{"version":3,"sources":["node_modules/browser-pack/_prelude.js","lib/colResizable-1.4.js","yasr.min.js","lib/jquery.csv-0.71.js","node_modules/codemirror/addon/edit/matchbrackets.js","node_modules/codemirror/addon/fold/brace-fold.js","node_modules/codemirror/addon/fold/foldcode.js","node_modules/codemirror/addon/fold/foldgutter.js","node_modules/codemirror/addon/fold/xml-fold.js","node_modules/codemirror/mode/javascript/javascript.js","node_modules/codemirror/mode/xml/xml.js","node_modules/color-convert/conversions.js","node_modules/color-convert/index.js","node_modules/color-convert/route.js","node_modules/color-name/index.js","node_modules/color-string/index.js","node_modules/color/index.js","node_modules/datatables.net/js/jquery.dataTables.js","node_modules/events/events.js","node_modules/leaflet/dist/leaflet-src.js","node_modules/lodash/_DataView.js","node_modules/lodash/_Hash.js","node_modules/lodash/_ListCache.js","node_modules/lodash/_Map.js","node_modules/lodash/_MapCache.js","node_modules/lodash/_Promise.js","node_modules/lodash/_Set.js","node_modules/lodash/_SetCache.js","node_modules/lodash/_Stack.js","node_modules/lodash/_Symbol.js","node_modules/lodash/_Uint8Array.js","node_modules/lodash/_WeakMap.js","node_modules/lodash/_arrayLikeKeys.js","node_modules/lodash/_arrayMap.js","node_modules/lodash/_arrayReduce.js","node_modules/lodash/_arraySome.js","node_modules/lodash/_assocIndexOf.js","node_modules/lodash/_baseEach.js","node_modules/lodash/_baseFor.js","node_modules/lodash/_baseForOwn.js","node_modules/lodash/_baseGet.js","node_modules/lodash/_baseGetTag.js","node_modules/lodash/_baseHasIn.js","node_modules/lodash/_baseIsEqual.js","node_modules/lodash/_baseIsEqualDeep.js","node_modules/lodash/_baseIsMatch.js","node_modules/lodash/_baseIsNative.js","node_modules/lodash/_baseIsTypedArray.js","node_modules/lodash/_baseIteratee.js","node_modules/lodash/_baseKeys.js","node_modules/lodash/_baseMap.js","node_modules/lodash/_baseMatches.js","node_modules/lodash/_baseMatchesProperty.js","node_modules/lodash/_baseProperty.js","node_modules/lodash/_basePropertyDeep.js","node_modules/lodash/_baseReduce.js","node_modules/lodash/_baseTimes.js","node_modules/lodash/_baseToString.js","node_modules/lodash/_baseUnary.js","node_modules/lodash/_cacheHas.js","node_modules/lodash/_castPath.js","node_modules/lodash/_coreJsData.js","node_modules/lodash/_createBaseEach.js","node_modules/lodash/_createBaseFor.js","node_modules/lodash/_equalArrays.js","node_modules/lodash/_equalByTag.js","node_modules/lodash/_equalObjects.js","node_modules/lodash/_freeGlobal.js","node_modules/lodash/_getMapData.js","node_modules/lodash/_getMatchData.js","node_modules/lodash/_getNative.js","node_modules/lodash/_getTag.js","node_modules/lodash/_getValue.js","node_modules/lodash/_hasPath.js","node_modules/lodash/_hashClear.js","node_modules/lodash/_hashDelete.js","node_modules/lodash/_hashGet.js","node_modules/lodash/_hashHas.js","node_modules/lodash/_hashSet.js","node_modules/lodash/_isIndex.js","node_modules/lodash/_isKey.js","node_modules/lodash/_isKeyable.js","node_modules/lodash/_isMasked.js","node_modules/lodash/_isPrototype.js","node_modules/lodash/_isStrictComparable.js","node_modules/lodash/_listCacheClear.js","node_modules/lodash/_listCacheDelete.js","node_modules/lodash/_listCacheGet.js","node_modules/lodash/_listCacheHas.js","node_modules/lodash/_listCacheSet.js","node_modules/lodash/_mapCacheClear.js","node_modules/lodash/_mapCacheDelete.js","node_modules/lodash/_mapCacheGet.js","node_modules/lodash/_mapCacheHas.js","node_modules/lodash/_mapCacheSet.js","node_modules/lodash/_mapToArray.js","node_modules/lodash/_matchesStrictComparable.js","node_modules/lodash/_memoizeCapped.js","node_modules/lodash/_nativeCreate.js","node_modules/lodash/_nativeKeys.js","node_modules/lodash/_nodeUtil.js","node_modules/lodash/_overArg.js","node_modules/lodash/_root.js","node_modules/lodash/_setCacheAdd.js","node_modules/lodash/_setCacheHas.js","node_modules/lodash/_setToArray.js","node_modules/lodash/_stackClear.js","node_modules/lodash/_stackDelete.js","node_modules/lodash/_stackGet.js","node_modules/lodash/_stackHas.js","node_modules/lodash/_stackSet.js","node_modules/lodash/_stringToPath.js","node_modules/lodash/_toKey.js","node_modules/lodash/_toSource.js","node_modules/lodash/eq.js","node_modules/lodash/get.js","node_modules/lodash/hasIn.js","node_modules/lodash/identity.js","node_modules/lodash/isArguments.js","node_modules/lodash/isArray.js","node_modules/lodash/isArrayLike.js","node_modules/lodash/isArrayLikeObject.js","node_modules/lodash/isFunction.js","node_modules/lodash/isLength.js","node_modules/lodash/isObject.js","node_modules/lodash/isObjectLike.js","node_modules/lodash/isSymbol.js","node_modules/lodash/isTypedArray.js","node_modules/lodash/keys.js","node_modules/lodash/map.js","node_modules/lodash/memoize.js","node_modules/lodash/property.js","node_modules/lodash/reduce.js","node_modules/lodash/toString.js","node_modules/pivottable/dist/d3_renderers.js","node_modules/pivottable/dist/gchart_renderers.js","node_modules/proj4/dist/proj4-src.js","node_modules/proj4leaflet/src/proj4leaflet.js","node_modules/simple-swizzle/index.js","node_modules/simple-swizzle/node_modules/is-arrayish/index.js","node_modules/store/dist/store.legacy.js","node_modules/store/plugins/json2.js","node_modules/store/plugins/lib/json2.js","node_modules/store/src/store-engine.js","node_modules/store/src/util.js","node_modules/store/storages/all.js","node_modules/store/storages/cookieStorage.js","node_modules/store/storages/localStorage.js","node_modules/store/storages/memoryStorage.js","node_modules/store/storages/oldFF-globalStorage.js","node_modules/store/storages/oldIE-userDataStorage.js","node_modules/store/storages/sessionStorage.js","node_modules/wicket/wicket-leaflet.js","node_modules/wicket/wicket.js","node_modules/yasgui-utils/package.json","node_modules/yasgui-utils/src/main.js","node_modules/yasgui-utils/src/storage.js","node_modules/yasgui-utils/src/svg.js","package.json","src/bindingsToCsv.js","src/boolean.js","src/defaults.js","src/entry.js","src/error.js","src/exceptions.js","src/gChartLoader.js","src/gchart.js","src/imgs.js","src/jquery/extendJquery.js","src/jquery/tableToCsv.js","src/leaflet.js","src/main.js","src/parsers/csv.js","src/parsers/dlv.js","src/parsers/graphJson.js","src/parsers/json.js","src/parsers/tsv.js","src/parsers/wrapper.js","src/parsers/xml.js","src/pivot.js","src/rawResponse.js","src/table.js","src/utils.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","YASR","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","1","S","$","jQuery","d","document","h","drag","tables","count","ID","PX","SIGNATURE","I","parseInt","M","Math","ie","navigator","userAgent","indexOf","sessionStorage","append","init","tb","options","disable","destroy","id","attr","p","postbackSafe","is","addClass","before","opt","c","w","width","gc","prev","marginLeft","css","marginRight","cs","cellSpacing","currentStyle","borderSpacing","b","border","borderLeftWidth","createGrips","removeClass","remove","th","find","cg","ln","memento","each","lastChild","push","removeAttr","bind","onGripMouseDown","gripInnerHtml","hoverCursor","data","syncGrips","not","m","aux","flush","split","eq","left","offset","outerWidth","height","headerOnly","outerHeight","syncCols","isOver","inc","x","c2","w2","onGripDrag","originalEvent","touches","pageX","ox","mw","minWidth","max","position","min","liveDrag","cb","onDrag","currentTarget","onGripDragOver","unbind","draggingClass","onResize","dragCursor","round","fn","extend","colResizable","defaults","jquery","undefined","2","RegExp","escape","replace","csv","separator","delimiter","headers","hooks","castToScalar","value","state","hasDot","isNaN","test","parseFloat","integer","parsers","parse","endOfEntry","start","rowNum","entry","colNum","onParseEntry","hookVal","end","exit","endOfValue","onParseValue","hook","escSeparator","escDelimiter","match","matchSrc","source","m0","splitLines","endOfLine","entries","prevChar","substr","parseEntry","toArray","callback","config","toArrays","toObjects","lines","headerOptions","headerLine","len","object","j","fromArrays","arrays","escaper","experimental","output","fromObjects2CSV","objects","csvEntry2Array","csv2Array","csv2Dictionary","3","mod","CodeMirror","findMatchingBracket","cm","where","strict","line","getLineHandle","pos","ch","matching","text","charAt","dir","style","getTokenTypeAt","Pos","found","scanForBracket","from","to","forward","maxScanLen","maxScanLineLength","maxScanLines","stack","re","bracketRegex","lineEnd","lastLine","firstLine","lineNo","getLine","pop","matchBrackets","autoclear","maxHighlightLen","maxHighlightLineLength","marks","ranges","listSelections","empty","head","markText","className","ie_lt8","focused","focus","clear","operation","setTimeout","doMatchBrackets","currentlyHighlighted","documentMode","(",")","[","]","{","}","defineOption","val","old","Init","off","on","defineExtension","codemirror","4","registerHelper","findOpening","openCh","at","pass","lineText","lastIndexOf","tokenType","startToken","endToken","startCh","endCh","outer","nextOpen","nextClose","hasImport","getTokenAt","string","type","semi","startLine","has","next","clipPos","hasInclude","slice","5","doFold","force","getRange","allowFolded","range","finder","minSize","findMarksAt","__isFold","cleared","getOption","myWidget","makeWidget","myRange","e_preventDefault","replacedWith","clearOnEnter","signal","widget","createTextNode","createElement","appendChild","name","editorOptions","foldOptions","defaultOptions","newFoldFunction","rangeFinder","commands","toggleFold","foldCode","getCursor","fold","unfold","foldAll","unfoldAll","funcs","Array","prototype","arguments","helpers","getHelpers","cur","auto","minFoldSize","scanUp","6","State","parseOptions","opts","gutter","indicatorOpen","indicatorFolded","isFolded","findMarks","marker","spec","elt","cloneNode","updateFoldInfo","foldGutter","foldOption","func","eachLine","mark","setGutterMarker","updateInViewport","vp","getViewport","onGutterClick","folded","onChange","clearTimeout","changeUpdate","foldOnChangeTimeSpan","onViewportChange","updateViewportTimeSpan","onFold","clearGutter","./foldcode","7","cmp","Iter","tagAt","iter","nextLine","prevLine","toTagEnd","gt","lastSlash","selfClose","toTagStart","lt","xmlTagStart","lastIndex","exec","index","toNextTag","toPrevTag","findMatchingClose","tag","findMatchingOpen","endLine","nameStartChar","nameChar","openTag","startPos","endPos","findMatchingTag","here","open","close","findEnclosingTag","scanForClosingTag","8","expressionAllowed","stream","backUp","lastType","defineMode","parserConfig","readRegexp","escaped","inSet","ret","tp","cont","content","tokenBase","tokenize","tokenString","eat","eatWhile","tokenComment","skipToEnd","isOperatorChar","current","tokenQuasi","wordRE","word","known","keywords","propertyIsEnumerable","quote","jsonldMode","peek","isJsonldKeyword","maybeEnd","findFatArrow","fatArrowAt","arrow","depth","sawSomething","bracket","brackets","JSLexical","indented","column","align","info","inScope","varname","v","localVars","cx","context","vars","parseJS","cc","marked","lexical","hasOwnProperty","combinator","jsonMode","expression","statement","lex","apply","register","inList","list","globalVars","pushcontext","defaultVars","popcontext","pushlex","result","indent","poplex","expect","wanted","exp","vardef","parenExpr","block","maybeelse","functiondef","forspec","maybelabel","funarg","afterExport","afterImport","pattern","typeexpr","expressionInner","expressionNoComma","noComma","body","arrowBodyNoComma","arrowBody","commasep","maybeop","maybeoperatorNoComma","maybeoperatorComma","atomicTypes","maybeexpressionNoComma","maybeexpression","arrayLiteral","contCommasep","objprop","quasi","maybeTarget","me","expr","property","continueQuasi","targetNoComma","target","_","getterSetter","afterprop","what","proceed","maybetype","isTS","maybedefault","afterType","typeprop","typearg","maybeReturnType","maybeAssign","vardefCont","proppattern","_type","forspec1","forspec2","formaybeinof","forspec3","classNameAfter","classBody","classfield","maybeFrom","importSpec","maybeAs","isContinuedStatement","textAfter","indentUnit","statementIndent","jsonld","json","typescript","wordCharacters","kw","A","B","C","operator","atom","jsKeywords","if","while","with","else","do","try","finally","return","break","continue","new","delete","throw","debugger","var","const","let","function","catch","for","switch","case","default","in","typeof","instanceof","true","false","null","NaN","Infinity","class","super","yield","export","import","extends","await","async","tsKeywords","interface","implements","namespace","enum","public","private","protected","abstract","as","number","boolean","any","variable","regexp","jsonld-keyword","startState","basecolumn","token","sol","indentation","eatSpace","Pass","top","firstChar","closing","doubleIndentSwitch","electricInput","blockCommentStart","blockCommentEnd","lineComment","closeBrackets","helperType","skipExpression","defineMIME","9","htmlConfig","autoSelfClosers","area","base","br","col","command","embed","frame","hr","img","input","keygen","link","meta","param","track","wbr","menuitem","implicitlyClosed","dd","li","optgroup","option","rp","rt","tbody","td","tfoot","tr","contextGrabbers","dt","address","article","aside","blockquote","div","dl","fieldset","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","menu","nav","ol","pre","section","table","ul","thead","doNotIndent","allowUnquoted","allowMissing","caseFold","xmlConfig","editorConf","config_","inText","chain","parser","inBlock","doctype","inTag","ok","baseState","tagName","tagStart","inAttribute","stringStartCol","closure","eol","isInAttribute","terminator","Context","startOfLine","noIndent","popContext","maybePopContext","nextTagName","parentTagName","tagNameState","closeTagNameState","setStyle","attrState","matchClosing","closeState","closeStateErr","_stream","attrEqState","attrValueState","attrContinuedState","htmlMode","prop","isInText","baseIndent","fullLine","multilineTagIndentPastTag","multilineTagIndentFactor","alignCDATA","tagAfter","grabbers","configuration","skipAttribute","mimeModes","10","comparativeDistance","y","pow","cssKeywords","reverseKeywords","key","convert","rgb","channels","labels","hsl","hsv","hwb","cmyk","xyz","lab","lch","hex","keyword","ansi16","ansi256","hcg","apple","gray","model","Object","defineProperty","delta","k","reversed","currentClosestKeyword","currentClosestDistance","distance","z","t1","t2","t3","sv","smin","lmin","hi","floor","q","sl","vmin","wh","bl","ratio","y2","x2","z2","atan2","PI","sqrt","cos","sin","args","ansi","color","mult","rem","toString","toUpperCase","substring","colorString","map","char","join","grayscale","hue","chroma","pure","mg","color-name","11","wrapRaw","wrappedFn","conversion","wrapRounded","conversions","route","models","keys","forEach","fromModel","routes","routeModels","toModel","raw","./conversions","./route","12","buildGraph","graph","parent","deriveBFS","queue","adjacents","adjacent","node","unshift","wrapConversion","path","13","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","14","clamp","num","hexDouble","str","colorNames","swizzle","reverseNames","get","prefix","toLowerCase","hexAlpha","abbr","rgba","per","i2","alpha","percent","hsla","hwba","simple-swizzle","15","Color","obj","skippedModels","valpha","newArr","_slice","zeroArray","splice","hashedKeys","sort","hashedModelKeys","JSON","stringify","limiters","limit","freeze","roundTo","places","Number","toFixed","roundToPlace","getset","channel","modifier","isArray","maxfn","assertArray","arr","toJSON","concat","percentString","array","unitArray","unitObject","saturationl","lightness","saturationv","wblack","rgbNumber","luminosity","lum","chan","contrast","color2","lum1","lum2","level","contrastRatio","dark","yiq","light","negate","lighten","darken","saturate","desaturate","whiten","blacken","fade","opaquer","rotate","degrees","mix","mixinColor","weight","color1","w1","newAlpha","color-convert","color-string","16","factory","root","_fnHungarianMap","newKey","hungarian","_hungarianMap","_fnCamelToHungarian","src","user","hungarianKey","_fnLanguageCompat","lang","DataTable","oLanguage","zeroRecords","sZeroRecords","sEmptyTable","_fnMap","sLoadingRecords","sInfoThousands","sThousands","decimal","sDecimal","_addNumericSort","_fnCompatOpts","_fnCompatMap","sScrollX","scrollX","searchCols","aoSearchCols","ien","oSearch","_fnCompatCols","dataSort","aDataSort","_fnBrowserDetect","settings","__browser","browser","scrollLeft","overflow","appendTo","children","inner","barWidth","offsetWidth","clientWidth","bScrollOversize","bScrollbarLeft","bBounding","getBoundingClientRect","oBrowser","oScroll","iBarWidth","_fnReduce","that","isSet","_fnAddColumn","oSettings","nTh","oDefaults","iCol","aoColumns","oCol","oColumn","sTitle","innerHTML","mData","idx","aoPreSearchCols","_fnColumnOptions","oOptions","oClasses","sWidthOrig","mDataProp","sType","_sManualType","sClass","iDataSort","mDataSrc","_fnGetObjectDataFn","mRender","attrTest","_bAttrSrc","isPlainObject","filter","_setter","fnGetData","rowData","innerData","fnSetData","_fnSetObjectDataFn","_rowReadObject","oFeatures","bSort","bSortable","sSortableNone","bAsc","inArray","asSorting","bDesc","sSortingClass","sSortableAsc","sSortingClassJUI","sSortJUIAscAllowed","sSortableDesc","sSortJUIDescAllowed","sSortable","sSortJUI","_fnAdjustColumnSizing","bAutoWidth","columns","_fnCalculateColumnWidths","iLen","sWidth","scroll","sY","sX","_fnScrollDraw","_fnCallbackFire","_fnVisibleToColumnIndex","iMatch","aiVis","_fnGetColumns","_fnColumnIndexToVisible","iPos","_fnVisbleColumns","vis","bVisible","sParam","_fnColumnTypes","jen","ken","detectedType","cache","aoData","types","ext","detect","_fnGetCellData","_fnApplyColumnDefs","aoColDefs","aoCols","jLen","kLen","def","aTargets","targets","hasClass","_fnAddData","aDataIn","nTr","anTds","iRow","oData","oRow","_aData","aiDisplayMaster","rowIdFn","aIds","bDeferRender","_fnCreateTr","_fnAddTr","trs","row","el","_fnGetRowElements","cells","_fnNodeToDataIndex","_DT_RowIndex","_fnNodeToColumnIndex","anCells","rowIdx","colIdx","draw","iDraw","defaultContent","sDefaultContent","cellData","iDrawError","_fnLog","_fnSetCellData","_fnSplitObjNotation","mSource","fetchData","arrayNotation","funcNotation","out","innerSrc","__reArray","__reFn","setData","aLast","_fnGetDataMaster","_pluck","_fnClearTable","aiDisplay","_fnDeleteIndex","iTarget","iTargetIndex","_fnInvalidate","cellWrite","cell","childNodes","removeChild","firstChild","_aSortData","_aFilterData","cols","_fnRowAttributes","contents","tds","objectRead","setter","getAttribute","cellProcess","trim","nodeName","nextSibling","rowNode","rowId","nTrIn","nTd","sCellType","_DT_CellIndex","parentNode","fnCreatedCell","oInstance","setAttribute","DT_RowClass","__rowc","_unique","DT_RowAttr","DT_RowData","_fnBuildHead","nTHead","nTFoot","createHeader","classes","iTabIndex","sTableId","_fnSortAttachListener","html","_fnRenderer","_fnDetectHeader","aoHeader","sHeaderTH","sFooterTH","aoFooter","nTf","_fnDrawHead","aoSource","bIncludeHidden","nLocalTr","iRowspan","iColspan","aoLocal","aApplied","iColumns","_fnDraw","aPreDraw","anRows","iRowCount","asStripeClasses","iStripes","oLang","aoOpenRows","iInitDisplayStart","bServerSide","_fnDataSource","bDrawing","_iDisplayStart","fnRecordsDisplay","iDisplayStart","iDisplayEnd","fnDisplayEnd","bDeferLoading","_fnProcessingDisplay","bDestroying","_fnAjaxUpdate","iStart","iEnd","iDataIndex","nRow","sStripe","_sRowStripe","sZero","fnRecordsTotal","valign","colSpan","sRowEmpty","nTBody","detach","bSorted","bFiltered","_fnReDraw","holdPosition","features","bFilter","_fnSort","_fnFilterComplete","oPreviousSearch","_drawHold","_fnAddOptionsHtml","nTable","holding","insertBefore","insert","sWrapper","sNoFooter","nHolding","nTableWrapper","nTableReinsertBefore","featureNode","cOption","nNewNode","cNext","sAttr","aDom","sDom","sJUIHeader","sJUIFooter","aSplit","bPaginate","bLengthChange","_fnFeatureHtmlLength","_fnFeatureHtmlFilter","bProcessing","_fnFeatureHtmlProcessing","_fnFeatureHtmlTable","bInfo","_fnFeatureHtmlInfo","_fnFeatureHtmlPaginate","feature","aoFeatures","cFeature","fnInit","aanFeatures","replaceWith","aLayout","nThead","nCell","iColShifted","iColumn","bUnique","nTrs","fnShiftCol","unique","_fnGetUniqueThs","nHeader","aReturn","bSortCellsTop","_fnBuildAjax","tmp","rbracket","ajaxData","ajax","instance","jqXHR","newData","isFunction","baseAjax","success","error","sError","dataType","sServerMethod","xhr","thrown","readyState","oAjaxData","fnServerData","sAjaxSource","url","bAjaxDataGet","_fnAjaxParameters","_fnAjaxUpdateDraw","dataProp","columnSearch","columnCount","preSearch","preColSearch","_fnSortFlatten","displayStart","displayLength","_iDisplayLength","order","search","sSearch","regex","bRegex","sName","searchable","bSearchable","orderable","legacy","compat","modern","_fnAjaxDataSrc","recordsTotal","recordsFiltered","_iRecordsTotal","_iRecordsDisplay","_bInitComplete","_fnInitComplete","dataSrc","sAjaxDataProp","aaData","tableId","language","previousSearch","sFilterInput","sFilter","searchFn","bSmart","bCaseInsensitive","searchDelay","jqFilter","sSearchPlaceholder","_fnThrottle","keyCode","ev","activeElement","oInput","iForce","oPrevSearch","aoPrevSearch","fnSaveFilter","oFilter","fnRegex","bEscapeRegex","_fnFilter","_fnFilterColumn","_fnFilterCustom","filters","displayRows","rows","merge","searchStr","smart","caseInsensitive","display","rpSearch","_fnFilterCreateSearch","invalidated","prevSearch","displayMaster","filtered","_fnFilterData","_sFilterRow","_fnEscapeRegex","filterData","fomatters","wasInvalidated","__filter_div","__filter_div_textContent","textContent","innerText","_fnSearchToCamel","_fnSearchToHung","tid","nodes","sInfo","aoDrawCallback","_fnUpdateInfo","total","sInfoEmpty","sInfoFiltered","sInfoPostFix","_fnInfoMacros","fnInfoCallback","formatter","fnFormatNumber","all","ceil","_fnInitialise","iAjaxStart","deferLoading","bInitialised","_fnStringToCss","aData","oInit","_fnLengthChange","_fnLengthOverflow","aLengthMenu","d2","lengths","select","aria-controls","sLengthSelect","Option","sLength","sLengthMenu","outerHTML","sPaginationType","plugin","pager","redraw","sPaging","visRecords","page","pages","buttons","fnUpdate","_fnPageChange","action","records","changed","sProcessing","show","scrollY","caption","captionSide","_captionSide","headerClone","footerClone","_div","size","scroller","sScrollWrapper","sScrollHead","sScrollHeadInner","box-sizing","sXInner","sScrollBody","sScrollFoot","sScrollFootInner","scrollHead","scrollBody","scrollFoot","bCollapse","nScrollHead","nScrollBody","nScrollFoot","headerTrgEls","footerTrgEls","headerSrcEls","footerSrcEls","headerCopy","footerCopy","correction","sanityWidth","scrollXInner","divHeader","divHeaderStyle","divHeaderInner","divHeaderInnerStyle","divHeaderTable","divBodyEl","divBody","divBodyStyle","divFooter","divFooterInner","divFooterTable","tableEl","tableStyle","ie67","dtHeaderCells","headerWidths","footerWidths","headerContent","footerContent","zeroOut","nSizer","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","scrollBarVis","scrollHeight","clientHeight","clone","prependTo","_fnApplyToChildren","offsetHeight","nToSize","iOuterWidth","bScrolling","padding","scrollTop","an1","an2","nNode1","nNode2","nodeType","columnIdx","visibleColumns","headerCells","tableWidthAttr","tableContainer","userInputs","styleWidth","_fnConvertToWidth","tmpTable","margin","_fnGetWidestNode","sContentPadding","holder","right","bounding","_reszEvt","bindResize","sInstance","_fnGetMaxLenString","maxIdx","__re_html_remove","srcCol","aSort","fixed","aaSortingFixed","fixedObj","nestedSort","add","aaSorting","post","_idx","sortCol","aiOrig","oExtSort","formatters","_fnSortData","dataA","dataB","_fnSortAria","label","nextSort","oAria","removeAttribute","sSortAscending","sSortDescending","_fnSortListener","nextSortIdx","sorting","bSortMulti","sortIdx","attachTo","_fnBindAction","shiftKey","_fnSortingClasses","oldSort","aLastSort","sortClass","sSortColumn","bSortClasses","customData","customSort","sSortDataType","_fnSaveState","bStateSave","time","Date","visible","oSavedState","fnStateSaveCallback","_fnLoadState","loaded","abStateLoad","duration","iStateDuration","oLoadedState","fnStateLoadCallback","_fnSettingsFromNode","msg","tn","console","log","sErrMode","errMode","alert","mappedName","_fnExtend","extender","breakRefs","blur","which","preventDefault","_fnCallbackReg","sStore","callbackArr","eventName","reverse","Event","trigger","renderer","host","_numbers","numbers","extPagination","numbers_length","half","_range","DT_el","decimalPlace","__numericReplace","num-fmt","_re_formatted_numeric","html-num","_re_html","html-num-fmt","_ext","_fnExternApiFunc","iApiIndex","internal","_Api","_api_register","_api_registerPlural","sSelector","oOpts","api","traditional","fnAddData","flatten","fnAdjustColumnSizing","bRedraw","adjust","fnClearTable","fnClose","child","hide","fnDeleteRow","fnDestroy","fnDraw","complete","fnFilter","sInput","bShowGlobal","fnGetNodes","fnGetPosition","columnVisible","fnIsOpen","isShown","fnOpen","mHtml","fnPageChange","mAction","fnSetColumnVis","bShow","fnSettings","fnSort","aaSort","fnSortListener","nNode","fnCallback","listener","mRow","bAction","fnVersionCheck","_that","emptyInit","oApi","sId","bInitHandedOff","$this","allSettings","bRetrieve","bDestroy","sDestroyWidth","dataTable","iDisplayLength","fnDrawCallback","fnServerParams","fnStateSaveParams","fnStateLoadParams","fnStateLoaded","fnRowCallback","fnCreatedRow","fnHeaderCallback","fnFooterCallback","fnInitComplete","fnPreDrawCallback","bJQueryUI","oJUIClasses","sTable","iDeferLoading","sUrl","sStripeOdd","sStripeEven","stripeClasses","rowOne","asDestroyStripes","aoColumnsInit","anThs","getElementsByTagName","aoColumnDefs","oDef","loadedInit","sortedColumns","captions","_re_dic","_re_new_lines","_re_date","_re_escape_regex","_empty","_intVal","isFinite","_numToDecimal","decimalPoint","_isNumber","formatted","strType","_isHtml","_htmlNumeric","_stripHtml","prop2","_pluck_order","_removeEmpty","_areAllUnique","sorted","last","again","util","throttle","freq","timer","frequency","now","escapeRegex","knew","__apiStruct","__arrayProto","_toSettings","mixed","jq","ctxSettings","selector","Api","ctx","iterator","alwaysNew","items","item","apiInst","_selector_row_indexes","apiSelector","pluck","reduce","reduceRight","shift","to$","toJQuery","scope","__dt_wrapper","struct","methodScoping","struc","methodExt","propExt","method","heir","registerPlural","pluralName","singularName","__table_selector","paging","recordsDisplay","serverSide","__reload","one","abort","resetPaging","_selector_run","selectFn","res","selectorType","_selector_opts","_selector_first","inst","displayFiltered","__row_selector","run","sel","selInt","closest","rowObj","hash","thatIdx","loopRow","loopCells","newRows","modRows","__details_add","klass","addRow","created","_details","_detailsShow","insertAfter","__details_remove","__details_display","__details_events","drawEvent","colvisEvent","destroyEvent","_emp","_child_obj","_child_mth","__re_column_selector","__columnData","r1","r2","__column_selector","names","visColumns","jqResult","__setColumnVis","calc","__cell_selector","allCells","fnSelector","rowSelector","columnSelector","set","caseInsen","versionCheck","version","iThis","iThat","aThis","aThat","isDataTable","fnIsDataTable","foot","fnTables","camelToHungarian","jqRows","orig","jqTable","jqTbody","jqWrapper","bJUI","sSortIcon","wrapper","sSortJUIWrapper","removedMethod","arg1","arg2","arg3","arg4","plural","resolved","bScrollCollapse","toFormat","localStorage","getItem","location","pathname","setItem","oPaginate","sFirst","sLast","sNext","sPrevious","sScrollXInner","sScrollY","aoRowCallback","aoHeaderCallback","aoFooterCallback","aoRowCreatedCallback","aoPreDrawCallback","aoInitComplete","aoStateSaveParams","aoStateLoadParams","aoStateLoaded","aoStateSave","aoStateLoad","aoServerParams","aoDestroyCallback","paginate","oPlugins","builder","pageButton","sVersion","afnFiltering","aTypes","ofnSearch","oSort","afnSortData","oStdClasses","oPagination","sPageButton","sPageButtonActive","sPageButtonDisabled","sSortAsc","sSortDesc","sSortJUIAsc","sSortJUIDesc","_stateDefault","_sortIcon","_headerFooter","simple","full","simple_numbers","full_numbers","first_last_numbers","btnDisplay","btnClass","activeEl","aria","counter","attach","container","button","clickHandler","aria-label","data-dt-idx","tabindex","parsed","re1","re2","date-pre","html-pre","string-pre","string-asc","string-desc","jqueryui","__htmlEscapeEntities","render","thousands","precision","postfix","negative","flo","abs","intPart","floatPart","_fnCalculateEnd","dataTableSettings","dataTableExt","17","EventEmitter","_events","_maxListeners","arg","isNumber","isObject","isUndefined","defaultMaxListeners","setMaxListeners","TypeError","emit","er","handler","listeners","err","addListener","newListener","warned","trace","once","removeListener","fired","removeAllListeners","listenerCount","evlistener","emitter","18","expose","oldL","L","noConflict","Util","dest","create","F","proto","stamp","_leaflet_id","lastId","lock","wrapperFn","later","wrapNum","includeMax","falseFn","formatNum","digits","splitWords","setOptions","getParamString","existingUrl","uppercase","params","encodeURIComponent","template","templateRe","emptyImageUrl","getPrefixed","timeoutDefer","timeToCall","lastTime","requestFn","requestAnimationFrame","cancelFn","cancelAnimationFrame","requestAnimFrame","immediate","cancelAnimFrame","Class","props","NewClass","initialize","callInitHooks","parentProto","__super__","constructor","statics","includes","_initHooks","_initHooksCalled","include","mergeOptions","addInitHook","Evented","_on","_off","typeListeners","_firingCount","fire","propagate","listens","event","_propagateEvent","_eventParents","addEventParent","removeEventParent","layer","addEventListener","removeEventListener","clearAllEventListeners","addOneTimeEventListener","fireEvent","hasEventListeners","Mixin","Events","ua","doc","documentElement","webkit","phantomjs","android23","chrome","gecko","opera","win","platform","mobile","orientation","msPointer","PointerEvent","MSPointerEvent","pointer","ie3d","webkit3d","WebKitCSSMatrix","gecko3d","opera12","touch","L_NO_TOUCH","DocumentTouch","Browser","ielt9","edge","android","safari","any3d","L_DISABLE_3D","mobileWebkit","mobileWebkit3d","mobileOpera","mobileGecko","retina","devicePixelRatio","screen","deviceXDPI","logicalXDPI","Point","point","_add","subtract","_subtract","divideBy","_divideBy","multiplyBy","_multiplyBy","scaleBy","unscaleBy","_round","_floor","_ceil","distanceTo","equals","contains","Bounds","points","getCenter","getBottomLeft","getTopRight","getSize","bounds","intersects","min2","max2","xIntersects","yIntersects","overlaps","xOverlaps","yOverlaps","isValid","Transformation","_a","_b","_c","_d","transform","scale","_transform","untransform","DomUtil","getElementById","getStyle","defaultView","getComputedStyle","toFront","toBack","classList","getClass","setClass","baseVal","setOpacity","opacity","_setOpacityIE","filterName","Enabled","Opacity","testProp","setTransform","TRANSFORM","setPosition","_leaflet_pos","getPosition","transition","TRANSITION","TRANSITION_END","disableTextSelection","DomEvent","enableTextSelection","userSelectProperty","_userSelect","disableImageDrag","enableImageDrag","preventOutline","element","tabIndex","restoreOutline","_outlineElement","_outlineStyle","outline","LatLng","lat","lng","alt","maxMargin","latLng","other","CRS","Earth","wrap","wrapLatLng","toBounds","sizeInMeters","latAccuracy","lngAccuracy","latLngBounds","lon","LatLngBounds","corner1","corner2","latlngs","sw2","ne2","sw","_southWest","ne","_northEast","pad","bufferRatio","heightBuffer","widthBuffer","getSouthWest","getNorthEast","getNorthWest","getNorth","getWest","getSouthEast","getSouth","getEast","latIntersects","lngIntersects","latOverlaps","lngOverlaps","toBBoxString","Projection","LonLat","project","latlng","unproject","SphericalMercator","R","MAX_LATITUDE","atan","latLngToPoint","zoom","projectedPoint","projection","transformation","pointToLatLng","untransformedPoint","LN2","getProjectedBounds","infinite","wrapLng","wrapLat","wrapLatLngBounds","center","newCenter","latShift","lngShift","newSw","newNe","Simple","latlng1","latlng2","dx","dy","rad","lat1","lat2","acos","EPSG3857","EPSG900913","EPSG4326","Map","crs","minZoom","maxZoom","layers","maxBounds","zoomAnimation","zoomAnimationThreshold","fadeAnimation","markerZoomAnimation","transform3DLimit","zoomSnap","zoomDelta","trackResize","_initContainer","_initLayout","_onResize","_initEvents","setMaxBounds","_zoom","_limitZoom","setView","reset","_handlers","_layers","_zoomBoundLayers","_sizeChanged","_zoomAnimated","_createAnimProxy","_proxy","_catchTransitionEnd","_addLayers","_limitCenter","_stop","_loaded","animate","pan","moved","_tryAnimatedZoom","_tryAnimatedPan","_sizeTimer","_resetView","setZoom","zoomIn","zoomOut","setZoomAround","getZoomScale","viewHalf","containerPoint","latLngToContainerPoint","centerOffset","containerPointToLatLng","_getBoundsCenterZoom","getBounds","paddingTL","paddingTopLeft","paddingBR","paddingBottomRight","getBoundsZoom","paddingOffset","swPoint","nePoint","fitBounds","fitWorld","panTo","panBy","getZoom","_panAnim","PosAnimation","step","_onPanTransitionStep","_onPanTransitionEnd","noMoveStart","_mapPane","newPos","_getMapPanePos","easeLinearity","_rawPanBy","flyTo","targetCenter","targetZoom","s1","s2","w0","rho2","u1","b1","sq","sinh","cosh","tanh","r0","rho","easeOut","_flyToFrame","_move","startZoom","getScaleZoom","_moveEnd","_moveStart","flyToBounds","_panInsideMaxBounds","setMinZoom","setMaxZoom","panInsideBounds","_enforcingBounds","invalidateSize","oldSize","_lastCenter","newSize","oldCenter","debounceMoveend","stop","locate","_locateOptions","timeout","watch","_handleGeolocationError","message","onResponse","_handleGeolocationResponse","onError","_locationWatchId","geolocation","watchPosition","getCurrentPosition","stopLocate","clearWatch","coords","latitude","longitude","accuracy","timestamp","addHandler","HandlerClass","enable","_containerId","_container","_clearControlPos","_clearHandlers","createPane","pane","_panes","_checkIfLoaded","_moved","layerPointToLatLng","_getCenterLayerPoint","getPixelBounds","getMinZoom","_layersMinZoom","getMaxZoom","_layersMaxZoom","inside","nw","se","boundsSize","snap","_size","topLeftPoint","_getTopLeftPoint","getPixelOrigin","_pixelOrigin","getPixelWorldBounds","getPane","getPanes","getContainer","toZoom","fromZoom","latLngToLayerPoint","containerPointToLayerPoint","layerPointToContainerPoint","layerPoint","mouseEventToContainerPoint","getMousePosition","mouseEventToLayerPoint","mouseEventToLatLng","_onScroll","_fadeAnimated","_initPanes","_initControlPos","panes","_paneRenderers","markerPane","shadowPane","loading","zoomChanged","_getNewPixelOrigin","pinch","_getZoomSpan","_targets","onOff","_handleDOMEvent","_onMoveEnd","_resizeRequest","_findEventTargets","isHover","srcElement","dragging","_simulated","_draggableMoved","_isExternalTarget","_skipped","_fireDOMEvent","synth","_stopped","isMarker","Marker","getLatLng","nonBubblingEvents","enabled","boxZoom","whenReady","pixelOrigin","_latLngToNewLayerPoint","topLeft","_latLngBoundsToNewLayerBounds","_getCenterOffset","centerPoint","viewBounds","_getBoundsOffset","_limitOffset","newBounds","pxBounds","projectedMaxBounds","minOffset","maxOffset","_rebound","proxy","mapPane","_animatingZoom","_onZoomTransitionEnd","propertyName","_nothingToAnimate","getElementsByClassName","_animateZoom","startAnim","noUpdate","_animateToCenter","_animateToZoom","Layer","attribution","addTo","addLayer","removeFrom","_map","_mapToAdd","removeLayer","addInteractiveTarget","targetEl","removeInteractiveTarget","getAttribution","_layerAdd","hasLayer","getEvents","events","onAdd","attributionControl","addAttribution","beforeAdd","onRemove","removeAttribution","eachLayer","_addZoomLimit","_updateZoomLevels","_removeZoomLimit","oldZoomSpan","eventsKey","originalHandler","addPointerListener","addDoubleTapListener","_filterClick","attachEvent","removePointerListener","removeDoubleTapListener","detachEvent","stopPropagation","cancelBubble","disableScrollPropagation","disableClickPropagation","Draggable","START","click","_fakeStop","dblclick","returnValue","clientX","clientY","rect","clientLeft","clientTop","_wheelPxFactor","getWheelDelta","wheelDeltaY","deltaY","deltaMode","deltaX","deltaZ","wheelDelta","detail","_skipEvents","skipped","related","relatedTarget","timeStamp","elapsed","_lastClick","_simulatedClick","_el","_inProgress","_duration","_easeOutPower","_startPos","_offset","_startTime","_animate","_step","_complete","_animId","_runFrame","_easeOut","progress","Mercator","R_MINOR","con","ts","phi","dphi","EPSG3395","GridLayer","tileSize","updateWhenIdle","updateWhenZooming","updateInterval","zIndex","noWrap","keepBuffer","_levels","_tiles","_update","_removeAllTiles","_tileZoom","bringToFront","_setAutoZIndex","bringToBack","_updateOpacity","setZIndex","_updateZIndex","isLoading","_loading","viewprereset","_invalidateAll","viewreset","moveend","_onMove","move","zoomanim","createTile","getTileSize","compare","edgeZIndex","nextFrame","willPrune","tile","active","_noPrune","_pruneTiles","_fadeFrame","_updateLevels","_removeTilesAtZoom","origin","_setZoomTransform","_level","retain","_retainParent","_retainChildren","_removeTile","coords2","_tileCoordsToKey","animating","_setView","noPrune","tileZoom","tileZoomChanged","_abortLoading","_resetGrid","_setZoomTransforms","translate","_tileSize","_globalTileRange","_pxBoundsToTileRange","_wrapX","_wrapY","_getTiledPixelBounds","mapZoom","pixelCenter","halfSize","pixelBounds","tileRange","tileCenter","noPruneRange","_isValidTile","fragment","createDocumentFragment","_addTile","tileBounds","_tileCoordsToBounds","_keyToBounds","_keyToTileCoords","nwPoint","sePoint","_initTile","onselectstart","onmousemove","WebkitBackfaceVisibility","tilePos","_getTilePos","_wrapCoords","_tileReady","_noTilesToLoad","newCoords","gridLayer","TileLayer","maxNativeZoom","minNativeZoom","subdomains","errorTileUrl","zoomOffset","tms","zoomReverse","detectRetina","crossOrigin","_url","_onTileRemove","setUrl","noRedraw","done","_tileOnLoad","_tileOnError","getTileUrl","_getSubdomain","_getZoomForUrl","invertedY","errorUrl","onload","tilePoint","onerror","tileLayer","WMS","defaultWmsParams","service","request","styles","format","transparent","wmsParams","_crs","_wmsVersion","projectionKey","bbox","setParams","wms","ImageOverlay","interactive","_bounds","_image","_initImage","_reset","styleOpts","setBounds","getElement","image","imageOverlay","Icon","createIcon","oldIcon","_createIcon","createShadow","_getIconUrl","_createImg","_setIconStyles","sizeOption","anchor","shadowAnchor","iconAnchor","marginTop","icon","Default","iconUrl","iconRetinaUrl","shadowUrl","iconSize","popupAnchor","tooltipAnchor","shadowSize","imagePath","_detectIconPath","draggable","keyboard","title","zIndexOffset","riseOnHover","riseOffset","_latlng","_initIcon","update","removeHooks","_removeIcon","_removeShadow","setLatLng","oldLatLng","setZIndexOffset","setIcon","_popup","bindPopup","_icon","_setPos","classToAdd","addIcon","mouseover","_bringToFront","mouseout","_resetZIndex","newShadow","_shadow","addShadow","_initInteraction","_zIndex","Handler","MarkerDrag","_getPopupAnchor","_getTooltipAnchor","DivIcon","bgPos","backgroundPosition","divIcon","DivOverlay","_source","_removeTimeout","_updatePosition","_adjustPan","getContent","_content","setContent","visibility","_updateContent","_updateLayout","isOpen","_contentNode","hasChildNodes","_getAnchor","bottom","_containerBottom","_containerLeft","_containerWidth","Popup","maxWidth","maxHeight","autoPan","autoPanPaddingTopLeft","autoPanPaddingBottomRight","autoPanPadding","keepInView","closeButton","autoClose","openOn","openPopup","popup","Path","closeOnClick","closePopupOnClick","preclick","_close","closePopup","_closeButton","href","_onCloseButtonClick","_wrapper","_tipContainer","_tip","whiteSpace","scrolledClass","marginBottom","containerHeight","containerWidth","layerPos","containerPos","_popupHandlersAdded","_openPopup","_movePopup","unbindPopup","FeatureGroup","togglePopup","isPopupOpen","setPopupContent","getPopup","Tooltip","direction","permanent","sticky","tooltip","closeTooltip","_setPosition","tooltipPoint","tooltipWidth","tooltipHeight","openTooltip","bindTooltip","_tooltip","_initTooltipInteractions","unbindTooltip","_tooltipHandlersAdded","_moveTooltip","_openTooltip","mousemove","toggleTooltip","isTooltipOpen","setTooltipContent","getTooltip","LayerGroup","getLayerId","clearLayers","invoke","methodName","getLayer","getLayers","layerGroup","featureGroup","Renderer","_updatePaths","_onZoom","zoomend","_onZoomEnd","_onAnimZoom","_updateTransform","currentCenterPoint","_center","destCenterPoint","topLeftOffset","_project","getRenderer","_getPaneRenderer","_renderer","preferCanvas","canvas","svg","SVG","Canvas","stroke","lineCap","lineJoin","dashArray","dashOffset","fill","fillColor","fillOpacity","fillRule","_initPath","_addPath","_removePath","_updatePath","_updateStyle","_bringToBack","_path","_clickTolerance","LineUtil","simplify","tolerance","sqTolerance","_reducePoints","_simplifyDP","pointToSegmentDistance","p1","p2","_sqClosestPointOnSegment","closestPointOnSegment","ArrayConstructor","Uint8Array","markers","_simplifyDPStep","newPoints","first","sqDist","maxSqDist","reducedPoints","_sqDist","clipSegment","useLastCode","codeOut","newCode","codeA","_lastCode","_getBitCode","codeB","_getEdgeIntersection","dot","Polyline","smoothFactor","noClip","_setLatLngs","getLatLngs","_latlngs","setLatLngs","isEmpty","closestLayerPoint","minDistance","minPoint","_parts","halfDist","segDist","dist","_rings","addLatLng","_defaultShape","_convertLatLngs","_flat","flat","_projectLatlngs","_pxBounds","projectedBounds","ring","_clipPoints","len2","segment","parts","_simplifyPoints","_updatePoly","polyline","PolyUtil","clipPolygon","clippedPoints","edges","lu","_code","Polygon","clipped","polygon","Rectangle","_boundsToLatLngs","rectangle","CircleMarker","radius","_radius","setRadius","getRadius","_point","_updateBounds","_radiusY","_updateCircle","circleMarker","Circle","legacyOptions","_mRadius","latR","lngR","circle","zoomstart","_onZoomStart","_rootGroup","_svgSize","closed","_setPath","pointsToPath","arc","createElementNS","rings","createSVGRect","vml","shape","behavior","adj","coordsize","_stroke","_fill","stroked","filled","dashStyle","endcap","joinstyle","namespaces","_onViewPreReset","_postponeUpdatePaths","_draw","_onMouseMove","_onClick","_handleMouseOut","_ctx","getContext","_redrawBounds","_redraw","_drawnLayers","_updateDashArray","_order","_drawLast","_drawFirst","_requestRedraw","_extendRedrawBounds","_dashArray","_redrawRequest","_clear","clearRect","save","beginPath","clip","_drawing","restore","setLineDash","closePath","_fillStroke","globalAlpha","fillStyle","lineWidth","strokeStyle","clickedLayer","_containsPoint","_fireEvent","moving","_handleMouseHover","_hoveredLayer","candidateHoveredLayer","part","GeoJSON","geojson","addData","geometries","geometry","coordinates","geometryToLayer","asFeature","resetStyle","onEachFeature","_setLayerStyle","pointToLayer","coordsToLatLng","coordsToLatLngs","properties","levelsDeep","latLngToCoords","latLngsToCoords","getFeature","newGeometry","PointToGeoJSON","toGeoJSON","multi","holes","toMultiPoint","isGeometryCollection","jsons","geoJSON","geoJson","clickTolerance","END","mousedown","touchstart","pointerdown","MSPointerDown","MOVE","dragStartTarget","_element","_dragStartTarget","_preventOutline","_enabled","_onDown","_dragging","finishDrag","_moving","_startPoint","_onUp","newPoint","_lastTarget","SVGElementInstance","correspondingUseElement","_newPos","_animRequest","_lastEvent","addHooks","inertia","inertiaDeceleration","inertiaMaxSpeed","worldCopyJump","maxBoundsViscosity","Drag","_draggable","down","dragstart","_onDragStart","_onDrag","dragend","_onDragEnd","_onPreDragLimit","_onPreDragWrap","_positions","_times","_offsetLimit","_viscosity","_lastTime","_lastPos","_absPos","pxCenter","pxWorldCenter","_initialWorldOffset","_worldWidth","_viscousLimit","threshold","worldWidth","halfWidth","newX1","newX2","newX","noInertia","ease","speedVector","speed","limitedSpeed","limitedSpeedVector","decelerationDuration","doubleClickZoom","DoubleClickZoom","_onDoubleClick","oldZoom","scrollWheelZoom","wheelDebounceTime","wheelPxPerZoomLevel","ScrollWheelZoom","_onWheelScroll","_delta","debounce","_lastMousePos","_timer","_performZoom","d3","d4","_touchstart","_touchend","onTouchStart","pointerType","_pointersCount","doubleTap","delay","onTouchEnd","newTouch","touchend","POINTER_DOWN","POINTER_MOVE","POINTER_UP","POINTER_CANCEL","TAG_WHITE_LIST","_pointers","_addPointerStart","_addPointerMove","_addPointerEnd","onDown","MSPOINTER_TYPE_MOUSE","_handlePointer","_pointerDocListener","pointerUp","_globalPointerUp","_globalPointerDown","_globalPointerMove","pointerId","changedTouches","onMove","onUp","touchZoom","bounceAtZoomLimits","TouchZoom","_onTouchStart","_zooming","_centerPoint","_startLatLng","_pinchStartLatLng","_startDist","_startZoom","_onTouchMove","_onTouchEnd","moveFn","tap","tapTolerance","Tap","_fireClick","_holdTimeout","_isTapValid","_simulateEvent","touchmove","simulatedEvent","createEvent","initMouseEvent","screenX","screenY","dispatchEvent","BoxZoom","_pane","overlayPane","_onMouseDown","_resetState","contextmenu","mouseup","_onMouseUp","keydown","_onKeyDown","_box","_finish","boxZoomBounds","keyboardPanDelta","Keyboard","keyCodes","up","_setPanDelta","_setZoomDelta","_onFocus","_onBlur","_addHooks","_removeHooks","_focused","docEl","scrollTo","panDelta","_panKeys","codes","_zoomKeys","altKey","ctrlKey","metaKey","_marker","_oldLatLng","shadow","iconPos","Control","removeControl","addControl","corner","_controlCorners","_refocusOnMap","control","createCorner","vSide","hSide","corners","_controlContainer","Zoom","zoomInText","zoomInTitle","zoomOutText","zoomOutTitle","zoomName","_zoomInButton","_createButton","_zoomIn","_zoomOutButton","_zoomOut","_updateDisabled","_disabled","zoomControl","Attribution","_attributions","setPrefix","attribs","prefixAndAttribs","Scale","metric","imperial","_addScales","_mScale","_iScale","maxMeters","_updateScales","_updateMetric","_updateImperial","meters","_getRoundNum","_updateScale","maxMiles","miles","feet","maxFeet","pow10","Layers","collapsed","autoZIndex","hideSingleBase","sortLayers","sortFunction","layerA","layerB","nameA","nameB","baseLayers","overlays","_lastZIndex","_handlingClick","_addLayer","_checkDisabledLayers","_onLayerChange","addBaseLayer","addOverlay","_getLayer","expand","_form","acceptableHeight","offsetTop","collapse","mouseenter","mouseleave","_layersLink","_onInputClick","_baseLayersList","_separator","_overlaysList","overlay","baseLayersPresent","overlaysPresent","baseLayersCount","_addItem","_createRadioElement","checked","radioHtml","radioFragment","defaultChecked","layerId","inputs","addedLayers","removedLayers","disabled","_expand","_collapse","19","getNative","DataView","./_getNative","./_root","20","Hash","hashClear","hashDelete","hashGet","hashHas","hashSet","./_hashClear","./_hashDelete","./_hashGet","./_hashHas","./_hashSet","21","ListCache","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","./_listCacheClear","./_listCacheDelete","./_listCacheGet","./_listCacheHas","./_listCacheSet","22","23","MapCache","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","./_mapCacheClear","./_mapCacheDelete","./_mapCacheGet","./_mapCacheHas","./_mapCacheSet","24","Promise","25","Set","26","SetCache","values","__data__","setCacheAdd","setCacheHas","./_MapCache","./_setCacheAdd","./_setCacheHas","27","Stack","stackClear","stackDelete","stackGet","stackHas","stackSet","./_ListCache","./_stackClear","./_stackDelete","./_stackGet","./_stackHas","./_stackSet","28","Symbol","29","30","WeakMap","31","arrayLikeKeys","inherited","isArguments","baseTimes","String","skipIndexes","isIndex","objectProto","./_baseTimes","./_isIndex","./isArguments","./isArray","32","arrayMap","iteratee","33","arrayReduce","accumulator","initAccum","34","arraySome","predicate","35","assocIndexOf","./eq","36","baseForOwn","createBaseEach","baseEach","./_baseForOwn","./_createBaseEach","37","createBaseFor","baseFor","./_createBaseFor","38","./_baseFor","./keys","39","baseGet","isKey","castPath","toKey","./_castPath","./_isKey","./_toKey","40","baseGetTag","objectToString","41","baseHasIn","42","baseIsEqual","customizer","bitmask","isObjectLike","baseIsEqualDeep","./_baseIsEqualDeep","./isObject","./isObjectLike","43","equalFunc","objIsArr","othIsArr","objTag","arrayTag","othTag","getTag","argsTag","objectTag","objIsObj","othIsObj","isSameTag","isTypedArray","equalArrays","equalByTag","PARTIAL_COMPARE_FLAG","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","equalObjects","./_Stack","./_equalArrays","./_equalByTag","./_equalObjects","./_getTag","./isTypedArray","44","baseIsMatch","matchData","noCustomizer","objValue","srcValue","UNORDERED_COMPARE_FLAG","./_baseIsEqual","45","baseIsNative","isMasked","reIsNative","reIsHostCtor","toSource","reRegExpChar","funcProto","Function","funcToString","./_isMasked","./_toSource","./isFunction","46","baseIsTypedArray","isLength","typedArrayTags","boolTag","dateTag","errorTag","funcTag","mapTag","numberTag","regexpTag","setTag","stringTag","weakMapTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","./isLength","47","baseIteratee","identity","baseMatchesProperty","baseMatches","./_baseMatches","./_baseMatchesProperty","./identity","./property","48","baseKeys","isPrototype","nativeKeys","./_isPrototype","./_nativeKeys","49","baseMap","collection","isArrayLike","./_baseEach","./isArrayLike","50","getMatchData","matchesStrictComparable","./_baseIsMatch","./_getMatchData","./_matchesStrictComparable","51","isStrictComparable","hasIn","./_isStrictComparable","./get","./hasIn","52","baseProperty","53","basePropertyDeep","./_baseGet","54","baseReduce","eachFunc","55","56","baseToString","isSymbol","symbolToString","INFINITY","symbolProto","./_Symbol","./isSymbol","57","baseUnary","58","cacheHas","59","stringToPath","./_stringToPath","60","coreJsData","61","fromRight","iterable","62","keysFunc","63","isPartial","arrLength","othLength","stacked","seen","arrValue","othValue","compared","othIndex","./_SetCache","./_arraySome","./_cacheHas","64","byteLength","byteOffset","buffer","mapToArray","setToArray","symbolTag","symbolValueOf","valueOf","./_Uint8Array","./_mapToArray","./_setToArray","65","objProps","objLength","othProps","skipCtor","objCtor","othCtor","66","freeGlobal","67","getMapData","isKeyable","./_isKeyable","68","69","getValue","./_baseIsNative","./_getValue","70","promiseTag","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","ArrayBuffer","resolve","Ctor","ctorString","./_DataView","./_Map","./_Promise","./_Set","./_WeakMap","./_baseGetTag","71","72","hasPath","hasFunc","73","nativeCreate","./_nativeCreate","74","75","HASH_UNDEFINED","76","77","78","MAX_SAFE_INTEGER","reIsUint","79","reIsPlainProp","reIsDeepProp","80","81","maskSrcKey","uid","IE_PROTO","./_coreJsData","82","83","84","85","arrayProto","./_assocIndexOf","86","87","88","89","./_Hash","90","./_getMapData","91","92","93","94","95","96","memoizeCapped","memoize","MAX_MEMOIZE_SIZE","./memoize","97","98","overArg","./_overArg","99","freeExports","freeModule","moduleExports","freeProcess","process","nodeUtil","binding","./_freeGlobal","100","101","freeSelf","102","103","104","105","106","107","108","109","pairs","LARGE_ARRAY_SIZE","110","reLeadingDot","rePropName","reEscapeChar","./_memoizeCapped","./toString","111","112","113","114","defaultValue","115","./_baseHasIn","./_hasPath","116","117","isArrayLikeObject","./isArrayLikeObject","118","119","120","121","genTag","122","123","124","125","126","nodeIsTypedArray","./_baseIsTypedArray","./_baseUnary","./_nodeUtil","127","./_arrayLikeKeys","./_baseKeys","128","./_arrayMap","./_baseIteratee","./_baseMap","129","resolver","FUNC_ERROR_TEXT","memoized","Cache","130","./_baseProperty","./_basePropertyDeep","131","./_arrayReduce","./_baseReduce","132","./_baseToString","133","callWithJQuery","pivotModule","pivotUtilities","d3_renderers","Treemap","pivotData","addToTree","ref","rowKey","tree","treemap","localeStrings","newChild","getRowKeys","getAggregator","category10","layout","datum","selectAll","enter","134","makeGoogleChart","chartType","extraOptions","agg","base1","colKey","colKeys","dataArray","fullAggName","groupByTitle","hAxisTitle","len1","numCharsInHAxis","rowKeys","tree2","vAxisTitle","vs","by","gchart","innerWidth","innerHeight","getColKeys","aggregatorName","valAttrs","results","google","visualization","addColumn","colAttrs","rowAttrs","role","addRows","isNumeric","toPrecision","arrayToDataTable","hAxis","slantedText","vAxis","textStyle","fontName","fontSize","minValue","legend","chartArea","ChartWrapper","editor","ChartEditor","getChartWrapper","openDialog","gchart_renderers","Line Chart","Bar Chart","Stacked Bar Chart","isStacked","Area Chart","Scatter Chart","135","proj4","testkey","processedKey","lkey","ignoredChar","Parser","place","currentObject","NEUTRAL","parseString","txt","mapit","thing","newObj","sExpr","rf","rename","outName","inName","d2r","D2R$1","cleanWKT","wkt","toMeter","to_meter","projName","local","PROJECTION","UNIT","units","DATUM","SPHEROID","geogcs","GEOGCS","datumCode","sphere","ellps","renamer","long0","longc","lat_ts","lat0","defs","parseProj","EPSG","ESRI","IAU2000","testObj","testDef","testWKT","codeWords","some","testProj","es","x0","y0","k0","msfnz","R2D","HALF_PI","EPSLN","adjust_lon","FORTPI","sinphi","tsfnz","inverse","phi2z","init$1","pt","proj","projStore","names$$1","projs","eccentricity","R_A","a2","b2","SIXTH","RA4","RA6","ep2","ellipse","exports$2","WGS84","datum_params","datum_type","PJD_NODATUM","PJD_WGS84","PJD_3PARAM","PJD_7PARAM","SEC_TO_RAD","Projection$1","srsCode","ourProj","projections","datumDef","exports$3","towgs84","datumName","axis","sphere_","ecc","datumObj","compareDatums","geodeticToGeocentric","Rn","Sin_Lat","Sin2_Lat","Cos_Lat","Longitude","Latitude","Height","geocentricToGeodetic","P","RR","CT","ST","RX","RK","RN","CPHI0","SPHI0","CPHI","SPHI","SDPHI","genau","genau2","maxiter","X","Y","Z","geocentricToWgs84","Dx_BF","Dy_BF","Dz_BF","Rx_BF","Ry_BF","Rz_BF","M_BF","geocentricFromWgs84","x_tmp","y_tmp","z_tmp","checkParams","checkNotWGS","wgs84","toPoint","adjust_axis","D2R","from_greenwich","datum_transform","transformer","transformedArray","checkProj","oProj","proj4$1","fromProj","toProj","coord","single","forward$1","ll","encode","LLtoUTM","inverse$1","mgrs","UTMtoLL","decode","toPoint$1","degToRad","deg","radToDeg","LongOrigin","eccPrimeSquared","N","T","LongOriginRad","ZoneNumber","Lat","Long","eccSquared","LatRad","LongRad","UTMEasting","UTMNorthing","northing","easting","zoneNumber","zoneLetter","getLetterDesignator","utm","N1","T1","C1","R1","D","mu","phi1Rad","e1","topRight","LetterDesignator","seasting","snorthing","get100kID","setParm","get100kSetForZone","setColumn","setRow","getLetter100kID","NUM_100K_SETS","parm","colOrigin","SET_ORIGIN_COLUMN_LETTERS","charCodeAt","rowOrigin","SET_ORIGIN_ROW_LETTERS","colInt","rowInt","rollover","O","V","twoLetter","fromCharCode","mgrsString","testChar","hunK","sb","east100k","getEastingFromChar","north100k","getNorthingFromChar","getMinNorthing","remainder","accuracyBonus","sepEastingString","sepNorthingString","sep","sepEasting","sepNorthing","curCol","eastingValue","rewindMarker","curRow","northingValue","warn","init$2","en","pj_enfn","ml0","pj_mlfn","forward$2","delta_lon","sin_phi","cos_phi","al","als","tq","ml","inverse$2","pj_inv_mlfn","tan_phi","ds","sign","temp","asin","init$3","cgb","cbg","utg","gtu","np","Qn","gatg","Zb","clens","forward$3","Ce","Cn","sin_Cn","cos_Cn","sin_Ce","cos_Ce","hypot","asinhy","clens_cmplx","inverse$3","init$4","zone","adjust_zone","utmSouth","etmerc","init$6","sphi","cphi","rc","phic0","ratexp","K","srat","forward$5","inverse$5","DEL_TOL","MAX_ITER$1","init$5","gauss","sinc0","cosc0","R2","forward$4","sinc","cosc","cosl","inverse$4","ssfn_","phit","eccen","init$7","coslat0","sinlat0","cons","ms1","X0","cosX0","sinX0","forward$6","sinX","cosX","rh","sinlat","coslat","dlon","inverse$6","ce","Chi","init$8","phy0","lambda0","sinPhy0","semiMajorAxis","invF","flattening","e2","b0","k1","k2","k3","forward$7","Sa1","Sa2","rotI","rotB","inverse$7","lambda","phy","prevPhy","iteration","init$9","no_off","no_rot","t0","fl","gl","hl","jl","pl","dlon12","long1","long2","dlon10","gamma0","uc","forward$8","us","ql","tl","vl","POSITIVE_INFINITY","inverse$8","qp","sp","init$10","sin1","cos1","ts1","sin2","cos2","ms2","ts2","ts0","ns","f0","forward$9","rh1","theta","inverse$9","init$11","s45","s90","fi0","alfa","uq","u0","n0","s0","ro0","ad","forward$10","gfi","deltav","eps","ro","czech","inverse$10","fi1","init$12","e0","e0fn","e1fn","e2fn","e3","e3fn","mlfn","forward$11","lam","cosphi","nl","gN","asq","cl","inverse$11","ml1","phi1","imlfn","nl1","rl1","tl1","dsq","adjust_lat","init$13","mode","S_POLE","N_POLE","EQUIT","OBLIQ","qsfnz","mmf","apa","authset","rq","xmf","ymf","sinb1","cosb1","sinph0","cosph0","forward$12","coslam","sinlam","sinb","cosb","phi0","inverse$12","cCe","sCe","ab","cosz","sinz","authlat","APA","P00","P01","P10","P02","P11","P20","beta","init$14","sin_po","cos_po","qs1","qs2","qs0","ns0","forward$13","qs","inverse$13","phi1z","eccent","com","asinz","eccnts","init$15","sin_p14","cos_p14","infinity_dist","forward$14","coslon","ksp","inverse$14","init$16","forward$15","inverse$15","iqsfnz","init$17","forward$16","dlat","inverse$16","init$18","forward$17","inverse$17","tanphi","MAX_ITER$2","mln","mlnp","ma","init$19","B_re","B_im","C_re","C_im","forward$18","delta_lat","d_phi","d_lambda","d_phi_n","d_psi","th_n_re1","th_n_im1","th_re","th_im","th_n_re","th_n_im","z_re","z_im","inverse$18","z_n_re1","z_n_im1","delta_x","delta_y","z_n_re","z_n_im","iterations","num_re","num_im","den_re","den_im","den2","d_psi_n","init$20","forward$19","inverse$19","init$21","C_y","C_x","forward$20","MAX_ITER$3","inverse$20","init$22","forward$21","delta_theta","inverse$21","init$23","ml2","forward$22","inverse$22","init$24","forward$23","sinth","costh","gsq","msq","inverse$23","xx","yy","xys","c1","c3","a1","m1","th1","init$25","sin_p12","cos_p12","forward$24","Mlp","Ml","Nl1","Nl","psi","Az","G","H","GH","Hs","kp","cos_c","s3","s4","s5","inverse$24","cosAz","Ee","init$26","forward$25","inverse$25","globals","GOOGLE","EPSILON","TWO_PI","SPI","exports$1","greenwich","lisbon","paris","bogota","madrid","rome","bern","jakarta","ferro","brussels","stockholm","athens","oslo","ft","us-ft","defData","paramName","paramVal","paramOutname","paramObj","lat_0","lat_1","lat_2","lon_0","lon_1","lon_2","lonc","x_0","y_0","k_0","r_a","south","unit","pm","nadgrids","legalAxis","KEYWORD","NUMBER","QUOTED","AFTERQUOTE","ENDED","whitespace","latin","endThings","digets","readCharicter","neutral","quoted","afterquote","afterItem","newObjects","lisp","destination","eccnth","names$1","merc","names$2","longlat","MERIT","ellipseName","SGS85","GRS80","IAU76","airy","APL4","NWL9D","mod_airy","andrae","aust_SA","GRS67","bessel","bess_nam","clrk66","clrk80","clrk58","CPM","delmbr","engelis","evrst30","evrst48","evrst56","evrst69","evrstSS","fschr60","fschr60m","fschr68","helmert","hough","intl","kaula","lerch","mprts","new_intl","plessis","krass","SEasia","walbeck","WGS60","WGS66","WGS7","ch1903","ggrs87","nad83","nad27","potsdam","carthage","hermannskogel","ire65","rassadiran","nzgd49","osgb36","s_jtsk","beduaram","gunung_segara","rnb72","denorm","xin","yin","zin","fromMGRS","mgrsStr","toMGRS","C00","C02","C04","C06","C08","C22","C44","C46","C48","C66","C68","C88","MAX_ITER","names$3","tmerc","log1py","pp","cos_2B","arg_r","hr1","hr2","arg_i","hi2","sin_arg_r","cos_arg_r","sinh_arg_i","cosh_arg_i","hi1","names$4","dependsOn","names$5","esinp","names$7","names$6","sterea","names$8","stere","names$9","somerc","names$10","omerc","names$11","lcc","names$12","krovak","names$13","cass","names$14","laea","names$15","aea","names$16","gnom","names$17","cea","names$18","eqc","names$19","poly","names$20","nzmg","names$21","mill","names$22","sinu","names$23","moll","names$24","eqdc","names$25","vandg","names$26","aeqd","names$27","ortho","includedProjections","Proj","defaultDatum","136","_isProj4Obj","isP4","_proj","_projFromCodeDef","unbounded","point2","urn","scales","_scales","resolutions","baseScale","nextScale","scaleDiff","zDiff","iZoom","nextZoom","downScale","_closestElement","downZoom","low","_callLevel","_projectedBounds","northWest","_projectedToNewLayerPoint","newTopLeft","leaflet","137","isArrayish","is-arrayish","138","getOwnPropertyDescriptor","139","engine","storages","plugins","createStore","../plugins/json2","../src/store-engine","../storages/all","140","json2Plugin","./lib/json2","141","this_value","rx_escapable","partial","mind","gap","rep","rx_one","rx_two","rx_three","rx_four","rx_dangerous","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","Boolean","\b","\t","\n","\f","\r","\"","\\","replacer","space","","reviver","walk","eval","SyntaxError","142","_privateStoreProps","_seenPlugins","_namespacePrefix","_namespaceRegexp","_legalNamespace","_storage","_testStorage","storage","testStr","write","read","_assignPluginFnProp","pluginFnProp","propName","oldFn","super_fn","newFnArgs","_serialize","_deserialize","strVal","defaultVal","store","storeAPI","addStorage","addPlugin","isList","seenPlugin","pluginProperties","optionalDefaultValue","namespacedKey","clearAll","hasNamespace","namespacePrefix","./util","143","make_assign","assign","props1","props2","etc","make_create","assignProps1","assignProps2","assignArgsList","make_trim","Global","144","oldFF-globalStorage","oldIE-userDataStorage","cookieStorage","memoryStorage","./cookieStorage","./localStorage","./memoryStorage","./oldFF-globalStorage","./oldIE-userDataStorage","./sessionStorage","145","_has","regexpStr","unescape","cookie","cookies","kvp","../src/util","146","removeItem","147","148","globalStorage","149","unfixedKey","fixedKey","fixKey","_withStorageEl","storageEl","storageName","attributes","XMLDocument","load","forbiddenCharsRegex","_makeIEStorageElFunction","addBehavior","storageOwner","storageContainer","scriptTag","ActiveXObject","frames","storeFunction","150","151","Wkt","isRectangle","trunc","verts","sameCoords","construct","component","components","multipoint","linestring","multilinestring","multiPolyline","multipolygon","multiPolygon","geometrycollection","comps","deconstruct","coordsFromLatLngs","_holes","MultiPolyline","MultiPolygon","mpgon","mpline","mpoint","152","beginsWith","endsWith","_wrapped","sub","initializer","wrapVertices","regExes","typeStr","spaces","numeric","comma","parenComma","doubleParenComma","trimParens","ogcTypes","crudeJson","fromObject","isCollection","fromJson","toObject","iring","oring","toJson","matches","ingest","pieces","extract","box","multipoints","subcomponents","x_cord","y_cord","polygons","153","_from","_id","_inBundle","_integrity","_location","_phantomChildren","_requested","escapedName","rawSpec","saveSpec","fetchSpec","_requiredBy","_resolved","_spec","_where","author","bugs","bundleDependencies","dependencies","deprecated","description","homepage","licenses","main","maintainers","email","repository","154","yasgui-utils","nestedExists","../package.json","./storage.js","./svg.js","155","isQuotaExceeded","quotaExceeded","times","day","month","year","onQuotaExceeded","XMLSerializer","serializeToString","getTime","removeAll","156","svgString","DOMParser","dom","parseFromString","svgContainer","157","license","devDependencies","bootstrap-sass","browserify","browserify-transform-tools","exorcist","gulp","gulp-autoprefixer","gulp-bump","gulp-clean-css","gulp-concat","gulp-connect","gulp-cssimport","gulp-delete-lines","gulp-embedlr","gulp-filter","gulp-git","gulp-html-replace","gulp-jsvalidate","gulp-livereload","gulp-minify-css","gulp-notify","gulp-rename","gulp-sass","gulp-sourcemaps","gulp-streamify","gulp-tag-version","gulp-uglify","node-sass","require-dir","run-sequence","vinyl-buffer","vinyl-source-stream","vinyl-transform","watchify","yasgui-yasqe","scripts","dev","build","patch","minor","major","web","browserify-shim","datatables.net","datatables.net-dt","jquery-ui","lodash","pivottable","proj4leaflet","wicket","optionalShim","../../lib/codemirror","datatables","jquery-ui/sortable","158","lineBreak","variables","querySolutions","bindings","addValueToString","csvString","createBody","addQuerySolutionToString","querySolution","needToQuoteString","needQuoting","159","yasr","resultsContainer","booleanVal","getBoolean","imgId","textVal","canHandleResults","hideFromSelection","getPriority","YASR-boolean","./imgs.js","160","useGoogleCharts","outputPlugins","drawOutputSelector","drawDownloadIcon","uriTarget","getUsedPrefixes","persistency","outputSelector","maxSize","161","./main.js","162","$container","getTryBtn","$tryBtn","tryQueryLink","getException","$header","status","statusText","responseText","corsMessage","163","GoogleTypeException","foundTypes","varName","toHtml","164","loadingMain","loadingFailed","loader","loadScript","protocol","maxTimeout","startTime","checkAndWait","googleLoad","packages","script","onreadystatechange","165","utils","chartWrapper","initEditor","getDataTable","setDataTable","chartConfig","containerId","wrapperId","$wrapper","setOption","updateHeader","priority","getPersistentSettings","motionChartState","setPersistentSettings","persSettings","getVariables","getDownloadInfo","svgEl","filename","contentType","buttonTitle","$table","tableToCsv","getEmbedHtml","htmlString","doDraw","jsonResults","getAsJson","getGoogleTypeForBindings","usedPrefixes","columnId","castGoogleType","getColumnType","getChartType","motionChart","getChart","getState","persistencyId","./exceptions.js","./gChartLoader.js","./utils.js","166","cross","check","unsorted","sortDesc","sortAsc","download","fullscreen","smallscreen","167","./tableToCsv.js","168","addRowToString","rowArray","$el","rowspans","totalColCount","$tr","htmlColId","actualColId","rowSpan","$cell","colspan","rowspan","169","defaultColor","defaultStyle","getSvgMarker","colors","fillColor2","borderColor2","addPopupAndEventsToMarker","zoomToEl","popupContent","formatPopup","plotVariable","hasLabel","_L","plotVariables","getGeoVariables","mapWrapper","mapConstructor","maps","defaultMap","mapLayers","defaultOverlay","getBindings","varId","getColor","colorBinding","mySVGIcon","markerPos","shouldDrawSeparateMarker","group","missingPopupMsg","prepend","geoKeywords","valueIsGeometric","geoVars","checkedVars","bindingVar","osm","nlmaps","chmaps","stopoAttr","tilelayer","continuousWorld","forVariable","geoVariables","disabledTitle","wicket/wicket","wicket/wicket-leaflet","170","queryResults","getPersistencyId","pluginName","downloadIcon","embedButton","outputPlugin","selectedOutput","selectedOutputPriority","unsupportedOutputs","tryOutput","disableOutputs","outputToDraw","outputs","outputName","somethingDrawn","setResponse","dataOrJqXhr","textStatus","jqXhrOrErrorString","exception","resultsId","getOriginalResponseAsString","getAsStoreObject","$toggableWarning","$toggableWarningClose","$toggableWarningMsg","warning","blobDownloadSupported","checkBlobDownloadSupported","windowUrl","URL","webkitURL","mozURL","msURL","Blob","embedBtn","drawHeader","btnGroup","stringToUrl","blob","createObjectURL","currentPlugin","downloadInfo","downloadUrl","downloadMockLink","fireClick","drawFullscreenButton","drawSmallscreenButton","drawEmbedButton","embedLink","prePopup","positions","persistentId","fromStorage","deprId","registerOutput","./boolean.js","./defaults.js","./error.js","./gchart.js","./jquery/extendJquery.js","./leaflet.js","./parsers/wrapper.js","./pivot.js","./rawResponse.js","./table.js","171","queryResponse","./dlv.js","172","detectType","mapVariable","rowIt","colIt","mapValue","isBoolean","varsFetched","../../lib/jquery.csv-0.71.js","173","getAsObject","entity","responseJson","hasContext","mapped","subject","value1","graphs","reduced","memo","triple","lodash/map","lodash/reduce","174","175","176","xml","tsv","graphJson","origResponse","errorString","getResponseHeader","ct","response","getParserFromContentType","doLuckyGuess","getOriginalResponse","responseString","getType","getOriginalContentType","./csv.js","./graphJson.js","./json.js","./tsv.js","./xml.js","177","parseHead","headNodeIt","headNode","parseResults","resultIt","resultNode","jsonResult","bindingIt","bindingNode","bindingInfIt","bindingInf","datatype","parseBoolean","mainXml","parseXML","isXMLDoc","178","yUtils","imgs","pivotUI","useD3Chart","renderers","$pivotWrapper","mergeLabelPostfix","getShownVariables","mergeLabelsWithUris","shownVariables","formatForPivot","uriToPrefixed","validatePivotTableOptions","pivotOptions","keepColsAndRows","pivotOptionse","rendererName","onRefresh","pivotObj","pivotTable","vals","openGchartBtn","originalRefresh","pivot","newSettings","YASR-rawResponse","pivottable/dist/d3_renderers.js","pivottable/dist/gchart_renderers.js","179","cmOptions","refresh","readOnly","lineNumbers","lineWrapping","gutters","codemirror/addon/edit/matchbrackets.js","codemirror/addon/fold/brace-fold.js","codemirror/addon/fold/foldcode.js","codemirror/addon/fold/foldgutter.js","codemirror/addon/fold/xml-fold.js","codemirror/mode/javascript/javascript.js","codemirror/mode/xml/xml.js","180","yutils","tableLengthPersistencyId","tableLength","getRows","colId","sparqlVar","getCellContent","addEvents","drawSvgIcons","callbacks","handlers","delegate","onCellClick","onCellMouseEnter","tdEl","fetchTitlesFromPreflabel","addPrefLabel","onCellMouseLeave","dataTableConfig","datatable","getColumns","pLength","pageLength","sortings","sorting_asc","sorting_desc","svgDiv","formatLiteral","literalBinding","stringRepresentation","escapeHtmlEntities","xmlSchemaNs","visibleString","postFix","addEmptyTitle","fail","includeVariable","variableToCheck","autoWidth","lengthMenu","lengthChange","pagingType","drawCallback","activePaginateButton","columnDefs","YASR-table","jquery-datatables","../lib/colResizable-1.4.js","./bindingsToCsv.js","181","unescaped","prefixes","uri","getGoogleTypeForBinding","typeCount","googleType","date","parseXmlSchemaDate","$els","oEvent","dateString"],"mappings":"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","file":"yasr.min.js","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})","/**\n               _ _____           _          _     _      \n              | |  __ \\         (_)        | |   | |     \n      ___ ___ | | |__) |___  ___ _ ______ _| |__ | | ___ \n     / __/ _ \\| |  _  // _ \\/ __| |_  / _` | '_ \\| |/ _ \\\n    | (_| (_) | | | \\ \\  __/\\__ \\ |/ / (_| | |_) | |  __/\n     \\___\\___/|_|_|  \\_\\___||___/_/___\\__,_|_.__/|_|\\___|\n\t \n\tv 1.4 - a jQuery plugin by Alvaro Prieto Lauroba\n\t\n\tLicences: MIT & GPL\n\tFeel free to use or modify this plugin as far as my full name is kept\t\n\t\n\tIf you are going to use this plugin in production environments it is \n\tstrongly recomended to use its minified version: colResizable.min.js\n\n*/\n\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\t\n\tvar d = $(document); \t\t//window object\n\tvar h = $(\"head\");\t\t\t//head object\n\tvar drag = null;\t\t\t//reference to the current grip that is being dragged\n\tvar tables = [];\t\t\t//array of the already processed tables (table.id as key)\n\tvar\tcount = 0;\t\t\t\t//internal count to create unique IDs when needed.\t\n\t\n\t//common strings for minification\t(in the minified version there are plenty more)\n\tvar ID = \"id\";\t\n\tvar PX = \"px\";\n\tvar SIGNATURE =\"JColResizer\";\n\t\n\t//shortcuts\n\tvar I = parseInt;\n\tvar M = Math;\n\tvar ie = navigator.userAgent.indexOf('Trident/4.0')>0;\n\tvar S;\n\ttry{S = sessionStorage;}catch(e){}\t//Firefox crashes when executed as local file system\n\t\n\t//append required CSS rules  \n\th.append(\"<style type='text/css'>  .JColResizer{table-layout:fixed;} .JColResizer td, .JColResizer th{overflow:hidden;padding-left:0!important; padding-right:0!important;}  .JCLRgrips{ height:0px; position:relative;} .JCLRgrip{margin-left:-5px; position:absolute; z-index:5; } .JCLRgrip .JColResizer{position:absolute;background-color:red;filter:alpha(opacity=1);opacity:0;width:10px;height:100%;top:0px} .JCLRLastGrip{position:absolute; width:1px; } .JCLRgripDrag{ border-left:1px dotted black;\t}</style>\");\n\n\t\n\t/**\n\t * Function to allow column resizing for table objects. It is the starting point to apply the plugin.\n\t * @param {DOM node} tb - refrence to the DOM table object to be enhanced\n\t * @param {Object} options\t- some customization values\n\t */\n\tvar init = function( tb, options){\t\n\t\tvar t = $(tb);\t\t\t\t\t\t\t\t\t\t//the table object is wrapped\n\t\tif(options.disable) return destroy(t);\t\t\t\t//the user is asking to destroy a previously colResized table\n\t\tvar\tid = t.id = t.attr(ID) || SIGNATURE+count++;\t//its id is obtained, if null new one is generated\t\t\n\t\tt.p = options.postbackSafe; \t\t\t\t\t\t//shortcut to detect postback safe \t\t\n\t\tif(!t.is(\"table\") || tables[id]) return; \t\t\t//if the object is not a table or if it was already processed then it is ignored.\n\t\tt.addClass(SIGNATURE).attr(ID, id).before('<div class=\"JCLRgrips\"/>');\t//the grips container object is added. Signature class forces table rendering in fixed-layout mode to prevent column's min-width\n\t\tt.opt = options; t.g = []; t.c = []; t.w = t.width(); t.gc = t.prev();\t//t.c and t.g are arrays of columns and grips respectively\t\t\t\t\n\t\tif(options.marginLeft) t.gc.css(\"marginLeft\", options.marginLeft);  \t//if the table contains margins, it must be specified\n\t\tif(options.marginRight) t.gc.css(\"marginRight\", options.marginRight);  \t//since there is no (direct) way to obtain margin values in its original units (%, em, ...)\n\t\tt.cs = I(ie? tb.cellSpacing || tb.currentStyle.borderSpacing :t.css('border-spacing'))||2;\t//table cellspacing (not even jQuery is fully cross-browser)\n\t\tt.b  = I(ie? tb.border || tb.currentStyle.borderLeftWidth :t.css('border-left-width'))||1;\t//outer border width (again cross-browser isues)\n\t\t// if(!(tb.style.width || tb.width)) t.width(t.width()); //I am not an IE fan at all, but it is a pitty that only IE has the currentStyle attribute working as expected. For this reason I can not check easily if the table has an explicit width or if it is rendered as \"auto\"\n\t\ttables[id] = t; \t//the table object is stored using its id as key\t\n\t\tcreateGrips(t);\t\t//grips are created\n\t\n\t};\n\n\n\t/**\n\t * This function allows to remove any enhancements performed by this plugin on a previously processed table.\n\t * @param {jQuery ref} t - table object\n\t */\n\tvar destroy = function(t){\n\t\tvar id=t.attr(ID), t=tables[id];\t\t//its table object is found\n\t\tif(!t||!t.is(\"table\")) return;\t\t\t//if none, then it wasnt processed\t \n\t\tt.removeClass(SIGNATURE).gc.remove();\t//class and grips are removed\n\t\tdelete tables[id];\t\t\t\t\t\t//clean up data\n\t};\n\n\n\t/**\n\t * Function to create all the grips associated with the table given by parameters \n\t * @param {jQuery ref} t - table object\n\t */\n\tvar createGrips = function(t){\t\n\t\n\t\tvar th = t.find(\">thead>tr>th,>thead>tr>td\");\t//if table headers are specified in its semantically correct tag, are obtained\n\t\tif(!th.length) th = t.find(\">tbody>tr:first>th,>tr:first>th,>tbody>tr:first>td, >tr:first>td\");\t //but headers can also be included in different ways\n\t\tt.cg = t.find(\"col\"); \t\t\t\t\t\t//a table can also contain a colgroup with col elements\t\t\n\t\tt.ln = th.length;\t\t\t\t\t\t\t//table length is stored\t\n\t\tif(t.p && S && S[t.id])memento(t,th);\t\t//if 'postbackSafe' is enabled and there is data for the current table, its coloumn layout is restored\n\t\tth.each(function(i){\t\t\t\t\t\t//iterate through the table column headers\t\t\t\n\t\t\tvar c = $(this); \t\t\t\t\t\t//jquery wrap for the current column\t\t\t\n\t\t\tvar g = $(t.gc.append('<div class=\"JCLRgrip\"></div>')[0].lastChild); //add the visual node to be used as grip\n\t\t\tg.t = t; g.i = i; g.c = c;\tc.w =c.width();\t\t//some values are stored in the grip's node data\n\t\t\tt.g.push(g); t.c.push(c);\t\t\t\t\t\t//the current grip and column are added to its table object\n\t\t\tc.width(c.w).removeAttr(\"width\");\t\t\t\t//the width of the column is converted into pixel-based measurements\n\t\t\tif (i < t.ln-1) {\n\t\t\t\tg.bind('touchstart mousedown', onGripMouseDown).append(t.opt.gripInnerHtml).append('<div class=\"'+SIGNATURE+'\" style=\"cursor:'+t.opt.hoverCursor+'\"></div>'); //bind the mousedown event to start dragging \n\t\t\t} else g.addClass(\"JCLRLastGrip\").removeClass(\"JCLRgrip\");\t//the last grip is used only to store data\t\t\t\n\t\t\tg.data(SIGNATURE, {i:i, t:t.attr(ID)});\t\t\t\t\t\t//grip index and its table name are stored in the HTML \t\t\t\t\t\t\t\t\t\t\t\t\n\t\t}); \t\n\t\tt.cg.removeAttr(\"width\");\t//remove the width attribute from elements in the colgroup (in any)\n\t\tsyncGrips(t); \t\t\t\t//the grips are positioned according to the current table layout\t\t\t\n\t\t//there is a small problem, some cells in the table could contain dimension values interfering with the \n\t\t//width value set by this plugin. Those values are removed\n\t\tt.find('td, th').not(th).not('table th, table td').each(function(){  \n\t\t\t$(this).removeAttr('width');\t//the width attribute is removed from all table cells which are not nested in other tables and dont belong to the header\n\t\t});\t\t\n\n\t\t\n\t};\n\t\n\n\t/**\n\t * Function to allow the persistence of columns dimensions after a browser postback. It is based in\n\t * the HTML5 sessionStorage object, which can be emulated for older browsers using sessionstorage.js\n\t * @param {jQuery ref} t - table object\n\t * @param {jQuery ref} th - reference to the first row elements (only set in deserialization)\n\t */\n\tvar memento = function(t, th){ \n\t\tvar w,m=0,i=0,aux =[];\n\t\tif(th){\t\t\t\t\t\t\t\t\t\t//in deserialization mode (after a postback)\n\t\t\tt.cg.removeAttr(\"width\");\n\t\t\tif(t.opt.flush){ S[t.id] =\"\"; return;} \t//if flush is activated, stored data is removed\n\t\t\tw = S[t.id].split(\";\");\t\t\t\t\t//column widths is obtained\n\t\t\tfor(;i<t.ln;i++){\t\t\t\t\t\t//for each column\n\t\t\t\taux.push(100*w[i]/w[t.ln]+\"%\"); \t//width is stored in an array since it will be required again a couple of lines ahead\n\t\t\t\tth.eq(i).css(\"width\", aux[i] ); \t//each column width in % is resotred\n\t\t\t}\t\t\t\n\t\t\tfor(i=0;i<t.ln;i++)\n\t\t\t\tt.cg.eq(i).css(\"width\", aux[i]);\t//this code is required in order to create an inline CSS rule with higher precedence than an existing CSS class in the \"col\" elements\n\t\t}else{\t\t\t\t\t\t\t//in serialization mode (after resizing a column)\n\t\t\tS[t.id] =\"\";\t\t\t\t//clean up previous data\n\t\t\tfor(;i < t.c.length; i++){\t\t//iterate through columns\n\t\t\t\n\t\t\t\tw = t.c[i].width();\t\t//width is obtained\n\t\t\t\tS[t.id] += w+\";\";\t\t//width is appended to the sessionStorage object using ID as key\n\t\t\t\tm+=w;\t\t\t\t\t//carriage is updated to obtain the full size used by columns\n\t\t\t}\n\t\t\tS[t.id]+=m;\t\t\t\t\t//the last item of the serialized string is the table's active area (width), \n\t\t\t\t\t\t\t\t\t\t//to be able to obtain % width value of each columns while deserializing\n\t\t}\t\n\t};\n\t\n\t\n\t/**\n\t * Function that places each grip in the correct position according to the current table layout\t * \n\t * @param {jQuery ref} t - table object\n\t */\n\tvar syncGrips = function (t){\t\n\t\tt.gc.width(t.w);\t\t\t//the grip's container width is updated\t\t\t\t\n\t\tfor(var i=0; i<t.ln; i++){\t//for each column\n\t\t\tvar c = t.c[i]; \t\t\t\n\t\t\tt.g[i].css({\t\t\t//height and position of the grip is updated according to the table layout\n\t\t\t\tleft: c.offset().left - t.offset().left + c.outerWidth(false) + t.cs / 2 + PX,\n\t\t\t\theight: t.opt.headerOnly? t.c[0].outerHeight(false) : t.outerHeight(false)\t\t\t\t\n\t\t\t});\t\t\t\n\t\t} \t\n\t};\n\t\n\t\n\t\n\t/**\n\t* This function updates column's width according to the horizontal position increment of the grip being\n\t* dragged. The function can be called while dragging if liveDragging is enabled and also from the onGripDragOver\n\t* event handler to synchronize grip's position with their related columns.\n\t* @param {jQuery ref} t - table object\n\t* @param {nunmber} i - index of the grip being dragged\n\t* @param {bool} isOver - to identify when the function is being called from the onGripDragOver event\t\n\t*/\n\tvar syncCols = function(t,i,isOver){\n\t\tvar inc = drag.x-drag.l, c = t.c[i], c2 = t.c[i+1]; \t\t\t\n\t\tvar w = c.w + inc;\tvar w2= c2.w- inc;\t//their new width is obtained\t\t\t\t\t\n\t\tc.width( w + PX);\tc2.width(w2 + PX);\t//and set\t\n\t\tt.cg.eq(i).width( w + PX); t.cg.eq(i+1).width( w2 + PX);\n\t\tif(isOver){c.w=w; c2.w=w2;}\n\t};\n\n\t\n\t/**\n\t * Event handler used while dragging a grip. It checks if the next grip's position is valid and updates it. \n\t * @param {event} e - mousemove event binded to the window object\n\t */\n\tvar onGripDrag = function(e){\t\n\t\tif(!drag) return; var t = drag.t;\t\t//table object reference \n\t\t\n\t\tif (e.originalEvent.touches) {\n\t\t\tvar x = e.originalEvent.touches[0].pageX - drag.ox + drag.l;\t\t//next position according to horizontal mouse position increment\n\t\t} else {\n\t\t\tvar x = e.pageX - drag.ox + drag.l;\t\t//next position according to horizontal mouse position increment\n\t\t}\n\t\t\n\t\t\n\t\t\t\n\t\tvar mw = t.opt.minWidth, i = drag.i ;\t//cell's min width\n\t\tvar l = t.cs*1.5 + mw + t.b;\n\n\t\tvar max = i == t.ln-1? t.w-l: t.g[i+1].position().left-t.cs-mw; //max position according to the contiguous cells\n\t\tvar min = i? t.g[i-1].position().left+t.cs+mw: l;\t\t\t\t//min position according to the contiguous cells\n\t\t\n\t\tx = M.max(min, M.min(max, x));\t\t\t\t\t\t//apply boundings\t\t\n\t\tdrag.x = x;\t drag.css(\"left\",  x + PX); \t\t\t//apply position increment\t\t\n\t\t\t\n\t\tif(t.opt.liveDrag){ \t\t\t\t\t\t\t\t//if liveDrag is enabled\n\t\t\tsyncCols(t,i); syncGrips(t);\t\t\t\t\t//columns and grips are synchronized\n\t\t\tvar cb = t.opt.onDrag;\t\t\t\t\t\t\t//check if there is an onDrag callback\n\t\t\tif (cb) { e.currentTarget = t[0]; cb(e); }\t\t//if any, it is fired\t\t\t\n\t\t}\n\t\t\n\t\treturn false; \t//prevent text selection\t\t\t\t\n\t};\n\t\n\n\t/**\n\t * Event handler fired when the dragging is over, updating table layout\n\t */\n\tvar onGripDragOver = function(e){\t\n\t\t\n\t\td.unbind('touchend.'+SIGNATURE+' mouseup.'+SIGNATURE).unbind('touchmove.'+SIGNATURE+' mousemove.'+SIGNATURE);\n\t\t$(\"head :last-child\").remove(); \t\t\t\t//remove the dragging cursor style\t\n\t\tif(!drag) return;\n\t\tdrag.removeClass(drag.t.opt.draggingClass);\t\t//remove the grip's dragging css-class\n\t\tvar t = drag.t;\n\t\tvar cb = t.opt.onResize; \t\t\t//get some values\t\n\t\tif(drag.x){ \t\t\t\t\t\t\t\t\t//only if the column width has been changed\n\t\t\tsyncCols(t,drag.i, true);\tsyncGrips(t);\t//the columns and grips are updated\n\t\t\tif (cb) { e.currentTarget = t[0]; cb(e); }\t//if there is a callback function, it is fired\n\t\t}\n\t\tif(t.p && S) memento(t); \t\t\t\t\t\t//if postbackSafe is enabled and there is sessionStorage support, the new layout is serialized and stored\n\t\tdrag = null;\t\t\t\t\t\t\t\t\t//since the grip's dragging is over\t\t\t\t\t\t\t\t\t\n\t};\t\n\t\n\n\t/**\n\t * Event handler fired when the grip's dragging is about to start. Its main goal is to set up events \n\t * and store some values used while dragging.\n\t * @param {event} e - grip's mousedown event\n\t */\n\tvar onGripMouseDown = function(e){\n\t\tvar o = $(this).data(SIGNATURE);\t\t\t//retrieve grip's data\n\t\tvar t = tables[o.t],  g = t.g[o.i];\t\t\t//shortcuts for the table and grip objects\n\t\tif (e.originalEvent.touches) {\n\t\t\tg.ox = e.originalEvent.touches[0].pageX;\n\t\t} else {\n\t\t\tg.ox = e.pageX;\t//the initial position is kept\n\t\t}\n\t\tg.l = g.position().left;\n\t\td.bind('touchmove.'+SIGNATURE+' mousemove.'+SIGNATURE, onGripDrag).bind('touchend.'+SIGNATURE+' mouseup.'+SIGNATURE,onGripDragOver);\t//mousemove and mouseup events are bound\n\t\th.append(\"<style type='text/css'>*{cursor:\"+ t.opt.dragCursor +\"!important}</style>\"); \t//change the mouse cursor\n\t\tg.addClass(t.opt.draggingClass); \t//add the dragging class (to allow some visual feedback)\t\t\t\t\n\t\tdrag = g;\t\t\t\t\t\t\t//the current grip is stored as the current dragging object\n\t\tif(t.c[o.i].l) for(var i=0,c; i<t.ln; i++){ c=t.c[i]; c.l = false; c.w= c.width(); } \t//if the colum is locked (after browser resize), then c.w must be updated\t\t\n\t\treturn false; \t//prevent text selection\n\t};\n\t\n\t/**\n\t * Event handler fired when the browser is resized. The main purpose of this function is to update\n\t * table layout according to the browser's size synchronizing related grips \n\t */\n\tvar onResize = function(){\n\t\tfor(t in tables){\t\t\n\t\t\tvar t = tables[t], i, mw=0;\t\t\t\t\n\t\t\tt.removeClass(SIGNATURE);\t\t\t\t\t\t//firefox doesnt like layout-fixed in some cases\n\t\t\tif (t.w != t.width()) {\t\t\t\t\t\t\t//if the the table's width has changed\n\t\t\t\tt.w = t.width();\t\t\t\t\t\t\t//its new value is kept\n\t\t\t\tfor(i=0; i<t.ln; i++) mw+= t.c[i].w;\t\t//the active cells area is obtained\n\t\t\t\t//cell rendering is not as trivial as it might seem, and it is slightly different for\n\t\t\t\t//each browser. In the begining i had a big switch for each browser, but since the code\n\t\t\t\t//was extremelly ugly now I use a different approach with several reflows. This works \n\t\t\t\t//pretty well but it's a bit slower. For now, lets keep things simple...   \n\t\t\t\tfor(i=0; i<t.ln; i++) t.c[i].css(\"width\", M.round(1000*t.c[i].w/mw)/10 + \"%\").l=true; \n\t\t\t\t//c.l locks the column, telling us that its c.w is outdated\t\t\t\t\t\t\t\t\t\n\t\t\t}\n\t\t\tsyncGrips(t.addClass(SIGNATURE));\n\t\t}\n\t};\t\t\n\n\n\t//bind resize event, to update grips position \n\t$(window).bind('resize.'+SIGNATURE, onResize); \n\n\n\t/**\n\t * The plugin is added to the jQuery library\n\t * @param {Object} options -  an object containg some basic customization values \n\t */\n    $.fn.extend({  \n        colResizable: function(options) {           \n            var defaults = {\n\t\t\t\n\t\t\t\t//attributes:\n                draggingClass: 'JCLRgripDrag',\t//css-class used when a grip is being dragged (for visual feedback purposes)\n\t\t\t\tgripInnerHtml: '',\t\t\t\t//if it is required to use a custom grip it can be done using some custom HTML\t\t\t\t\n\t\t\t\tliveDrag: false,\t\t\t\t//enables table-layout updaing while dragging\t\t\t\n\t\t\t\tminWidth: 15, \t\t\t\t\t//minimum width value in pixels allowed for a column \n\t\t\t\theaderOnly: false,\t\t\t\t//specifies that the size of the the column resizing anchors will be bounded to the size of the first row \n\t\t\t\thoverCursor: \"e-resize\",  \t\t//cursor to be used on grip hover\n\t\t\t\tdragCursor: \"e-resize\",  \t\t//cursor to be used while dragging\n\t\t\t\tpostbackSafe: false, \t\t\t//when it is enabled, table layout can persist after postback. It requires browsers with sessionStorage support (it can be emulated with sessionStorage.js). Some browsers ony \n\t\t\t\tflush: false, \t\t\t\t\t//when postbakSafe is enabled, and it is required to prevent layout restoration after postback, 'flush' will remove its associated layout data \n\t\t\t\tmarginLeft: null,\t\t\t\t//in case the table contains any margins, colResizable needs to know the values used, e.g. \"10%\", \"15em\", \"5px\" ...\n\t\t\t\tmarginRight: null, \t\t\t\t//in case the table contains any margins, colResizable needs to know the values used, e.g. \"10%\", \"15em\", \"5px\" ...\n\t\t\t\tdisable: false,\t\t\t\t\t//disables all the enhancements performed in a previously colResized table\t\n\t\t\t\t\n\t\t\t\t//events:\n\t\t\t\tonDrag: null, \t\t\t\t\t//callback function to be fired during the column resizing process if liveDrag is enabled\n\t\t\t\tonResize: null\t\t\t\t\t//callback function fired when the dragging process is over\n            }\t\t\t\n\t\t\tvar options =  $.extend(defaults, options);\t\t\t\n            return this.each(function() {\t\t\t\t\n             \tinit( this, options);             \n            });\n        }\n    });\n\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.YASR = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n/**\n               _ _____           _          _     _      \n              | |  __ \\         (_)        | |   | |     \n      ___ ___ | | |__) |___  ___ _ ______ _| |__ | | ___ \n     / __/ _ \\| |  _  // _ \\/ __| |_  / _` | '_ \\| |/ _ \\\n    | (_| (_) | | | \\ \\  __/\\__ \\ |/ / (_| | |_) | |  __/\n     \\___\\___/|_|_|  \\_\\___||___/_/___\\__,_|_.__/|_|\\___|\n\t \n\tv 1.4 - a jQuery plugin by Alvaro Prieto Lauroba\n\t\n\tLicences: MIT & GPL\n\tFeel free to use or modify this plugin as far as my full name is kept\t\n\t\n\tIf you are going to use this plugin in production environments it is \n\tstrongly recomended to use its minified version: colResizable.min.js\n\n*/\n\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\t\n\tvar d = $(document); \t\t//window object\n\tvar h = $(\"head\");\t\t\t//head object\n\tvar drag = null;\t\t\t//reference to the current grip that is being dragged\n\tvar tables = [];\t\t\t//array of the already processed tables (table.id as key)\n\tvar\tcount = 0;\t\t\t\t//internal count to create unique IDs when needed.\t\n\t\n\t//common strings for minification\t(in the minified version there are plenty more)\n\tvar ID = \"id\";\t\n\tvar PX = \"px\";\n\tvar SIGNATURE =\"JColResizer\";\n\t\n\t//shortcuts\n\tvar I = parseInt;\n\tvar M = Math;\n\tvar ie = navigator.userAgent.indexOf('Trident/4.0')>0;\n\tvar S;\n\ttry{S = sessionStorage;}catch(e){}\t//Firefox crashes when executed as local file system\n\t\n\t//append required CSS rules  \n\th.append(\"<style type='text/css'>  .JColResizer{table-layout:fixed;} .JColResizer td, .JColResizer th{overflow:hidden;padding-left:0!important; padding-right:0!important;}  .JCLRgrips{ height:0px; position:relative;} .JCLRgrip{margin-left:-5px; position:absolute; z-index:5; } .JCLRgrip .JColResizer{position:absolute;background-color:red;filter:alpha(opacity=1);opacity:0;width:10px;height:100%;top:0px} .JCLRLastGrip{position:absolute; width:1px; } .JCLRgripDrag{ border-left:1px dotted black;\t}</style>\");\n\n\t\n\t/**\n\t * Function to allow column resizing for table objects. It is the starting point to apply the plugin.\n\t * @param {DOM node} tb - refrence to the DOM table object to be enhanced\n\t * @param {Object} options\t- some customization values\n\t */\n\tvar init = function( tb, options){\t\n\t\tvar t = $(tb);\t\t\t\t\t\t\t\t\t\t//the table object is wrapped\n\t\tif(options.disable) return destroy(t);\t\t\t\t//the user is asking to destroy a previously colResized table\n\t\tvar\tid = t.id = t.attr(ID) || SIGNATURE+count++;\t//its id is obtained, if null new one is generated\t\t\n\t\tt.p = options.postbackSafe; \t\t\t\t\t\t//shortcut to detect postback safe \t\t\n\t\tif(!t.is(\"table\") || tables[id]) return; \t\t\t//if the object is not a table or if it was already processed then it is ignored.\n\t\tt.addClass(SIGNATURE).attr(ID, id).before('<div class=\"JCLRgrips\"/>');\t//the grips container object is added. Signature class forces table rendering in fixed-layout mode to prevent column's min-width\n\t\tt.opt = options; t.g = []; t.c = []; t.w = t.width(); t.gc = t.prev();\t//t.c and t.g are arrays of columns and grips respectively\t\t\t\t\n\t\tif(options.marginLeft) t.gc.css(\"marginLeft\", options.marginLeft);  \t//if the table contains margins, it must be specified\n\t\tif(options.marginRight) t.gc.css(\"marginRight\", options.marginRight);  \t//since there is no (direct) way to obtain margin values in its original units (%, em, ...)\n\t\tt.cs = I(ie? tb.cellSpacing || tb.currentStyle.borderSpacing :t.css('border-spacing'))||2;\t//table cellspacing (not even jQuery is fully cross-browser)\n\t\tt.b  = I(ie? tb.border || tb.currentStyle.borderLeftWidth :t.css('border-left-width'))||1;\t//outer border width (again cross-browser isues)\n\t\t// if(!(tb.style.width || tb.width)) t.width(t.width()); //I am not an IE fan at all, but it is a pitty that only IE has the currentStyle attribute working as expected. For this reason I can not check easily if the table has an explicit width or if it is rendered as \"auto\"\n\t\ttables[id] = t; \t//the table object is stored using its id as key\t\n\t\tcreateGrips(t);\t\t//grips are created\n\t\n\t};\n\n\n\t/**\n\t * This function allows to remove any enhancements performed by this plugin on a previously processed table.\n\t * @param {jQuery ref} t - table object\n\t */\n\tvar destroy = function(t){\n\t\tvar id=t.attr(ID), t=tables[id];\t\t//its table object is found\n\t\tif(!t||!t.is(\"table\")) return;\t\t\t//if none, then it wasnt processed\t \n\t\tt.removeClass(SIGNATURE).gc.remove();\t//class and grips are removed\n\t\tdelete tables[id];\t\t\t\t\t\t//clean up data\n\t};\n\n\n\t/**\n\t * Function to create all the grips associated with the table given by parameters \n\t * @param {jQuery ref} t - table object\n\t */\n\tvar createGrips = function(t){\t\n\t\n\t\tvar th = t.find(\">thead>tr>th,>thead>tr>td\");\t//if table headers are specified in its semantically correct tag, are obtained\n\t\tif(!th.length) th = t.find(\">tbody>tr:first>th,>tr:first>th,>tbody>tr:first>td, >tr:first>td\");\t //but headers can also be included in different ways\n\t\tt.cg = t.find(\"col\"); \t\t\t\t\t\t//a table can also contain a colgroup with col elements\t\t\n\t\tt.ln = th.length;\t\t\t\t\t\t\t//table length is stored\t\n\t\tif(t.p && S && S[t.id])memento(t,th);\t\t//if 'postbackSafe' is enabled and there is data for the current table, its coloumn layout is restored\n\t\tth.each(function(i){\t\t\t\t\t\t//iterate through the table column headers\t\t\t\n\t\t\tvar c = $(this); \t\t\t\t\t\t//jquery wrap for the current column\t\t\t\n\t\t\tvar g = $(t.gc.append('<div class=\"JCLRgrip\"></div>')[0].lastChild); //add the visual node to be used as grip\n\t\t\tg.t = t; g.i = i; g.c = c;\tc.w =c.width();\t\t//some values are stored in the grip's node data\n\t\t\tt.g.push(g); t.c.push(c);\t\t\t\t\t\t//the current grip and column are added to its table object\n\t\t\tc.width(c.w).removeAttr(\"width\");\t\t\t\t//the width of the column is converted into pixel-based measurements\n\t\t\tif (i < t.ln-1) {\n\t\t\t\tg.bind('touchstart mousedown', onGripMouseDown).append(t.opt.gripInnerHtml).append('<div class=\"'+SIGNATURE+'\" style=\"cursor:'+t.opt.hoverCursor+'\"></div>'); //bind the mousedown event to start dragging \n\t\t\t} else g.addClass(\"JCLRLastGrip\").removeClass(\"JCLRgrip\");\t//the last grip is used only to store data\t\t\t\n\t\t\tg.data(SIGNATURE, {i:i, t:t.attr(ID)});\t\t\t\t\t\t//grip index and its table name are stored in the HTML \t\t\t\t\t\t\t\t\t\t\t\t\n\t\t}); \t\n\t\tt.cg.removeAttr(\"width\");\t//remove the width attribute from elements in the colgroup (in any)\n\t\tsyncGrips(t); \t\t\t\t//the grips are positioned according to the current table layout\t\t\t\n\t\t//there is a small problem, some cells in the table could contain dimension values interfering with the \n\t\t//width value set by this plugin. Those values are removed\n\t\tt.find('td, th').not(th).not('table th, table td').each(function(){  \n\t\t\t$(this).removeAttr('width');\t//the width attribute is removed from all table cells which are not nested in other tables and dont belong to the header\n\t\t});\t\t\n\n\t\t\n\t};\n\t\n\n\t/**\n\t * Function to allow the persistence of columns dimensions after a browser postback. It is based in\n\t * the HTML5 sessionStorage object, which can be emulated for older browsers using sessionstorage.js\n\t * @param {jQuery ref} t - table object\n\t * @param {jQuery ref} th - reference to the first row elements (only set in deserialization)\n\t */\n\tvar memento = function(t, th){ \n\t\tvar w,m=0,i=0,aux =[];\n\t\tif(th){\t\t\t\t\t\t\t\t\t\t//in deserialization mode (after a postback)\n\t\t\tt.cg.removeAttr(\"width\");\n\t\t\tif(t.opt.flush){ S[t.id] =\"\"; return;} \t//if flush is activated, stored data is removed\n\t\t\tw = S[t.id].split(\";\");\t\t\t\t\t//column widths is obtained\n\t\t\tfor(;i<t.ln;i++){\t\t\t\t\t\t//for each column\n\t\t\t\taux.push(100*w[i]/w[t.ln]+\"%\"); \t//width is stored in an array since it will be required again a couple of lines ahead\n\t\t\t\tth.eq(i).css(\"width\", aux[i] ); \t//each column width in % is resotred\n\t\t\t}\t\t\t\n\t\t\tfor(i=0;i<t.ln;i++)\n\t\t\t\tt.cg.eq(i).css(\"width\", aux[i]);\t//this code is required in order to create an inline CSS rule with higher precedence than an existing CSS class in the \"col\" elements\n\t\t}else{\t\t\t\t\t\t\t//in serialization mode (after resizing a column)\n\t\t\tS[t.id] =\"\";\t\t\t\t//clean up previous data\n\t\t\tfor(;i < t.c.length; i++){\t\t//iterate through columns\n\t\t\t\n\t\t\t\tw = t.c[i].width();\t\t//width is obtained\n\t\t\t\tS[t.id] += w+\";\";\t\t//width is appended to the sessionStorage object using ID as key\n\t\t\t\tm+=w;\t\t\t\t\t//carriage is updated to obtain the full size used by columns\n\t\t\t}\n\t\t\tS[t.id]+=m;\t\t\t\t\t//the last item of the serialized string is the table's active area (width), \n\t\t\t\t\t\t\t\t\t\t//to be able to obtain % width value of each columns while deserializing\n\t\t}\t\n\t};\n\t\n\t\n\t/**\n\t * Function that places each grip in the correct position according to the current table layout\t * \n\t * @param {jQuery ref} t - table object\n\t */\n\tvar syncGrips = function (t){\t\n\t\tt.gc.width(t.w);\t\t\t//the grip's container width is updated\t\t\t\t\n\t\tfor(var i=0; i<t.ln; i++){\t//for each column\n\t\t\tvar c = t.c[i]; \t\t\t\n\t\t\tt.g[i].css({\t\t\t//height and position of the grip is updated according to the table layout\n\t\t\t\tleft: c.offset().left - t.offset().left + c.outerWidth(false) + t.cs / 2 + PX,\n\t\t\t\theight: t.opt.headerOnly? t.c[0].outerHeight(false) : t.outerHeight(false)\t\t\t\t\n\t\t\t});\t\t\t\n\t\t} \t\n\t};\n\t\n\t\n\t\n\t/**\n\t* This function updates column's width according to the horizontal position increment of the grip being\n\t* dragged. The function can be called while dragging if liveDragging is enabled and also from the onGripDragOver\n\t* event handler to synchronize grip's position with their related columns.\n\t* @param {jQuery ref} t - table object\n\t* @param {nunmber} i - index of the grip being dragged\n\t* @param {bool} isOver - to identify when the function is being called from the onGripDragOver event\t\n\t*/\n\tvar syncCols = function(t,i,isOver){\n\t\tvar inc = drag.x-drag.l, c = t.c[i], c2 = t.c[i+1]; \t\t\t\n\t\tvar w = c.w + inc;\tvar w2= c2.w- inc;\t//their new width is obtained\t\t\t\t\t\n\t\tc.width( w + PX);\tc2.width(w2 + PX);\t//and set\t\n\t\tt.cg.eq(i).width( w + PX); t.cg.eq(i+1).width( w2 + PX);\n\t\tif(isOver){c.w=w; c2.w=w2;}\n\t};\n\n\t\n\t/**\n\t * Event handler used while dragging a grip. It checks if the next grip's position is valid and updates it. \n\t * @param {event} e - mousemove event binded to the window object\n\t */\n\tvar onGripDrag = function(e){\t\n\t\tif(!drag) return; var t = drag.t;\t\t//table object reference \n\t\t\n\t\tif (e.originalEvent.touches) {\n\t\t\tvar x = e.originalEvent.touches[0].pageX - drag.ox + drag.l;\t\t//next position according to horizontal mouse position increment\n\t\t} else {\n\t\t\tvar x = e.pageX - drag.ox + drag.l;\t\t//next position according to horizontal mouse position increment\n\t\t}\n\t\t\n\t\t\n\t\t\t\n\t\tvar mw = t.opt.minWidth, i = drag.i ;\t//cell's min width\n\t\tvar l = t.cs*1.5 + mw + t.b;\n\n\t\tvar max = i == t.ln-1? t.w-l: t.g[i+1].position().left-t.cs-mw; //max position according to the contiguous cells\n\t\tvar min = i? t.g[i-1].position().left+t.cs+mw: l;\t\t\t\t//min position according to the contiguous cells\n\t\t\n\t\tx = M.max(min, M.min(max, x));\t\t\t\t\t\t//apply boundings\t\t\n\t\tdrag.x = x;\t drag.css(\"left\",  x + PX); \t\t\t//apply position increment\t\t\n\t\t\t\n\t\tif(t.opt.liveDrag){ \t\t\t\t\t\t\t\t//if liveDrag is enabled\n\t\t\tsyncCols(t,i); syncGrips(t);\t\t\t\t\t//columns and grips are synchronized\n\t\t\tvar cb = t.opt.onDrag;\t\t\t\t\t\t\t//check if there is an onDrag callback\n\t\t\tif (cb) { e.currentTarget = t[0]; cb(e); }\t\t//if any, it is fired\t\t\t\n\t\t}\n\t\t\n\t\treturn false; \t//prevent text selection\t\t\t\t\n\t};\n\t\n\n\t/**\n\t * Event handler fired when the dragging is over, updating table layout\n\t */\n\tvar onGripDragOver = function(e){\t\n\t\t\n\t\td.unbind('touchend.'+SIGNATURE+' mouseup.'+SIGNATURE).unbind('touchmove.'+SIGNATURE+' mousemove.'+SIGNATURE);\n\t\t$(\"head :last-child\").remove(); \t\t\t\t//remove the dragging cursor style\t\n\t\tif(!drag) return;\n\t\tdrag.removeClass(drag.t.opt.draggingClass);\t\t//remove the grip's dragging css-class\n\t\tvar t = drag.t;\n\t\tvar cb = t.opt.onResize; \t\t\t//get some values\t\n\t\tif(drag.x){ \t\t\t\t\t\t\t\t\t//only if the column width has been changed\n\t\t\tsyncCols(t,drag.i, true);\tsyncGrips(t);\t//the columns and grips are updated\n\t\t\tif (cb) { e.currentTarget = t[0]; cb(e); }\t//if there is a callback function, it is fired\n\t\t}\n\t\tif(t.p && S) memento(t); \t\t\t\t\t\t//if postbackSafe is enabled and there is sessionStorage support, the new layout is serialized and stored\n\t\tdrag = null;\t\t\t\t\t\t\t\t\t//since the grip's dragging is over\t\t\t\t\t\t\t\t\t\n\t};\t\n\t\n\n\t/**\n\t * Event handler fired when the grip's dragging is about to start. Its main goal is to set up events \n\t * and store some values used while dragging.\n\t * @param {event} e - grip's mousedown event\n\t */\n\tvar onGripMouseDown = function(e){\n\t\tvar o = $(this).data(SIGNATURE);\t\t\t//retrieve grip's data\n\t\tvar t = tables[o.t],  g = t.g[o.i];\t\t\t//shortcuts for the table and grip objects\n\t\tif (e.originalEvent.touches) {\n\t\t\tg.ox = e.originalEvent.touches[0].pageX;\n\t\t} else {\n\t\t\tg.ox = e.pageX;\t//the initial position is kept\n\t\t}\n\t\tg.l = g.position().left;\n\t\td.bind('touchmove.'+SIGNATURE+' mousemove.'+SIGNATURE, onGripDrag).bind('touchend.'+SIGNATURE+' mouseup.'+SIGNATURE,onGripDragOver);\t//mousemove and mouseup events are bound\n\t\th.append(\"<style type='text/css'>*{cursor:\"+ t.opt.dragCursor +\"!important}</style>\"); \t//change the mouse cursor\n\t\tg.addClass(t.opt.draggingClass); \t//add the dragging class (to allow some visual feedback)\t\t\t\t\n\t\tdrag = g;\t\t\t\t\t\t\t//the current grip is stored as the current dragging object\n\t\tif(t.c[o.i].l) for(var i=0,c; i<t.ln; i++){ c=t.c[i]; c.l = false; c.w= c.width(); } \t//if the colum is locked (after browser resize), then c.w must be updated\t\t\n\t\treturn false; \t//prevent text selection\n\t};\n\t\n\t/**\n\t * Event handler fired when the browser is resized. The main purpose of this function is to update\n\t * table layout according to the browser's size synchronizing related grips \n\t */\n\tvar onResize = function(){\n\t\tfor(t in tables){\t\t\n\t\t\tvar t = tables[t], i, mw=0;\t\t\t\t\n\t\t\tt.removeClass(SIGNATURE);\t\t\t\t\t\t//firefox doesnt like layout-fixed in some cases\n\t\t\tif (t.w != t.width()) {\t\t\t\t\t\t\t//if the the table's width has changed\n\t\t\t\tt.w = t.width();\t\t\t\t\t\t\t//its new value is kept\n\t\t\t\tfor(i=0; i<t.ln; i++) mw+= t.c[i].w;\t\t//the active cells area is obtained\n\t\t\t\t//cell rendering is not as trivial as it might seem, and it is slightly different for\n\t\t\t\t//each browser. In the begining i had a big switch for each browser, but since the code\n\t\t\t\t//was extremelly ugly now I use a different approach with several reflows. This works \n\t\t\t\t//pretty well but it's a bit slower. For now, lets keep things simple...   \n\t\t\t\tfor(i=0; i<t.ln; i++) t.c[i].css(\"width\", M.round(1000*t.c[i].w/mw)/10 + \"%\").l=true; \n\t\t\t\t//c.l locks the column, telling us that its c.w is outdated\t\t\t\t\t\t\t\t\t\n\t\t\t}\n\t\t\tsyncGrips(t.addClass(SIGNATURE));\n\t\t}\n\t};\t\t\n\n\n\t//bind resize event, to update grips position \n\t$(window).bind('resize.'+SIGNATURE, onResize); \n\n\n\t/**\n\t * The plugin is added to the jQuery library\n\t * @param {Object} options -  an object containg some basic customization values \n\t */\n    $.fn.extend({  \n        colResizable: function(options) {           \n            var defaults = {\n\t\t\t\n\t\t\t\t//attributes:\n                draggingClass: 'JCLRgripDrag',\t//css-class used when a grip is being dragged (for visual feedback purposes)\n\t\t\t\tgripInnerHtml: '',\t\t\t\t//if it is required to use a custom grip it can be done using some custom HTML\t\t\t\t\n\t\t\t\tliveDrag: false,\t\t\t\t//enables table-layout updaing while dragging\t\t\t\n\t\t\t\tminWidth: 15, \t\t\t\t\t//minimum width value in pixels allowed for a column \n\t\t\t\theaderOnly: false,\t\t\t\t//specifies that the size of the the column resizing anchors will be bounded to the size of the first row \n\t\t\t\thoverCursor: \"e-resize\",  \t\t//cursor to be used on grip hover\n\t\t\t\tdragCursor: \"e-resize\",  \t\t//cursor to be used while dragging\n\t\t\t\tpostbackSafe: false, \t\t\t//when it is enabled, table layout can persist after postback. It requires browsers with sessionStorage support (it can be emulated with sessionStorage.js). Some browsers ony \n\t\t\t\tflush: false, \t\t\t\t\t//when postbakSafe is enabled, and it is required to prevent layout restoration after postback, 'flush' will remove its associated layout data \n\t\t\t\tmarginLeft: null,\t\t\t\t//in case the table contains any margins, colResizable needs to know the values used, e.g. \"10%\", \"15em\", \"5px\" ...\n\t\t\t\tmarginRight: null, \t\t\t\t//in case the table contains any margins, colResizable needs to know the values used, e.g. \"10%\", \"15em\", \"5px\" ...\n\t\t\t\tdisable: false,\t\t\t\t\t//disables all the enhancements performed in a previously colResized table\t\n\t\t\t\t\n\t\t\t\t//events:\n\t\t\t\tonDrag: null, \t\t\t\t\t//callback function to be fired during the column resizing process if liveDrag is enabled\n\t\t\t\tonResize: null\t\t\t\t\t//callback function fired when the dragging process is over\n            }\t\t\t\n\t\t\tvar options =  $.extend(defaults, options);\t\t\t\n            return this.each(function() {\t\t\t\t\n             \tinit( this, options);             \n            });\n        }\n    });\n\n\n},{\"jquery\":undefined}],2:[function(require,module,exports){\n/**\n * jQuery-csv (jQuery Plugin)\n * version: 0.71 (2012-11-19)\n *\n * This document is licensed as free software under the terms of the\n * MIT License: http://www.opensource.org/licenses/mit-license.php\n *\n * Acknowledgements:\n * The original design and influence to implement this library as a jquery\n * plugin is influenced by jquery-json (http://code.google.com/p/jquery-json/).\n * If you're looking to use native JSON.Stringify but want additional backwards\n * compatibility for browsers that don't support it, I highly recommend you\n * check it out.\n *\n * A special thanks goes out to rwk@acm.org for providing a lot of valuable\n * feedback to the project including the core for the new FSM\n * (Finite State Machine) parsers. If you're looking for a stable TSV parser\n * be sure to take a look at jquery-tsv (http://code.google.com/p/jquery-tsv/).\n\n * For legal purposes I'll include the \"NO WARRANTY EXPRESSED OR IMPLIED.\n * USE AT YOUR OWN RISK.\". Which, in 'layman's terms' means, by using this\n * library you are accepting responsibility if it breaks your code.\n *\n * Legal jargon aside, I will do my best to provide a useful and stable core\n * that can effectively be built on.\n *\n * Copyrighted 2012 by Evan Plaice.\n */\n\nRegExp.escape= function(s) {\n    return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n};\n\n  'use strict'\n  var $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\n  /**\n   * jQuery.csv.defaults\n   * Encapsulates the method paramater defaults for the CSV plugin module.\n   */\n\n  $.csv = {\n    defaults: {\n      separator:',',\n      delimiter:'\"',\n      headers:true\n    },\n\n    hooks: {\n      castToScalar: function(value, state) {\n        var hasDot = /\\./;\n        if (isNaN(value)) {\n          return value;\n        } else {\n          if (hasDot.test(value)) {\n            return parseFloat(value);\n          } else {\n            var integer = parseInt(value);\n            if(isNaN(integer)) {\n              return null;\n            } else {\n              return integer;\n            }\n          }\n        }\n      }\n    },\n\n    parsers: {\n      parse: function(csv, options) {\n        // cache settings\n        var separator = options.separator;\n        var delimiter = options.delimiter;\n\n        // set initial state if it's missing\n        if(!options.state.rowNum) {\n          options.state.rowNum = 1;\n        }\n        if(!options.state.colNum) {\n          options.state.colNum = 1;\n        }\n\n        // clear initial state\n        var data = [];\n        var entry = [];\n        var state = 0;\n        var value = ''\n        var exit = false;\n\n        function endOfEntry() {\n          // reset the state\n          state = 0;\n          value = '';\n\n          // if 'start' hasn't been met, don't output\n          if(options.start && options.state.rowNum < options.start) {\n            // update global state\n            entry = [];\n            options.state.rowNum++;\n            options.state.colNum = 1;\n            return;\n          }\n          \n          if(options.onParseEntry === undefined) {\n            // onParseEntry hook not set\n            data.push(entry);\n          } else {\n            var hookVal = options.onParseEntry(entry, options.state); // onParseEntry Hook\n            // false skips the row, configurable through a hook\n            if(hookVal !== false) {\n              data.push(hookVal);\n            }\n          }\n          //console.log('entry:' + entry);\n          \n          // cleanup\n          entry = [];\n\n          // if 'end' is met, stop parsing\n          if(options.end && options.state.rowNum >= options.end) {\n            exit = true;\n          }\n          \n          // update global state\n          options.state.rowNum++;\n          options.state.colNum = 1;\n        }\n\n        function endOfValue() {\n          if(options.onParseValue === undefined) {\n            // onParseValue hook not set\n            entry.push(value);\n          } else {\n            var hook = options.onParseValue(value, options.state); // onParseValue Hook\n            // false skips the row, configurable through a hook\n            if(hook !== false) {\n              entry.push(hook);\n            }\n          }\n          //console.log('value:' + value);\n          // reset the state\n          value = '';\n          state = 0;\n          // update global state\n          options.state.colNum++;\n        }\n\n        // escape regex-specific control chars\n        var escSeparator = RegExp.escape(separator);\n        var escDelimiter = RegExp.escape(delimiter);\n\n        // compile the regEx str using the custom delimiter/separator\n        var match = /(D|S|\\n|\\r|[^DS\\r\\n]+)/;\n        var matchSrc = match.source;\n        matchSrc = matchSrc.replace(/S/g, escSeparator);\n        matchSrc = matchSrc.replace(/D/g, escDelimiter);\n        match = RegExp(matchSrc, 'gm');\n\n        // put on your fancy pants...\n        // process control chars individually, use look-ahead on non-control chars\n        csv.replace(match, function (m0) {\n          if(exit) {\n            return;\n          }\n          switch (state) {\n            // the start of a value\n            case 0:\n              // null last value\n              if (m0 === separator) {\n                value += '';\n                endOfValue();\n                break;\n              }\n              // opening delimiter\n              if (m0 === delimiter) {\n                state = 1;\n                break;\n              }\n              // null last value\n              if (m0 === '\\n') {\n                endOfValue();\n                endOfEntry();\n                break;\n              }\n              // phantom carriage return\n              if (/^\\r$/.test(m0)) {\n                break;\n              }\n              // un-delimited value\n              value += m0;\n              state = 3;\n              break;\n\n            // delimited input\n            case 1:\n              // second delimiter? check further\n              if (m0 === delimiter) {\n                state = 2;\n                break;\n              }\n              // delimited data\n              value += m0;\n              state = 1;\n              break;\n\n            // delimiter found in delimited input\n            case 2:\n              // escaped delimiter?\n              if (m0 === delimiter) {\n                value += m0;\n                state = 1;\n                break;\n              }\n              // null value\n              if (m0 === separator) {\n                endOfValue();\n                break;\n              }\n              // end of entry\n              if (m0 === '\\n') {\n                endOfValue();\n                endOfEntry();\n                break;\n              }\n              // phantom carriage return\n              if (/^\\r$/.test(m0)) {\n                break;\n              }\n              // broken paser?\n              throw new Error('CSVDataError: Illegal State [Row:' + options.state.rowNum + '][Col:' + options.state.colNum + ']');\n\n            // un-delimited input\n            case 3:\n              // null last value\n              if (m0 === separator) {\n                endOfValue();\n                break;\n              }\n              // end of entry\n              if (m0 === '\\n') {\n                endOfValue();\n                endOfEntry();\n                break;\n              }\n              // phantom carriage return\n              if (/^\\r$/.test(m0)) {\n                break;\n              }\n              if (m0 === delimiter) {\n              // non-compliant data\n                throw new Error('CSVDataError: Illegal Quote [Row:' + options.state.rowNum + '][Col:' + options.state.colNum + ']');\n              }\n              // broken parser?\n              throw new Error('CSVDataError: Illegal Data [Row:' + options.state.rowNum + '][Col:' + options.state.colNum + ']');\n            default:\n              // shenanigans\n              throw new Error('CSVDataError: Unknown State [Row:' + options.state.rowNum + '][Col:' + options.state.colNum + ']');\n          }\n          //console.log('val:' + m0 + ' state:' + state);\n        });\n\n        // submit the last entry\n        // ignore null last line\n        if(entry.length !== 0) {\n          endOfValue();\n          endOfEntry();\n        }\n\n        return data;\n      },\n\n      // a csv-specific line splitter\n      splitLines: function(csv, options) {\n        // cache settings\n        var separator = options.separator;\n        var delimiter = options.delimiter;\n\n        // set initial state if it's missing\n        if(!options.state.rowNum) {\n          options.state.rowNum = 1;\n        }\n\n        // clear initial state\n        var entries = [];\n        var state = 0;\n        var entry = '';\n        var exit = false;\n\n        function endOfLine() {          \n          // reset the state\n          state = 0;\n          \n          // if 'start' hasn't been met, don't output\n          if(options.start && options.state.rowNum < options.start) {\n            // update global state\n            entry = '';\n            options.state.rowNum++;\n            return;\n          }\n          \n          if(options.onParseEntry === undefined) {\n            // onParseEntry hook not set\n            entries.push(entry);\n          } else {\n            var hookVal = options.onParseEntry(entry, options.state); // onParseEntry Hook\n            // false skips the row, configurable through a hook\n            if(hookVal !== false) {\n              entries.push(hookVal);\n            }\n          }\n\n          // cleanup\n          entry = '';\n\n          // if 'end' is met, stop parsing\n          if(options.end && options.state.rowNum >= options.end) {\n            exit = true;\n          }\n          \n          // update global state\n          options.state.rowNum++;\n        }\n\n        // escape regex-specific control chars\n        var escSeparator = RegExp.escape(separator);\n        var escDelimiter = RegExp.escape(delimiter);\n\n        // compile the regEx str using the custom delimiter/separator\n        var match = /(D|S|\\n|\\r|[^DS\\r\\n]+)/;\n        var matchSrc = match.source;\n        matchSrc = matchSrc.replace(/S/g, escSeparator);\n        matchSrc = matchSrc.replace(/D/g, escDelimiter);\n        match = RegExp(matchSrc, 'gm');\n        \n        // put on your fancy pants...\n        // process control chars individually, use look-ahead on non-control chars\n        csv.replace(match, function (m0) {\n          if(exit) {\n            return;\n          }\n          switch (state) {\n            // the start of a value/entry\n            case 0:\n              // null value\n              if (m0 === separator) {\n                entry += m0;\n                state = 0;\n                break;\n              }\n              // opening delimiter\n              if (m0 === delimiter) {\n                entry += m0;\n                state = 1;\n                break;\n              }\n              // end of line\n              if (m0 === '\\n') {\n                endOfLine();\n                break;\n              }\n              // phantom carriage return\n              if (/^\\r$/.test(m0)) {\n                break;\n              }\n              // un-delimit value\n              entry += m0;\n              state = 3;\n              break;\n\n            // delimited input\n            case 1:\n              // second delimiter? check further\n              if (m0 === delimiter) {\n                entry += m0;\n                state = 2;\n                break;\n              }\n              // delimited data\n              entry += m0;\n              state = 1;\n              break;\n\n            // delimiter found in delimited input\n            case 2:\n              // escaped delimiter?\n              var prevChar = entry.substr(entry.length - 1);\n              if (m0 === delimiter && prevChar === delimiter) {\n                entry += m0;\n                state = 1;\n                break;\n              }\n              // end of value\n              if (m0 === separator) {\n                entry += m0;\n                state = 0;\n                break;\n              }\n              // end of line\n              if (m0 === '\\n') {\n                endOfLine();\n                break;\n              }\n              // phantom carriage return\n              if (m0 === '\\r') {\n                break;\n              }\n              // broken paser?\n              throw new Error('CSVDataError: Illegal state [Row:' + options.state.rowNum + ']');\n\n            // un-delimited input\n            case 3:\n              // null value\n              if (m0 === separator) {\n                entry += m0;\n                state = 0;\n                break;\n              }\n              // end of line\n              if (m0 === '\\n') {\n                endOfLine();\n                break;\n              }\n              // phantom carriage return\n              if (m0 === '\\r') {\n                break;\n              }\n              // non-compliant data\n              if (m0 === delimiter) {\n                throw new Error('CSVDataError: Illegal quote [Row:' + options.state.rowNum + ']');\n              }\n              // broken parser?\n              throw new Error('CSVDataError: Illegal state [Row:' + options.state.rowNum + ']');\n            default:\n              // shenanigans\n              throw new Error('CSVDataError: Unknown state [Row:' + options.state.rowNum + ']');\n          }\n          //console.log('val:' + m0 + ' state:' + state);\n        });\n\n        // submit the last entry\n        // ignore null last line\n        if(entry !== '') {\n          endOfLine();\n        }\n\n        return entries;\n      },\n\n      // a csv entry parser\n      parseEntry: function(csv, options) {\n        // cache settings\n        var separator = options.separator;\n        var delimiter = options.delimiter;\n        \n        // set initial state if it's missing\n        if(!options.state.rowNum) {\n          options.state.rowNum = 1;\n        }\n        if(!options.state.colNum) {\n          options.state.colNum = 1;\n        }\n\n        // clear initial state\n        var entry = [];\n        var state = 0;\n        var value = '';\n\n        function endOfValue() {\n          if(options.onParseValue === undefined) {\n            // onParseValue hook not set\n            entry.push(value);\n          } else {\n            var hook = options.onParseValue(value, options.state); // onParseValue Hook\n            // false skips the value, configurable through a hook\n            if(hook !== false) {\n              entry.push(hook);\n            }\n          }\n          // reset the state\n          value = '';\n          state = 0;\n          // update global state\n          options.state.colNum++;\n        }\n\n        // checked for a cached regEx first\n        if(!options.match) {\n          // escape regex-specific control chars\n          var escSeparator = RegExp.escape(separator);\n          var escDelimiter = RegExp.escape(delimiter);\n          \n          // compile the regEx str using the custom delimiter/separator\n          var match = /(D|S|\\n|\\r|[^DS\\r\\n]+)/;\n          var matchSrc = match.source;\n          matchSrc = matchSrc.replace(/S/g, escSeparator);\n          matchSrc = matchSrc.replace(/D/g, escDelimiter);\n          options.match = RegExp(matchSrc, 'gm');\n        }\n\n        // put on your fancy pants...\n        // process control chars individually, use look-ahead on non-control chars\n        csv.replace(options.match, function (m0) {\n          switch (state) {\n            // the start of a value\n            case 0:\n              // null last value\n              if (m0 === separator) {\n                value += '';\n                endOfValue();\n                break;\n              }\n              // opening delimiter\n              if (m0 === delimiter) {\n                state = 1;\n                break;\n              }\n              // skip un-delimited new-lines\n              if (m0 === '\\n' || m0 === '\\r') {\n                break;\n              }\n              // un-delimited value\n              value += m0;\n              state = 3;\n              break;\n\n            // delimited input\n            case 1:\n              // second delimiter? check further\n              if (m0 === delimiter) {\n                state = 2;\n                break;\n              }\n              // delimited data\n              value += m0;\n              state = 1;\n              break;\n\n            // delimiter found in delimited input\n            case 2:\n              // escaped delimiter?\n              if (m0 === delimiter) {\n                value += m0;\n                state = 1;\n                break;\n              }\n              // null value\n              if (m0 === separator) {\n                endOfValue();\n                break;\n              }\n              // skip un-delimited new-lines\n              if (m0 === '\\n' || m0 === '\\r') {\n                break;\n              }\n              // broken paser?\n              throw new Error('CSVDataError: Illegal State [Row:' + options.state.rowNum + '][Col:' + options.state.colNum + ']');\n\n            // un-delimited input\n            case 3:\n              // null last value\n              if (m0 === separator) {\n                endOfValue();\n                break;\n              }\n              // skip un-delimited new-lines\n              if (m0 === '\\n' || m0 === '\\r') {\n                break;\n              }\n              // non-compliant data\n              if (m0 === delimiter) {\n                throw new Error('CSVDataError: Illegal Quote [Row:' + options.state.rowNum + '][Col:' + options.state.colNum + ']');\n              }\n              // broken parser?\n              throw new Error('CSVDataError: Illegal Data [Row:' + options.state.rowNum + '][Col:' + options.state.colNum + ']');\n            default:\n              // shenanigans\n              throw new Error('CSVDataError: Unknown State [Row:' + options.state.rowNum + '][Col:' + options.state.colNum + ']');\n          }\n          //console.log('val:' + m0 + ' state:' + state);\n        });\n\n        // submit the last value\n        endOfValue();\n\n        return entry;\n      }\n    },\n\n    /**\n     * $.csv.toArray(csv)\n     * Converts a CSV entry string to a javascript array.\n     *\n     * @param {Array} csv The string containing the CSV data.\n     * @param {Object} [options] An object containing user-defined options.\n     * @param {Character} [separator] An override for the separator character. Defaults to a comma(,).\n     * @param {Character} [delimiter] An override for the delimiter character. Defaults to a double-quote(\").\n     *\n     * This method deals with simple CSV strings only. It's useful if you only\n     * need to parse a single entry. If you need to parse more than one line,\n     * use $.csv2Array instead.\n     */\n    toArray: function(csv, options, callback) {\n      var options = (options !== undefined ? options : {});\n      var config = {};\n      config.callback = ((callback !== undefined && typeof(callback) === 'function') ? callback : false);\n      config.separator = 'separator' in options ? options.separator : $.csv.defaults.separator;\n      config.delimiter = 'delimiter' in options ? options.delimiter : $.csv.defaults.delimiter;\n      var state = (options.state !== undefined ? options.state : {});\n\n      // setup\n      var options = {\n        delimiter: config.delimiter,\n        separator: config.separator,\n        onParseEntry: options.onParseEntry,\n        onParseValue: options.onParseValue,\n        state: state\n      }\n\n      var entry = $.csv.parsers.parseEntry(csv, options);\n\n      // push the value to a callback if one is defined\n      if(!config.callback) {\n        return entry;\n      } else {\n        config.callback('', entry);\n      }\n    },\n\n    /**\n     * $.csv.toArrays(csv)\n     * Converts a CSV string to a javascript array.\n     *\n     * @param {String} csv The string containing the raw CSV data.\n     * @param {Object} [options] An object containing user-defined options.\n     * @param {Character} [separator] An override for the separator character. Defaults to a comma(,).\n     * @param {Character} [delimiter] An override for the delimiter character. Defaults to a double-quote(\").\n     *\n     * This method deals with multi-line CSV. The breakdown is simple. The first\n     * dimension of the array represents the line (or entry/row) while the second\n     * dimension contains the values (or values/columns).\n     */\n    toArrays: function(csv, options, callback) {\n      var options = (options !== undefined ? options : {});\n      var config = {};\n      config.callback = ((callback !== undefined && typeof(callback) === 'function') ? callback : false);\n      config.separator = 'separator' in options ? options.separator : $.csv.defaults.separator;\n      config.delimiter = 'delimiter' in options ? options.delimiter : $.csv.defaults.delimiter;\n      \n      // setup\n      var data = [];\n      var options = {\n        delimiter: config.delimiter,\n        separator: config.separator,\n        onParseEntry: options.onParseEntry,\n        onParseValue: options.onParseValue,\n        start: options.start,\n        end: options.end,\n        state: {\n          rowNum: 1,\n          colNum: 1\n        }\n      };\n\n      // break the data down to lines\n      data = $.csv.parsers.parse(csv, options);\n\n      // push the value to a callback if one is defined\n      if(!config.callback) {\n        return data;\n      } else {\n        config.callback('', data);\n      }\n    },\n\n    /**\n     * $.csv.toObjects(csv)\n     * Converts a CSV string to a javascript object.\n     * @param {String} csv The string containing the raw CSV data.\n     * @param {Object} [options] An object containing user-defined options.\n     * @param {Character} [separator] An override for the separator character. Defaults to a comma(,).\n     * @param {Character} [delimiter] An override for the delimiter character. Defaults to a double-quote(\").\n     * @param {Boolean} [headers] Indicates whether the data contains a header line. Defaults to true.\n     *\n     * This method deals with multi-line CSV strings. Where the headers line is\n     * used as the key for each value per entry.\n     */\n    toObjects: function(csv, options, callback) {\n      var options = (options !== undefined ? options : {});\n      var config = {};\n      config.callback = ((callback !== undefined && typeof(callback) === 'function') ? callback : false);\n      config.separator = 'separator' in options ? options.separator : $.csv.defaults.separator;\n      config.delimiter = 'delimiter' in options ? options.delimiter : $.csv.defaults.delimiter;\n      config.headers = 'headers' in options ? options.headers : $.csv.defaults.headers;\n      options.start = 'start' in options ? options.start : 1;\n      \n      // account for headers\n      if(config.headers) {\n        options.start++;\n      }\n      if(options.end && config.headers) {\n        options.end++;\n      }\n      \n      // setup\n      var lines = [];\n      var data = [];\n      \n      var options = {\n        delimiter: config.delimiter,\n        separator: config.separator,\n        onParseEntry: options.onParseEntry,\n        onParseValue: options.onParseValue,\n        start: options.start,\n        end: options.end,\n        state: {\n          rowNum: 1,\n          colNum: 1\n        },\n        match: false\n      };\n\n      // fetch the headers\n      var headerOptions = {\n        delimiter: config.delimiter,\n        separator: config.separator,\n        start: 1,\n        end: 1,\n        state: {\n          rowNum:1,\n          colNum:1\n        }\n      }\n      var headerLine = $.csv.parsers.splitLines(csv, headerOptions);\n      var headers = $.csv.toArray(headerLine[0], options);\n\n      // fetch the data\n      var lines = $.csv.parsers.splitLines(csv, options);\n      \n      // reset the state for re-use\n      options.state.colNum = 1;\n      if(headers){\n        options.state.rowNum = 2;\n      } else {\n        options.state.rowNum = 1;\n      }\n      \n      // convert data to objects\n      for(var i=0, len=lines.length; i<len; i++) {\n        var entry = $.csv.toArray(lines[i], options);\n        var object = {};\n        for(var j in headers) {\n          object[headers[j]] = entry[j];\n        }\n        data.push(object);\n        \n        // update row state\n        options.state.rowNum++;\n      }\n\n      // push the value to a callback if one is defined\n      if(!config.callback) {\n        return data;\n      } else {\n        config.callback('', data);\n      }\n    },\n\n     /**\n     * $.csv.fromArrays(arrays)\n     * Converts a javascript array to a CSV String.\n     *\n     * @param {Array} array An array containing an array of CSV entries.\n     * @param {Object} [options] An object containing user-defined options.\n     * @param {Character} [separator] An override for the separator character. Defaults to a comma(,).\n     * @param {Character} [delimiter] An override for the delimiter character. Defaults to a double-quote(\").\n     *\n     * This method generates a CSV file from an array of arrays (representing entries).\n     */\n    fromArrays: function(arrays, options, callback) {\n      var options = (options !== undefined ? options : {});\n      var config = {};\n      config.callback = ((callback !== undefined && typeof(callback) === 'function') ? callback : false);\n      config.separator = 'separator' in options ? options.separator : $.csv.defaults.separator;\n      config.delimiter = 'delimiter' in options ? options.delimiter : $.csv.defaults.delimiter;\n      config.escaper = 'escaper' in options ? options.escaper : $.csv.defaults.escaper;\n      config.experimental = 'experimental' in options ? options.experimental : false;\n\n      if(!config.experimental) {\n        throw new Error('not implemented');\n      }\n\n      var output = [];\n      for(i in arrays) {\n        output.push(arrays[i]);\n      }\n\n      // push the value to a callback if one is defined\n      if(!config.callback) {\n        return output;\n      } else {\n        config.callback('', output);\n      }\n    },\n\n    /**\n     * $.csv.fromObjects(objects)\n     * Converts a javascript dictionary to a CSV string.\n     * @param {Object} objects An array of objects containing the data.\n     * @param {Object} [options] An object containing user-defined options.\n     * @param {Character} [separator] An override for the separator character. Defaults to a comma(,).\n     * @param {Character} [delimiter] An override for the delimiter character. Defaults to a double-quote(\").\n     *\n     * This method generates a CSV file from an array of objects (name:value pairs).\n     * It starts by detecting the headers and adding them as the first line of\n     * the CSV file, followed by a structured dump of the data.\n     */\n    fromObjects2CSV: function(objects, options, callback) {\n      var options = (options !== undefined ? options : {});\n      var config = {};\n      config.callback = ((callback !== undefined && typeof(callback) === 'function') ? callback : false);\n      config.separator = 'separator' in options ? options.separator : $.csv.defaults.separator;\n      config.delimiter = 'delimiter' in options ? options.delimiter : $.csv.defaults.delimiter;\n      config.experimental = 'experimental' in options ? options.experimental : false;\n\n      if(!config.experimental) {\n        throw new Error('not implemented');\n      }\n\n      var output = [];\n      for(i in objects) {\n        output.push(arrays[i]);\n      }\n\n      // push the value to a callback if one is defined\n      if(!config.callback) {\n        return output;\n      } else {\n        config.callback('', output);\n      }\n    }\n  };\n\n  // Maintenance code to maintain backward-compatibility\n  // Will be removed in release 1.0\n  $.csvEntry2Array = $.csv.toArray;\n  $.csv2Array = $.csv.toArrays;\n  $.csv2Dictionary = $.csv.toObjects;\n\n\n\n},{\"jquery\":undefined}],3:[function(require,module,exports){\n// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod((function(){try{return require('codemirror')}catch(e){return window.CodeMirror}})());\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  var ie_lt8 = /MSIE \\d/.test(navigator.userAgent) &&\n    (document.documentMode == null || document.documentMode < 8);\n\n  var Pos = CodeMirror.Pos;\n\n  var matching = {\"(\": \")>\", \")\": \"(<\", \"[\": \"]>\", \"]\": \"[<\", \"{\": \"}>\", \"}\": \"{<\"};\n\n  function findMatchingBracket(cm, where, strict, config) {\n    var line = cm.getLineHandle(where.line), pos = where.ch - 1;\n    var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)];\n    if (!match) return null;\n    var dir = match.charAt(1) == \">\" ? 1 : -1;\n    if (strict && (dir > 0) != (pos == where.ch)) return null;\n    var style = cm.getTokenTypeAt(Pos(where.line, pos + 1));\n\n    var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style || null, config);\n    if (found == null) return null;\n    return {from: Pos(where.line, pos), to: found && found.pos,\n            match: found && found.ch == match.charAt(0), forward: dir > 0};\n  }\n\n  // bracketRegex is used to specify which type of bracket to scan\n  // should be a regexp, e.g. /[[\\]]/\n  //\n  // Note: If \"where\" is on an open bracket, then this bracket is ignored.\n  //\n  // Returns false when no bracket was found, null when it reached\n  // maxScanLines and gave up\n  function scanForBracket(cm, where, dir, style, config) {\n    var maxScanLen = (config && config.maxScanLineLength) || 10000;\n    var maxScanLines = (config && config.maxScanLines) || 1000;\n\n    var stack = [];\n    var re = config && config.bracketRegex ? config.bracketRegex : /[(){}[\\]]/;\n    var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1)\n                          : Math.max(cm.firstLine() - 1, where.line - maxScanLines);\n    for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) {\n      var line = cm.getLine(lineNo);\n      if (!line) continue;\n      var pos = dir > 0 ? 0 : line.length - 1, end = dir > 0 ? line.length : -1;\n      if (line.length > maxScanLen) continue;\n      if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0);\n      for (; pos != end; pos += dir) {\n        var ch = line.charAt(pos);\n        if (re.test(ch) && (style === undefined || cm.getTokenTypeAt(Pos(lineNo, pos + 1)) == style)) {\n          var match = matching[ch];\n          if ((match.charAt(1) == \">\") == (dir > 0)) stack.push(ch);\n          else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch};\n          else stack.pop();\n        }\n      }\n    }\n    return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null;\n  }\n\n  function matchBrackets(cm, autoclear, config) {\n    // Disable brace matching in long lines, since it'll cause hugely slow updates\n    var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000;\n    var marks = [], ranges = cm.listSelections();\n    for (var i = 0; i < ranges.length; i++) {\n      var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, false, config);\n      if (match && cm.getLine(match.from.line).length <= maxHighlightLen) {\n        var style = match.match ? \"CodeMirror-matchingbracket\" : \"CodeMirror-nonmatchingbracket\";\n        marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), {className: style}));\n        if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen)\n          marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), {className: style}));\n      }\n    }\n\n    if (marks.length) {\n      // Kludge to work around the IE bug from issue #1193, where text\n      // input stops going to the textare whever this fires.\n      if (ie_lt8 && cm.state.focused) cm.focus();\n\n      var clear = function() {\n        cm.operation(function() {\n          for (var i = 0; i < marks.length; i++) marks[i].clear();\n        });\n      };\n      if (autoclear) setTimeout(clear, 800);\n      else return clear;\n    }\n  }\n\n  var currentlyHighlighted = null;\n  function doMatchBrackets(cm) {\n    cm.operation(function() {\n      if (currentlyHighlighted) {currentlyHighlighted(); currentlyHighlighted = null;}\n      currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets);\n    });\n  }\n\n  CodeMirror.defineOption(\"matchBrackets\", false, function(cm, val, old) {\n    if (old && old != CodeMirror.Init) {\n      cm.off(\"cursorActivity\", doMatchBrackets);\n      if (currentlyHighlighted) {currentlyHighlighted(); currentlyHighlighted = null;}\n    }\n    if (val) {\n      cm.state.matchBrackets = typeof val == \"object\" ? val : {};\n      cm.on(\"cursorActivity\", doMatchBrackets);\n    }\n  });\n\n  CodeMirror.defineExtension(\"matchBrackets\", function() {matchBrackets(this, true);});\n  CodeMirror.defineExtension(\"findMatchingBracket\", function(pos, strict, config){\n    return findMatchingBracket(this, pos, strict, config);\n  });\n  CodeMirror.defineExtension(\"scanForBracket\", function(pos, dir, style, config){\n    return scanForBracket(this, pos, dir, style, config);\n  });\n});\n\n},{\"codemirror\":undefined}],4:[function(require,module,exports){\n// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod((function(){try{return require('codemirror')}catch(e){return window.CodeMirror}})());\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.registerHelper(\"fold\", \"brace\", function(cm, start) {\n  var line = start.line, lineText = cm.getLine(line);\n  var tokenType;\n\n  function findOpening(openCh) {\n    for (var at = start.ch, pass = 0;;) {\n      var found = at <= 0 ? -1 : lineText.lastIndexOf(openCh, at - 1);\n      if (found == -1) {\n        if (pass == 1) break;\n        pass = 1;\n        at = lineText.length;\n        continue;\n      }\n      if (pass == 1 && found < start.ch) break;\n      tokenType = cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1));\n      if (!/^(comment|string)/.test(tokenType)) return found + 1;\n      at = found - 1;\n    }\n  }\n\n  var startToken = \"{\", endToken = \"}\", startCh = findOpening(\"{\");\n  if (startCh == null) {\n    startToken = \"[\", endToken = \"]\";\n    startCh = findOpening(\"[\");\n  }\n\n  if (startCh == null) return;\n  var count = 1, lastLine = cm.lastLine(), end, endCh;\n  outer: for (var i = line; i <= lastLine; ++i) {\n    var text = cm.getLine(i), pos = i == line ? startCh : 0;\n    for (;;) {\n      var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos);\n      if (nextOpen < 0) nextOpen = text.length;\n      if (nextClose < 0) nextClose = text.length;\n      pos = Math.min(nextOpen, nextClose);\n      if (pos == text.length) break;\n      if (cm.getTokenTypeAt(CodeMirror.Pos(i, pos + 1)) == tokenType) {\n        if (pos == nextOpen) ++count;\n        else if (!--count) { end = i; endCh = pos; break outer; }\n      }\n      ++pos;\n    }\n  }\n  if (end == null || line == end && endCh == startCh) return;\n  return {from: CodeMirror.Pos(line, startCh),\n          to: CodeMirror.Pos(end, endCh)};\n});\n\nCodeMirror.registerHelper(\"fold\", \"import\", function(cm, start) {\n  function hasImport(line) {\n    if (line < cm.firstLine() || line > cm.lastLine()) return null;\n    var start = cm.getTokenAt(CodeMirror.Pos(line, 1));\n    if (!/\\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));\n    if (start.type != \"keyword\" || start.string != \"import\") return null;\n    // Now find closing semicolon, return its position\n    for (var i = line, e = Math.min(cm.lastLine(), line + 10); i <= e; ++i) {\n      var text = cm.getLine(i), semi = text.indexOf(\";\");\n      if (semi != -1) return {startCh: start.end, end: CodeMirror.Pos(i, semi)};\n    }\n  }\n\n  var startLine = start.line, has = hasImport(startLine), prev;\n  if (!has || hasImport(startLine - 1) || ((prev = hasImport(startLine - 2)) && prev.end.line == startLine - 1))\n    return null;\n  for (var end = has.end;;) {\n    var next = hasImport(end.line + 1);\n    if (next == null) break;\n    end = next.end;\n  }\n  return {from: cm.clipPos(CodeMirror.Pos(startLine, has.startCh + 1)), to: end};\n});\n\nCodeMirror.registerHelper(\"fold\", \"include\", function(cm, start) {\n  function hasInclude(line) {\n    if (line < cm.firstLine() || line > cm.lastLine()) return null;\n    var start = cm.getTokenAt(CodeMirror.Pos(line, 1));\n    if (!/\\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));\n    if (start.type == \"meta\" && start.string.slice(0, 8) == \"#include\") return start.start + 8;\n  }\n\n  var startLine = start.line, has = hasInclude(startLine);\n  if (has == null || hasInclude(startLine - 1) != null) return null;\n  for (var end = startLine;;) {\n    var next = hasInclude(end + 1);\n    if (next == null) break;\n    ++end;\n  }\n  return {from: CodeMirror.Pos(startLine, has + 1),\n          to: cm.clipPos(CodeMirror.Pos(end))};\n});\n\n});\n\n},{\"codemirror\":undefined}],5:[function(require,module,exports){\n// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod((function(){try{return require('codemirror')}catch(e){return window.CodeMirror}})());\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  function doFold(cm, pos, options, force) {\n    if (options && options.call) {\n      var finder = options;\n      options = null;\n    } else {\n      var finder = getOption(cm, options, \"rangeFinder\");\n    }\n    if (typeof pos == \"number\") pos = CodeMirror.Pos(pos, 0);\n    var minSize = getOption(cm, options, \"minFoldSize\");\n\n    function getRange(allowFolded) {\n      var range = finder(cm, pos);\n      if (!range || range.to.line - range.from.line < minSize) return null;\n      var marks = cm.findMarksAt(range.from);\n      for (var i = 0; i < marks.length; ++i) {\n        if (marks[i].__isFold && force !== \"fold\") {\n          if (!allowFolded) return null;\n          range.cleared = true;\n          marks[i].clear();\n        }\n      }\n      return range;\n    }\n\n    var range = getRange(true);\n    if (getOption(cm, options, \"scanUp\")) while (!range && pos.line > cm.firstLine()) {\n      pos = CodeMirror.Pos(pos.line - 1, 0);\n      range = getRange(false);\n    }\n    if (!range || range.cleared || force === \"unfold\") return;\n\n    var myWidget = makeWidget(cm, options);\n    CodeMirror.on(myWidget, \"mousedown\", function(e) {\n      myRange.clear();\n      CodeMirror.e_preventDefault(e);\n    });\n    var myRange = cm.markText(range.from, range.to, {\n      replacedWith: myWidget,\n      clearOnEnter: getOption(cm, options, \"clearOnEnter\"),\n      __isFold: true\n    });\n    myRange.on(\"clear\", function(from, to) {\n      CodeMirror.signal(cm, \"unfold\", cm, from, to);\n    });\n    CodeMirror.signal(cm, \"fold\", cm, range.from, range.to);\n  }\n\n  function makeWidget(cm, options) {\n    var widget = getOption(cm, options, \"widget\");\n    if (typeof widget == \"string\") {\n      var text = document.createTextNode(widget);\n      widget = document.createElement(\"span\");\n      widget.appendChild(text);\n      widget.className = \"CodeMirror-foldmarker\";\n    }\n    return widget;\n  }\n\n  // Clumsy backwards-compatible interface\n  CodeMirror.newFoldFunction = function(rangeFinder, widget) {\n    return function(cm, pos) { doFold(cm, pos, {rangeFinder: rangeFinder, widget: widget}); };\n  };\n\n  // New-style interface\n  CodeMirror.defineExtension(\"foldCode\", function(pos, options, force) {\n    doFold(this, pos, options, force);\n  });\n\n  CodeMirror.defineExtension(\"isFolded\", function(pos) {\n    var marks = this.findMarksAt(pos);\n    for (var i = 0; i < marks.length; ++i)\n      if (marks[i].__isFold) return true;\n  });\n\n  CodeMirror.commands.toggleFold = function(cm) {\n    cm.foldCode(cm.getCursor());\n  };\n  CodeMirror.commands.fold = function(cm) {\n    cm.foldCode(cm.getCursor(), null, \"fold\");\n  };\n  CodeMirror.commands.unfold = function(cm) {\n    cm.foldCode(cm.getCursor(), null, \"unfold\");\n  };\n  CodeMirror.commands.foldAll = function(cm) {\n    cm.operation(function() {\n      for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++)\n        cm.foldCode(CodeMirror.Pos(i, 0), null, \"fold\");\n    });\n  };\n  CodeMirror.commands.unfoldAll = function(cm) {\n    cm.operation(function() {\n      for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++)\n        cm.foldCode(CodeMirror.Pos(i, 0), null, \"unfold\");\n    });\n  };\n\n  CodeMirror.registerHelper(\"fold\", \"combine\", function() {\n    var funcs = Array.prototype.slice.call(arguments, 0);\n    return function(cm, start) {\n      for (var i = 0; i < funcs.length; ++i) {\n        var found = funcs[i](cm, start);\n        if (found) return found;\n      }\n    };\n  });\n\n  CodeMirror.registerHelper(\"fold\", \"auto\", function(cm, start) {\n    var helpers = cm.getHelpers(start, \"fold\");\n    for (var i = 0; i < helpers.length; i++) {\n      var cur = helpers[i](cm, start);\n      if (cur) return cur;\n    }\n  });\n\n  var defaultOptions = {\n    rangeFinder: CodeMirror.fold.auto,\n    widget: \"\\u2194\",\n    minFoldSize: 0,\n    scanUp: false,\n    clearOnEnter: true\n  };\n\n  CodeMirror.defineOption(\"foldOptions\", null);\n\n  function getOption(cm, options, name) {\n    if (options && options[name] !== undefined)\n      return options[name];\n    var editorOptions = cm.options.foldOptions;\n    if (editorOptions && editorOptions[name] !== undefined)\n      return editorOptions[name];\n    return defaultOptions[name];\n  }\n\n  CodeMirror.defineExtension(\"foldOption\", function(options, name) {\n    return getOption(this, options, name);\n  });\n});\n\n},{\"codemirror\":undefined}],6:[function(require,module,exports){\n// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod((function(){try{return require('codemirror')}catch(e){return window.CodeMirror}})(), require(\"./foldcode\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"./foldcode\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineOption(\"foldGutter\", false, function(cm, val, old) {\n    if (old && old != CodeMirror.Init) {\n      cm.clearGutter(cm.state.foldGutter.options.gutter);\n      cm.state.foldGutter = null;\n      cm.off(\"gutterClick\", onGutterClick);\n      cm.off(\"change\", onChange);\n      cm.off(\"viewportChange\", onViewportChange);\n      cm.off(\"fold\", onFold);\n      cm.off(\"unfold\", onFold);\n      cm.off(\"swapDoc\", onChange);\n    }\n    if (val) {\n      cm.state.foldGutter = new State(parseOptions(val));\n      updateInViewport(cm);\n      cm.on(\"gutterClick\", onGutterClick);\n      cm.on(\"change\", onChange);\n      cm.on(\"viewportChange\", onViewportChange);\n      cm.on(\"fold\", onFold);\n      cm.on(\"unfold\", onFold);\n      cm.on(\"swapDoc\", onChange);\n    }\n  });\n\n  var Pos = CodeMirror.Pos;\n\n  function State(options) {\n    this.options = options;\n    this.from = this.to = 0;\n  }\n\n  function parseOptions(opts) {\n    if (opts === true) opts = {};\n    if (opts.gutter == null) opts.gutter = \"CodeMirror-foldgutter\";\n    if (opts.indicatorOpen == null) opts.indicatorOpen = \"CodeMirror-foldgutter-open\";\n    if (opts.indicatorFolded == null) opts.indicatorFolded = \"CodeMirror-foldgutter-folded\";\n    return opts;\n  }\n\n  function isFolded(cm, line) {\n    var marks = cm.findMarks(Pos(line, 0), Pos(line + 1, 0));\n    for (var i = 0; i < marks.length; ++i)\n      if (marks[i].__isFold && marks[i].find().from.line == line) return marks[i];\n  }\n\n  function marker(spec) {\n    if (typeof spec == \"string\") {\n      var elt = document.createElement(\"div\");\n      elt.className = spec + \" CodeMirror-guttermarker-subtle\";\n      return elt;\n    } else {\n      return spec.cloneNode(true);\n    }\n  }\n\n  function updateFoldInfo(cm, from, to) {\n    var opts = cm.state.foldGutter.options, cur = from;\n    var minSize = cm.foldOption(opts, \"minFoldSize\");\n    var func = cm.foldOption(opts, \"rangeFinder\");\n    cm.eachLine(from, to, function(line) {\n      var mark = null;\n      if (isFolded(cm, cur)) {\n        mark = marker(opts.indicatorFolded);\n      } else {\n        var pos = Pos(cur, 0);\n        var range = func && func(cm, pos);\n        if (range && range.to.line - range.from.line >= minSize)\n          mark = marker(opts.indicatorOpen);\n      }\n      cm.setGutterMarker(line, opts.gutter, mark);\n      ++cur;\n    });\n  }\n\n  function updateInViewport(cm) {\n    var vp = cm.getViewport(), state = cm.state.foldGutter;\n    if (!state) return;\n    cm.operation(function() {\n      updateFoldInfo(cm, vp.from, vp.to);\n    });\n    state.from = vp.from; state.to = vp.to;\n  }\n\n  function onGutterClick(cm, line, gutter) {\n    var state = cm.state.foldGutter;\n    if (!state) return;\n    var opts = state.options;\n    if (gutter != opts.gutter) return;\n    var folded = isFolded(cm, line);\n    if (folded) folded.clear();\n    else cm.foldCode(Pos(line, 0), opts.rangeFinder);\n  }\n\n  function onChange(cm) {\n    var state = cm.state.foldGutter;\n    if (!state) return;\n    var opts = state.options;\n    state.from = state.to = 0;\n    clearTimeout(state.changeUpdate);\n    state.changeUpdate = setTimeout(function() { updateInViewport(cm); }, opts.foldOnChangeTimeSpan || 600);\n  }\n\n  function onViewportChange(cm) {\n    var state = cm.state.foldGutter;\n    if (!state) return;\n    var opts = state.options;\n    clearTimeout(state.changeUpdate);\n    state.changeUpdate = setTimeout(function() {\n      var vp = cm.getViewport();\n      if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) {\n        updateInViewport(cm);\n      } else {\n        cm.operation(function() {\n          if (vp.from < state.from) {\n            updateFoldInfo(cm, vp.from, state.from);\n            state.from = vp.from;\n          }\n          if (vp.to > state.to) {\n            updateFoldInfo(cm, state.to, vp.to);\n            state.to = vp.to;\n          }\n        });\n      }\n    }, opts.updateViewportTimeSpan || 400);\n  }\n\n  function onFold(cm, from) {\n    var state = cm.state.foldGutter;\n    if (!state) return;\n    var line = from.line;\n    if (line >= state.from && line < state.to)\n      updateFoldInfo(cm, line, line + 1);\n  }\n});\n\n},{\"./foldcode\":5,\"codemirror\":undefined}],7:[function(require,module,exports){\n// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod((function(){try{return require('codemirror')}catch(e){return window.CodeMirror}})());\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var Pos = CodeMirror.Pos;\n  function cmp(a, b) { return a.line - b.line || a.ch - b.ch; }\n\n  var nameStartChar = \"A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\";\n  var nameChar = nameStartChar + \"\\-\\:\\.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040\";\n  var xmlTagStart = new RegExp(\"<(/?)([\" + nameStartChar + \"][\" + nameChar + \"]*)\", \"g\");\n\n  function Iter(cm, line, ch, range) {\n    this.line = line; this.ch = ch;\n    this.cm = cm; this.text = cm.getLine(line);\n    this.min = range ? Math.max(range.from, cm.firstLine()) : cm.firstLine();\n    this.max = range ? Math.min(range.to - 1, cm.lastLine()) : cm.lastLine();\n  }\n\n  function tagAt(iter, ch) {\n    var type = iter.cm.getTokenTypeAt(Pos(iter.line, ch));\n    return type && /\\btag\\b/.test(type);\n  }\n\n  function nextLine(iter) {\n    if (iter.line >= iter.max) return;\n    iter.ch = 0;\n    iter.text = iter.cm.getLine(++iter.line);\n    return true;\n  }\n  function prevLine(iter) {\n    if (iter.line <= iter.min) return;\n    iter.text = iter.cm.getLine(--iter.line);\n    iter.ch = iter.text.length;\n    return true;\n  }\n\n  function toTagEnd(iter) {\n    for (;;) {\n      var gt = iter.text.indexOf(\">\", iter.ch);\n      if (gt == -1) { if (nextLine(iter)) continue; else return; }\n      if (!tagAt(iter, gt + 1)) { iter.ch = gt + 1; continue; }\n      var lastSlash = iter.text.lastIndexOf(\"/\", gt);\n      var selfClose = lastSlash > -1 && !/\\S/.test(iter.text.slice(lastSlash + 1, gt));\n      iter.ch = gt + 1;\n      return selfClose ? \"selfClose\" : \"regular\";\n    }\n  }\n  function toTagStart(iter) {\n    for (;;) {\n      var lt = iter.ch ? iter.text.lastIndexOf(\"<\", iter.ch - 1) : -1;\n      if (lt == -1) { if (prevLine(iter)) continue; else return; }\n      if (!tagAt(iter, lt + 1)) { iter.ch = lt; continue; }\n      xmlTagStart.lastIndex = lt;\n      iter.ch = lt;\n      var match = xmlTagStart.exec(iter.text);\n      if (match && match.index == lt) return match;\n    }\n  }\n\n  function toNextTag(iter) {\n    for (;;) {\n      xmlTagStart.lastIndex = iter.ch;\n      var found = xmlTagStart.exec(iter.text);\n      if (!found) { if (nextLine(iter)) continue; else return; }\n      if (!tagAt(iter, found.index + 1)) { iter.ch = found.index + 1; continue; }\n      iter.ch = found.index + found[0].length;\n      return found;\n    }\n  }\n  function toPrevTag(iter) {\n    for (;;) {\n      var gt = iter.ch ? iter.text.lastIndexOf(\">\", iter.ch - 1) : -1;\n      if (gt == -1) { if (prevLine(iter)) continue; else return; }\n      if (!tagAt(iter, gt + 1)) { iter.ch = gt; continue; }\n      var lastSlash = iter.text.lastIndexOf(\"/\", gt);\n      var selfClose = lastSlash > -1 && !/\\S/.test(iter.text.slice(lastSlash + 1, gt));\n      iter.ch = gt + 1;\n      return selfClose ? \"selfClose\" : \"regular\";\n    }\n  }\n\n  function findMatchingClose(iter, tag) {\n    var stack = [];\n    for (;;) {\n      var next = toNextTag(iter), end, startLine = iter.line, startCh = iter.ch - (next ? next[0].length : 0);\n      if (!next || !(end = toTagEnd(iter))) return;\n      if (end == \"selfClose\") continue;\n      if (next[1]) { // closing tag\n        for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == next[2]) {\n          stack.length = i;\n          break;\n        }\n        if (i < 0 && (!tag || tag == next[2])) return {\n          tag: next[2],\n          from: Pos(startLine, startCh),\n          to: Pos(iter.line, iter.ch)\n        };\n      } else { // opening tag\n        stack.push(next[2]);\n      }\n    }\n  }\n  function findMatchingOpen(iter, tag) {\n    var stack = [];\n    for (;;) {\n      var prev = toPrevTag(iter);\n      if (!prev) return;\n      if (prev == \"selfClose\") { toTagStart(iter); continue; }\n      var endLine = iter.line, endCh = iter.ch;\n      var start = toTagStart(iter);\n      if (!start) return;\n      if (start[1]) { // closing tag\n        stack.push(start[2]);\n      } else { // opening tag\n        for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == start[2]) {\n          stack.length = i;\n          break;\n        }\n        if (i < 0 && (!tag || tag == start[2])) return {\n          tag: start[2],\n          from: Pos(iter.line, iter.ch),\n          to: Pos(endLine, endCh)\n        };\n      }\n    }\n  }\n\n  CodeMirror.registerHelper(\"fold\", \"xml\", function(cm, start) {\n    var iter = new Iter(cm, start.line, 0);\n    for (;;) {\n      var openTag = toNextTag(iter), end;\n      if (!openTag || iter.line != start.line || !(end = toTagEnd(iter))) return;\n      if (!openTag[1] && end != \"selfClose\") {\n        var startPos = Pos(iter.line, iter.ch);\n        var endPos = findMatchingClose(iter, openTag[2]);\n        return endPos && {from: startPos, to: endPos.from};\n      }\n    }\n  });\n  CodeMirror.findMatchingTag = function(cm, pos, range) {\n    var iter = new Iter(cm, pos.line, pos.ch, range);\n    if (iter.text.indexOf(\">\") == -1 && iter.text.indexOf(\"<\") == -1) return;\n    var end = toTagEnd(iter), to = end && Pos(iter.line, iter.ch);\n    var start = end && toTagStart(iter);\n    if (!end || !start || cmp(iter, pos) > 0) return;\n    var here = {from: Pos(iter.line, iter.ch), to: to, tag: start[2]};\n    if (end == \"selfClose\") return {open: here, close: null, at: \"open\"};\n\n    if (start[1]) { // closing tag\n      return {open: findMatchingOpen(iter, start[2]), close: here, at: \"close\"};\n    } else { // opening tag\n      iter = new Iter(cm, to.line, to.ch, range);\n      return {open: here, close: findMatchingClose(iter, start[2]), at: \"open\"};\n    }\n  };\n\n  CodeMirror.findEnclosingTag = function(cm, pos, range) {\n    var iter = new Iter(cm, pos.line, pos.ch, range);\n    for (;;) {\n      var open = findMatchingOpen(iter);\n      if (!open) break;\n      var forward = new Iter(cm, pos.line, pos.ch, range);\n      var close = findMatchingClose(forward, open.tag);\n      if (close) return {open: open, close: close};\n    }\n  };\n\n  // Used by addon/edit/closetag.js\n  CodeMirror.scanForClosingTag = function(cm, pos, name, end) {\n    var iter = new Iter(cm, pos.line, pos.ch, end ? {from: 0, to: end} : null);\n    return findMatchingClose(iter, name);\n  };\n});\n\n},{\"codemirror\":undefined}],8:[function(require,module,exports){\n// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod((function(){try{return require('codemirror')}catch(e){return window.CodeMirror}})());\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nfunction expressionAllowed(stream, state, backUp) {\n  return /^(?:operator|sof|keyword c|case|new|[\\[{}\\(,;:]|=>)$/.test(state.lastType) ||\n    (state.lastType == \"quasi\" && /\\{\\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0))))\n}\n\nCodeMirror.defineMode(\"javascript\", function(config, parserConfig) {\n  var indentUnit = config.indentUnit;\n  var statementIndent = parserConfig.statementIndent;\n  var jsonldMode = parserConfig.jsonld;\n  var jsonMode = parserConfig.json || jsonldMode;\n  var isTS = parserConfig.typescript;\n  var wordRE = parserConfig.wordCharacters || /[\\w$\\xa1-\\uffff]/;\n\n  // Tokenizer\n\n  var keywords = function(){\n    function kw(type) {return {type: type, style: \"keyword\"};}\n    var A = kw(\"keyword a\"), B = kw(\"keyword b\"), C = kw(\"keyword c\");\n    var operator = kw(\"operator\"), atom = {type: \"atom\", style: \"atom\"};\n\n    var jsKeywords = {\n      \"if\": kw(\"if\"), \"while\": A, \"with\": A, \"else\": B, \"do\": B, \"try\": B, \"finally\": B,\n      \"return\": C, \"break\": C, \"continue\": C, \"new\": kw(\"new\"), \"delete\": C, \"throw\": C, \"debugger\": C,\n      \"var\": kw(\"var\"), \"const\": kw(\"var\"), \"let\": kw(\"var\"),\n      \"function\": kw(\"function\"), \"catch\": kw(\"catch\"),\n      \"for\": kw(\"for\"), \"switch\": kw(\"switch\"), \"case\": kw(\"case\"), \"default\": kw(\"default\"),\n      \"in\": operator, \"typeof\": operator, \"instanceof\": operator,\n      \"true\": atom, \"false\": atom, \"null\": atom, \"undefined\": atom, \"NaN\": atom, \"Infinity\": atom,\n      \"this\": kw(\"this\"), \"class\": kw(\"class\"), \"super\": kw(\"atom\"),\n      \"yield\": C, \"export\": kw(\"export\"), \"import\": kw(\"import\"), \"extends\": C,\n      \"await\": C, \"async\": kw(\"async\")\n    };\n\n    // Extend the 'normal' keywords with the TypeScript language extensions\n    if (isTS) {\n      var type = {type: \"variable\", style: \"variable-3\"};\n      var tsKeywords = {\n        // object-like things\n        \"interface\": kw(\"class\"),\n        \"implements\": C,\n        \"namespace\": C,\n        \"module\": kw(\"module\"),\n        \"enum\": kw(\"module\"),\n        \"type\": kw(\"type\"),\n\n        // scope modifiers\n        \"public\": kw(\"modifier\"),\n        \"private\": kw(\"modifier\"),\n        \"protected\": kw(\"modifier\"),\n        \"abstract\": kw(\"modifier\"),\n\n        // operators\n        \"as\": operator,\n\n        // types\n        \"string\": type, \"number\": type, \"boolean\": type, \"any\": type\n      };\n\n      for (var attr in tsKeywords) {\n        jsKeywords[attr] = tsKeywords[attr];\n      }\n    }\n\n    return jsKeywords;\n  }();\n\n  var isOperatorChar = /[+\\-*&%=<>!?|~^]/;\n  var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)\"/;\n\n  function readRegexp(stream) {\n    var escaped = false, next, inSet = false;\n    while ((next = stream.next()) != null) {\n      if (!escaped) {\n        if (next == \"/\" && !inSet) return;\n        if (next == \"[\") inSet = true;\n        else if (inSet && next == \"]\") inSet = false;\n      }\n      escaped = !escaped && next == \"\\\\\";\n    }\n  }\n\n  // Used as scratch variables to communicate multiple values without\n  // consing up tons of objects.\n  var type, content;\n  function ret(tp, style, cont) {\n    type = tp; content = cont;\n    return style;\n  }\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (ch == '\"' || ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    } else if (ch == \".\" && stream.match(/^\\d+(?:[eE][+\\-]?\\d+)?/)) {\n      return ret(\"number\", \"number\");\n    } else if (ch == \".\" && stream.match(\"..\")) {\n      return ret(\"spread\", \"meta\");\n    } else if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch)) {\n      return ret(ch);\n    } else if (ch == \"=\" && stream.eat(\">\")) {\n      return ret(\"=>\", \"operator\");\n    } else if (ch == \"0\" && stream.eat(/x/i)) {\n      stream.eatWhile(/[\\da-f]/i);\n      return ret(\"number\", \"number\");\n    } else if (ch == \"0\" && stream.eat(/o/i)) {\n      stream.eatWhile(/[0-7]/i);\n      return ret(\"number\", \"number\");\n    } else if (ch == \"0\" && stream.eat(/b/i)) {\n      stream.eatWhile(/[01]/i);\n      return ret(\"number\", \"number\");\n    } else if (/\\d/.test(ch)) {\n      stream.match(/^\\d*(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/);\n      return ret(\"number\", \"number\");\n    } else if (ch == \"/\") {\n      if (stream.eat(\"*\")) {\n        state.tokenize = tokenComment;\n        return tokenComment(stream, state);\n      } else if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return ret(\"comment\", \"comment\");\n      } else if (expressionAllowed(stream, state, 1)) {\n        readRegexp(stream);\n        stream.match(/^\\b(([gimyu])(?![gimyu]*\\2))+\\b/);\n        return ret(\"regexp\", \"string-2\");\n      } else {\n        stream.eatWhile(isOperatorChar);\n        return ret(\"operator\", \"operator\", stream.current());\n      }\n    } else if (ch == \"`\") {\n      state.tokenize = tokenQuasi;\n      return tokenQuasi(stream, state);\n    } else if (ch == \"#\") {\n      stream.skipToEnd();\n      return ret(\"error\", \"error\");\n    } else if (isOperatorChar.test(ch)) {\n      stream.eatWhile(isOperatorChar);\n      return ret(\"operator\", \"operator\", stream.current());\n    } else if (wordRE.test(ch)) {\n      stream.eatWhile(wordRE);\n      var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];\n      return (known && state.lastType != \".\") ? ret(known.type, known.style, word) :\n                     ret(\"variable\", \"variable\", word);\n    }\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next;\n      if (jsonldMode && stream.peek() == \"@\" && stream.match(isJsonldKeyword)){\n        state.tokenize = tokenBase;\n        return ret(\"jsonld-keyword\", \"meta\");\n      }\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) break;\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (!escaped) state.tokenize = tokenBase;\n      return ret(\"string\", \"string\");\n    };\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return ret(\"comment\", \"comment\");\n  }\n\n  function tokenQuasi(stream, state) {\n    var escaped = false, next;\n    while ((next = stream.next()) != null) {\n      if (!escaped && (next == \"`\" || next == \"$\" && stream.eat(\"{\"))) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      escaped = !escaped && next == \"\\\\\";\n    }\n    return ret(\"quasi\", \"string-2\", stream.current());\n  }\n\n  var brackets = \"([{}])\";\n  // This is a crude lookahead trick to try and notice that we're\n  // parsing the argument patterns for a fat-arrow function before we\n  // actually hit the arrow token. It only works if the arrow is on\n  // the same line as the arguments and there's no strange noise\n  // (comments) in between. Fallback is to only notice when we hit the\n  // arrow, and not declare the arguments as locals for the arrow\n  // body.\n  function findFatArrow(stream, state) {\n    if (state.fatArrowAt) state.fatArrowAt = null;\n    var arrow = stream.string.indexOf(\"=>\", stream.start);\n    if (arrow < 0) return;\n\n    var depth = 0, sawSomething = false;\n    for (var pos = arrow - 1; pos >= 0; --pos) {\n      var ch = stream.string.charAt(pos);\n      var bracket = brackets.indexOf(ch);\n      if (bracket >= 0 && bracket < 3) {\n        if (!depth) { ++pos; break; }\n        if (--depth == 0) { if (ch == \"(\") sawSomething = true; break; }\n      } else if (bracket >= 3 && bracket < 6) {\n        ++depth;\n      } else if (wordRE.test(ch)) {\n        sawSomething = true;\n      } else if (/[\"'\\/]/.test(ch)) {\n        return;\n      } else if (sawSomething && !depth) {\n        ++pos;\n        break;\n      }\n    }\n    if (sawSomething && !depth) state.fatArrowAt = pos;\n  }\n\n  // Parser\n\n  var atomicTypes = {\"atom\": true, \"number\": true, \"variable\": true, \"string\": true, \"regexp\": true, \"this\": true, \"jsonld-keyword\": true};\n\n  function JSLexical(indented, column, type, align, prev, info) {\n    this.indented = indented;\n    this.column = column;\n    this.type = type;\n    this.prev = prev;\n    this.info = info;\n    if (align != null) this.align = align;\n  }\n\n  function inScope(state, varname) {\n    for (var v = state.localVars; v; v = v.next)\n      if (v.name == varname) return true;\n    for (var cx = state.context; cx; cx = cx.prev) {\n      for (var v = cx.vars; v; v = v.next)\n        if (v.name == varname) return true;\n    }\n  }\n\n  function parseJS(state, style, type, content, stream) {\n    var cc = state.cc;\n    // Communicate our context to the combinators.\n    // (Less wasteful than consing up a hundred closures on every call.)\n    cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style;\n\n    if (!state.lexical.hasOwnProperty(\"align\"))\n      state.lexical.align = true;\n\n    while(true) {\n      var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;\n      if (combinator(type, content)) {\n        while(cc.length && cc[cc.length - 1].lex)\n          cc.pop()();\n        if (cx.marked) return cx.marked;\n        if (type == \"variable\" && inScope(state, content)) return \"variable-2\";\n        return style;\n      }\n    }\n  }\n\n  // Combinator utils\n\n  var cx = {state: null, column: null, marked: null, cc: null};\n  function pass() {\n    for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);\n  }\n  function cont() {\n    pass.apply(null, arguments);\n    return true;\n  }\n  function register(varname) {\n    function inList(list) {\n      for (var v = list; v; v = v.next)\n        if (v.name == varname) return true;\n      return false;\n    }\n    var state = cx.state;\n    cx.marked = \"def\";\n    if (state.context) {\n      if (inList(state.localVars)) return;\n      state.localVars = {name: varname, next: state.localVars};\n    } else {\n      if (inList(state.globalVars)) return;\n      if (parserConfig.globalVars)\n        state.globalVars = {name: varname, next: state.globalVars};\n    }\n  }\n\n  // Combinators\n\n  var defaultVars = {name: \"this\", next: {name: \"arguments\"}};\n  function pushcontext() {\n    cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};\n    cx.state.localVars = defaultVars;\n  }\n  function popcontext() {\n    cx.state.localVars = cx.state.context.vars;\n    cx.state.context = cx.state.context.prev;\n  }\n  function pushlex(type, info) {\n    var result = function() {\n      var state = cx.state, indent = state.indented;\n      if (state.lexical.type == \"stat\") indent = state.lexical.indented;\n      else for (var outer = state.lexical; outer && outer.type == \")\" && outer.align; outer = outer.prev)\n        indent = outer.indented;\n      state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info);\n    };\n    result.lex = true;\n    return result;\n  }\n  function poplex() {\n    var state = cx.state;\n    if (state.lexical.prev) {\n      if (state.lexical.type == \")\")\n        state.indented = state.lexical.indented;\n      state.lexical = state.lexical.prev;\n    }\n  }\n  poplex.lex = true;\n\n  function expect(wanted) {\n    function exp(type) {\n      if (type == wanted) return cont();\n      else if (wanted == \";\") return pass();\n      else return cont(exp);\n    };\n    return exp;\n  }\n\n  function statement(type, value) {\n    if (type == \"var\") return cont(pushlex(\"vardef\", value.length), vardef, expect(\";\"), poplex);\n    if (type == \"keyword a\") return cont(pushlex(\"form\"), parenExpr, statement, poplex);\n    if (type == \"keyword b\") return cont(pushlex(\"form\"), statement, poplex);\n    if (type == \"{\") return cont(pushlex(\"}\"), block, poplex);\n    if (type == \";\") return cont();\n    if (type == \"if\") {\n      if (cx.state.lexical.info == \"else\" && cx.state.cc[cx.state.cc.length - 1] == poplex)\n        cx.state.cc.pop()();\n      return cont(pushlex(\"form\"), parenExpr, statement, poplex, maybeelse);\n    }\n    if (type == \"function\") return cont(functiondef);\n    if (type == \"for\") return cont(pushlex(\"form\"), forspec, statement, poplex);\n    if (type == \"variable\") return cont(pushlex(\"stat\"), maybelabel);\n    if (type == \"switch\") return cont(pushlex(\"form\"), parenExpr, pushlex(\"}\", \"switch\"), expect(\"{\"),\n                                      block, poplex, poplex);\n    if (type == \"case\") return cont(expression, expect(\":\"));\n    if (type == \"default\") return cont(expect(\":\"));\n    if (type == \"catch\") return cont(pushlex(\"form\"), pushcontext, expect(\"(\"), funarg, expect(\")\"),\n                                     statement, poplex, popcontext);\n    if (type == \"class\") return cont(pushlex(\"form\"), className, poplex);\n    if (type == \"export\") return cont(pushlex(\"stat\"), afterExport, poplex);\n    if (type == \"import\") return cont(pushlex(\"stat\"), afterImport, poplex);\n    if (type == \"module\") return cont(pushlex(\"form\"), pattern, pushlex(\"}\"), expect(\"{\"), block, poplex, poplex)\n    if (type == \"type\") return cont(typeexpr, expect(\"operator\"), typeexpr, expect(\";\"));\n    if (type == \"async\") return cont(statement)\n    return pass(pushlex(\"stat\"), expression, expect(\";\"), poplex);\n  }\n  function expression(type) {\n    return expressionInner(type, false);\n  }\n  function expressionNoComma(type) {\n    return expressionInner(type, true);\n  }\n  function parenExpr(type) {\n    if (type != \"(\") return pass()\n    return cont(pushlex(\")\"), expression, expect(\")\"), poplex)\n  }\n  function expressionInner(type, noComma) {\n    if (cx.state.fatArrowAt == cx.stream.start) {\n      var body = noComma ? arrowBodyNoComma : arrowBody;\n      if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(pattern, \")\"), poplex, expect(\"=>\"), body, popcontext);\n      else if (type == \"variable\") return pass(pushcontext, pattern, expect(\"=>\"), body, popcontext);\n    }\n\n    var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma;\n    if (atomicTypes.hasOwnProperty(type)) return cont(maybeop);\n    if (type == \"function\") return cont(functiondef, maybeop);\n    if (type == \"keyword c\" || type == \"async\") return cont(noComma ? maybeexpressionNoComma : maybeexpression);\n    if (type == \"(\") return cont(pushlex(\")\"), maybeexpression, expect(\")\"), poplex, maybeop);\n    if (type == \"operator\" || type == \"spread\") return cont(noComma ? expressionNoComma : expression);\n    if (type == \"[\") return cont(pushlex(\"]\"), arrayLiteral, poplex, maybeop);\n    if (type == \"{\") return contCommasep(objprop, \"}\", null, maybeop);\n    if (type == \"quasi\") return pass(quasi, maybeop);\n    if (type == \"new\") return cont(maybeTarget(noComma));\n    return cont();\n  }\n  function maybeexpression(type) {\n    if (type.match(/[;\\}\\)\\],]/)) return pass();\n    return pass(expression);\n  }\n  function maybeexpressionNoComma(type) {\n    if (type.match(/[;\\}\\)\\],]/)) return pass();\n    return pass(expressionNoComma);\n  }\n\n  function maybeoperatorComma(type, value) {\n    if (type == \",\") return cont(expression);\n    return maybeoperatorNoComma(type, value, false);\n  }\n  function maybeoperatorNoComma(type, value, noComma) {\n    var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma;\n    var expr = noComma == false ? expression : expressionNoComma;\n    if (type == \"=>\") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);\n    if (type == \"operator\") {\n      if (/\\+\\+|--/.test(value)) return cont(me);\n      if (value == \"?\") return cont(expression, expect(\":\"), expr);\n      return cont(expr);\n    }\n    if (type == \"quasi\") { return pass(quasi, me); }\n    if (type == \";\") return;\n    if (type == \"(\") return contCommasep(expressionNoComma, \")\", \"call\", me);\n    if (type == \".\") return cont(property, me);\n    if (type == \"[\") return cont(pushlex(\"]\"), maybeexpression, expect(\"]\"), poplex, me);\n  }\n  function quasi(type, value) {\n    if (type != \"quasi\") return pass();\n    if (value.slice(value.length - 2) != \"${\") return cont(quasi);\n    return cont(expression, continueQuasi);\n  }\n  function continueQuasi(type) {\n    if (type == \"}\") {\n      cx.marked = \"string-2\";\n      cx.state.tokenize = tokenQuasi;\n      return cont(quasi);\n    }\n  }\n  function arrowBody(type) {\n    findFatArrow(cx.stream, cx.state);\n    return pass(type == \"{\" ? statement : expression);\n  }\n  function arrowBodyNoComma(type) {\n    findFatArrow(cx.stream, cx.state);\n    return pass(type == \"{\" ? statement : expressionNoComma);\n  }\n  function maybeTarget(noComma) {\n    return function(type) {\n      if (type == \".\") return cont(noComma ? targetNoComma : target);\n      else return pass(noComma ? expressionNoComma : expression);\n    };\n  }\n  function target(_, value) {\n    if (value == \"target\") { cx.marked = \"keyword\"; return cont(maybeoperatorComma); }\n  }\n  function targetNoComma(_, value) {\n    if (value == \"target\") { cx.marked = \"keyword\"; return cont(maybeoperatorNoComma); }\n  }\n  function maybelabel(type) {\n    if (type == \":\") return cont(poplex, statement);\n    return pass(maybeoperatorComma, expect(\";\"), poplex);\n  }\n  function property(type) {\n    if (type == \"variable\") {cx.marked = \"property\"; return cont();}\n  }\n  function objprop(type, value) {\n    if (type == \"async\") {\n      cx.marked = \"property\";\n      return cont(objprop);\n    } else if (type == \"variable\" || cx.style == \"keyword\") {\n      cx.marked = \"property\";\n      if (value == \"get\" || value == \"set\") return cont(getterSetter);\n      return cont(afterprop);\n    } else if (type == \"number\" || type == \"string\") {\n      cx.marked = jsonldMode ? \"property\" : (cx.style + \" property\");\n      return cont(afterprop);\n    } else if (type == \"jsonld-keyword\") {\n      return cont(afterprop);\n    } else if (type == \"modifier\") {\n      return cont(objprop)\n    } else if (type == \"[\") {\n      return cont(expression, expect(\"]\"), afterprop);\n    } else if (type == \"spread\") {\n      return cont(expression);\n    } else if (type == \":\") {\n      return pass(afterprop)\n    }\n  }\n  function getterSetter(type) {\n    if (type != \"variable\") return pass(afterprop);\n    cx.marked = \"property\";\n    return cont(functiondef);\n  }\n  function afterprop(type) {\n    if (type == \":\") return cont(expressionNoComma);\n    if (type == \"(\") return pass(functiondef);\n  }\n  function commasep(what, end) {\n    function proceed(type, value) {\n      if (type == \",\") {\n        var lex = cx.state.lexical;\n        if (lex.info == \"call\") lex.pos = (lex.pos || 0) + 1;\n        return cont(function(type, value) {\n          if (type == end || value == end) return pass()\n          return pass(what)\n        }, proceed);\n      }\n      if (type == end || value == end) return cont();\n      return cont(expect(end));\n    }\n    return function(type, value) {\n      if (type == end || value == end) return cont();\n      return pass(what, proceed);\n    };\n  }\n  function contCommasep(what, end, info) {\n    for (var i = 3; i < arguments.length; i++)\n      cx.cc.push(arguments[i]);\n    return cont(pushlex(end, info), commasep(what, end), poplex);\n  }\n  function block(type) {\n    if (type == \"}\") return cont();\n    return pass(statement, block);\n  }\n  function maybetype(type, value) {\n    if (isTS) {\n      if (type == \":\") return cont(typeexpr);\n      if (value == \"?\") return cont(maybetype);\n    }\n  }\n  function maybedefault(_, value) {\n    if (value == \"=\") return cont(expressionNoComma);\n  }\n  function typeexpr(type) {\n    if (type == \"variable\") {cx.marked = \"variable-3\"; return cont(afterType);}\n    if (type == \"{\") return cont(commasep(typeprop, \"}\"))\n    if (type == \"(\") return cont(commasep(typearg, \")\"), maybeReturnType)\n  }\n  function maybeReturnType(type) {\n    if (type == \"=>\") return cont(typeexpr)\n  }\n  function typeprop(type) {\n    if (type == \"variable\" || cx.style == \"keyword\") {\n      cx.marked = \"property\"\n      return cont(typeprop)\n    } else if (type == \":\") {\n      return cont(typeexpr)\n    }\n  }\n  function typearg(type) {\n    if (type == \"variable\") return cont(typearg)\n    else if (type == \":\") return cont(typeexpr)\n  }\n  function afterType(type, value) {\n    if (value == \"<\") return cont(commasep(typeexpr, \">\"), afterType)\n    if (type == \"[\") return cont(expect(\"]\"), afterType)\n  }\n  function vardef() {\n    return pass(pattern, maybetype, maybeAssign, vardefCont);\n  }\n  function pattern(type, value) {\n    if (type == \"modifier\") return cont(pattern)\n    if (type == \"variable\") { register(value); return cont(); }\n    if (type == \"spread\") return cont(pattern);\n    if (type == \"[\") return contCommasep(pattern, \"]\");\n    if (type == \"{\") return contCommasep(proppattern, \"}\");\n  }\n  function proppattern(type, value) {\n    if (type == \"variable\" && !cx.stream.match(/^\\s*:/, false)) {\n      register(value);\n      return cont(maybeAssign);\n    }\n    if (type == \"variable\") cx.marked = \"property\";\n    if (type == \"spread\") return cont(pattern);\n    if (type == \"}\") return pass();\n    return cont(expect(\":\"), pattern, maybeAssign);\n  }\n  function maybeAssign(_type, value) {\n    if (value == \"=\") return cont(expressionNoComma);\n  }\n  function vardefCont(type) {\n    if (type == \",\") return cont(vardef);\n  }\n  function maybeelse(type, value) {\n    if (type == \"keyword b\" && value == \"else\") return cont(pushlex(\"form\", \"else\"), statement, poplex);\n  }\n  function forspec(type) {\n    if (type == \"(\") return cont(pushlex(\")\"), forspec1, expect(\")\"), poplex);\n  }\n  function forspec1(type) {\n    if (type == \"var\") return cont(vardef, expect(\";\"), forspec2);\n    if (type == \";\") return cont(forspec2);\n    if (type == \"variable\") return cont(formaybeinof);\n    return pass(expression, expect(\";\"), forspec2);\n  }\n  function formaybeinof(_type, value) {\n    if (value == \"in\" || value == \"of\") { cx.marked = \"keyword\"; return cont(expression); }\n    return cont(maybeoperatorComma, forspec2);\n  }\n  function forspec2(type, value) {\n    if (type == \";\") return cont(forspec3);\n    if (value == \"in\" || value == \"of\") { cx.marked = \"keyword\"; return cont(expression); }\n    return pass(expression, expect(\";\"), forspec3);\n  }\n  function forspec3(type) {\n    if (type != \")\") cont(expression);\n  }\n  function functiondef(type, value) {\n    if (value == \"*\") {cx.marked = \"keyword\"; return cont(functiondef);}\n    if (type == \"variable\") {register(value); return cont(functiondef);}\n    if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(funarg, \")\"), poplex, maybetype, statement, popcontext);\n  }\n  function funarg(type) {\n    if (type == \"spread\") return cont(funarg);\n    return pass(pattern, maybetype, maybedefault);\n  }\n  function className(type, value) {\n    if (type == \"variable\") {register(value); return cont(classNameAfter);}\n  }\n  function classNameAfter(type, value) {\n    if (value == \"extends\") return cont(isTS ? typeexpr : expression, classNameAfter);\n    if (type == \"{\") return cont(pushlex(\"}\"), classBody, poplex);\n  }\n  function classBody(type, value) {\n    if (type == \"variable\" || cx.style == \"keyword\") {\n      if ((value == \"static\" || value == \"get\" || value == \"set\" ||\n           (isTS && (value == \"public\" || value == \"private\" || value == \"protected\"))) &&\n          cx.stream.match(/^\\s+[\\w$\\xa1-\\uffff]/, false)) {\n        cx.marked = \"keyword\";\n        return cont(classBody);\n      }\n      cx.marked = \"property\";\n      return cont(isTS ? classfield : functiondef, classBody);\n    }\n    if (value == \"*\") {\n      cx.marked = \"keyword\";\n      return cont(classBody);\n    }\n    if (type == \";\") return cont(classBody);\n    if (type == \"}\") return cont();\n  }\n  function classfield(type) {\n    if (type == \":\") return cont(typeexpr)\n    return pass(functiondef)\n  }\n  function afterExport(_type, value) {\n    if (value == \"*\") { cx.marked = \"keyword\"; return cont(maybeFrom, expect(\";\")); }\n    if (value == \"default\") { cx.marked = \"keyword\"; return cont(expression, expect(\";\")); }\n    return pass(statement);\n  }\n  function afterImport(type) {\n    if (type == \"string\") return cont();\n    return pass(importSpec, maybeFrom);\n  }\n  function importSpec(type, value) {\n    if (type == \"{\") return contCommasep(importSpec, \"}\");\n    if (type == \"variable\") register(value);\n    if (value == \"*\") cx.marked = \"keyword\";\n    return cont(maybeAs);\n  }\n  function maybeAs(_type, value) {\n    if (value == \"as\") { cx.marked = \"keyword\"; return cont(importSpec); }\n  }\n  function maybeFrom(_type, value) {\n    if (value == \"from\") { cx.marked = \"keyword\"; return cont(expression); }\n  }\n  function arrayLiteral(type) {\n    if (type == \"]\") return cont();\n    return pass(commasep(expressionNoComma, \"]\"));\n  }\n\n  function isContinuedStatement(state, textAfter) {\n    return state.lastType == \"operator\" || state.lastType == \",\" ||\n      isOperatorChar.test(textAfter.charAt(0)) ||\n      /[,.]/.test(textAfter.charAt(0));\n  }\n\n  // Interface\n\n  return {\n    startState: function(basecolumn) {\n      var state = {\n        tokenize: tokenBase,\n        lastType: \"sof\",\n        cc: [],\n        lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, \"block\", false),\n        localVars: parserConfig.localVars,\n        context: parserConfig.localVars && {vars: parserConfig.localVars},\n        indented: basecolumn || 0\n      };\n      if (parserConfig.globalVars && typeof parserConfig.globalVars == \"object\")\n        state.globalVars = parserConfig.globalVars;\n      return state;\n    },\n\n    token: function(stream, state) {\n      if (stream.sol()) {\n        if (!state.lexical.hasOwnProperty(\"align\"))\n          state.lexical.align = false;\n        state.indented = stream.indentation();\n        findFatArrow(stream, state);\n      }\n      if (state.tokenize != tokenComment && stream.eatSpace()) return null;\n      var style = state.tokenize(stream, state);\n      if (type == \"comment\") return style;\n      state.lastType = type == \"operator\" && (content == \"++\" || content == \"--\") ? \"incdec\" : type;\n      return parseJS(state, style, type, content, stream);\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize == tokenComment) return CodeMirror.Pass;\n      if (state.tokenize != tokenBase) return 0;\n      var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical, top\n      // Kludge to prevent 'maybelse' from blocking lexical scope pops\n      if (!/^\\s*else\\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) {\n        var c = state.cc[i];\n        if (c == poplex) lexical = lexical.prev;\n        else if (c != maybeelse) break;\n      }\n      while ((lexical.type == \"stat\" || lexical.type == \"form\") &&\n             (firstChar == \"}\" || ((top = state.cc[state.cc.length - 1]) &&\n                                   (top == maybeoperatorComma || top == maybeoperatorNoComma) &&\n                                   !/^[,\\.=+\\-*:?[\\(]/.test(textAfter))))\n        lexical = lexical.prev;\n      if (statementIndent && lexical.type == \")\" && lexical.prev.type == \"stat\")\n        lexical = lexical.prev;\n      var type = lexical.type, closing = firstChar == type;\n\n      if (type == \"vardef\") return lexical.indented + (state.lastType == \"operator\" || state.lastType == \",\" ? lexical.info + 1 : 0);\n      else if (type == \"form\" && firstChar == \"{\") return lexical.indented;\n      else if (type == \"form\") return lexical.indented + indentUnit;\n      else if (type == \"stat\")\n        return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0);\n      else if (lexical.info == \"switch\" && !closing && parserConfig.doubleIndentSwitch != false)\n        return lexical.indented + (/^(?:case|default)\\b/.test(textAfter) ? indentUnit : 2 * indentUnit);\n      else if (lexical.align) return lexical.column + (closing ? 0 : 1);\n      else return lexical.indented + (closing ? 0 : indentUnit);\n    },\n\n    electricInput: /^\\s*(?:case .*?:|default:|\\{|\\})$/,\n    blockCommentStart: jsonMode ? null : \"/*\",\n    blockCommentEnd: jsonMode ? null : \"*/\",\n    lineComment: jsonMode ? null : \"//\",\n    fold: \"brace\",\n    closeBrackets: \"()[]{}''\\\"\\\"``\",\n\n    helperType: jsonMode ? \"json\" : \"javascript\",\n    jsonldMode: jsonldMode,\n    jsonMode: jsonMode,\n\n    expressionAllowed: expressionAllowed,\n    skipExpression: function(state) {\n      var top = state.cc[state.cc.length - 1]\n      if (top == expression || top == expressionNoComma) state.cc.pop()\n    }\n  };\n});\n\nCodeMirror.registerHelper(\"wordChars\", \"javascript\", /[\\w$]/);\n\nCodeMirror.defineMIME(\"text/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"text/ecmascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/x-javascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/ecmascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/json\", {name: \"javascript\", json: true});\nCodeMirror.defineMIME(\"application/x-json\", {name: \"javascript\", json: true});\nCodeMirror.defineMIME(\"application/ld+json\", {name: \"javascript\", jsonld: true});\nCodeMirror.defineMIME(\"text/typescript\", { name: \"javascript\", typescript: true });\nCodeMirror.defineMIME(\"application/typescript\", { name: \"javascript\", typescript: true });\n\n});\n\n},{\"codemirror\":undefined}],9:[function(require,module,exports){\n// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod((function(){try{return require('codemirror')}catch(e){return window.CodeMirror}})());\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nvar htmlConfig = {\n  autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true,\n                    'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true,\n                    'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true,\n                    'track': true, 'wbr': true, 'menuitem': true},\n  implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true,\n                     'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true,\n                     'th': true, 'tr': true},\n  contextGrabbers: {\n    'dd': {'dd': true, 'dt': true},\n    'dt': {'dd': true, 'dt': true},\n    'li': {'li': true},\n    'option': {'option': true, 'optgroup': true},\n    'optgroup': {'optgroup': true},\n    'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true,\n          'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true,\n          'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true,\n          'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true,\n          'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true},\n    'rp': {'rp': true, 'rt': true},\n    'rt': {'rp': true, 'rt': true},\n    'tbody': {'tbody': true, 'tfoot': true},\n    'td': {'td': true, 'th': true},\n    'tfoot': {'tbody': true},\n    'th': {'td': true, 'th': true},\n    'thead': {'tbody': true, 'tfoot': true},\n    'tr': {'tr': true}\n  },\n  doNotIndent: {\"pre\": true},\n  allowUnquoted: true,\n  allowMissing: true,\n  caseFold: true\n}\n\nvar xmlConfig = {\n  autoSelfClosers: {},\n  implicitlyClosed: {},\n  contextGrabbers: {},\n  doNotIndent: {},\n  allowUnquoted: false,\n  allowMissing: false,\n  caseFold: false\n}\n\nCodeMirror.defineMode(\"xml\", function(editorConf, config_) {\n  var indentUnit = editorConf.indentUnit\n  var config = {}\n  var defaults = config_.htmlMode ? htmlConfig : xmlConfig\n  for (var prop in defaults) config[prop] = defaults[prop]\n  for (var prop in config_) config[prop] = config_[prop]\n\n  // Return variables for tokenizers\n  var type, setStyle;\n\n  function inText(stream, state) {\n    function chain(parser) {\n      state.tokenize = parser;\n      return parser(stream, state);\n    }\n\n    var ch = stream.next();\n    if (ch == \"<\") {\n      if (stream.eat(\"!\")) {\n        if (stream.eat(\"[\")) {\n          if (stream.match(\"CDATA[\")) return chain(inBlock(\"atom\", \"]]>\"));\n          else return null;\n        } else if (stream.match(\"--\")) {\n          return chain(inBlock(\"comment\", \"-->\"));\n        } else if (stream.match(\"DOCTYPE\", true, true)) {\n          stream.eatWhile(/[\\w\\._\\-]/);\n          return chain(doctype(1));\n        } else {\n          return null;\n        }\n      } else if (stream.eat(\"?\")) {\n        stream.eatWhile(/[\\w\\._\\-]/);\n        state.tokenize = inBlock(\"meta\", \"?>\");\n        return \"meta\";\n      } else {\n        type = stream.eat(\"/\") ? \"closeTag\" : \"openTag\";\n        state.tokenize = inTag;\n        return \"tag bracket\";\n      }\n    } else if (ch == \"&\") {\n      var ok;\n      if (stream.eat(\"#\")) {\n        if (stream.eat(\"x\")) {\n          ok = stream.eatWhile(/[a-fA-F\\d]/) && stream.eat(\";\");\n        } else {\n          ok = stream.eatWhile(/[\\d]/) && stream.eat(\";\");\n        }\n      } else {\n        ok = stream.eatWhile(/[\\w\\.\\-:]/) && stream.eat(\";\");\n      }\n      return ok ? \"atom\" : \"error\";\n    } else {\n      stream.eatWhile(/[^&<]/);\n      return null;\n    }\n  }\n  inText.isInText = true;\n\n  function inTag(stream, state) {\n    var ch = stream.next();\n    if (ch == \">\" || (ch == \"/\" && stream.eat(\">\"))) {\n      state.tokenize = inText;\n      type = ch == \">\" ? \"endTag\" : \"selfcloseTag\";\n      return \"tag bracket\";\n    } else if (ch == \"=\") {\n      type = \"equals\";\n      return null;\n    } else if (ch == \"<\") {\n      state.tokenize = inText;\n      state.state = baseState;\n      state.tagName = state.tagStart = null;\n      var next = state.tokenize(stream, state);\n      return next ? next + \" tag error\" : \"tag error\";\n    } else if (/[\\'\\\"]/.test(ch)) {\n      state.tokenize = inAttribute(ch);\n      state.stringStartCol = stream.column();\n      return state.tokenize(stream, state);\n    } else {\n      stream.match(/^[^\\s\\u00a0=<>\\\"\\']*[^\\s\\u00a0=<>\\\"\\'\\/]/);\n      return \"word\";\n    }\n  }\n\n  function inAttribute(quote) {\n    var closure = function(stream, state) {\n      while (!stream.eol()) {\n        if (stream.next() == quote) {\n          state.tokenize = inTag;\n          break;\n        }\n      }\n      return \"string\";\n    };\n    closure.isInAttribute = true;\n    return closure;\n  }\n\n  function inBlock(style, terminator) {\n    return function(stream, state) {\n      while (!stream.eol()) {\n        if (stream.match(terminator)) {\n          state.tokenize = inText;\n          break;\n        }\n        stream.next();\n      }\n      return style;\n    };\n  }\n  function doctype(depth) {\n    return function(stream, state) {\n      var ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == \"<\") {\n          state.tokenize = doctype(depth + 1);\n          return state.tokenize(stream, state);\n        } else if (ch == \">\") {\n          if (depth == 1) {\n            state.tokenize = inText;\n            break;\n          } else {\n            state.tokenize = doctype(depth - 1);\n            return state.tokenize(stream, state);\n          }\n        }\n      }\n      return \"meta\";\n    };\n  }\n\n  function Context(state, tagName, startOfLine) {\n    this.prev = state.context;\n    this.tagName = tagName;\n    this.indent = state.indented;\n    this.startOfLine = startOfLine;\n    if (config.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent))\n      this.noIndent = true;\n  }\n  function popContext(state) {\n    if (state.context) state.context = state.context.prev;\n  }\n  function maybePopContext(state, nextTagName) {\n    var parentTagName;\n    while (true) {\n      if (!state.context) {\n        return;\n      }\n      parentTagName = state.context.tagName;\n      if (!config.contextGrabbers.hasOwnProperty(parentTagName) ||\n          !config.contextGrabbers[parentTagName].hasOwnProperty(nextTagName)) {\n        return;\n      }\n      popContext(state);\n    }\n  }\n\n  function baseState(type, stream, state) {\n    if (type == \"openTag\") {\n      state.tagStart = stream.column();\n      return tagNameState;\n    } else if (type == \"closeTag\") {\n      return closeTagNameState;\n    } else {\n      return baseState;\n    }\n  }\n  function tagNameState(type, stream, state) {\n    if (type == \"word\") {\n      state.tagName = stream.current();\n      setStyle = \"tag\";\n      return attrState;\n    } else {\n      setStyle = \"error\";\n      return tagNameState;\n    }\n  }\n  function closeTagNameState(type, stream, state) {\n    if (type == \"word\") {\n      var tagName = stream.current();\n      if (state.context && state.context.tagName != tagName &&\n          config.implicitlyClosed.hasOwnProperty(state.context.tagName))\n        popContext(state);\n      if ((state.context && state.context.tagName == tagName) || config.matchClosing === false) {\n        setStyle = \"tag\";\n        return closeState;\n      } else {\n        setStyle = \"tag error\";\n        return closeStateErr;\n      }\n    } else {\n      setStyle = \"error\";\n      return closeStateErr;\n    }\n  }\n\n  function closeState(type, _stream, state) {\n    if (type != \"endTag\") {\n      setStyle = \"error\";\n      return closeState;\n    }\n    popContext(state);\n    return baseState;\n  }\n  function closeStateErr(type, stream, state) {\n    setStyle = \"error\";\n    return closeState(type, stream, state);\n  }\n\n  function attrState(type, _stream, state) {\n    if (type == \"word\") {\n      setStyle = \"attribute\";\n      return attrEqState;\n    } else if (type == \"endTag\" || type == \"selfcloseTag\") {\n      var tagName = state.tagName, tagStart = state.tagStart;\n      state.tagName = state.tagStart = null;\n      if (type == \"selfcloseTag\" ||\n          config.autoSelfClosers.hasOwnProperty(tagName)) {\n        maybePopContext(state, tagName);\n      } else {\n        maybePopContext(state, tagName);\n        state.context = new Context(state, tagName, tagStart == state.indented);\n      }\n      return baseState;\n    }\n    setStyle = \"error\";\n    return attrState;\n  }\n  function attrEqState(type, stream, state) {\n    if (type == \"equals\") return attrValueState;\n    if (!config.allowMissing) setStyle = \"error\";\n    return attrState(type, stream, state);\n  }\n  function attrValueState(type, stream, state) {\n    if (type == \"string\") return attrContinuedState;\n    if (type == \"word\" && config.allowUnquoted) {setStyle = \"string\"; return attrState;}\n    setStyle = \"error\";\n    return attrState(type, stream, state);\n  }\n  function attrContinuedState(type, stream, state) {\n    if (type == \"string\") return attrContinuedState;\n    return attrState(type, stream, state);\n  }\n\n  return {\n    startState: function(baseIndent) {\n      var state = {tokenize: inText,\n                   state: baseState,\n                   indented: baseIndent || 0,\n                   tagName: null, tagStart: null,\n                   context: null}\n      if (baseIndent != null) state.baseIndent = baseIndent\n      return state\n    },\n\n    token: function(stream, state) {\n      if (!state.tagName && stream.sol())\n        state.indented = stream.indentation();\n\n      if (stream.eatSpace()) return null;\n      type = null;\n      var style = state.tokenize(stream, state);\n      if ((style || type) && style != \"comment\") {\n        setStyle = null;\n        state.state = state.state(type || style, stream, state);\n        if (setStyle)\n          style = setStyle == \"error\" ? style + \" error\" : setStyle;\n      }\n      return style;\n    },\n\n    indent: function(state, textAfter, fullLine) {\n      var context = state.context;\n      // Indent multi-line strings (e.g. css).\n      if (state.tokenize.isInAttribute) {\n        if (state.tagStart == state.indented)\n          return state.stringStartCol + 1;\n        else\n          return state.indented + indentUnit;\n      }\n      if (context && context.noIndent) return CodeMirror.Pass;\n      if (state.tokenize != inTag && state.tokenize != inText)\n        return fullLine ? fullLine.match(/^(\\s*)/)[0].length : 0;\n      // Indent the starts of attribute names.\n      if (state.tagName) {\n        if (config.multilineTagIndentPastTag !== false)\n          return state.tagStart + state.tagName.length + 2;\n        else\n          return state.tagStart + indentUnit * (config.multilineTagIndentFactor || 1);\n      }\n      if (config.alignCDATA && /<!\\[CDATA\\[/.test(textAfter)) return 0;\n      var tagAfter = textAfter && /^<(\\/)?([\\w_:\\.-]*)/.exec(textAfter);\n      if (tagAfter && tagAfter[1]) { // Closing tag spotted\n        while (context) {\n          if (context.tagName == tagAfter[2]) {\n            context = context.prev;\n            break;\n          } else if (config.implicitlyClosed.hasOwnProperty(context.tagName)) {\n            context = context.prev;\n          } else {\n            break;\n          }\n        }\n      } else if (tagAfter) { // Opening tag spotted\n        while (context) {\n          var grabbers = config.contextGrabbers[context.tagName];\n          if (grabbers && grabbers.hasOwnProperty(tagAfter[2]))\n            context = context.prev;\n          else\n            break;\n        }\n      }\n      while (context && context.prev && !context.startOfLine)\n        context = context.prev;\n      if (context) return context.indent + indentUnit;\n      else return state.baseIndent || 0;\n    },\n\n    electricInput: /<\\/[\\s\\w:]+>$/,\n    blockCommentStart: \"<!--\",\n    blockCommentEnd: \"-->\",\n\n    configuration: config.htmlMode ? \"html\" : \"xml\",\n    helperType: config.htmlMode ? \"html\" : \"xml\",\n\n    skipAttribute: function(state) {\n      if (state.state == attrValueState)\n        state.state = attrState\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/xml\", \"xml\");\nCodeMirror.defineMIME(\"application/xml\", \"xml\");\nif (!CodeMirror.mimeModes.hasOwnProperty(\"text/html\"))\n  CodeMirror.defineMIME(\"text/html\", {name: \"xml\", htmlMode: true});\n\n});\n\n},{\"codemirror\":undefined}],10:[function(require,module,exports){\n/* MIT license */\nvar cssKeywords = require('color-name');\n\n// NOTE: conversions should only return primitive values (i.e. arrays, or\n//       values that give correct `typeof` results).\n//       do not use box values types (i.e. Number(), String(), etc.)\n\nvar reverseKeywords = {};\nfor (var key in cssKeywords) {\n\tif (cssKeywords.hasOwnProperty(key)) {\n\t\treverseKeywords[cssKeywords[key]] = key;\n\t}\n}\n\nvar convert = module.exports = {\n\trgb: {channels: 3, labels: 'rgb'},\n\thsl: {channels: 3, labels: 'hsl'},\n\thsv: {channels: 3, labels: 'hsv'},\n\thwb: {channels: 3, labels: 'hwb'},\n\tcmyk: {channels: 4, labels: 'cmyk'},\n\txyz: {channels: 3, labels: 'xyz'},\n\tlab: {channels: 3, labels: 'lab'},\n\tlch: {channels: 3, labels: 'lch'},\n\thex: {channels: 1, labels: ['hex']},\n\tkeyword: {channels: 1, labels: ['keyword']},\n\tansi16: {channels: 1, labels: ['ansi16']},\n\tansi256: {channels: 1, labels: ['ansi256']},\n\thcg: {channels: 3, labels: ['h', 'c', 'g']},\n\tapple: {channels: 3, labels: ['r16', 'g16', 'b16']},\n\tgray: {channels: 1, labels: ['gray']}\n};\n\n// hide .channels and .labels properties\nfor (var model in convert) {\n\tif (convert.hasOwnProperty(model)) {\n\t\tif (!('channels' in convert[model])) {\n\t\t\tthrow new Error('missing channels property: ' + model);\n\t\t}\n\n\t\tif (!('labels' in convert[model])) {\n\t\t\tthrow new Error('missing channel labels property: ' + model);\n\t\t}\n\n\t\tif (convert[model].labels.length !== convert[model].channels) {\n\t\t\tthrow new Error('channel and label counts mismatch: ' + model);\n\t\t}\n\n\t\tvar channels = convert[model].channels;\n\t\tvar labels = convert[model].labels;\n\t\tdelete convert[model].channels;\n\t\tdelete convert[model].labels;\n\t\tObject.defineProperty(convert[model], 'channels', {value: channels});\n\t\tObject.defineProperty(convert[model], 'labels', {value: labels});\n\t}\n}\n\nconvert.rgb.hsl = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar min = Math.min(r, g, b);\n\tvar max = Math.max(r, g, b);\n\tvar delta = max - min;\n\tvar h;\n\tvar s;\n\tvar l;\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tl = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t} else if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t} else {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n\nconvert.rgb.hsv = function (rgb) {\n\tvar r = rgb[0];\n\tvar g = rgb[1];\n\tvar b = rgb[2];\n\tvar min = Math.min(r, g, b);\n\tvar max = Math.max(r, g, b);\n\tvar delta = max - min;\n\tvar h;\n\tvar s;\n\tvar v;\n\n\tif (max === 0) {\n\t\ts = 0;\n\t} else {\n\t\ts = (delta / max * 1000) / 10;\n\t}\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tv = ((max / 255) * 1000) / 10;\n\n\treturn [h, s, v];\n};\n\nconvert.rgb.hwb = function (rgb) {\n\tvar r = rgb[0];\n\tvar g = rgb[1];\n\tvar b = rgb[2];\n\tvar h = convert.rgb.hsl(rgb)[0];\n\tvar w = 1 / 255 * Math.min(r, Math.min(g, b));\n\n\tb = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\treturn [h, w * 100, b * 100];\n};\n\nconvert.rgb.cmyk = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar c;\n\tvar m;\n\tvar y;\n\tvar k;\n\n\tk = Math.min(1 - r, 1 - g, 1 - b);\n\tc = (1 - r - k) / (1 - k) || 0;\n\tm = (1 - g - k) / (1 - k) || 0;\n\ty = (1 - b - k) / (1 - k) || 0;\n\n\treturn [c * 100, m * 100, y * 100, k * 100];\n};\n\n/**\n * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance\n * */\nfunction comparativeDistance(x, y) {\n\treturn (\n\t\tMath.pow(x[0] - y[0], 2) +\n\t\tMath.pow(x[1] - y[1], 2) +\n\t\tMath.pow(x[2] - y[2], 2)\n\t);\n}\n\nconvert.rgb.keyword = function (rgb) {\n\tvar reversed = reverseKeywords[rgb];\n\tif (reversed) {\n\t\treturn reversed;\n\t}\n\n\tvar currentClosestDistance = Infinity;\n\tvar currentClosestKeyword;\n\n\tfor (var keyword in cssKeywords) {\n\t\tif (cssKeywords.hasOwnProperty(keyword)) {\n\t\t\tvar value = cssKeywords[keyword];\n\n\t\t\t// Compute comparative distance\n\t\t\tvar distance = comparativeDistance(rgb, value);\n\n\t\t\t// Check if its less, if so set as closest\n\t\t\tif (distance < currentClosestDistance) {\n\t\t\t\tcurrentClosestDistance = distance;\n\t\t\t\tcurrentClosestKeyword = keyword;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn currentClosestKeyword;\n};\n\nconvert.keyword.rgb = function (keyword) {\n\treturn cssKeywords[keyword];\n};\n\nconvert.rgb.xyz = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\n\t// assume sRGB\n\tr = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\n\tvar x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n\tvar y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n\tvar z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n\treturn [x * 100, y * 100, z * 100];\n};\n\nconvert.rgb.lab = function (rgb) {\n\tvar xyz = convert.rgb.xyz(rgb);\n\tvar x = xyz[0];\n\tvar y = xyz[1];\n\tvar z = xyz[2];\n\tvar l;\n\tvar a;\n\tvar b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.hsl.rgb = function (hsl) {\n\tvar h = hsl[0] / 360;\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar t1;\n\tvar t2;\n\tvar t3;\n\tvar rgb;\n\tvar val;\n\n\tif (s === 0) {\n\t\tval = l * 255;\n\t\treturn [val, val, val];\n\t}\n\n\tif (l < 0.5) {\n\t\tt2 = l * (1 + s);\n\t} else {\n\t\tt2 = l + s - l * s;\n\t}\n\n\tt1 = 2 * l - t2;\n\n\trgb = [0, 0, 0];\n\tfor (var i = 0; i < 3; i++) {\n\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\tif (t3 < 0) {\n\t\t\tt3++;\n\t\t}\n\t\tif (t3 > 1) {\n\t\t\tt3--;\n\t\t}\n\n\t\tif (6 * t3 < 1) {\n\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t} else if (2 * t3 < 1) {\n\t\t\tval = t2;\n\t\t} else if (3 * t3 < 2) {\n\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t} else {\n\t\t\tval = t1;\n\t\t}\n\n\t\trgb[i] = val * 255;\n\t}\n\n\treturn rgb;\n};\n\nconvert.hsl.hsv = function (hsl) {\n\tvar h = hsl[0];\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar smin = s;\n\tvar lmin = Math.max(l, 0.01);\n\tvar sv;\n\tvar v;\n\n\tl *= 2;\n\ts *= (l <= 1) ? l : 2 - l;\n\tsmin *= lmin <= 1 ? lmin : 2 - lmin;\n\tv = (l + s) / 2;\n\tsv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);\n\n\treturn [h, sv * 100, v * 100];\n};\n\nconvert.hsv.rgb = function (hsv) {\n\tvar h = hsv[0] / 60;\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\tvar hi = Math.floor(h) % 6;\n\n\tvar f = h - Math.floor(h);\n\tvar p = 255 * v * (1 - s);\n\tvar q = 255 * v * (1 - (s * f));\n\tvar t = 255 * v * (1 - (s * (1 - f)));\n\tv *= 255;\n\n\tswitch (hi) {\n\t\tcase 0:\n\t\t\treturn [v, t, p];\n\t\tcase 1:\n\t\t\treturn [q, v, p];\n\t\tcase 2:\n\t\t\treturn [p, v, t];\n\t\tcase 3:\n\t\t\treturn [p, q, v];\n\t\tcase 4:\n\t\t\treturn [t, p, v];\n\t\tcase 5:\n\t\t\treturn [v, p, q];\n\t}\n};\n\nconvert.hsv.hsl = function (hsv) {\n\tvar h = hsv[0];\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\tvar vmin = Math.max(v, 0.01);\n\tvar lmin;\n\tvar sl;\n\tvar l;\n\n\tl = (2 - s) * v;\n\tlmin = (2 - s) * vmin;\n\tsl = s * vmin;\n\tsl /= (lmin <= 1) ? lmin : 2 - lmin;\n\tsl = sl || 0;\n\tl /= 2;\n\n\treturn [h, sl * 100, l * 100];\n};\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nconvert.hwb.rgb = function (hwb) {\n\tvar h = hwb[0] / 360;\n\tvar wh = hwb[1] / 100;\n\tvar bl = hwb[2] / 100;\n\tvar ratio = wh + bl;\n\tvar i;\n\tvar v;\n\tvar f;\n\tvar n;\n\n\t// wh + bl cant be > 1\n\tif (ratio > 1) {\n\t\twh /= ratio;\n\t\tbl /= ratio;\n\t}\n\n\ti = Math.floor(6 * h);\n\tv = 1 - bl;\n\tf = 6 * h - i;\n\n\tif ((i & 0x01) !== 0) {\n\t\tf = 1 - f;\n\t}\n\n\tn = wh + f * (v - wh); // linear interpolation\n\n\tvar r;\n\tvar g;\n\tvar b;\n\tswitch (i) {\n\t\tdefault:\n\t\tcase 6:\n\t\tcase 0: r = v; g = n; b = wh; break;\n\t\tcase 1: r = n; g = v; b = wh; break;\n\t\tcase 2: r = wh; g = v; b = n; break;\n\t\tcase 3: r = wh; g = n; b = v; break;\n\t\tcase 4: r = n; g = wh; b = v; break;\n\t\tcase 5: r = v; g = wh; b = n; break;\n\t}\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.cmyk.rgb = function (cmyk) {\n\tvar c = cmyk[0] / 100;\n\tvar m = cmyk[1] / 100;\n\tvar y = cmyk[2] / 100;\n\tvar k = cmyk[3] / 100;\n\tvar r;\n\tvar g;\n\tvar b;\n\n\tr = 1 - Math.min(1, c * (1 - k) + k);\n\tg = 1 - Math.min(1, m * (1 - k) + k);\n\tb = 1 - Math.min(1, y * (1 - k) + k);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.rgb = function (xyz) {\n\tvar x = xyz[0] / 100;\n\tvar y = xyz[1] / 100;\n\tvar z = xyz[2] / 100;\n\tvar r;\n\tvar g;\n\tvar b;\n\n\tr = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n\tg = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n\tb = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n\t// assume sRGB\n\tr = r > 0.0031308\n\t\t? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n\t\t: r * 12.92;\n\n\tg = g > 0.0031308\n\t\t? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n\t\t: g * 12.92;\n\n\tb = b > 0.0031308\n\t\t? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n\t\t: b * 12.92;\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.lab = function (xyz) {\n\tvar x = xyz[0];\n\tvar y = xyz[1];\n\tvar z = xyz[2];\n\tvar l;\n\tvar a;\n\tvar b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.lab.xyz = function (lab) {\n\tvar l = lab[0];\n\tvar a = lab[1];\n\tvar b = lab[2];\n\tvar x;\n\tvar y;\n\tvar z;\n\n\ty = (l + 16) / 116;\n\tx = a / 500 + y;\n\tz = y - b / 200;\n\n\tvar y2 = Math.pow(y, 3);\n\tvar x2 = Math.pow(x, 3);\n\tvar z2 = Math.pow(z, 3);\n\ty = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;\n\tx = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;\n\tz = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;\n\n\tx *= 95.047;\n\ty *= 100;\n\tz *= 108.883;\n\n\treturn [x, y, z];\n};\n\nconvert.lab.lch = function (lab) {\n\tvar l = lab[0];\n\tvar a = lab[1];\n\tvar b = lab[2];\n\tvar hr;\n\tvar h;\n\tvar c;\n\n\thr = Math.atan2(b, a);\n\th = hr * 360 / 2 / Math.PI;\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tc = Math.sqrt(a * a + b * b);\n\n\treturn [l, c, h];\n};\n\nconvert.lch.lab = function (lch) {\n\tvar l = lch[0];\n\tvar c = lch[1];\n\tvar h = lch[2];\n\tvar a;\n\tvar b;\n\tvar hr;\n\n\thr = h / 360 * 2 * Math.PI;\n\ta = c * Math.cos(hr);\n\tb = c * Math.sin(hr);\n\n\treturn [l, a, b];\n};\n\nconvert.rgb.ansi16 = function (args) {\n\tvar r = args[0];\n\tvar g = args[1];\n\tvar b = args[2];\n\tvar value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization\n\n\tvalue = Math.round(value / 50);\n\n\tif (value === 0) {\n\t\treturn 30;\n\t}\n\n\tvar ansi = 30\n\t\t+ ((Math.round(b / 255) << 2)\n\t\t| (Math.round(g / 255) << 1)\n\t\t| Math.round(r / 255));\n\n\tif (value === 2) {\n\t\tansi += 60;\n\t}\n\n\treturn ansi;\n};\n\nconvert.hsv.ansi16 = function (args) {\n\t// optimization here; we already know the value and don't need to get\n\t// it converted for us.\n\treturn convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n};\n\nconvert.rgb.ansi256 = function (args) {\n\tvar r = args[0];\n\tvar g = args[1];\n\tvar b = args[2];\n\n\t// we use the extended greyscale palette here, with the exception of\n\t// black and white. normal palette only has 4 greyscale shades.\n\tif (r === g && g === b) {\n\t\tif (r < 8) {\n\t\t\treturn 16;\n\t\t}\n\n\t\tif (r > 248) {\n\t\t\treturn 231;\n\t\t}\n\n\t\treturn Math.round(((r - 8) / 247) * 24) + 232;\n\t}\n\n\tvar ansi = 16\n\t\t+ (36 * Math.round(r / 255 * 5))\n\t\t+ (6 * Math.round(g / 255 * 5))\n\t\t+ Math.round(b / 255 * 5);\n\n\treturn ansi;\n};\n\nconvert.ansi16.rgb = function (args) {\n\tvar color = args % 10;\n\n\t// handle greyscale\n\tif (color === 0 || color === 7) {\n\t\tif (args > 50) {\n\t\t\tcolor += 3.5;\n\t\t}\n\n\t\tcolor = color / 10.5 * 255;\n\n\t\treturn [color, color, color];\n\t}\n\n\tvar mult = (~~(args > 50) + 1) * 0.5;\n\tvar r = ((color & 1) * mult) * 255;\n\tvar g = (((color >> 1) & 1) * mult) * 255;\n\tvar b = (((color >> 2) & 1) * mult) * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.ansi256.rgb = function (args) {\n\t// handle greyscale\n\tif (args >= 232) {\n\t\tvar c = (args - 232) * 10 + 8;\n\t\treturn [c, c, c];\n\t}\n\n\targs -= 16;\n\n\tvar rem;\n\tvar r = Math.floor(args / 36) / 5 * 255;\n\tvar g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n\tvar b = (rem % 6) / 5 * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hex = function (args) {\n\tvar integer = ((Math.round(args[0]) & 0xFF) << 16)\n\t\t+ ((Math.round(args[1]) & 0xFF) << 8)\n\t\t+ (Math.round(args[2]) & 0xFF);\n\n\tvar string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.hex.rgb = function (args) {\n\tvar match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);\n\tif (!match) {\n\t\treturn [0, 0, 0];\n\t}\n\n\tvar colorString = match[0];\n\n\tif (match[0].length === 3) {\n\t\tcolorString = colorString.split('').map(function (char) {\n\t\t\treturn char + char;\n\t\t}).join('');\n\t}\n\n\tvar integer = parseInt(colorString, 16);\n\tvar r = (integer >> 16) & 0xFF;\n\tvar g = (integer >> 8) & 0xFF;\n\tvar b = integer & 0xFF;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hcg = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar max = Math.max(Math.max(r, g), b);\n\tvar min = Math.min(Math.min(r, g), b);\n\tvar chroma = (max - min);\n\tvar grayscale;\n\tvar hue;\n\n\tif (chroma < 1) {\n\t\tgrayscale = min / (1 - chroma);\n\t} else {\n\t\tgrayscale = 0;\n\t}\n\n\tif (chroma <= 0) {\n\t\thue = 0;\n\t} else\n\tif (max === r) {\n\t\thue = ((g - b) / chroma) % 6;\n\t} else\n\tif (max === g) {\n\t\thue = 2 + (b - r) / chroma;\n\t} else {\n\t\thue = 4 + (r - g) / chroma + 4;\n\t}\n\n\thue /= 6;\n\thue %= 1;\n\n\treturn [hue * 360, chroma * 100, grayscale * 100];\n};\n\nconvert.hsl.hcg = function (hsl) {\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar c = 1;\n\tvar f = 0;\n\n\tif (l < 0.5) {\n\t\tc = 2.0 * s * l;\n\t} else {\n\t\tc = 2.0 * s * (1.0 - l);\n\t}\n\n\tif (c < 1.0) {\n\t\tf = (l - 0.5 * c) / (1.0 - c);\n\t}\n\n\treturn [hsl[0], c * 100, f * 100];\n};\n\nconvert.hsv.hcg = function (hsv) {\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\n\tvar c = s * v;\n\tvar f = 0;\n\n\tif (c < 1.0) {\n\t\tf = (v - c) / (1 - c);\n\t}\n\n\treturn [hsv[0], c * 100, f * 100];\n};\n\nconvert.hcg.rgb = function (hcg) {\n\tvar h = hcg[0] / 360;\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tif (c === 0.0) {\n\t\treturn [g * 255, g * 255, g * 255];\n\t}\n\n\tvar pure = [0, 0, 0];\n\tvar hi = (h % 1) * 6;\n\tvar v = hi % 1;\n\tvar w = 1 - v;\n\tvar mg = 0;\n\n\tswitch (Math.floor(hi)) {\n\t\tcase 0:\n\t\t\tpure[0] = 1; pure[1] = v; pure[2] = 0; break;\n\t\tcase 1:\n\t\t\tpure[0] = w; pure[1] = 1; pure[2] = 0; break;\n\t\tcase 2:\n\t\t\tpure[0] = 0; pure[1] = 1; pure[2] = v; break;\n\t\tcase 3:\n\t\t\tpure[0] = 0; pure[1] = w; pure[2] = 1; break;\n\t\tcase 4:\n\t\t\tpure[0] = v; pure[1] = 0; pure[2] = 1; break;\n\t\tdefault:\n\t\t\tpure[0] = 1; pure[1] = 0; pure[2] = w;\n\t}\n\n\tmg = (1.0 - c) * g;\n\n\treturn [\n\t\t(c * pure[0] + mg) * 255,\n\t\t(c * pure[1] + mg) * 255,\n\t\t(c * pure[2] + mg) * 255\n\t];\n};\n\nconvert.hcg.hsv = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tvar v = c + g * (1.0 - c);\n\tvar f = 0;\n\n\tif (v > 0.0) {\n\t\tf = c / v;\n\t}\n\n\treturn [hcg[0], f * 100, v * 100];\n};\n\nconvert.hcg.hsl = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tvar l = g * (1.0 - c) + 0.5 * c;\n\tvar s = 0;\n\n\tif (l > 0.0 && l < 0.5) {\n\t\ts = c / (2 * l);\n\t} else\n\tif (l >= 0.5 && l < 1.0) {\n\t\ts = c / (2 * (1 - l));\n\t}\n\n\treturn [hcg[0], s * 100, l * 100];\n};\n\nconvert.hcg.hwb = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\tvar v = c + g * (1.0 - c);\n\treturn [hcg[0], (v - c) * 100, (1 - v) * 100];\n};\n\nconvert.hwb.hcg = function (hwb) {\n\tvar w = hwb[1] / 100;\n\tvar b = hwb[2] / 100;\n\tvar v = 1 - b;\n\tvar c = v - w;\n\tvar g = 0;\n\n\tif (c < 1) {\n\t\tg = (v - c) / (1 - c);\n\t}\n\n\treturn [hwb[0], c * 100, g * 100];\n};\n\nconvert.apple.rgb = function (apple) {\n\treturn [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];\n};\n\nconvert.rgb.apple = function (rgb) {\n\treturn [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];\n};\n\nconvert.gray.rgb = function (args) {\n\treturn [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];\n};\n\nconvert.gray.hsl = convert.gray.hsv = function (args) {\n\treturn [0, 0, args[0]];\n};\n\nconvert.gray.hwb = function (gray) {\n\treturn [0, 100, gray[0]];\n};\n\nconvert.gray.cmyk = function (gray) {\n\treturn [0, 0, 0, gray[0]];\n};\n\nconvert.gray.lab = function (gray) {\n\treturn [gray[0], 0, 0];\n};\n\nconvert.gray.hex = function (gray) {\n\tvar val = Math.round(gray[0] / 100 * 255) & 0xFF;\n\tvar integer = (val << 16) + (val << 8) + val;\n\n\tvar string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.rgb.gray = function (rgb) {\n\tvar val = (rgb[0] + rgb[1] + rgb[2]) / 3;\n\treturn [val / 255 * 100];\n};\n\n},{\"color-name\":13}],11:[function(require,module,exports){\nvar conversions = require('./conversions');\nvar route = require('./route');\n\nvar convert = {};\n\nvar models = Object.keys(conversions);\n\nfunction wrapRaw(fn) {\n\tvar wrappedFn = function (args) {\n\t\tif (args === undefined || args === null) {\n\t\t\treturn args;\n\t\t}\n\n\t\tif (arguments.length > 1) {\n\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t}\n\n\t\treturn fn(args);\n\t};\n\n\t// preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nfunction wrapRounded(fn) {\n\tvar wrappedFn = function (args) {\n\t\tif (args === undefined || args === null) {\n\t\t\treturn args;\n\t\t}\n\n\t\tif (arguments.length > 1) {\n\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t}\n\n\t\tvar result = fn(args);\n\n\t\t// we're assuming the result is an array here.\n\t\t// see notice in conversions.js; don't use box types\n\t\t// in conversion functions.\n\t\tif (typeof result === 'object') {\n\t\t\tfor (var len = result.length, i = 0; i < len; i++) {\n\t\t\t\tresult[i] = Math.round(result[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t// preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nmodels.forEach(function (fromModel) {\n\tconvert[fromModel] = {};\n\n\tObject.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});\n\tObject.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});\n\n\tvar routes = route(fromModel);\n\tvar routeModels = Object.keys(routes);\n\n\trouteModels.forEach(function (toModel) {\n\t\tvar fn = routes[toModel];\n\n\t\tconvert[fromModel][toModel] = wrapRounded(fn);\n\t\tconvert[fromModel][toModel].raw = wrapRaw(fn);\n\t});\n});\n\nmodule.exports = convert;\n\n},{\"./conversions\":10,\"./route\":12}],12:[function(require,module,exports){\nvar conversions = require('./conversions');\n\n/*\n\tthis function routes a model to all other models.\n\n\tall functions that are routed have a property `.conversion` attached\n\tto the returned synthetic function. This property is an array\n\tof strings, each with the steps in between the 'from' and 'to'\n\tcolor models (inclusive).\n\n\tconversions that are not possible simply are not included.\n*/\n\n// https://jsperf.com/object-keys-vs-for-in-with-closure/3\nvar models = Object.keys(conversions);\n\nfunction buildGraph() {\n\tvar graph = {};\n\n\tfor (var len = models.length, i = 0; i < len; i++) {\n\t\tgraph[models[i]] = {\n\t\t\t// http://jsperf.com/1-vs-infinity\n\t\t\t// micro-opt, but this is simple.\n\t\t\tdistance: -1,\n\t\t\tparent: null\n\t\t};\n\t}\n\n\treturn graph;\n}\n\n// https://en.wikipedia.org/wiki/Breadth-first_search\nfunction deriveBFS(fromModel) {\n\tvar graph = buildGraph();\n\tvar queue = [fromModel]; // unshift -> queue -> pop\n\n\tgraph[fromModel].distance = 0;\n\n\twhile (queue.length) {\n\t\tvar current = queue.pop();\n\t\tvar adjacents = Object.keys(conversions[current]);\n\n\t\tfor (var len = adjacents.length, i = 0; i < len; i++) {\n\t\t\tvar adjacent = adjacents[i];\n\t\t\tvar node = graph[adjacent];\n\n\t\t\tif (node.distance === -1) {\n\t\t\t\tnode.distance = graph[current].distance + 1;\n\t\t\t\tnode.parent = current;\n\t\t\t\tqueue.unshift(adjacent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn graph;\n}\n\nfunction link(from, to) {\n\treturn function (args) {\n\t\treturn to(from(args));\n\t};\n}\n\nfunction wrapConversion(toModel, graph) {\n\tvar path = [graph[toModel].parent, toModel];\n\tvar fn = conversions[graph[toModel].parent][toModel];\n\n\tvar cur = graph[toModel].parent;\n\twhile (graph[cur].parent) {\n\t\tpath.unshift(graph[cur].parent);\n\t\tfn = link(conversions[graph[cur].parent][cur], fn);\n\t\tcur = graph[cur].parent;\n\t}\n\n\tfn.conversion = path;\n\treturn fn;\n}\n\nmodule.exports = function (fromModel) {\n\tvar graph = deriveBFS(fromModel);\n\tvar conversion = {};\n\n\tvar models = Object.keys(graph);\n\tfor (var len = models.length, i = 0; i < len; i++) {\n\t\tvar toModel = models[i];\n\t\tvar node = graph[toModel];\n\n\t\tif (node.parent === null) {\n\t\t\t// no possible conversion, or this node is the source model.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconversion[toModel] = wrapConversion(toModel, graph);\n\t}\n\n\treturn conversion;\n};\n\n\n},{\"./conversions\":10}],13:[function(require,module,exports){\nmodule.exports = {\r\n\t\"aliceblue\": [240, 248, 255],\r\n\t\"antiquewhite\": [250, 235, 215],\r\n\t\"aqua\": [0, 255, 255],\r\n\t\"aquamarine\": [127, 255, 212],\r\n\t\"azure\": [240, 255, 255],\r\n\t\"beige\": [245, 245, 220],\r\n\t\"bisque\": [255, 228, 196],\r\n\t\"black\": [0, 0, 0],\r\n\t\"blanchedalmond\": [255, 235, 205],\r\n\t\"blue\": [0, 0, 255],\r\n\t\"blueviolet\": [138, 43, 226],\r\n\t\"brown\": [165, 42, 42],\r\n\t\"burlywood\": [222, 184, 135],\r\n\t\"cadetblue\": [95, 158, 160],\r\n\t\"chartreuse\": [127, 255, 0],\r\n\t\"chocolate\": [210, 105, 30],\r\n\t\"coral\": [255, 127, 80],\r\n\t\"cornflowerblue\": [100, 149, 237],\r\n\t\"cornsilk\": [255, 248, 220],\r\n\t\"crimson\": [220, 20, 60],\r\n\t\"cyan\": [0, 255, 255],\r\n\t\"darkblue\": [0, 0, 139],\r\n\t\"darkcyan\": [0, 139, 139],\r\n\t\"darkgoldenrod\": [184, 134, 11],\r\n\t\"darkgray\": [169, 169, 169],\r\n\t\"darkgreen\": [0, 100, 0],\r\n\t\"darkgrey\": [169, 169, 169],\r\n\t\"darkkhaki\": [189, 183, 107],\r\n\t\"darkmagenta\": [139, 0, 139],\r\n\t\"darkolivegreen\": [85, 107, 47],\r\n\t\"darkorange\": [255, 140, 0],\r\n\t\"darkorchid\": [153, 50, 204],\r\n\t\"darkred\": [139, 0, 0],\r\n\t\"darksalmon\": [233, 150, 122],\r\n\t\"darkseagreen\": [143, 188, 143],\r\n\t\"darkslateblue\": [72, 61, 139],\r\n\t\"darkslategray\": [47, 79, 79],\r\n\t\"darkslategrey\": [47, 79, 79],\r\n\t\"darkturquoise\": [0, 206, 209],\r\n\t\"darkviolet\": [148, 0, 211],\r\n\t\"deeppink\": [255, 20, 147],\r\n\t\"deepskyblue\": [0, 191, 255],\r\n\t\"dimgray\": [105, 105, 105],\r\n\t\"dimgrey\": [105, 105, 105],\r\n\t\"dodgerblue\": [30, 144, 255],\r\n\t\"firebrick\": [178, 34, 34],\r\n\t\"floralwhite\": [255, 250, 240],\r\n\t\"forestgreen\": [34, 139, 34],\r\n\t\"fuchsia\": [255, 0, 255],\r\n\t\"gainsboro\": [220, 220, 220],\r\n\t\"ghostwhite\": [248, 248, 255],\r\n\t\"gold\": [255, 215, 0],\r\n\t\"goldenrod\": [218, 165, 32],\r\n\t\"gray\": [128, 128, 128],\r\n\t\"green\": [0, 128, 0],\r\n\t\"greenyellow\": [173, 255, 47],\r\n\t\"grey\": [128, 128, 128],\r\n\t\"honeydew\": [240, 255, 240],\r\n\t\"hotpink\": [255, 105, 180],\r\n\t\"indianred\": [205, 92, 92],\r\n\t\"indigo\": [75, 0, 130],\r\n\t\"ivory\": [255, 255, 240],\r\n\t\"khaki\": [240, 230, 140],\r\n\t\"lavender\": [230, 230, 250],\r\n\t\"lavenderblush\": [255, 240, 245],\r\n\t\"lawngreen\": [124, 252, 0],\r\n\t\"lemonchiffon\": [255, 250, 205],\r\n\t\"lightblue\": [173, 216, 230],\r\n\t\"lightcoral\": [240, 128, 128],\r\n\t\"lightcyan\": [224, 255, 255],\r\n\t\"lightgoldenrodyellow\": [250, 250, 210],\r\n\t\"lightgray\": [211, 211, 211],\r\n\t\"lightgreen\": [144, 238, 144],\r\n\t\"lightgrey\": [211, 211, 211],\r\n\t\"lightpink\": [255, 182, 193],\r\n\t\"lightsalmon\": [255, 160, 122],\r\n\t\"lightseagreen\": [32, 178, 170],\r\n\t\"lightskyblue\": [135, 206, 250],\r\n\t\"lightslategray\": [119, 136, 153],\r\n\t\"lightslategrey\": [119, 136, 153],\r\n\t\"lightsteelblue\": [176, 196, 222],\r\n\t\"lightyellow\": [255, 255, 224],\r\n\t\"lime\": [0, 255, 0],\r\n\t\"limegreen\": [50, 205, 50],\r\n\t\"linen\": [250, 240, 230],\r\n\t\"magenta\": [255, 0, 255],\r\n\t\"maroon\": [128, 0, 0],\r\n\t\"mediumaquamarine\": [102, 205, 170],\r\n\t\"mediumblue\": [0, 0, 205],\r\n\t\"mediumorchid\": [186, 85, 211],\r\n\t\"mediumpurple\": [147, 112, 219],\r\n\t\"mediumseagreen\": [60, 179, 113],\r\n\t\"mediumslateblue\": [123, 104, 238],\r\n\t\"mediumspringgreen\": [0, 250, 154],\r\n\t\"mediumturquoise\": [72, 209, 204],\r\n\t\"mediumvioletred\": [199, 21, 133],\r\n\t\"midnightblue\": [25, 25, 112],\r\n\t\"mintcream\": [245, 255, 250],\r\n\t\"mistyrose\": [255, 228, 225],\r\n\t\"moccasin\": [255, 228, 181],\r\n\t\"navajowhite\": [255, 222, 173],\r\n\t\"navy\": [0, 0, 128],\r\n\t\"oldlace\": [253, 245, 230],\r\n\t\"olive\": [128, 128, 0],\r\n\t\"olivedrab\": [107, 142, 35],\r\n\t\"orange\": [255, 165, 0],\r\n\t\"orangered\": [255, 69, 0],\r\n\t\"orchid\": [218, 112, 214],\r\n\t\"palegoldenrod\": [238, 232, 170],\r\n\t\"palegreen\": [152, 251, 152],\r\n\t\"paleturquoise\": [175, 238, 238],\r\n\t\"palevioletred\": [219, 112, 147],\r\n\t\"papayawhip\": [255, 239, 213],\r\n\t\"peachpuff\": [255, 218, 185],\r\n\t\"peru\": [205, 133, 63],\r\n\t\"pink\": [255, 192, 203],\r\n\t\"plum\": [221, 160, 221],\r\n\t\"powderblue\": [176, 224, 230],\r\n\t\"purple\": [128, 0, 128],\r\n\t\"rebeccapurple\": [102, 51, 153],\r\n\t\"red\": [255, 0, 0],\r\n\t\"rosybrown\": [188, 143, 143],\r\n\t\"royalblue\": [65, 105, 225],\r\n\t\"saddlebrown\": [139, 69, 19],\r\n\t\"salmon\": [250, 128, 114],\r\n\t\"sandybrown\": [244, 164, 96],\r\n\t\"seagreen\": [46, 139, 87],\r\n\t\"seashell\": [255, 245, 238],\r\n\t\"sienna\": [160, 82, 45],\r\n\t\"silver\": [192, 192, 192],\r\n\t\"skyblue\": [135, 206, 235],\r\n\t\"slateblue\": [106, 90, 205],\r\n\t\"slategray\": [112, 128, 144],\r\n\t\"slategrey\": [112, 128, 144],\r\n\t\"snow\": [255, 250, 250],\r\n\t\"springgreen\": [0, 255, 127],\r\n\t\"steelblue\": [70, 130, 180],\r\n\t\"tan\": [210, 180, 140],\r\n\t\"teal\": [0, 128, 128],\r\n\t\"thistle\": [216, 191, 216],\r\n\t\"tomato\": [255, 99, 71],\r\n\t\"turquoise\": [64, 224, 208],\r\n\t\"violet\": [238, 130, 238],\r\n\t\"wheat\": [245, 222, 179],\r\n\t\"white\": [255, 255, 255],\r\n\t\"whitesmoke\": [245, 245, 245],\r\n\t\"yellow\": [255, 255, 0],\r\n\t\"yellowgreen\": [154, 205, 50]\r\n};\n},{}],14:[function(require,module,exports){\n/* MIT license */\nvar colorNames = require('color-name');\nvar swizzle = require('simple-swizzle');\n\nvar reverseNames = {};\n\n// create a list of reverse color names\nfor (var name in colorNames) {\n\tif (colorNames.hasOwnProperty(name)) {\n\t\treverseNames[colorNames[name]] = name;\n\t}\n}\n\nvar cs = module.exports = {\n\tto: {}\n};\n\ncs.get = function (string) {\n\tvar prefix = string.substring(0, 3).toLowerCase();\n\tvar val;\n\tvar model;\n\tswitch (prefix) {\n\t\tcase 'hsl':\n\t\t\tval = cs.get.hsl(string);\n\t\t\tmodel = 'hsl';\n\t\t\tbreak;\n\t\tcase 'hwb':\n\t\t\tval = cs.get.hwb(string);\n\t\t\tmodel = 'hwb';\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tval = cs.get.rgb(string);\n\t\t\tmodel = 'rgb';\n\t\t\tbreak;\n\t}\n\n\tif (!val) {\n\t\treturn null;\n\t}\n\n\treturn {model: model, value: val};\n};\n\ncs.get.rgb = function (string) {\n\tif (!string) {\n\t\treturn null;\n\t}\n\n\tvar abbr = /^#([a-f0-9]{3,4})$/i;\n\tvar hex = /^#([a-f0-9]{6})([a-f0-9]{2})?$/i;\n\tvar rgba = /^rgba?\\(\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/;\n\tvar per = /^rgba?\\(\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/;\n\tvar keyword = /(\\D+)/;\n\n\tvar rgb = [0, 0, 0, 1];\n\tvar match;\n\tvar i;\n\tvar hexAlpha;\n\n\tif (match = string.match(hex)) {\n\t\thexAlpha = match[2];\n\t\tmatch = match[1];\n\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\t// https://jsperf.com/slice-vs-substr-vs-substring-methods-long-string/19\n\t\t\tvar i2 = i * 2;\n\t\t\trgb[i] = parseInt(match.slice(i2, i2 + 2), 16);\n\t\t}\n\n\t\tif (hexAlpha) {\n\t\t\trgb[3] = Math.round((parseInt(hexAlpha, 16) / 255) * 100) / 100;\n\t\t}\n\t} else if (match = string.match(abbr)) {\n\t\tmatch = match[1];\n\t\thexAlpha = match[3];\n\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\trgb[i] = parseInt(match[i] + match[i], 16);\n\t\t}\n\n\t\tif (hexAlpha) {\n\t\t\trgb[3] = Math.round((parseInt(hexAlpha + hexAlpha, 16) / 255) * 100) / 100;\n\t\t}\n\t} else if (match = string.match(rgba)) {\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\trgb[i] = parseInt(match[i + 1], 0);\n\t\t}\n\n\t\tif (match[4]) {\n\t\t\trgb[3] = parseFloat(match[4]);\n\t\t}\n\t} else if (match = string.match(per)) {\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\trgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);\n\t\t}\n\n\t\tif (match[4]) {\n\t\t\trgb[3] = parseFloat(match[4]);\n\t\t}\n\t} else if (match = string.match(keyword)) {\n\t\tif (match[1] === 'transparent') {\n\t\t\treturn [0, 0, 0, 0];\n\t\t}\n\n\t\trgb = colorNames[match[1]];\n\n\t\tif (!rgb) {\n\t\t\treturn null;\n\t\t}\n\n\t\trgb[3] = 1;\n\n\t\treturn rgb;\n\t} else {\n\t\treturn null;\n\t}\n\n\tfor (i = 0; i < 3; i++) {\n\t\trgb[i] = clamp(rgb[i], 0, 255);\n\t}\n\trgb[3] = clamp(rgb[3], 0, 1);\n\n\treturn rgb;\n};\n\ncs.get.hsl = function (string) {\n\tif (!string) {\n\t\treturn null;\n\t}\n\n\tvar hsl = /^hsla?\\(\\s*([+-]?\\d*[\\.]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/;\n\tvar match = string.match(hsl);\n\n\tif (match) {\n\t\tvar alpha = parseFloat(match[4]);\n\t\tvar h = ((parseFloat(match[1]) % 360) + 360) % 360;\n\t\tvar s = clamp(parseFloat(match[2]), 0, 100);\n\t\tvar l = clamp(parseFloat(match[3]), 0, 100);\n\t\tvar a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);\n\n\t\treturn [h, s, l, a];\n\t}\n\n\treturn null;\n};\n\ncs.get.hwb = function (string) {\n\tif (!string) {\n\t\treturn null;\n\t}\n\n\tvar hwb = /^hwb\\(\\s*([+-]?\\d*[\\.]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/;\n\tvar match = string.match(hwb);\n\n\tif (match) {\n\t\tvar alpha = parseFloat(match[4]);\n\t\tvar h = ((parseFloat(match[1]) % 360) + 360) % 360;\n\t\tvar w = clamp(parseFloat(match[2]), 0, 100);\n\t\tvar b = clamp(parseFloat(match[3]), 0, 100);\n\t\tvar a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);\n\t\treturn [h, w, b, a];\n\t}\n\n\treturn null;\n};\n\ncs.to.hex = function () {\n\tvar rgba = swizzle(arguments);\n\n\treturn (\n\t\t'#' +\n\t\thexDouble(rgba[0]) +\n\t\thexDouble(rgba[1]) +\n\t\thexDouble(rgba[2]) +\n\t\t(rgba[3] < 1\n\t\t\t? (hexDouble(Math.round(rgba[3] * 255)))\n\t\t\t: '')\n\t);\n};\n\ncs.to.rgb = function () {\n\tvar rgba = swizzle(arguments);\n\n\treturn rgba.length < 4 || rgba[3] === 1\n\t\t? 'rgb(' + Math.round(rgba[0]) + ', ' + Math.round(rgba[1]) + ', ' + Math.round(rgba[2]) + ')'\n\t\t: 'rgba(' + Math.round(rgba[0]) + ', ' + Math.round(rgba[1]) + ', ' + Math.round(rgba[2]) + ', ' + rgba[3] + ')';\n};\n\ncs.to.rgb.percent = function () {\n\tvar rgba = swizzle(arguments);\n\n\tvar r = Math.round(rgba[0] / 255 * 100);\n\tvar g = Math.round(rgba[1] / 255 * 100);\n\tvar b = Math.round(rgba[2] / 255 * 100);\n\n\treturn rgba.length < 4 || rgba[3] === 1\n\t\t? 'rgb(' + r + '%, ' + g + '%, ' + b + '%)'\n\t\t: 'rgba(' + r + '%, ' + g + '%, ' + b + '%, ' + rgba[3] + ')';\n};\n\ncs.to.hsl = function () {\n\tvar hsla = swizzle(arguments);\n\treturn hsla.length < 4 || hsla[3] === 1\n\t\t? 'hsl(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%)'\n\t\t: 'hsla(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%, ' + hsla[3] + ')';\n};\n\n// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax\n// (hwb have alpha optional & 1 is default value)\ncs.to.hwb = function () {\n\tvar hwba = swizzle(arguments);\n\n\tvar a = '';\n\tif (hwba.length >= 4 && hwba[3] !== 1) {\n\t\ta = ', ' + hwba[3];\n\t}\n\n\treturn 'hwb(' + hwba[0] + ', ' + hwba[1] + '%, ' + hwba[2] + '%' + a + ')';\n};\n\ncs.to.keyword = function (rgb) {\n\treturn reverseNames[rgb.slice(0, 3)];\n};\n\n// helpers\nfunction clamp(num, min, max) {\n\treturn Math.min(Math.max(min, num), max);\n}\n\nfunction hexDouble(num) {\n\tvar str = num.toString(16).toUpperCase();\n\treturn (str.length < 2) ? '0' + str : str;\n}\n\n},{\"color-name\":13,\"simple-swizzle\":137}],15:[function(require,module,exports){\n'use strict';\n\nvar colorString = require('color-string');\nvar convert = require('color-convert');\n\nvar _slice = [].slice;\n\nvar skippedModels = [\n\t// to be honest, I don't really feel like keyword belongs in color convert, but eh.\n\t'keyword',\n\n\t// gray conflicts with some method names, and has its own method defined.\n\t'gray',\n\n\t// shouldn't really be in color-convert either...\n\t'hex'\n];\n\nvar hashedModelKeys = {};\nObject.keys(convert).forEach(function (model) {\n\thashedModelKeys[_slice.call(convert[model].labels).sort().join('')] = model;\n});\n\nvar limiters = {};\n\nfunction Color(obj, model) {\n\tif (!(this instanceof Color)) {\n\t\treturn new Color(obj, model);\n\t}\n\n\tif (model && model in skippedModels) {\n\t\tmodel = null;\n\t}\n\n\tif (model && !(model in convert)) {\n\t\tthrow new Error('Unknown model: ' + model);\n\t}\n\n\tvar i;\n\tvar channels;\n\n\tif (!obj) {\n\t\tthis.model = 'rgb';\n\t\tthis.color = [0, 0, 0];\n\t\tthis.valpha = 1;\n\t} else if (obj instanceof Color) {\n\t\tthis.model = obj.model;\n\t\tthis.color = obj.color.slice();\n\t\tthis.valpha = obj.valpha;\n\t} else if (typeof obj === 'string') {\n\t\tvar result = colorString.get(obj);\n\t\tif (result === null) {\n\t\t\tthrow new Error('Unable to parse color from string: ' + obj);\n\t\t}\n\n\t\tthis.model = result.model;\n\t\tchannels = convert[this.model].channels;\n\t\tthis.color = result.value.slice(0, channels);\n\t\tthis.valpha = typeof result.value[channels] === 'number' ? result.value[channels] : 1;\n\t} else if (obj.length) {\n\t\tthis.model = model || 'rgb';\n\t\tchannels = convert[this.model].channels;\n\t\tvar newArr = _slice.call(obj, 0, channels);\n\t\tthis.color = zeroArray(newArr, channels);\n\t\tthis.valpha = typeof obj[channels] === 'number' ? obj[channels] : 1;\n\t} else if (typeof obj === 'number') {\n\t\t// this is always RGB - can be converted later on.\n\t\tobj &= 0xFFFFFF;\n\t\tthis.model = 'rgb';\n\t\tthis.color = [\n\t\t\t(obj >> 16) & 0xFF,\n\t\t\t(obj >> 8) & 0xFF,\n\t\t\tobj & 0xFF\n\t\t];\n\t\tthis.valpha = 1;\n\t} else {\n\t\tthis.valpha = 1;\n\n\t\tvar keys = Object.keys(obj);\n\t\tif ('alpha' in obj) {\n\t\t\tkeys.splice(keys.indexOf('alpha'), 1);\n\t\t\tthis.valpha = typeof obj.alpha === 'number' ? obj.alpha : 0;\n\t\t}\n\n\t\tvar hashedKeys = keys.sort().join('');\n\t\tif (!(hashedKeys in hashedModelKeys)) {\n\t\t\tthrow new Error('Unable to parse color from object: ' + JSON.stringify(obj));\n\t\t}\n\n\t\tthis.model = hashedModelKeys[hashedKeys];\n\n\t\tvar labels = convert[this.model].labels;\n\t\tvar color = [];\n\t\tfor (i = 0; i < labels.length; i++) {\n\t\t\tcolor.push(obj[labels[i]]);\n\t\t}\n\n\t\tthis.color = zeroArray(color);\n\t}\n\n\t// perform limitations (clamping, etc.)\n\tif (limiters[this.model]) {\n\t\tchannels = convert[this.model].channels;\n\t\tfor (i = 0; i < channels; i++) {\n\t\t\tvar limit = limiters[this.model][i];\n\t\t\tif (limit) {\n\t\t\t\tthis.color[i] = limit(this.color[i]);\n\t\t\t}\n\t\t}\n\t}\n\n\tthis.valpha = Math.max(0, Math.min(1, this.valpha));\n\n\tif (Object.freeze) {\n\t\tObject.freeze(this);\n\t}\n}\n\nColor.prototype = {\n\ttoString: function () {\n\t\treturn this.string();\n\t},\n\n\ttoJSON: function () {\n\t\treturn this[this.model]();\n\t},\n\n\tstring: function (places) {\n\t\tvar self = this.model in colorString.to ? this : this.rgb();\n\t\tself = self.round(typeof places === 'number' ? places : 1);\n\t\tvar args = self.valpha === 1 ? self.color : self.color.concat(this.valpha);\n\t\treturn colorString.to[self.model](args);\n\t},\n\n\tpercentString: function (places) {\n\t\tvar self = this.rgb().round(typeof places === 'number' ? places : 1);\n\t\tvar args = self.valpha === 1 ? self.color : self.color.concat(this.valpha);\n\t\treturn colorString.to.rgb.percent(args);\n\t},\n\n\tarray: function () {\n\t\treturn this.valpha === 1 ? this.color.slice() : this.color.concat(this.valpha);\n\t},\n\n\tobject: function () {\n\t\tvar result = {};\n\t\tvar channels = convert[this.model].channels;\n\t\tvar labels = convert[this.model].labels;\n\n\t\tfor (var i = 0; i < channels; i++) {\n\t\t\tresult[labels[i]] = this.color[i];\n\t\t}\n\n\t\tif (this.valpha !== 1) {\n\t\t\tresult.alpha = this.valpha;\n\t\t}\n\n\t\treturn result;\n\t},\n\n\tunitArray: function () {\n\t\tvar rgb = this.rgb().color;\n\t\trgb[0] /= 255;\n\t\trgb[1] /= 255;\n\t\trgb[2] /= 255;\n\n\t\tif (this.valpha !== 1) {\n\t\t\trgb.push(this.valpha);\n\t\t}\n\n\t\treturn rgb;\n\t},\n\n\tunitObject: function () {\n\t\tvar rgb = this.rgb().object();\n\t\trgb.r /= 255;\n\t\trgb.g /= 255;\n\t\trgb.b /= 255;\n\n\t\tif (this.valpha !== 1) {\n\t\t\trgb.alpha = this.valpha;\n\t\t}\n\n\t\treturn rgb;\n\t},\n\n\tround: function (places) {\n\t\tplaces = Math.max(places || 0, 0);\n\t\treturn new Color(this.color.map(roundToPlace(places)).concat(this.valpha), this.model);\n\t},\n\n\talpha: function (val) {\n\t\tif (arguments.length) {\n\t\t\treturn new Color(this.color.concat(Math.max(0, Math.min(1, val))), this.model);\n\t\t}\n\n\t\treturn this.valpha;\n\t},\n\n\t// rgb\n\tred: getset('rgb', 0, maxfn(255)),\n\tgreen: getset('rgb', 1, maxfn(255)),\n\tblue: getset('rgb', 2, maxfn(255)),\n\n\thue: getset(['hsl', 'hsv', 'hsl', 'hwb', 'hcg'], 0, function (val) { return ((val % 360) + 360) % 360; }), // eslint-disable-line brace-style\n\n\tsaturationl: getset('hsl', 1, maxfn(100)),\n\tlightness: getset('hsl', 2, maxfn(100)),\n\n\tsaturationv: getset('hsv', 1, maxfn(100)),\n\tvalue: getset('hsv', 2, maxfn(100)),\n\n\tchroma: getset('hcg', 1, maxfn(100)),\n\tgray: getset('hcg', 2, maxfn(100)),\n\n\twhite: getset('hwb', 1, maxfn(100)),\n\twblack: getset('hwb', 2, maxfn(100)),\n\n\tcyan: getset('cmyk', 0, maxfn(100)),\n\tmagenta: getset('cmyk', 1, maxfn(100)),\n\tyellow: getset('cmyk', 2, maxfn(100)),\n\tblack: getset('cmyk', 3, maxfn(100)),\n\n\tx: getset('xyz', 0, maxfn(100)),\n\ty: getset('xyz', 1, maxfn(100)),\n\tz: getset('xyz', 2, maxfn(100)),\n\n\tl: getset('lab', 0, maxfn(100)),\n\ta: getset('lab', 1),\n\tb: getset('lab', 2),\n\n\tkeyword: function (val) {\n\t\tif (arguments.length) {\n\t\t\treturn new Color(val);\n\t\t}\n\n\t\treturn convert[this.model].keyword(this.color);\n\t},\n\n\thex: function (val) {\n\t\tif (arguments.length) {\n\t\t\treturn new Color(val);\n\t\t}\n\n\t\treturn colorString.to.hex(this.rgb().round().color);\n\t},\n\n\trgbNumber: function () {\n\t\tvar rgb = this.rgb().color;\n\t\treturn ((rgb[0] & 0xFF) << 16) | ((rgb[1] & 0xFF) << 8) | (rgb[2] & 0xFF);\n\t},\n\n\tluminosity: function () {\n\t\t// http://www.w3.org/TR/WCAG20/#relativeluminancedef\n\t\tvar rgb = this.rgb().color;\n\n\t\tvar lum = [];\n\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\tvar chan = rgb[i] / 255;\n\t\t\tlum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4);\n\t\t}\n\n\t\treturn 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];\n\t},\n\n\tcontrast: function (color2) {\n\t\t// http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n\t\tvar lum1 = this.luminosity();\n\t\tvar lum2 = color2.luminosity();\n\n\t\tif (lum1 > lum2) {\n\t\t\treturn (lum1 + 0.05) / (lum2 + 0.05);\n\t\t}\n\n\t\treturn (lum2 + 0.05) / (lum1 + 0.05);\n\t},\n\n\tlevel: function (color2) {\n\t\tvar contrastRatio = this.contrast(color2);\n\t\tif (contrastRatio >= 7.1) {\n\t\t\treturn 'AAA';\n\t\t}\n\n\t\treturn (contrastRatio >= 4.5) ? 'AA' : '';\n\t},\n\n\tdark: function () {\n\t\t// YIQ equation from http://24ways.org/2010/calculating-color-contrast\n\t\tvar rgb = this.rgb().color;\n\t\tvar yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;\n\t\treturn yiq < 128;\n\t},\n\n\tlight: function () {\n\t\treturn !this.dark();\n\t},\n\n\tnegate: function () {\n\t\tvar rgb = this.rgb();\n\t\tfor (var i = 0; i < 3; i++) {\n\t\t\trgb.color[i] = 255 - rgb.color[i];\n\t\t}\n\t\treturn rgb;\n\t},\n\n\tlighten: function (ratio) {\n\t\tvar hsl = this.hsl();\n\t\thsl.color[2] += hsl.color[2] * ratio;\n\t\treturn hsl;\n\t},\n\n\tdarken: function (ratio) {\n\t\tvar hsl = this.hsl();\n\t\thsl.color[2] -= hsl.color[2] * ratio;\n\t\treturn hsl;\n\t},\n\n\tsaturate: function (ratio) {\n\t\tvar hsl = this.hsl();\n\t\thsl.color[1] += hsl.color[1] * ratio;\n\t\treturn hsl;\n\t},\n\n\tdesaturate: function (ratio) {\n\t\tvar hsl = this.hsl();\n\t\thsl.color[1] -= hsl.color[1] * ratio;\n\t\treturn hsl;\n\t},\n\n\twhiten: function (ratio) {\n\t\tvar hwb = this.hwb();\n\t\thwb.color[1] += hwb.color[1] * ratio;\n\t\treturn hwb;\n\t},\n\n\tblacken: function (ratio) {\n\t\tvar hwb = this.hwb();\n\t\thwb.color[2] += hwb.color[2] * ratio;\n\t\treturn hwb;\n\t},\n\n\tgrayscale: function () {\n\t\t// http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale\n\t\tvar rgb = this.rgb().color;\n\t\tvar val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;\n\t\treturn Color.rgb(val, val, val);\n\t},\n\n\tfade: function (ratio) {\n\t\treturn this.alpha(this.valpha - (this.valpha * ratio));\n\t},\n\n\topaquer: function (ratio) {\n\t\treturn this.alpha(this.valpha + (this.valpha * ratio));\n\t},\n\n\trotate: function (degrees) {\n\t\tvar hsl = this.hsl();\n\t\tvar hue = hsl.color[0];\n\t\thue = (hue + degrees) % 360;\n\t\thue = hue < 0 ? 360 + hue : hue;\n\t\thsl.color[0] = hue;\n\t\treturn hsl;\n\t},\n\n\tmix: function (mixinColor, weight) {\n\t\t// ported from sass implementation in C\n\t\t// https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209\n\t\tvar color1 = this.rgb();\n\t\tvar color2 = mixinColor.rgb();\n\t\tvar p = weight === undefined ? 0.5 : weight;\n\n\t\tvar w = 2 * p - 1;\n\t\tvar a = color1.alpha() - color2.alpha();\n\n\t\tvar w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n\t\tvar w2 = 1 - w1;\n\n\t\treturn Color.rgb(\n\t\t\t\tw1 * color1.red() + w2 * color2.red(),\n\t\t\t\tw1 * color1.green() + w2 * color2.green(),\n\t\t\t\tw1 * color1.blue() + w2 * color2.blue(),\n\t\t\t\tcolor1.alpha() * p + color2.alpha() * (1 - p));\n\t}\n};\n\n// model conversion methods and static constructors\nObject.keys(convert).forEach(function (model) {\n\tif (skippedModels.indexOf(model) !== -1) {\n\t\treturn;\n\t}\n\n\tvar channels = convert[model].channels;\n\n\t// conversion methods\n\tColor.prototype[model] = function () {\n\t\tif (this.model === model) {\n\t\t\treturn new Color(this);\n\t\t}\n\n\t\tif (arguments.length) {\n\t\t\treturn new Color(arguments, model);\n\t\t}\n\n\t\tvar newAlpha = typeof arguments[channels] === 'number' ? channels : this.valpha;\n\t\treturn new Color(assertArray(convert[this.model][model].raw(this.color)).concat(newAlpha), model);\n\t};\n\n\t// 'static' construction methods\n\tColor[model] = function (color) {\n\t\tif (typeof color === 'number') {\n\t\t\tcolor = zeroArray(_slice.call(arguments), channels);\n\t\t}\n\t\treturn new Color(color, model);\n\t};\n});\n\nfunction roundTo(num, places) {\n\treturn Number(num.toFixed(places));\n}\n\nfunction roundToPlace(places) {\n\treturn function (num) {\n\t\treturn roundTo(num, places);\n\t};\n}\n\nfunction getset(model, channel, modifier) {\n\tmodel = Array.isArray(model) ? model : [model];\n\n\tmodel.forEach(function (m) {\n\t\t(limiters[m] || (limiters[m] = []))[channel] = modifier;\n\t});\n\n\tmodel = model[0];\n\n\treturn function (val) {\n\t\tvar result;\n\n\t\tif (arguments.length) {\n\t\t\tif (modifier) {\n\t\t\t\tval = modifier(val);\n\t\t\t}\n\n\t\t\tresult = this[model]();\n\t\t\tresult.color[channel] = val;\n\t\t\treturn result;\n\t\t}\n\n\t\tresult = this[model]().color[channel];\n\t\tif (modifier) {\n\t\t\tresult = modifier(result);\n\t\t}\n\n\t\treturn result;\n\t};\n}\n\nfunction maxfn(max) {\n\treturn function (v) {\n\t\treturn Math.max(0, Math.min(max, v));\n\t};\n}\n\nfunction assertArray(val) {\n\treturn Array.isArray(val) ? val : [val];\n}\n\nfunction zeroArray(arr, length) {\n\tfor (var i = 0; i < length; i++) {\n\t\tif (typeof arr[i] !== 'number') {\n\t\t\tarr[i] = 0;\n\t\t}\n\t}\n\n\treturn arr;\n}\n\nmodule.exports = Color;\n\n},{\"color-convert\":11,\"color-string\":14}],16:[function(require,module,exports){\n/*! DataTables 1.10.15\n * ©2008-2017 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * @summary     DataTables\n * @description Paginate, search and order HTML tables\n * @version     1.10.15\n * @file        jquery.dataTables.js\n * @author      SpryMedia Ltd\n * @contact     www.datatables.net\n * @copyright   Copyright 2008-2017 SpryMedia Ltd.\n *\n * This source file is free software, available under the following license:\n *   MIT license - http://datatables.net/license\n *\n * This source file is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.\n *\n * For details please refer to: http://www.datatables.net\n */\n\n/*jslint evil: true, undef: true, browser: true */\n/*globals $,require,jQuery,define,_selector_run,_selector_opts,_selector_first,_selector_row_indexes,_ext,_Api,_api_register,_api_registerPlural,_re_new_lines,_re_html,_re_formatted_numeric,_re_escape_regex,_empty,_intVal,_numToDecimal,_isNumber,_isHtml,_htmlNumeric,_pluck,_pluck_order,_range,_stripHtml,_unique,_fnBuildAjax,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnAjaxDataSrc,_fnAddColumn,_fnColumnOptions,_fnAdjustColumnSizing,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnVisbleColumns,_fnGetColumns,_fnColumnTypes,_fnApplyColumnDefs,_fnHungarianMap,_fnCamelToHungarian,_fnLanguageCompat,_fnBrowserDetect,_fnAddData,_fnAddTr,_fnNodeToDataIndex,_fnNodeToColumnIndex,_fnGetCellData,_fnSetCellData,_fnSplitObjNotation,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnGetDataMaster,_fnClearTable,_fnDeleteIndex,_fnInvalidate,_fnGetRowElements,_fnCreateTr,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAddOptionsHtml,_fnDetectHeader,_fnGetUniqueThs,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnFilterCreateSearch,_fnEscapeRegex,_fnFilterData,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnInfoMacros,_fnInitialise,_fnInitComplete,_fnLengthChange,_fnFeatureHtmlLength,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnFeatureHtmlTable,_fnScrollDraw,_fnApplyToChildren,_fnCalculateColumnWidths,_fnThrottle,_fnConvertToWidth,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnSortFlatten,_fnSort,_fnSortAria,_fnSortListener,_fnSortAttachListener,_fnSortingClasses,_fnSortData,_fnSaveState,_fnLoadState,_fnSettingsFromNode,_fnLog,_fnMap,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnLengthOverflow,_fnRenderer,_fnDataSource,_fnRowAttributes*/\n\n(function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === 'function' && define.amd ) {\n\t\t// AMD\n\t\tdefine( ['jquery'], function ( $ ) {\n\t\t\treturn factory( $, window, document );\n\t\t} );\n\t}\n\telse if ( typeof exports === 'object' ) {\n\t\t// CommonJS\n\t\tmodule.exports = function (root, $) {\n\t\t\tif ( ! root ) {\n\t\t\t\t// CommonJS environments without a window global must pass a\n\t\t\t\t// root. This will give an error otherwise\n\t\t\t\troot = window;\n\t\t\t}\n\n\t\t\tif ( ! $ ) {\n\t\t\t\t$ = typeof window !== 'undefined' ? // jQuery's factory checks for a global window\n\t\t\t\t\t(function(){try{return require('jquery')}catch(e){return window.jQuery}})() :\n\t\t\t\t\t(function(){try{return require('jquery')}catch(e){return window.jQuery}})()( root );\n\t\t\t}\n\n\t\t\treturn factory( $, root, root.document );\n\t\t};\n\t}\n\telse {\n\t\t// Browser\n\t\tfactory( jQuery, window, document );\n\t}\n}\n(function( $, window, document, undefined ) {\n\t\"use strict\";\n\n\t/**\n\t * DataTables is a plug-in for the jQuery Javascript library. It is a highly\n\t * flexible tool, based upon the foundations of progressive enhancement,\n\t * which will add advanced interaction controls to any HTML table. For a\n\t * full list of features please refer to\n\t * [DataTables.net](href=\"http://datatables.net).\n\t *\n\t * Note that the `DataTable` object is not a global variable but is aliased\n\t * to `jQuery.fn.DataTable` and `jQuery.fn.dataTable` through which it may\n\t * be  accessed.\n\t *\n\t *  @class\n\t *  @param {object} [init={}] Configuration object for DataTables. Options\n\t *    are defined by {@link DataTable.defaults}\n\t *  @requires jQuery 1.7+\n\t *\n\t *  @example\n\t *    // Basic initialisation\n\t *    $(document).ready( function {\n\t *      $('#example').dataTable();\n\t *    } );\n\t *\n\t *  @example\n\t *    // Initialisation with configuration options - in this case, disable\n\t *    // pagination and sorting.\n\t *    $(document).ready( function {\n\t *      $('#example').dataTable( {\n\t *        \"paginate\": false,\n\t *        \"sort\": false\n\t *      } );\n\t *    } );\n\t */\n\tvar DataTable = function ( options )\n\t{\n\t\t/**\n\t\t * Perform a jQuery selector action on the table's TR elements (from the tbody) and\n\t\t * return the resulting jQuery object.\n\t\t *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on\n\t\t *  @param {object} [oOpts] Optional parameters for modifying the rows to be included\n\t\t *  @param {string} [oOpts.filter=none] Select TR elements that meet the current filter\n\t\t *    criterion (\"applied\") or all TR elements (i.e. no filter).\n\t\t *  @param {string} [oOpts.order=current] Order of the TR elements in the processed array.\n\t\t *    Can be either 'current', whereby the current sorting of the table is used, or\n\t\t *    'original' whereby the original order the data was read into the table is used.\n\t\t *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page\n\t\t *    (\"current\") or not (\"all\"). If 'current' is given, then order is assumed to be\n\t\t *    'current' and filter is 'applied', regardless of what they might be given as.\n\t\t *  @returns {object} jQuery object, filtered by the given selector.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Highlight every second row\n\t\t *      oTable.$('tr:odd').css('backgroundColor', 'blue');\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Filter to rows with 'Webkit' in them, add a background colour and then\n\t\t *      // remove the filter, thus highlighting the 'Webkit' rows only.\n\t\t *      oTable.fnFilter('Webkit');\n\t\t *      oTable.$('tr', {\"search\": \"applied\"}).css('backgroundColor', 'blue');\n\t\t *      oTable.fnFilter('');\n\t\t *    } );\n\t\t */\n\t\tthis.$ = function ( sSelector, oOpts )\n\t\t{\n\t\t\treturn this.api(true).$( sSelector, oOpts );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Almost identical to $ in operation, but in this case returns the data for the matched\n\t\t * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes\n\t\t * rather than any descendants, so the data can be obtained for the row/cell. If matching\n\t\t * rows are found, the data returned is the original data array/object that was used to\n\t\t * create the row (or a generated array if from a DOM source).\n\t\t *\n\t\t * This method is often useful in-combination with $ where both functions are given the\n\t\t * same parameters and the array indexes will match identically.\n\t\t *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on\n\t\t *  @param {object} [oOpts] Optional parameters for modifying the rows to be included\n\t\t *  @param {string} [oOpts.filter=none] Select elements that meet the current filter\n\t\t *    criterion (\"applied\") or all elements (i.e. no filter).\n\t\t *  @param {string} [oOpts.order=current] Order of the data in the processed array.\n\t\t *    Can be either 'current', whereby the current sorting of the table is used, or\n\t\t *    'original' whereby the original order the data was read into the table is used.\n\t\t *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page\n\t\t *    (\"current\") or not (\"all\"). If 'current' is given, then order is assumed to be\n\t\t *    'current' and filter is 'applied', regardless of what they might be given as.\n\t\t *  @returns {array} Data for the matched elements. If any elements, as a result of the\n\t\t *    selector, were not TR, TD or TH elements in the DataTable, they will have a null\n\t\t *    entry in the array.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Get the data from the first row in the table\n\t\t *      var data = oTable._('tr:first');\n\t\t *\n\t\t *      // Do something useful with the data\n\t\t *      alert( \"First cell is: \"+data[0] );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Filter to 'Webkit' and get all data for\n\t\t *      oTable.fnFilter('Webkit');\n\t\t *      var data = oTable._('tr', {\"search\": \"applied\"});\n\t\t *\n\t\t *      // Do something with the data\n\t\t *      alert( data.length+\" rows matched the search\" );\n\t\t *    } );\n\t\t */\n\t\tthis._ = function ( sSelector, oOpts )\n\t\t{\n\t\t\treturn this.api(true).rows( sSelector, oOpts ).data();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Create a DataTables Api instance, with the currently selected tables for\n\t\t * the Api's context.\n\t\t * @param {boolean} [traditional=false] Set the API instance's context to be\n\t\t *   only the table referred to by the `DataTable.ext.iApiIndex` option, as was\n\t\t *   used in the API presented by DataTables 1.9- (i.e. the traditional mode),\n\t\t *   or if all tables captured in the jQuery object should be used.\n\t\t * @return {DataTables.Api}\n\t\t */\n\t\tthis.api = function ( traditional )\n\t\t{\n\t\t\treturn traditional ?\n\t\t\t\tnew _Api(\n\t\t\t\t\t_fnSettingsFromNode( this[ _ext.iApiIndex ] )\n\t\t\t\t) :\n\t\t\t\tnew _Api( this );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Add a single new row or multiple rows of data to the table. Please note\n\t\t * that this is suitable for client-side processing only - if you are using\n\t\t * server-side processing (i.e. \"bServerSide\": true), then to add data, you\n\t\t * must add it to the data source, i.e. the server-side, through an Ajax call.\n\t\t *  @param {array|object} data The data to be added to the table. This can be:\n\t\t *    <ul>\n\t\t *      <li>1D array of data - add a single row with the data provided</li>\n\t\t *      <li>2D array of arrays - add multiple rows in a single call</li>\n\t\t *      <li>object - data object when using <i>mData</i></li>\n\t\t *      <li>array of objects - multiple data objects when using <i>mData</i></li>\n\t\t *    </ul>\n\t\t *  @param {bool} [redraw=true] redraw the table or not\n\t\t *  @returns {array} An array of integers, representing the list of indexes in\n\t\t *    <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to\n\t\t *    the table.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    // Global var for counter\n\t\t *    var giCount = 2;\n\t\t *\n\t\t *    $(document).ready(function() {\n\t\t *      $('#example').dataTable();\n\t\t *    } );\n\t\t *\n\t\t *    function fnClickAddRow() {\n\t\t *      $('#example').dataTable().fnAddData( [\n\t\t *        giCount+\".1\",\n\t\t *        giCount+\".2\",\n\t\t *        giCount+\".3\",\n\t\t *        giCount+\".4\" ]\n\t\t *      );\n\t\t *\n\t\t *      giCount++;\n\t\t *    }\n\t\t */\n\t\tthis.fnAddData = function( data, redraw )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\n\t\t\t/* Check if we want to add multiple rows or not */\n\t\t\tvar rows = $.isArray(data) && ( $.isArray(data[0]) || $.isPlainObject(data[0]) ) ?\n\t\t\t\tapi.rows.add( data ) :\n\t\t\t\tapi.row.add( data );\n\t\t\n\t\t\tif ( redraw === undefined || redraw ) {\n\t\t\t\tapi.draw();\n\t\t\t}\n\t\t\n\t\t\treturn rows.flatten().toArray();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * This function will make DataTables recalculate the column sizes, based on the data\n\t\t * contained in the table and the sizes applied to the columns (in the DOM, CSS or\n\t\t * through the sWidth parameter). This can be useful when the width of the table's\n\t\t * parent element changes (for example a window resize).\n\t\t *  @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable( {\n\t\t *        \"sScrollY\": \"200px\",\n\t\t *        \"bPaginate\": false\n\t\t *      } );\n\t\t *\n\t\t *      $(window).on('resize', function () {\n\t\t *        oTable.fnAdjustColumnSizing();\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\tthis.fnAdjustColumnSizing = function ( bRedraw )\n\t\t{\n\t\t\tvar api = this.api( true ).columns.adjust();\n\t\t\tvar settings = api.settings()[0];\n\t\t\tvar scroll = settings.oScroll;\n\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.draw( false );\n\t\t\t}\n\t\t\telse if ( scroll.sX !== \"\" || scroll.sY !== \"\" ) {\n\t\t\t\t/* If not redrawing, but scrolling, we want to apply the new column sizes anyway */\n\t\t\t\t_fnScrollDraw( settings );\n\t\t\t}\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Quickly and simply clear a table\n\t\t *  @param {bool} [bRedraw=true] redraw the table or not\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)\n\t\t *      oTable.fnClearTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnClearTable = function( bRedraw )\n\t\t{\n\t\t\tvar api = this.api( true ).clear();\n\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.draw();\n\t\t\t}\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * The exact opposite of 'opening' a row, this function will close any rows which\n\t\t * are currently 'open'.\n\t\t *  @param {node} nTr the table row to 'close'\n\t\t *  @returns {int} 0 on success, or 1 if failed (can't find the row)\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable;\n\t\t *\n\t\t *      // 'open' an information row when a row is clicked on\n\t\t *      $('#example tbody tr').click( function () {\n\t\t *        if ( oTable.fnIsOpen(this) ) {\n\t\t *          oTable.fnClose( this );\n\t\t *        } else {\n\t\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t\t *        }\n\t\t *      } );\n\t\t *\n\t\t *      oTable = $('#example').dataTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnClose = function( nTr )\n\t\t{\n\t\t\tthis.api( true ).row( nTr ).child.hide();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Remove a row for the table\n\t\t *  @param {mixed} target The index of the row from aoData to be deleted, or\n\t\t *    the TR element you want to delete\n\t\t *  @param {function|null} [callBack] Callback function\n\t\t *  @param {bool} [redraw=true] Redraw the table or not\n\t\t *  @returns {array} The row that was deleted\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Immediately remove the first row\n\t\t *      oTable.fnDeleteRow( 0 );\n\t\t *    } );\n\t\t */\n\t\tthis.fnDeleteRow = function( target, callback, redraw )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\tvar rows = api.rows( target );\n\t\t\tvar settings = rows.settings()[0];\n\t\t\tvar data = settings.aoData[ rows[0][0] ];\n\t\t\n\t\t\trows.remove();\n\t\t\n\t\t\tif ( callback ) {\n\t\t\t\tcallback.call( this, settings, data );\n\t\t\t}\n\t\t\n\t\t\tif ( redraw === undefined || redraw ) {\n\t\t\t\tapi.draw();\n\t\t\t}\n\t\t\n\t\t\treturn data;\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Restore the table to it's original state in the DOM by removing all of DataTables\n\t\t * enhancements, alterations to the DOM structure of the table and event listeners.\n\t\t *  @param {boolean} [remove=false] Completely remove the table from the DOM\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      // This example is fairly pointless in reality, but shows how fnDestroy can be used\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      oTable.fnDestroy();\n\t\t *    } );\n\t\t */\n\t\tthis.fnDestroy = function ( remove )\n\t\t{\n\t\t\tthis.api( true ).destroy( remove );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Redraw the table\n\t\t *  @param {bool} [complete=true] Re-filter and resort (if enabled) the table before the draw.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Re-draw the table - you wouldn't want to do it here, but it's an example :-)\n\t\t *      oTable.fnDraw();\n\t\t *    } );\n\t\t */\n\t\tthis.fnDraw = function( complete )\n\t\t{\n\t\t\t// Note that this isn't an exact match to the old call to _fnDraw - it takes\n\t\t\t// into account the new data, but can hold position.\n\t\t\tthis.api( true ).draw( complete );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Filter the input based on data\n\t\t *  @param {string} sInput String to filter the table on\n\t\t *  @param {int|null} [iColumn] Column to limit filtering to\n\t\t *  @param {bool} [bRegex=false] Treat as regular expression or not\n\t\t *  @param {bool} [bSmart=true] Perform smart filtering or not\n\t\t *  @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)\n\t\t *  @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Sometime later - filter...\n\t\t *      oTable.fnFilter( 'test string' );\n\t\t *    } );\n\t\t */\n\t\tthis.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\n\t\t\tif ( iColumn === null || iColumn === undefined ) {\n\t\t\t\tapi.search( sInput, bRegex, bSmart, bCaseInsensitive );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tapi.column( iColumn ).search( sInput, bRegex, bSmart, bCaseInsensitive );\n\t\t\t}\n\t\t\n\t\t\tapi.draw();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Get the data for the whole table, an individual row or an individual cell based on the\n\t\t * provided parameters.\n\t\t *  @param {int|node} [src] A TR row node, TD/TH cell node or an integer. If given as\n\t\t *    a TR node then the data source for the whole row will be returned. If given as a\n\t\t *    TD/TH cell node then iCol will be automatically calculated and the data for the\n\t\t *    cell returned. If given as an integer, then this is treated as the aoData internal\n\t\t *    data index for the row (see fnGetPosition) and the data for that row used.\n\t\t *  @param {int} [col] Optional column index that you want the data of.\n\t\t *  @returns {array|object|string} If mRow is undefined, then the data for all rows is\n\t\t *    returned. If mRow is defined, just data for that row, and is iCol is\n\t\t *    defined, only data for the designated cell is returned.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    // Row data\n\t\t *    $(document).ready(function() {\n\t\t *      oTable = $('#example').dataTable();\n\t\t *\n\t\t *      oTable.$('tr').click( function () {\n\t\t *        var data = oTable.fnGetData( this );\n\t\t *        // ... do something with the array / object of data for the row\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Individual cell data\n\t\t *    $(document).ready(function() {\n\t\t *      oTable = $('#example').dataTable();\n\t\t *\n\t\t *      oTable.$('td').click( function () {\n\t\t *        var sData = oTable.fnGetData( this );\n\t\t *        alert( 'The cell clicked on had the value of '+sData );\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\tthis.fnGetData = function( src, col )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\n\t\t\tif ( src !== undefined ) {\n\t\t\t\tvar type = src.nodeName ? src.nodeName.toLowerCase() : '';\n\t\t\n\t\t\t\treturn col !== undefined || type == 'td' || type == 'th' ?\n\t\t\t\t\tapi.cell( src, col ).data() :\n\t\t\t\t\tapi.row( src ).data() || null;\n\t\t\t}\n\t\t\n\t\t\treturn api.data().toArray();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Get an array of the TR nodes that are used in the table's body. Note that you will\n\t\t * typically want to use the '$' API method in preference to this as it is more\n\t\t * flexible.\n\t\t *  @param {int} [iRow] Optional row index for the TR element you want\n\t\t *  @returns {array|node} If iRow is undefined, returns an array of all TR elements\n\t\t *    in the table's body, or iRow is defined, just the TR element requested.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Get the nodes from the table\n\t\t *      var nNodes = oTable.fnGetNodes( );\n\t\t *    } );\n\t\t */\n\t\tthis.fnGetNodes = function( iRow )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\n\t\t\treturn iRow !== undefined ?\n\t\t\t\tapi.row( iRow ).node() :\n\t\t\t\tapi.rows().nodes().flatten().toArray();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Get the array indexes of a particular cell from it's DOM element\n\t\t * and column index including hidden columns\n\t\t *  @param {node} node this can either be a TR, TD or TH in the table's body\n\t\t *  @returns {int} If nNode is given as a TR, then a single index is returned, or\n\t\t *    if given as a cell, an array of [row index, column index (visible),\n\t\t *    column index (all)] is given.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      $('#example tbody td').click( function () {\n\t\t *        // Get the position of the current data from the node\n\t\t *        var aPos = oTable.fnGetPosition( this );\n\t\t *\n\t\t *        // Get the data array for this row\n\t\t *        var aData = oTable.fnGetData( aPos[0] );\n\t\t *\n\t\t *        // Update the data array and return the value\n\t\t *        aData[ aPos[1] ] = 'clicked';\n\t\t *        this.innerHTML = 'clicked';\n\t\t *      } );\n\t\t *\n\t\t *      // Init DataTables\n\t\t *      oTable = $('#example').dataTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnGetPosition = function( node )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\tvar nodeName = node.nodeName.toUpperCase();\n\t\t\n\t\t\tif ( nodeName == 'TR' ) {\n\t\t\t\treturn api.row( node ).index();\n\t\t\t}\n\t\t\telse if ( nodeName == 'TD' || nodeName == 'TH' ) {\n\t\t\t\tvar cell = api.cell( node ).index();\n\t\t\n\t\t\t\treturn [\n\t\t\t\t\tcell.row,\n\t\t\t\t\tcell.columnVisible,\n\t\t\t\t\tcell.column\n\t\t\t\t];\n\t\t\t}\n\t\t\treturn null;\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Check to see if a row is 'open' or not.\n\t\t *  @param {node} nTr the table row to check\n\t\t *  @returns {boolean} true if the row is currently open, false otherwise\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable;\n\t\t *\n\t\t *      // 'open' an information row when a row is clicked on\n\t\t *      $('#example tbody tr').click( function () {\n\t\t *        if ( oTable.fnIsOpen(this) ) {\n\t\t *          oTable.fnClose( this );\n\t\t *        } else {\n\t\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t\t *        }\n\t\t *      } );\n\t\t *\n\t\t *      oTable = $('#example').dataTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnIsOpen = function( nTr )\n\t\t{\n\t\t\treturn this.api( true ).row( nTr ).child.isShown();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * This function will place a new row directly after a row which is currently\n\t\t * on display on the page, with the HTML contents that is passed into the\n\t\t * function. This can be used, for example, to ask for confirmation that a\n\t\t * particular record should be deleted.\n\t\t *  @param {node} nTr The table row to 'open'\n\t\t *  @param {string|node|jQuery} mHtml The HTML to put into the row\n\t\t *  @param {string} sClass Class to give the new TD cell\n\t\t *  @returns {node} The row opened. Note that if the table row passed in as the\n\t\t *    first parameter, is not found in the table, this method will silently\n\t\t *    return.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable;\n\t\t *\n\t\t *      // 'open' an information row when a row is clicked on\n\t\t *      $('#example tbody tr').click( function () {\n\t\t *        if ( oTable.fnIsOpen(this) ) {\n\t\t *          oTable.fnClose( this );\n\t\t *        } else {\n\t\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t\t *        }\n\t\t *      } );\n\t\t *\n\t\t *      oTable = $('#example').dataTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnOpen = function( nTr, mHtml, sClass )\n\t\t{\n\t\t\treturn this.api( true )\n\t\t\t\t.row( nTr )\n\t\t\t\t.child( mHtml, sClass )\n\t\t\t\t.show()\n\t\t\t\t.child()[0];\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Change the pagination - provides the internal logic for pagination in a simple API\n\t\t * function. With this function you can have a DataTables table go to the next,\n\t\t * previous, first or last pages.\n\t\t *  @param {string|int} mAction Paging action to take: \"first\", \"previous\", \"next\" or \"last\"\n\t\t *    or page number to jump to (integer), note that page 0 is the first page.\n\t\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      oTable.fnPageChange( 'next' );\n\t\t *    } );\n\t\t */\n\t\tthis.fnPageChange = function ( mAction, bRedraw )\n\t\t{\n\t\t\tvar api = this.api( true ).page( mAction );\n\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.draw(false);\n\t\t\t}\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Show a particular column\n\t\t *  @param {int} iCol The column whose display should be changed\n\t\t *  @param {bool} bShow Show (true) or hide (false) the column\n\t\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Hide the second column after initialisation\n\t\t *      oTable.fnSetColumnVis( 1, false );\n\t\t *    } );\n\t\t */\n\t\tthis.fnSetColumnVis = function ( iCol, bShow, bRedraw )\n\t\t{\n\t\t\tvar api = this.api( true ).column( iCol ).visible( bShow );\n\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.columns.adjust().draw();\n\t\t\t}\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Get the settings for a particular table for external manipulation\n\t\t *  @returns {object} DataTables settings object. See\n\t\t *    {@link DataTable.models.oSettings}\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      var oSettings = oTable.fnSettings();\n\t\t *\n\t\t *      // Show an example parameter from the settings\n\t\t *      alert( oSettings._iDisplayStart );\n\t\t *    } );\n\t\t */\n\t\tthis.fnSettings = function()\n\t\t{\n\t\t\treturn _fnSettingsFromNode( this[_ext.iApiIndex] );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Sort the table by a particular column\n\t\t *  @param {int} iCol the data index to sort on. Note that this will not match the\n\t\t *    'display index' if you have hidden data entries\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Sort immediately with columns 0 and 1\n\t\t *      oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );\n\t\t *    } );\n\t\t */\n\t\tthis.fnSort = function( aaSort )\n\t\t{\n\t\t\tthis.api( true ).order( aaSort ).draw();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Attach a sort listener to an element for a given column\n\t\t *  @param {node} nNode the element to attach the sort listener to\n\t\t *  @param {int} iColumn the column that a click on this node will sort on\n\t\t *  @param {function} [fnCallback] callback function when sort is run\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Sort on column 1, when 'sorter' is clicked on\n\t\t *      oTable.fnSortListener( document.getElementById('sorter'), 1 );\n\t\t *    } );\n\t\t */\n\t\tthis.fnSortListener = function( nNode, iColumn, fnCallback )\n\t\t{\n\t\t\tthis.api( true ).order.listener( nNode, iColumn, fnCallback );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Update a table cell or row - this method will accept either a single value to\n\t\t * update the cell with, an array of values with one element for each column or\n\t\t * an object in the same format as the original data source. The function is\n\t\t * self-referencing in order to make the multi column updates easier.\n\t\t *  @param {object|array|string} mData Data to update the cell/row with\n\t\t *  @param {node|int} mRow TR element you want to update or the aoData index\n\t\t *  @param {int} [iColumn] The column to update, give as null or undefined to\n\t\t *    update a whole row.\n\t\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t\t *  @param {bool} [bAction=true] Perform pre-draw actions or not\n\t\t *  @returns {int} 0 on success, 1 on error\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell\n\t\t *      oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], $('tbody tr')[0] ); // Row\n\t\t *    } );\n\t\t */\n\t\tthis.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\n\t\t\tif ( iColumn === undefined || iColumn === null ) {\n\t\t\t\tapi.row( mRow ).data( mData );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tapi.cell( mRow, iColumn ).data( mData );\n\t\t\t}\n\t\t\n\t\t\tif ( bAction === undefined || bAction ) {\n\t\t\t\tapi.columns.adjust();\n\t\t\t}\n\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.draw();\n\t\t\t}\n\t\t\treturn 0;\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Provide a common method for plug-ins to check the version of DataTables being used, in order\n\t\t * to ensure compatibility.\n\t\t *  @param {string} sVersion Version string to check for, in the format \"X.Y.Z\". Note that the\n\t\t *    formats \"X\" and \"X.Y\" are also acceptable.\n\t\t *  @returns {boolean} true if this version of DataTables is greater or equal to the required\n\t\t *    version, or false if this version of DataTales is not suitable\n\t\t *  @method\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      alert( oTable.fnVersionCheck( '1.9.0' ) );\n\t\t *    } );\n\t\t */\n\t\tthis.fnVersionCheck = _ext.fnVersionCheck;\n\t\t\n\n\t\tvar _that = this;\n\t\tvar emptyInit = options === undefined;\n\t\tvar len = this.length;\n\n\t\tif ( emptyInit ) {\n\t\t\toptions = {};\n\t\t}\n\n\t\tthis.oApi = this.internal = _ext.internal;\n\n\t\t// Extend with old style plug-in API methods\n\t\tfor ( var fn in DataTable.ext.internal ) {\n\t\t\tif ( fn ) {\n\t\t\t\tthis[fn] = _fnExternApiFunc(fn);\n\t\t\t}\n\t\t}\n\n\t\tthis.each(function() {\n\t\t\t// For each initialisation we want to give it a clean initialisation\n\t\t\t// object that can be bashed around\n\t\t\tvar o = {};\n\t\t\tvar oInit = len > 1 ? // optimisation for single table case\n\t\t\t\t_fnExtend( o, options, true ) :\n\t\t\t\toptions;\n\n\t\t\t/*global oInit,_that,emptyInit*/\n\t\t\tvar i=0, iLen, j, jLen, k, kLen;\n\t\t\tvar sId = this.getAttribute( 'id' );\n\t\t\tvar bInitHandedOff = false;\n\t\t\tvar defaults = DataTable.defaults;\n\t\t\tvar $this = $(this);\n\t\t\t\n\t\t\t\n\t\t\t/* Sanity check */\n\t\t\tif ( this.nodeName.toLowerCase() != 'table' )\n\t\t\t{\n\t\t\t\t_fnLog( null, 0, 'Non-table node initialisation ('+this.nodeName+')', 2 );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t/* Backwards compatibility for the defaults */\n\t\t\t_fnCompatOpts( defaults );\n\t\t\t_fnCompatCols( defaults.column );\n\t\t\t\n\t\t\t/* Convert the camel-case defaults to Hungarian */\n\t\t\t_fnCamelToHungarian( defaults, defaults, true );\n\t\t\t_fnCamelToHungarian( defaults.column, defaults.column, true );\n\t\t\t\n\t\t\t/* Setting up the initialisation object */\n\t\t\t_fnCamelToHungarian( defaults, $.extend( oInit, $this.data() ) );\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t/* Check to see if we are re-initialising a table */\n\t\t\tvar allSettings = DataTable.settings;\n\t\t\tfor ( i=0, iLen=allSettings.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tvar s = allSettings[i];\n\t\t\t\n\t\t\t\t/* Base check on table node */\n\t\t\t\tif ( s.nTable == this || s.nTHead.parentNode == this || (s.nTFoot && s.nTFoot.parentNode == this) )\n\t\t\t\t{\n\t\t\t\t\tvar bRetrieve = oInit.bRetrieve !== undefined ? oInit.bRetrieve : defaults.bRetrieve;\n\t\t\t\t\tvar bDestroy = oInit.bDestroy !== undefined ? oInit.bDestroy : defaults.bDestroy;\n\t\t\t\n\t\t\t\t\tif ( emptyInit || bRetrieve )\n\t\t\t\t\t{\n\t\t\t\t\t\treturn s.oInstance;\n\t\t\t\t\t}\n\t\t\t\t\telse if ( bDestroy )\n\t\t\t\t\t{\n\t\t\t\t\t\ts.oInstance.fnDestroy();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t_fnLog( s, 0, 'Cannot reinitialise DataTable', 3 );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\t\t/* If the element we are initialising has the same ID as a table which was previously\n\t\t\t\t * initialised, but the table nodes don't match (from before) then we destroy the old\n\t\t\t\t * instance by simply deleting it. This is under the assumption that the table has been\n\t\t\t\t * destroyed by other methods. Anyone using non-id selectors will need to do this manually\n\t\t\t\t */\n\t\t\t\tif ( s.sTableId == this.id )\n\t\t\t\t{\n\t\t\t\t\tallSettings.splice( i, 1 );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* Ensure the table has an ID - required for accessibility */\n\t\t\tif ( sId === null || sId === \"\" )\n\t\t\t{\n\t\t\t\tsId = \"DataTables_Table_\"+(DataTable.ext._unique++);\n\t\t\t\tthis.id = sId;\n\t\t\t}\n\t\t\t\n\t\t\t/* Create the settings object for this table and set some of the default parameters */\n\t\t\tvar oSettings = $.extend( true, {}, DataTable.models.oSettings, {\n\t\t\t\t\"sDestroyWidth\": $this[0].style.width,\n\t\t\t\t\"sInstance\":     sId,\n\t\t\t\t\"sTableId\":      sId\n\t\t\t} );\n\t\t\toSettings.nTable = this;\n\t\t\toSettings.oApi   = _that.internal;\n\t\t\toSettings.oInit  = oInit;\n\t\t\t\n\t\t\tallSettings.push( oSettings );\n\t\t\t\n\t\t\t// Need to add the instance after the instance after the settings object has been added\n\t\t\t// to the settings array, so we can self reference the table instance if more than one\n\t\t\toSettings.oInstance = (_that.length===1) ? _that : $this.dataTable();\n\t\t\t\n\t\t\t// Backwards compatibility, before we apply all the defaults\n\t\t\t_fnCompatOpts( oInit );\n\t\t\t\n\t\t\tif ( oInit.oLanguage )\n\t\t\t{\n\t\t\t\t_fnLanguageCompat( oInit.oLanguage );\n\t\t\t}\n\t\t\t\n\t\t\t// If the length menu is given, but the init display length is not, use the length menu\n\t\t\tif ( oInit.aLengthMenu && ! oInit.iDisplayLength )\n\t\t\t{\n\t\t\t\toInit.iDisplayLength = $.isArray( oInit.aLengthMenu[0] ) ?\n\t\t\t\t\toInit.aLengthMenu[0][0] : oInit.aLengthMenu[0];\n\t\t\t}\n\t\t\t\n\t\t\t// Apply the defaults and init options to make a single init object will all\n\t\t\t// options defined from defaults and instance options.\n\t\t\toInit = _fnExtend( $.extend( true, {}, defaults ), oInit );\n\t\t\t\n\t\t\t\n\t\t\t// Map the initialisation options onto the settings object\n\t\t\t_fnMap( oSettings.oFeatures, oInit, [\n\t\t\t\t\"bPaginate\",\n\t\t\t\t\"bLengthChange\",\n\t\t\t\t\"bFilter\",\n\t\t\t\t\"bSort\",\n\t\t\t\t\"bSortMulti\",\n\t\t\t\t\"bInfo\",\n\t\t\t\t\"bProcessing\",\n\t\t\t\t\"bAutoWidth\",\n\t\t\t\t\"bSortClasses\",\n\t\t\t\t\"bServerSide\",\n\t\t\t\t\"bDeferRender\"\n\t\t\t] );\n\t\t\t_fnMap( oSettings, oInit, [\n\t\t\t\t\"asStripeClasses\",\n\t\t\t\t\"ajax\",\n\t\t\t\t\"fnServerData\",\n\t\t\t\t\"fnFormatNumber\",\n\t\t\t\t\"sServerMethod\",\n\t\t\t\t\"aaSorting\",\n\t\t\t\t\"aaSortingFixed\",\n\t\t\t\t\"aLengthMenu\",\n\t\t\t\t\"sPaginationType\",\n\t\t\t\t\"sAjaxSource\",\n\t\t\t\t\"sAjaxDataProp\",\n\t\t\t\t\"iStateDuration\",\n\t\t\t\t\"sDom\",\n\t\t\t\t\"bSortCellsTop\",\n\t\t\t\t\"iTabIndex\",\n\t\t\t\t\"fnStateLoadCallback\",\n\t\t\t\t\"fnStateSaveCallback\",\n\t\t\t\t\"renderer\",\n\t\t\t\t\"searchDelay\",\n\t\t\t\t\"rowId\",\n\t\t\t\t[ \"iCookieDuration\", \"iStateDuration\" ], // backwards compat\n\t\t\t\t[ \"oSearch\", \"oPreviousSearch\" ],\n\t\t\t\t[ \"aoSearchCols\", \"aoPreSearchCols\" ],\n\t\t\t\t[ \"iDisplayLength\", \"_iDisplayLength\" ],\n\t\t\t\t[ \"bJQueryUI\", \"bJUI\" ]\n\t\t\t] );\n\t\t\t_fnMap( oSettings.oScroll, oInit, [\n\t\t\t\t[ \"sScrollX\", \"sX\" ],\n\t\t\t\t[ \"sScrollXInner\", \"sXInner\" ],\n\t\t\t\t[ \"sScrollY\", \"sY\" ],\n\t\t\t\t[ \"bScrollCollapse\", \"bCollapse\" ]\n\t\t\t] );\n\t\t\t_fnMap( oSettings.oLanguage, oInit, \"fnInfoCallback\" );\n\t\t\t\n\t\t\t/* Callback functions which are array driven */\n\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback',       oInit.fnDrawCallback,      'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoServerParams',       oInit.fnServerParams,      'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoStateSaveParams',    oInit.fnStateSaveParams,   'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoStateLoadParams',    oInit.fnStateLoadParams,   'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoStateLoaded',        oInit.fnStateLoaded,       'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoRowCallback',        oInit.fnRowCallback,       'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow,        'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoHeaderCallback',     oInit.fnHeaderCallback,    'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoFooterCallback',     oInit.fnFooterCallback,    'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoInitComplete',       oInit.fnInitComplete,      'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoPreDrawCallback',    oInit.fnPreDrawCallback,   'user' );\n\t\t\t\n\t\t\toSettings.rowIdFn = _fnGetObjectDataFn( oInit.rowId );\n\t\t\t\n\t\t\t/* Browser support detection */\n\t\t\t_fnBrowserDetect( oSettings );\n\t\t\t\n\t\t\tvar oClasses = oSettings.oClasses;\n\t\t\t\n\t\t\t// @todo Remove in 1.11\n\t\t\tif ( oInit.bJQueryUI )\n\t\t\t{\n\t\t\t\t/* Use the JUI classes object for display. You could clone the oStdClasses object if\n\t\t\t\t * you want to have multiple tables with multiple independent classes\n\t\t\t\t */\n\t\t\t\t$.extend( oClasses, DataTable.ext.oJUIClasses, oInit.oClasses );\n\t\t\t\n\t\t\t\tif ( oInit.sDom === defaults.sDom && defaults.sDom === \"lfrtip\" )\n\t\t\t\t{\n\t\t\t\t\t/* Set the DOM to use a layout suitable for jQuery UI's theming */\n\t\t\t\t\toSettings.sDom = '<\"H\"lfr>t<\"F\"ip>';\n\t\t\t\t}\n\t\t\t\n\t\t\t\tif ( ! oSettings.renderer ) {\n\t\t\t\t\toSettings.renderer = 'jqueryui';\n\t\t\t\t}\n\t\t\t\telse if ( $.isPlainObject( oSettings.renderer ) && ! oSettings.renderer.header ) {\n\t\t\t\t\toSettings.renderer.header = 'jqueryui';\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$.extend( oClasses, DataTable.ext.classes, oInit.oClasses );\n\t\t\t}\n\t\t\t$this.addClass( oClasses.sTable );\n\t\t\t\n\t\t\t\n\t\t\tif ( oSettings.iInitDisplayStart === undefined )\n\t\t\t{\n\t\t\t\t/* Display start point, taking into account the save saving */\n\t\t\t\toSettings.iInitDisplayStart = oInit.iDisplayStart;\n\t\t\t\toSettings._iDisplayStart = oInit.iDisplayStart;\n\t\t\t}\n\t\t\t\n\t\t\tif ( oInit.iDeferLoading !== null )\n\t\t\t{\n\t\t\t\toSettings.bDeferLoading = true;\n\t\t\t\tvar tmp = $.isArray( oInit.iDeferLoading );\n\t\t\t\toSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;\n\t\t\t\toSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;\n\t\t\t}\n\t\t\t\n\t\t\t/* Language definitions */\n\t\t\tvar oLanguage = oSettings.oLanguage;\n\t\t\t$.extend( true, oLanguage, oInit.oLanguage );\n\t\t\t\n\t\t\tif ( oLanguage.sUrl )\n\t\t\t{\n\t\t\t\t/* Get the language definitions from a file - because this Ajax call makes the language\n\t\t\t\t * get async to the remainder of this function we use bInitHandedOff to indicate that\n\t\t\t\t * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor\n\t\t\t\t */\n\t\t\t\t$.ajax( {\n\t\t\t\t\tdataType: 'json',\n\t\t\t\t\turl: oLanguage.sUrl,\n\t\t\t\t\tsuccess: function ( json ) {\n\t\t\t\t\t\t_fnLanguageCompat( json );\n\t\t\t\t\t\t_fnCamelToHungarian( defaults.oLanguage, json );\n\t\t\t\t\t\t$.extend( true, oLanguage, json );\n\t\t\t\t\t\t_fnInitialise( oSettings );\n\t\t\t\t\t},\n\t\t\t\t\terror: function () {\n\t\t\t\t\t\t// Error occurred loading language file, continue on as best we can\n\t\t\t\t\t\t_fnInitialise( oSettings );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbInitHandedOff = true;\n\t\t\t}\n\t\t\t\n\t\t\t/*\n\t\t\t * Stripes\n\t\t\t */\n\t\t\tif ( oInit.asStripeClasses === null )\n\t\t\t{\n\t\t\t\toSettings.asStripeClasses =[\n\t\t\t\t\toClasses.sStripeOdd,\n\t\t\t\t\toClasses.sStripeEven\n\t\t\t\t];\n\t\t\t}\n\t\t\t\n\t\t\t/* Remove row stripe classes if they are already on the table row */\n\t\t\tvar stripeClasses = oSettings.asStripeClasses;\n\t\t\tvar rowOne = $this.children('tbody').find('tr').eq(0);\n\t\t\tif ( $.inArray( true, $.map( stripeClasses, function(el, i) {\n\t\t\t\treturn rowOne.hasClass(el);\n\t\t\t} ) ) !== -1 ) {\n\t\t\t\t$('tbody tr', this).removeClass( stripeClasses.join(' ') );\n\t\t\t\toSettings.asDestroyStripes = stripeClasses.slice();\n\t\t\t}\n\t\t\t\n\t\t\t/*\n\t\t\t * Columns\n\t\t\t * See if we should load columns automatically or use defined ones\n\t\t\t */\n\t\t\tvar anThs = [];\n\t\t\tvar aoColumnsInit;\n\t\t\tvar nThead = this.getElementsByTagName('thead');\n\t\t\tif ( nThead.length !== 0 )\n\t\t\t{\n\t\t\t\t_fnDetectHeader( oSettings.aoHeader, nThead[0] );\n\t\t\t\tanThs = _fnGetUniqueThs( oSettings );\n\t\t\t}\n\t\t\t\n\t\t\t/* If not given a column array, generate one with nulls */\n\t\t\tif ( oInit.aoColumns === null )\n\t\t\t{\n\t\t\t\taoColumnsInit = [];\n\t\t\t\tfor ( i=0, iLen=anThs.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\taoColumnsInit.push( null );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\taoColumnsInit = oInit.aoColumns;\n\t\t\t}\n\t\t\t\n\t\t\t/* Add the columns */\n\t\t\tfor ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\t_fnAddColumn( oSettings, anThs ? anThs[i] : null );\n\t\t\t}\n\t\t\t\n\t\t\t/* Apply the column definitions */\n\t\t\t_fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) {\n\t\t\t\t_fnColumnOptions( oSettings, iCol, oDef );\n\t\t\t} );\n\t\t\t\n\t\t\t/* HTML5 attribute detection - build an mData object automatically if the\n\t\t\t * attributes are found\n\t\t\t */\n\t\t\tif ( rowOne.length ) {\n\t\t\t\tvar a = function ( cell, name ) {\n\t\t\t\t\treturn cell.getAttribute( 'data-'+name ) !== null ? name : null;\n\t\t\t\t};\n\t\t\t\n\t\t\t\t$( rowOne[0] ).children('th, td').each( function (i, cell) {\n\t\t\t\t\tvar col = oSettings.aoColumns[i];\n\t\t\t\n\t\t\t\t\tif ( col.mData === i ) {\n\t\t\t\t\t\tvar sort = a( cell, 'sort' ) || a( cell, 'order' );\n\t\t\t\t\t\tvar filter = a( cell, 'filter' ) || a( cell, 'search' );\n\t\t\t\n\t\t\t\t\t\tif ( sort !== null || filter !== null ) {\n\t\t\t\t\t\t\tcol.mData = {\n\t\t\t\t\t\t\t\t_:      i+'.display',\n\t\t\t\t\t\t\t\tsort:   sort !== null   ? i+'.@data-'+sort   : undefined,\n\t\t\t\t\t\t\t\ttype:   sort !== null   ? i+'.@data-'+sort   : undefined,\n\t\t\t\t\t\t\t\tfilter: filter !== null ? i+'.@data-'+filter : undefined\n\t\t\t\t\t\t\t};\n\t\t\t\n\t\t\t\t\t\t\t_fnColumnOptions( oSettings, i );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\t\n\t\t\tvar features = oSettings.oFeatures;\n\t\t\tvar loadedInit = function () {\n\t\t\t\t/*\n\t\t\t\t * Sorting\n\t\t\t\t * @todo For modularisation (1.11) this needs to do into a sort start up handler\n\t\t\t\t */\n\t\t\t\n\t\t\t\t// If aaSorting is not defined, then we use the first indicator in asSorting\n\t\t\t\t// in case that has been altered, so the default sort reflects that option\n\t\t\t\tif ( oInit.aaSorting === undefined ) {\n\t\t\t\t\tvar sorting = oSettings.aaSorting;\n\t\t\t\t\tfor ( i=0, iLen=sorting.length ; i<iLen ; i++ ) {\n\t\t\t\t\t\tsorting[i][1] = oSettings.aoColumns[ i ].asSorting[0];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\t\t/* Do a first pass on the sorting classes (allows any size changes to be taken into\n\t\t\t\t * account, and also will apply sorting disabled classes if disabled\n\t\t\t\t */\n\t\t\t\t_fnSortingClasses( oSettings );\n\t\t\t\n\t\t\t\tif ( features.bSort ) {\n\t\t\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', function () {\n\t\t\t\t\t\tif ( oSettings.bSorted ) {\n\t\t\t\t\t\t\tvar aSort = _fnSortFlatten( oSettings );\n\t\t\t\t\t\t\tvar sortedColumns = {};\n\t\t\t\n\t\t\t\t\t\t\t$.each( aSort, function (i, val) {\n\t\t\t\t\t\t\t\tsortedColumns[ val.src ] = val.dir;\n\t\t\t\t\t\t\t} );\n\t\t\t\n\t\t\t\t\t\t\t_fnCallbackFire( oSettings, null, 'order', [oSettings, aSort, sortedColumns] );\n\t\t\t\t\t\t\t_fnSortAria( oSettings );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\n\t\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', function () {\n\t\t\t\t\tif ( oSettings.bSorted || _fnDataSource( oSettings ) === 'ssp' || features.bDeferRender ) {\n\t\t\t\t\t\t_fnSortingClasses( oSettings );\n\t\t\t\t\t}\n\t\t\t\t}, 'sc' );\n\t\t\t\n\t\t\t\n\t\t\t\t/*\n\t\t\t\t * Final init\n\t\t\t\t * Cache the header, body and footer as required, creating them if needed\n\t\t\t\t */\n\t\t\t\n\t\t\t\t// Work around for Webkit bug 83867 - store the caption-side before removing from doc\n\t\t\t\tvar captions = $this.children('caption').each( function () {\n\t\t\t\t\tthis._captionSide = $(this).css('caption-side');\n\t\t\t\t} );\n\t\t\t\n\t\t\t\tvar thead = $this.children('thead');\n\t\t\t\tif ( thead.length === 0 ) {\n\t\t\t\t\tthead = $('<thead/>').appendTo($this);\n\t\t\t\t}\n\t\t\t\toSettings.nTHead = thead[0];\n\t\t\t\n\t\t\t\tvar tbody = $this.children('tbody');\n\t\t\t\tif ( tbody.length === 0 ) {\n\t\t\t\t\ttbody = $('<tbody/>').appendTo($this);\n\t\t\t\t}\n\t\t\t\toSettings.nTBody = tbody[0];\n\t\t\t\n\t\t\t\tvar tfoot = $this.children('tfoot');\n\t\t\t\tif ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== \"\" || oSettings.oScroll.sY !== \"\") ) {\n\t\t\t\t\t// If we are a scrolling table, and no footer has been given, then we need to create\n\t\t\t\t\t// a tfoot element for the caption element to be appended to\n\t\t\t\t\ttfoot = $('<tfoot/>').appendTo($this);\n\t\t\t\t}\n\t\t\t\n\t\t\t\tif ( tfoot.length === 0 || tfoot.children().length === 0 ) {\n\t\t\t\t\t$this.addClass( oClasses.sNoFooter );\n\t\t\t\t}\n\t\t\t\telse if ( tfoot.length > 0 ) {\n\t\t\t\t\toSettings.nTFoot = tfoot[0];\n\t\t\t\t\t_fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot );\n\t\t\t\t}\n\t\t\t\n\t\t\t\t/* Check if there is data passing into the constructor */\n\t\t\t\tif ( oInit.aaData ) {\n\t\t\t\t\tfor ( i=0 ; i<oInit.aaData.length ; i++ ) {\n\t\t\t\t\t\t_fnAddData( oSettings, oInit.aaData[ i ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ( oSettings.bDeferLoading || _fnDataSource( oSettings ) == 'dom' ) {\n\t\t\t\t\t/* Grab the data from the page - only do this when deferred loading or no Ajax\n\t\t\t\t\t * source since there is no point in reading the DOM data if we are then going\n\t\t\t\t\t * to replace it with Ajax data\n\t\t\t\t\t */\n\t\t\t\t\t_fnAddTr( oSettings, $(oSettings.nTBody).children('tr') );\n\t\t\t\t}\n\t\t\t\n\t\t\t\t/* Copy the data index array */\n\t\t\t\toSettings.aiDisplay = oSettings.aiDisplayMaster.slice();\n\t\t\t\n\t\t\t\t/* Initialisation complete - table can be drawn */\n\t\t\t\toSettings.bInitialised = true;\n\t\t\t\n\t\t\t\t/* Check if we need to initialise the table (it might not have been handed off to the\n\t\t\t\t * language processor)\n\t\t\t\t */\n\t\t\t\tif ( bInitHandedOff === false ) {\n\t\t\t\t\t_fnInitialise( oSettings );\n\t\t\t\t}\n\t\t\t};\n\t\t\t\n\t\t\t/* Must be done after everything which can be overridden by the state saving! */\n\t\t\tif ( oInit.bStateSave )\n\t\t\t{\n\t\t\t\tfeatures.bStateSave = true;\n\t\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' );\n\t\t\t\t_fnLoadState( oSettings, oInit, loadedInit );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tloadedInit();\n\t\t\t}\n\t\t\t\n\t\t} );\n\t\t_that = null;\n\t\treturn this;\n\t};\n\n\t\n\t/*\n\t * It is useful to have variables which are scoped locally so only the\n\t * DataTables functions can access them and they don't leak into global space.\n\t * At the same time these functions are often useful over multiple files in the\n\t * core and API, so we list, or at least document, all variables which are used\n\t * by DataTables as private variables here. This also ensures that there is no\n\t * clashing of variable names and that they can easily referenced for reuse.\n\t */\n\t\n\t\n\t// Defined else where\n\t//  _selector_run\n\t//  _selector_opts\n\t//  _selector_first\n\t//  _selector_row_indexes\n\t\n\tvar _ext; // DataTable.ext\n\tvar _Api; // DataTable.Api\n\tvar _api_register; // DataTable.Api.register\n\tvar _api_registerPlural; // DataTable.Api.registerPlural\n\t\n\tvar _re_dic = {};\n\tvar _re_new_lines = /[\\r\\n]/g;\n\tvar _re_html = /<.*?>/g;\n\t\n\t// This is not strict ISO8601 - Date.parse() is quite lax, although\n\t// implementations differ between browsers.\n\tvar _re_date = /^\\d{2,4}[\\.\\/\\-]\\d{1,2}[\\.\\/\\-]\\d{1,2}([T ]{1}\\d{1,2}[:\\.]\\d{2}([\\.:]\\d{2})?)?$/;\n\t\n\t// Escape regular expression special characters\n\tvar _re_escape_regex = new RegExp( '(\\\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\\\', '$', '^', '-' ].join('|\\\\') + ')', 'g' );\n\t\n\t// http://en.wikipedia.org/wiki/Foreign_exchange_market\n\t// - \\u20BD - Russian ruble.\n\t// - \\u20a9 - South Korean Won\n\t// - \\u20BA - Turkish Lira\n\t// - \\u20B9 - Indian Rupee\n\t// - R - Brazil (R$) and South Africa\n\t// - fr - Swiss Franc\n\t// - kr - Swedish krona, Norwegian krone and Danish krone\n\t// - \\u2009 is thin space and \\u202F is narrow no-break space, both used in many\n\t//   standards as thousands separators.\n\tvar _re_formatted_numeric = /[',$£€¥%\\u2009\\u202F\\u20BD\\u20a9\\u20BArfk]/gi;\n\t\n\t\n\tvar _empty = function ( d ) {\n\t\treturn !d || d === true || d === '-' ? true : false;\n\t};\n\t\n\t\n\tvar _intVal = function ( s ) {\n\t\tvar integer = parseInt( s, 10 );\n\t\treturn !isNaN(integer) && isFinite(s) ? integer : null;\n\t};\n\t\n\t// Convert from a formatted number with characters other than `.` as the\n\t// decimal place, to a Javascript number\n\tvar _numToDecimal = function ( num, decimalPoint ) {\n\t\t// Cache created regular expressions for speed as this function is called often\n\t\tif ( ! _re_dic[ decimalPoint ] ) {\n\t\t\t_re_dic[ decimalPoint ] = new RegExp( _fnEscapeRegex( decimalPoint ), 'g' );\n\t\t}\n\t\treturn typeof num === 'string' && decimalPoint !== '.' ?\n\t\t\tnum.replace( /\\./g, '' ).replace( _re_dic[ decimalPoint ], '.' ) :\n\t\t\tnum;\n\t};\n\t\n\t\n\tvar _isNumber = function ( d, decimalPoint, formatted ) {\n\t\tvar strType = typeof d === 'string';\n\t\n\t\t// If empty return immediately so there must be a number if it is a\n\t\t// formatted string (this stops the string \"k\", or \"kr\", etc being detected\n\t\t// as a formatted number for currency\n\t\tif ( _empty( d ) ) {\n\t\t\treturn true;\n\t\t}\n\t\n\t\tif ( decimalPoint && strType ) {\n\t\t\td = _numToDecimal( d, decimalPoint );\n\t\t}\n\t\n\t\tif ( formatted && strType ) {\n\t\t\td = d.replace( _re_formatted_numeric, '' );\n\t\t}\n\t\n\t\treturn !isNaN( parseFloat(d) ) && isFinite( d );\n\t};\n\t\n\t\n\t// A string without HTML in it can be considered to be HTML still\n\tvar _isHtml = function ( d ) {\n\t\treturn _empty( d ) || typeof d === 'string';\n\t};\n\t\n\t\n\tvar _htmlNumeric = function ( d, decimalPoint, formatted ) {\n\t\tif ( _empty( d ) ) {\n\t\t\treturn true;\n\t\t}\n\t\n\t\tvar html = _isHtml( d );\n\t\treturn ! html ?\n\t\t\tnull :\n\t\t\t_isNumber( _stripHtml( d ), decimalPoint, formatted ) ?\n\t\t\t\ttrue :\n\t\t\t\tnull;\n\t};\n\t\n\t\n\tvar _pluck = function ( a, prop, prop2 ) {\n\t\tvar out = [];\n\t\tvar i=0, ien=a.length;\n\t\n\t\t// Could have the test in the loop for slightly smaller code, but speed\n\t\t// is essential here\n\t\tif ( prop2 !== undefined ) {\n\t\t\tfor ( ; i<ien ; i++ ) {\n\t\t\t\tif ( a[i] && a[i][ prop ] ) {\n\t\t\t\t\tout.push( a[i][ prop ][ prop2 ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tfor ( ; i<ien ; i++ ) {\n\t\t\t\tif ( a[i] ) {\n\t\t\t\t\tout.push( a[i][ prop ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\treturn out;\n\t};\n\t\n\t\n\t// Basically the same as _pluck, but rather than looping over `a` we use `order`\n\t// as the indexes to pick from `a`\n\tvar _pluck_order = function ( a, order, prop, prop2 )\n\t{\n\t\tvar out = [];\n\t\tvar i=0, ien=order.length;\n\t\n\t\t// Could have the test in the loop for slightly smaller code, but speed\n\t\t// is essential here\n\t\tif ( prop2 !== undefined ) {\n\t\t\tfor ( ; i<ien ; i++ ) {\n\t\t\t\tif ( a[ order[i] ][ prop ] ) {\n\t\t\t\t\tout.push( a[ order[i] ][ prop ][ prop2 ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tfor ( ; i<ien ; i++ ) {\n\t\t\t\tout.push( a[ order[i] ][ prop ] );\n\t\t\t}\n\t\t}\n\t\n\t\treturn out;\n\t};\n\t\n\t\n\tvar _range = function ( len, start )\n\t{\n\t\tvar out = [];\n\t\tvar end;\n\t\n\t\tif ( start === undefined ) {\n\t\t\tstart = 0;\n\t\t\tend = len;\n\t\t}\n\t\telse {\n\t\t\tend = start;\n\t\t\tstart = len;\n\t\t}\n\t\n\t\tfor ( var i=start ; i<end ; i++ ) {\n\t\t\tout.push( i );\n\t\t}\n\t\n\t\treturn out;\n\t};\n\t\n\t\n\tvar _removeEmpty = function ( a )\n\t{\n\t\tvar out = [];\n\t\n\t\tfor ( var i=0, ien=a.length ; i<ien ; i++ ) {\n\t\t\tif ( a[i] ) { // careful - will remove all falsy values!\n\t\t\t\tout.push( a[i] );\n\t\t\t}\n\t\t}\n\t\n\t\treturn out;\n\t};\n\t\n\t\n\tvar _stripHtml = function ( d ) {\n\t\treturn d.replace( _re_html, '' );\n\t};\n\t\n\t\n\t/**\n\t * Determine if all values in the array are unique. This means we can short\n\t * cut the _unique method at the cost of a single loop. A sorted array is used\n\t * to easily check the values.\n\t *\n\t * @param  {array} src Source array\n\t * @return {boolean} true if all unique, false otherwise\n\t * @ignore\n\t */\n\tvar _areAllUnique = function ( src ) {\n\t\tif ( src.length < 2 ) {\n\t\t\treturn true;\n\t\t}\n\t\n\t\tvar sorted = src.slice().sort();\n\t\tvar last = sorted[0];\n\t\n\t\tfor ( var i=1, ien=sorted.length ; i<ien ; i++ ) {\n\t\t\tif ( sorted[i] === last ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\n\t\t\tlast = sorted[i];\n\t\t}\n\t\n\t\treturn true;\n\t};\n\t\n\t\n\t/**\n\t * Find the unique elements in a source array.\n\t *\n\t * @param  {array} src Source array\n\t * @return {array} Array of unique items\n\t * @ignore\n\t */\n\tvar _unique = function ( src )\n\t{\n\t\tif ( _areAllUnique( src ) ) {\n\t\t\treturn src.slice();\n\t\t}\n\t\n\t\t// A faster unique method is to use object keys to identify used values,\n\t\t// but this doesn't work with arrays or objects, which we must also\n\t\t// consider. See jsperf.com/compare-array-unique-versions/4 for more\n\t\t// information.\n\t\tvar\n\t\t\tout = [],\n\t\t\tval,\n\t\t\ti, ien=src.length,\n\t\t\tj, k=0;\n\t\n\t\tagain: for ( i=0 ; i<ien ; i++ ) {\n\t\t\tval = src[i];\n\t\n\t\t\tfor ( j=0 ; j<k ; j++ ) {\n\t\t\t\tif ( out[j] === val ) {\n\t\t\t\t\tcontinue again;\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tout.push( val );\n\t\t\tk++;\n\t\t}\n\t\n\t\treturn out;\n\t};\n\t\n\t\n\t/**\n\t * DataTables utility methods\n\t * \n\t * This namespace provides helper methods that DataTables uses internally to\n\t * create a DataTable, but which are not exclusively used only for DataTables.\n\t * These methods can be used by extension authors to save the duplication of\n\t * code.\n\t *\n\t *  @namespace\n\t */\n\tDataTable.util = {\n\t\t/**\n\t\t * Throttle the calls to a function. Arguments and context are maintained\n\t\t * for the throttled function.\n\t\t *\n\t\t * @param {function} fn Function to be called\n\t\t * @param {integer} freq Call frequency in mS\n\t\t * @return {function} Wrapped function\n\t\t */\n\t\tthrottle: function ( fn, freq ) {\n\t\t\tvar\n\t\t\t\tfrequency = freq !== undefined ? freq : 200,\n\t\t\t\tlast,\n\t\t\t\ttimer;\n\t\n\t\t\treturn function () {\n\t\t\t\tvar\n\t\t\t\t\tthat = this,\n\t\t\t\t\tnow  = +new Date(),\n\t\t\t\t\targs = arguments;\n\t\n\t\t\t\tif ( last && now < last + frequency ) {\n\t\t\t\t\tclearTimeout( timer );\n\t\n\t\t\t\t\ttimer = setTimeout( function () {\n\t\t\t\t\t\tlast = undefined;\n\t\t\t\t\t\tfn.apply( that, args );\n\t\t\t\t\t}, frequency );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlast = now;\n\t\t\t\t\tfn.apply( that, args );\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * Escape a string such that it can be used in a regular expression\n\t\t *\n\t\t *  @param {string} val string to escape\n\t\t *  @returns {string} escaped string\n\t\t */\n\t\tescapeRegex: function ( val ) {\n\t\t\treturn val.replace( _re_escape_regex, '\\\\$1' );\n\t\t}\n\t};\n\t\n\t\n\t\n\t/**\n\t * Create a mapping object that allows camel case parameters to be looked up\n\t * for their Hungarian counterparts. The mapping is stored in a private\n\t * parameter called `_hungarianMap` which can be accessed on the source object.\n\t *  @param {object} o\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnHungarianMap ( o )\n\t{\n\t\tvar\n\t\t\thungarian = 'a aa ai ao as b fn i m o s ',\n\t\t\tmatch,\n\t\t\tnewKey,\n\t\t\tmap = {};\n\t\n\t\t$.each( o, function (key, val) {\n\t\t\tmatch = key.match(/^([^A-Z]+?)([A-Z])/);\n\t\n\t\t\tif ( match && hungarian.indexOf(match[1]+' ') !== -1 )\n\t\t\t{\n\t\t\t\tnewKey = key.replace( match[0], match[2].toLowerCase() );\n\t\t\t\tmap[ newKey ] = key;\n\t\n\t\t\t\tif ( match[1] === 'o' )\n\t\t\t\t{\n\t\t\t\t\t_fnHungarianMap( o[key] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t\n\t\to._hungarianMap = map;\n\t}\n\t\n\t\n\t/**\n\t * Convert from camel case parameters to Hungarian, based on a Hungarian map\n\t * created by _fnHungarianMap.\n\t *  @param {object} src The model object which holds all parameters that can be\n\t *    mapped.\n\t *  @param {object} user The object to convert from camel case to Hungarian.\n\t *  @param {boolean} force When set to `true`, properties which already have a\n\t *    Hungarian value in the `user` object will be overwritten. Otherwise they\n\t *    won't be.\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCamelToHungarian ( src, user, force )\n\t{\n\t\tif ( ! src._hungarianMap ) {\n\t\t\t_fnHungarianMap( src );\n\t\t}\n\t\n\t\tvar hungarianKey;\n\t\n\t\t$.each( user, function (key, val) {\n\t\t\thungarianKey = src._hungarianMap[ key ];\n\t\n\t\t\tif ( hungarianKey !== undefined && (force || user[hungarianKey] === undefined) )\n\t\t\t{\n\t\t\t\t// For objects, we need to buzz down into the object to copy parameters\n\t\t\t\tif ( hungarianKey.charAt(0) === 'o' )\n\t\t\t\t{\n\t\t\t\t\t// Copy the camelCase options over to the hungarian\n\t\t\t\t\tif ( ! user[ hungarianKey ] ) {\n\t\t\t\t\t\tuser[ hungarianKey ] = {};\n\t\t\t\t\t}\n\t\t\t\t\t$.extend( true, user[hungarianKey], user[key] );\n\t\n\t\t\t\t\t_fnCamelToHungarian( src[hungarianKey], user[hungarianKey], force );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tuser[hungarianKey] = user[ key ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n\t\n\t\n\t/**\n\t * Language compatibility - when certain options are given, and others aren't, we\n\t * need to duplicate the values over, in order to provide backwards compatibility\n\t * with older language files.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnLanguageCompat( lang )\n\t{\n\t\tvar defaults = DataTable.defaults.oLanguage;\n\t\tvar zeroRecords = lang.sZeroRecords;\n\t\n\t\t/* Backwards compatibility - if there is no sEmptyTable given, then use the same as\n\t\t * sZeroRecords - assuming that is given.\n\t\t */\n\t\tif ( ! lang.sEmptyTable && zeroRecords &&\n\t\t\tdefaults.sEmptyTable === \"No data available in table\" )\n\t\t{\n\t\t\t_fnMap( lang, lang, 'sZeroRecords', 'sEmptyTable' );\n\t\t}\n\t\n\t\t/* Likewise with loading records */\n\t\tif ( ! lang.sLoadingRecords && zeroRecords &&\n\t\t\tdefaults.sLoadingRecords === \"Loading...\" )\n\t\t{\n\t\t\t_fnMap( lang, lang, 'sZeroRecords', 'sLoadingRecords' );\n\t\t}\n\t\n\t\t// Old parameter name of the thousands separator mapped onto the new\n\t\tif ( lang.sInfoThousands ) {\n\t\t\tlang.sThousands = lang.sInfoThousands;\n\t\t}\n\t\n\t\tvar decimal = lang.sDecimal;\n\t\tif ( decimal ) {\n\t\t\t_addNumericSort( decimal );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Map one parameter onto another\n\t *  @param {object} o Object to map\n\t *  @param {*} knew The new parameter name\n\t *  @param {*} old The old parameter name\n\t */\n\tvar _fnCompatMap = function ( o, knew, old ) {\n\t\tif ( o[ knew ] !== undefined ) {\n\t\t\to[ old ] = o[ knew ];\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * Provide backwards compatibility for the main DT options. Note that the new\n\t * options are mapped onto the old parameters, so this is an external interface\n\t * change only.\n\t *  @param {object} init Object to map\n\t */\n\tfunction _fnCompatOpts ( init )\n\t{\n\t\t_fnCompatMap( init, 'ordering',      'bSort' );\n\t\t_fnCompatMap( init, 'orderMulti',    'bSortMulti' );\n\t\t_fnCompatMap( init, 'orderClasses',  'bSortClasses' );\n\t\t_fnCompatMap( init, 'orderCellsTop', 'bSortCellsTop' );\n\t\t_fnCompatMap( init, 'order',         'aaSorting' );\n\t\t_fnCompatMap( init, 'orderFixed',    'aaSortingFixed' );\n\t\t_fnCompatMap( init, 'paging',        'bPaginate' );\n\t\t_fnCompatMap( init, 'pagingType',    'sPaginationType' );\n\t\t_fnCompatMap( init, 'pageLength',    'iDisplayLength' );\n\t\t_fnCompatMap( init, 'searching',     'bFilter' );\n\t\n\t\t// Boolean initialisation of x-scrolling\n\t\tif ( typeof init.sScrollX === 'boolean' ) {\n\t\t\tinit.sScrollX = init.sScrollX ? '100%' : '';\n\t\t}\n\t\tif ( typeof init.scrollX === 'boolean' ) {\n\t\t\tinit.scrollX = init.scrollX ? '100%' : '';\n\t\t}\n\t\n\t\t// Column search objects are in an array, so it needs to be converted\n\t\t// element by element\n\t\tvar searchCols = init.aoSearchCols;\n\t\n\t\tif ( searchCols ) {\n\t\t\tfor ( var i=0, ien=searchCols.length ; i<ien ; i++ ) {\n\t\t\t\tif ( searchCols[i] ) {\n\t\t\t\t\t_fnCamelToHungarian( DataTable.models.oSearch, searchCols[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Provide backwards compatibility for column options. Note that the new options\n\t * are mapped onto the old parameters, so this is an external interface change\n\t * only.\n\t *  @param {object} init Object to map\n\t */\n\tfunction _fnCompatCols ( init )\n\t{\n\t\t_fnCompatMap( init, 'orderable',     'bSortable' );\n\t\t_fnCompatMap( init, 'orderData',     'aDataSort' );\n\t\t_fnCompatMap( init, 'orderSequence', 'asSorting' );\n\t\t_fnCompatMap( init, 'orderDataType', 'sortDataType' );\n\t\n\t\t// orderData can be given as an integer\n\t\tvar dataSort = init.aDataSort;\n\t\tif ( typeof dataSort === 'number' && ! $.isArray( dataSort ) ) {\n\t\t\tinit.aDataSort = [ dataSort ];\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Browser feature detection for capabilities, quirks\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnBrowserDetect( settings )\n\t{\n\t\t// We don't need to do this every time DataTables is constructed, the values\n\t\t// calculated are specific to the browser and OS configuration which we\n\t\t// don't expect to change between initialisations\n\t\tif ( ! DataTable.__browser ) {\n\t\t\tvar browser = {};\n\t\t\tDataTable.__browser = browser;\n\t\n\t\t\t// Scrolling feature / quirks detection\n\t\t\tvar n = $('<div/>')\n\t\t\t\t.css( {\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tleft: $(window).scrollLeft()*-1, // allow for scrolling\n\t\t\t\t\theight: 1,\n\t\t\t\t\twidth: 1,\n\t\t\t\t\toverflow: 'hidden'\n\t\t\t\t} )\n\t\t\t\t.append(\n\t\t\t\t\t$('<div/>')\n\t\t\t\t\t\t.css( {\n\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\ttop: 1,\n\t\t\t\t\t\t\tleft: 1,\n\t\t\t\t\t\t\twidth: 100,\n\t\t\t\t\t\t\toverflow: 'scroll'\n\t\t\t\t\t\t} )\n\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t$('<div/>')\n\t\t\t\t\t\t\t\t.css( {\n\t\t\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\t\t\theight: 10\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t\t.appendTo( 'body' );\n\t\n\t\t\tvar outer = n.children();\n\t\t\tvar inner = outer.children();\n\t\n\t\t\t// Numbers below, in order, are:\n\t\t\t// inner.offsetWidth, inner.clientWidth, outer.offsetWidth, outer.clientWidth\n\t\t\t//\n\t\t\t// IE6 XP:                           100 100 100  83\n\t\t\t// IE7 Vista:                        100 100 100  83\n\t\t\t// IE 8+ Windows:                     83  83 100  83\n\t\t\t// Evergreen Windows:                 83  83 100  83\n\t\t\t// Evergreen Mac with scrollbars:     85  85 100  85\n\t\t\t// Evergreen Mac without scrollbars: 100 100 100 100\n\t\n\t\t\t// Get scrollbar width\n\t\t\tbrowser.barWidth = outer[0].offsetWidth - outer[0].clientWidth;\n\t\n\t\t\t// IE6/7 will oversize a width 100% element inside a scrolling element, to\n\t\t\t// include the width of the scrollbar, while other browsers ensure the inner\n\t\t\t// element is contained without forcing scrolling\n\t\t\tbrowser.bScrollOversize = inner[0].offsetWidth === 100 && outer[0].clientWidth !== 100;\n\t\n\t\t\t// In rtl text layout, some browsers (most, but not all) will place the\n\t\t\t// scrollbar on the left, rather than the right.\n\t\t\tbrowser.bScrollbarLeft = Math.round( inner.offset().left ) !== 1;\n\t\n\t\t\t// IE8- don't provide height and width for getBoundingClientRect\n\t\t\tbrowser.bBounding = n[0].getBoundingClientRect().width ? true : false;\n\t\n\t\t\tn.remove();\n\t\t}\n\t\n\t\t$.extend( settings.oBrowser, DataTable.__browser );\n\t\tsettings.oScroll.iBarWidth = DataTable.__browser.barWidth;\n\t}\n\t\n\t\n\t/**\n\t * Array.prototype reduce[Right] method, used for browsers which don't support\n\t * JS 1.6. Done this way to reduce code size, since we iterate either way\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnReduce ( that, fn, init, start, end, inc )\n\t{\n\t\tvar\n\t\t\ti = start,\n\t\t\tvalue,\n\t\t\tisSet = false;\n\t\n\t\tif ( init !== undefined ) {\n\t\t\tvalue = init;\n\t\t\tisSet = true;\n\t\t}\n\t\n\t\twhile ( i !== end ) {\n\t\t\tif ( ! that.hasOwnProperty(i) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\n\t\t\tvalue = isSet ?\n\t\t\t\tfn( value, that[i], i, that ) :\n\t\t\t\tthat[i];\n\t\n\t\t\tisSet = true;\n\t\t\ti += inc;\n\t\t}\n\t\n\t\treturn value;\n\t}\n\t\n\t/**\n\t * Add a column to the list used for the table with default values\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {node} nTh The th element for this column\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAddColumn( oSettings, nTh )\n\t{\n\t\t// Add column to aoColumns array\n\t\tvar oDefaults = DataTable.defaults.column;\n\t\tvar iCol = oSettings.aoColumns.length;\n\t\tvar oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {\n\t\t\t\"nTh\": nTh ? nTh : document.createElement('th'),\n\t\t\t\"sTitle\":    oDefaults.sTitle    ? oDefaults.sTitle    : nTh ? nTh.innerHTML : '',\n\t\t\t\"aDataSort\": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],\n\t\t\t\"mData\": oDefaults.mData ? oDefaults.mData : iCol,\n\t\t\tidx: iCol\n\t\t} );\n\t\toSettings.aoColumns.push( oCol );\n\t\n\t\t// Add search object for column specific search. Note that the `searchCols[ iCol ]`\n\t\t// passed into extend can be undefined. This allows the user to give a default\n\t\t// with only some of the parameters defined, and also not give a default\n\t\tvar searchCols = oSettings.aoPreSearchCols;\n\t\tsearchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch, searchCols[ iCol ] );\n\t\n\t\t// Use the default column options function to initialise classes etc\n\t\t_fnColumnOptions( oSettings, iCol, $(nTh).data() );\n\t}\n\t\n\t\n\t/**\n\t * Apply options for a column\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {int} iCol column index to consider\n\t *  @param {object} oOptions object with sType, bVisible and bSearchable etc\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnColumnOptions( oSettings, iCol, oOptions )\n\t{\n\t\tvar oCol = oSettings.aoColumns[ iCol ];\n\t\tvar oClasses = oSettings.oClasses;\n\t\tvar th = $(oCol.nTh);\n\t\n\t\t// Try to get width information from the DOM. We can't get it from CSS\n\t\t// as we'd need to parse the CSS stylesheet. `width` option can override\n\t\tif ( ! oCol.sWidthOrig ) {\n\t\t\t// Width attribute\n\t\t\toCol.sWidthOrig = th.attr('width') || null;\n\t\n\t\t\t// Style attribute\n\t\t\tvar t = (th.attr('style') || '').match(/width:\\s*(\\d+[pxem%]+)/);\n\t\t\tif ( t ) {\n\t\t\t\toCol.sWidthOrig = t[1];\n\t\t\t}\n\t\t}\n\t\n\t\t/* User specified column options */\n\t\tif ( oOptions !== undefined && oOptions !== null )\n\t\t{\n\t\t\t// Backwards compatibility\n\t\t\t_fnCompatCols( oOptions );\n\t\n\t\t\t// Map camel case parameters to their Hungarian counterparts\n\t\t\t_fnCamelToHungarian( DataTable.defaults.column, oOptions );\n\t\n\t\t\t/* Backwards compatibility for mDataProp */\n\t\t\tif ( oOptions.mDataProp !== undefined && !oOptions.mData )\n\t\t\t{\n\t\t\t\toOptions.mData = oOptions.mDataProp;\n\t\t\t}\n\t\n\t\t\tif ( oOptions.sType )\n\t\t\t{\n\t\t\t\toCol._sManualType = oOptions.sType;\n\t\t\t}\n\t\n\t\t\t// `class` is a reserved word in Javascript, so we need to provide\n\t\t\t// the ability to use a valid name for the camel case input\n\t\t\tif ( oOptions.className && ! oOptions.sClass )\n\t\t\t{\n\t\t\t\toOptions.sClass = oOptions.className;\n\t\t\t}\n\t\n\t\t\t$.extend( oCol, oOptions );\n\t\t\t_fnMap( oCol, oOptions, \"sWidth\", \"sWidthOrig\" );\n\t\n\t\t\t/* iDataSort to be applied (backwards compatibility), but aDataSort will take\n\t\t\t * priority if defined\n\t\t\t */\n\t\t\tif ( oOptions.iDataSort !== undefined )\n\t\t\t{\n\t\t\t\toCol.aDataSort = [ oOptions.iDataSort ];\n\t\t\t}\n\t\t\t_fnMap( oCol, oOptions, \"aDataSort\" );\n\t\t}\n\t\n\t\t/* Cache the data get and set functions for speed */\n\t\tvar mDataSrc = oCol.mData;\n\t\tvar mData = _fnGetObjectDataFn( mDataSrc );\n\t\tvar mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;\n\t\n\t\tvar attrTest = function( src ) {\n\t\t\treturn typeof src === 'string' && src.indexOf('@') !== -1;\n\t\t};\n\t\toCol._bAttrSrc = $.isPlainObject( mDataSrc ) && (\n\t\t\tattrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter)\n\t\t);\n\t\toCol._setter = null;\n\t\n\t\toCol.fnGetData = function (rowData, type, meta) {\n\t\t\tvar innerData = mData( rowData, type, undefined, meta );\n\t\n\t\t\treturn mRender && type ?\n\t\t\t\tmRender( innerData, type, rowData, meta ) :\n\t\t\t\tinnerData;\n\t\t};\n\t\toCol.fnSetData = function ( rowData, val, meta ) {\n\t\t\treturn _fnSetObjectDataFn( mDataSrc )( rowData, val, meta );\n\t\t};\n\t\n\t\t// Indicate if DataTables should read DOM data as an object or array\n\t\t// Used in _fnGetRowElements\n\t\tif ( typeof mDataSrc !== 'number' ) {\n\t\t\toSettings._rowReadObject = true;\n\t\t}\n\t\n\t\t/* Feature sorting overrides column specific when off */\n\t\tif ( !oSettings.oFeatures.bSort )\n\t\t{\n\t\t\toCol.bSortable = false;\n\t\t\tth.addClass( oClasses.sSortableNone ); // Have to add class here as order event isn't called\n\t\t}\n\t\n\t\t/* Check that the class assignment is correct for sorting */\n\t\tvar bAsc = $.inArray('asc', oCol.asSorting) !== -1;\n\t\tvar bDesc = $.inArray('desc', oCol.asSorting) !== -1;\n\t\tif ( !oCol.bSortable || (!bAsc && !bDesc) )\n\t\t{\n\t\t\toCol.sSortingClass = oClasses.sSortableNone;\n\t\t\toCol.sSortingClassJUI = \"\";\n\t\t}\n\t\telse if ( bAsc && !bDesc )\n\t\t{\n\t\t\toCol.sSortingClass = oClasses.sSortableAsc;\n\t\t\toCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed;\n\t\t}\n\t\telse if ( !bAsc && bDesc )\n\t\t{\n\t\t\toCol.sSortingClass = oClasses.sSortableDesc;\n\t\t\toCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed;\n\t\t}\n\t\telse\n\t\t{\n\t\t\toCol.sSortingClass = oClasses.sSortable;\n\t\t\toCol.sSortingClassJUI = oClasses.sSortJUI;\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Adjust the table column widths for new data. Note: you would probably want to\n\t * do a redraw after calling this function!\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAdjustColumnSizing ( settings )\n\t{\n\t\t/* Not interested in doing column width calculation if auto-width is disabled */\n\t\tif ( settings.oFeatures.bAutoWidth !== false )\n\t\t{\n\t\t\tvar columns = settings.aoColumns;\n\t\n\t\t\t_fnCalculateColumnWidths( settings );\n\t\t\tfor ( var i=0 , iLen=columns.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tcolumns[i].nTh.style.width = columns[i].sWidth;\n\t\t\t}\n\t\t}\n\t\n\t\tvar scroll = settings.oScroll;\n\t\tif ( scroll.sY !== '' || scroll.sX !== '')\n\t\t{\n\t\t\t_fnScrollDraw( settings );\n\t\t}\n\t\n\t\t_fnCallbackFire( settings, null, 'column-sizing', [settings] );\n\t}\n\t\n\t\n\t/**\n\t * Covert the index of a visible column to the index in the data array (take account\n\t * of hidden columns)\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {int} iMatch Visible column index to lookup\n\t *  @returns {int} i the data index\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnVisibleToColumnIndex( oSettings, iMatch )\n\t{\n\t\tvar aiVis = _fnGetColumns( oSettings, 'bVisible' );\n\t\n\t\treturn typeof aiVis[iMatch] === 'number' ?\n\t\t\taiVis[iMatch] :\n\t\t\tnull;\n\t}\n\t\n\t\n\t/**\n\t * Covert the index of an index in the data array and convert it to the visible\n\t *   column index (take account of hidden columns)\n\t *  @param {int} iMatch Column index to lookup\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {int} i the data index\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnColumnIndexToVisible( oSettings, iMatch )\n\t{\n\t\tvar aiVis = _fnGetColumns( oSettings, 'bVisible' );\n\t\tvar iPos = $.inArray( iMatch, aiVis );\n\t\n\t\treturn iPos !== -1 ? iPos : null;\n\t}\n\t\n\t\n\t/**\n\t * Get the number of visible columns\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {int} i the number of visible columns\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnVisbleColumns( oSettings )\n\t{\n\t\tvar vis = 0;\n\t\n\t\t// No reduce in IE8, use a loop for now\n\t\t$.each( oSettings.aoColumns, function ( i, col ) {\n\t\t\tif ( col.bVisible && $(col.nTh).css('display') !== 'none' ) {\n\t\t\t\tvis++;\n\t\t\t}\n\t\t} );\n\t\n\t\treturn vis;\n\t}\n\t\n\t\n\t/**\n\t * Get an array of column indexes that match a given property\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {string} sParam Parameter in aoColumns to look for - typically\n\t *    bVisible or bSearchable\n\t *  @returns {array} Array of indexes with matched properties\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetColumns( oSettings, sParam )\n\t{\n\t\tvar a = [];\n\t\n\t\t$.map( oSettings.aoColumns, function(val, i) {\n\t\t\tif ( val[sParam] ) {\n\t\t\t\ta.push( i );\n\t\t\t}\n\t\t} );\n\t\n\t\treturn a;\n\t}\n\t\n\t\n\t/**\n\t * Calculate the 'type' of a column\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnColumnTypes ( settings )\n\t{\n\t\tvar columns = settings.aoColumns;\n\t\tvar data = settings.aoData;\n\t\tvar types = DataTable.ext.type.detect;\n\t\tvar i, ien, j, jen, k, ken;\n\t\tvar col, cell, detectedType, cache;\n\t\n\t\t// For each column, spin over the \n\t\tfor ( i=0, ien=columns.length ; i<ien ; i++ ) {\n\t\t\tcol = columns[i];\n\t\t\tcache = [];\n\t\n\t\t\tif ( ! col.sType && col._sManualType ) {\n\t\t\t\tcol.sType = col._sManualType;\n\t\t\t}\n\t\t\telse if ( ! col.sType ) {\n\t\t\t\tfor ( j=0, jen=types.length ; j<jen ; j++ ) {\n\t\t\t\t\tfor ( k=0, ken=data.length ; k<ken ; k++ ) {\n\t\t\t\t\t\t// Use a cache array so we only need to get the type data\n\t\t\t\t\t\t// from the formatter once (when using multiple detectors)\n\t\t\t\t\t\tif ( cache[k] === undefined ) {\n\t\t\t\t\t\t\tcache[k] = _fnGetCellData( settings, k, i, 'type' );\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tdetectedType = types[j]( cache[k], settings );\n\t\n\t\t\t\t\t\t// If null, then this type can't apply to this column, so\n\t\t\t\t\t\t// rather than testing all cells, break out. There is an\n\t\t\t\t\t\t// exception for the last type which is `html`. We need to\n\t\t\t\t\t\t// scan all rows since it is possible to mix string and HTML\n\t\t\t\t\t\t// types\n\t\t\t\t\t\tif ( ! detectedType && j !== types.length-1 ) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Only a single match is needed for html type since it is\n\t\t\t\t\t\t// bottom of the pile and very similar to string\n\t\t\t\t\t\tif ( detectedType === 'html' ) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Type is valid for all data points in the column - use this\n\t\t\t\t\t// type\n\t\t\t\t\tif ( detectedType ) {\n\t\t\t\t\t\tcol.sType = detectedType;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\t// Fall back - if no type was detected, always use string\n\t\t\t\tif ( ! col.sType ) {\n\t\t\t\t\tcol.sType = 'string';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Take the column definitions and static columns arrays and calculate how\n\t * they relate to column indexes. The callback function will then apply the\n\t * definition found for a column to a suitable configuration object.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {array} aoColDefs The aoColumnDefs array that is to be applied\n\t *  @param {array} aoCols The aoColumns array that defines columns individually\n\t *  @param {function} fn Callback function - takes two parameters, the calculated\n\t *    column index and the definition for that column.\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )\n\t{\n\t\tvar i, iLen, j, jLen, k, kLen, def;\n\t\tvar columns = oSettings.aoColumns;\n\t\n\t\t// Column definitions with aTargets\n\t\tif ( aoColDefs )\n\t\t{\n\t\t\t/* Loop over the definitions array - loop in reverse so first instance has priority */\n\t\t\tfor ( i=aoColDefs.length-1 ; i>=0 ; i-- )\n\t\t\t{\n\t\t\t\tdef = aoColDefs[i];\n\t\n\t\t\t\t/* Each definition can target multiple columns, as it is an array */\n\t\t\t\tvar aTargets = def.targets !== undefined ?\n\t\t\t\t\tdef.targets :\n\t\t\t\t\tdef.aTargets;\n\t\n\t\t\t\tif ( ! $.isArray( aTargets ) )\n\t\t\t\t{\n\t\t\t\t\taTargets = [ aTargets ];\n\t\t\t\t}\n\t\n\t\t\t\tfor ( j=0, jLen=aTargets.length ; j<jLen ; j++ )\n\t\t\t\t{\n\t\t\t\t\tif ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Add columns that we don't yet know about */\n\t\t\t\t\t\twhile( columns.length <= aTargets[j] )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_fnAddColumn( oSettings );\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t/* Integer, basic index */\n\t\t\t\t\t\tfn( aTargets[j], def );\n\t\t\t\t\t}\n\t\t\t\t\telse if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Negative integer, right to left column counting */\n\t\t\t\t\t\tfn( columns.length+aTargets[j], def );\n\t\t\t\t\t}\n\t\t\t\t\telse if ( typeof aTargets[j] === 'string' )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Class name matching on TH element */\n\t\t\t\t\t\tfor ( k=0, kLen=columns.length ; k<kLen ; k++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ( aTargets[j] == \"_all\" ||\n\t\t\t\t\t\t\t     $(columns[k].nTh).hasClass( aTargets[j] ) )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfn( k, def );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\t// Statically defined columns array\n\t\tif ( aoCols )\n\t\t{\n\t\t\tfor ( i=0, iLen=aoCols.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tfn( i, aoCols[i] );\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/**\n\t * Add a data array to the table, creating DOM node etc. This is the parallel to\n\t * _fnGatherData, but for adding rows from a Javascript source, rather than a\n\t * DOM source.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {array} aData data array to be added\n\t *  @param {node} [nTr] TR element to add to the table - optional. If not given,\n\t *    DataTables will create a row automatically\n\t *  @param {array} [anTds] Array of TD|TH elements for the row - must be given\n\t *    if nTr is.\n\t *  @returns {int} >=0 if successful (index of new aoData entry), -1 if failed\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAddData ( oSettings, aDataIn, nTr, anTds )\n\t{\n\t\t/* Create the object for storing information about this new row */\n\t\tvar iRow = oSettings.aoData.length;\n\t\tvar oData = $.extend( true, {}, DataTable.models.oRow, {\n\t\t\tsrc: nTr ? 'dom' : 'data',\n\t\t\tidx: iRow\n\t\t} );\n\t\n\t\toData._aData = aDataIn;\n\t\toSettings.aoData.push( oData );\n\t\n\t\t/* Create the cells */\n\t\tvar nTd, sThisType;\n\t\tvar columns = oSettings.aoColumns;\n\t\n\t\t// Invalidate the column types as the new data needs to be revalidated\n\t\tfor ( var i=0, iLen=columns.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tcolumns[i].sType = null;\n\t\t}\n\t\n\t\t/* Add to the display array */\n\t\toSettings.aiDisplayMaster.push( iRow );\n\t\n\t\tvar id = oSettings.rowIdFn( aDataIn );\n\t\tif ( id !== undefined ) {\n\t\t\toSettings.aIds[ id ] = oData;\n\t\t}\n\t\n\t\t/* Create the DOM information, or register it if already present */\n\t\tif ( nTr || ! oSettings.oFeatures.bDeferRender )\n\t\t{\n\t\t\t_fnCreateTr( oSettings, iRow, nTr, anTds );\n\t\t}\n\t\n\t\treturn iRow;\n\t}\n\t\n\t\n\t/**\n\t * Add one or more TR elements to the table. Generally we'd expect to\n\t * use this for reading data from a DOM sourced table, but it could be\n\t * used for an TR element. Note that if a TR is given, it is used (i.e.\n\t * it is not cloned).\n\t *  @param {object} settings dataTables settings object\n\t *  @param {array|node|jQuery} trs The TR element(s) to add to the table\n\t *  @returns {array} Array of indexes for the added rows\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAddTr( settings, trs )\n\t{\n\t\tvar row;\n\t\n\t\t// Allow an individual node to be passed in\n\t\tif ( ! (trs instanceof $) ) {\n\t\t\ttrs = $(trs);\n\t\t}\n\t\n\t\treturn trs.map( function (i, el) {\n\t\t\trow = _fnGetRowElements( settings, el );\n\t\t\treturn _fnAddData( settings, row.data, el, row.cells );\n\t\t} );\n\t}\n\t\n\t\n\t/**\n\t * Take a TR element and convert it to an index in aoData\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {node} n the TR element to find\n\t *  @returns {int} index if the node is found, null if not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnNodeToDataIndex( oSettings, n )\n\t{\n\t\treturn (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null;\n\t}\n\t\n\t\n\t/**\n\t * Take a TD element and convert it into a column data index (not the visible index)\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {int} iRow The row number the TD/TH can be found in\n\t *  @param {node} n The TD/TH element to find\n\t *  @returns {int} index if the node is found, -1 if not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnNodeToColumnIndex( oSettings, iRow, n )\n\t{\n\t\treturn $.inArray( n, oSettings.aoData[ iRow ].anCells );\n\t}\n\t\n\t\n\t/**\n\t * Get the data for a given cell from the internal cache, taking into account data mapping\n\t *  @param {object} settings dataTables settings object\n\t *  @param {int} rowIdx aoData row id\n\t *  @param {int} colIdx Column index\n\t *  @param {string} type data get type ('display', 'type' 'filter' 'sort')\n\t *  @returns {*} Cell data\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetCellData( settings, rowIdx, colIdx, type )\n\t{\n\t\tvar draw           = settings.iDraw;\n\t\tvar col            = settings.aoColumns[colIdx];\n\t\tvar rowData        = settings.aoData[rowIdx]._aData;\n\t\tvar defaultContent = col.sDefaultContent;\n\t\tvar cellData       = col.fnGetData( rowData, type, {\n\t\t\tsettings: settings,\n\t\t\trow:      rowIdx,\n\t\t\tcol:      colIdx\n\t\t} );\n\t\n\t\tif ( cellData === undefined ) {\n\t\t\tif ( settings.iDrawError != draw && defaultContent === null ) {\n\t\t\t\t_fnLog( settings, 0, \"Requested unknown parameter \"+\n\t\t\t\t\t(typeof col.mData=='function' ? '{function}' : \"'\"+col.mData+\"'\")+\n\t\t\t\t\t\" for row \"+rowIdx+\", column \"+colIdx, 4 );\n\t\t\t\tsettings.iDrawError = draw;\n\t\t\t}\n\t\t\treturn defaultContent;\n\t\t}\n\t\n\t\t// When the data source is null and a specific data type is requested (i.e.\n\t\t// not the original data), we can use default column data\n\t\tif ( (cellData === rowData || cellData === null) && defaultContent !== null && type !== undefined ) {\n\t\t\tcellData = defaultContent;\n\t\t}\n\t\telse if ( typeof cellData === 'function' ) {\n\t\t\t// If the data source is a function, then we run it and use the return,\n\t\t\t// executing in the scope of the data object (for instances)\n\t\t\treturn cellData.call( rowData );\n\t\t}\n\t\n\t\tif ( cellData === null && type == 'display' ) {\n\t\t\treturn '';\n\t\t}\n\t\treturn cellData;\n\t}\n\t\n\t\n\t/**\n\t * Set the value for a specific cell, into the internal data cache\n\t *  @param {object} settings dataTables settings object\n\t *  @param {int} rowIdx aoData row id\n\t *  @param {int} colIdx Column index\n\t *  @param {*} val Value to set\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSetCellData( settings, rowIdx, colIdx, val )\n\t{\n\t\tvar col     = settings.aoColumns[colIdx];\n\t\tvar rowData = settings.aoData[rowIdx]._aData;\n\t\n\t\tcol.fnSetData( rowData, val, {\n\t\t\tsettings: settings,\n\t\t\trow:      rowIdx,\n\t\t\tcol:      colIdx\n\t\t}  );\n\t}\n\t\n\t\n\t// Private variable that is used to match action syntax in the data property object\n\tvar __reArray = /\\[.*?\\]$/;\n\tvar __reFn = /\\(\\)$/;\n\t\n\t/**\n\t * Split string on periods, taking into account escaped periods\n\t * @param  {string} str String to split\n\t * @return {array} Split string\n\t */\n\tfunction _fnSplitObjNotation( str )\n\t{\n\t\treturn $.map( str.match(/(\\\\.|[^\\.])+/g) || [''], function ( s ) {\n\t\t\treturn s.replace(/\\\\\\./g, '.');\n\t\t} );\n\t}\n\t\n\t\n\t/**\n\t * Return a function that can be used to get data from a source object, taking\n\t * into account the ability to use nested objects as a source\n\t *  @param {string|int|function} mSource The data source for the object\n\t *  @returns {function} Data get function\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetObjectDataFn( mSource )\n\t{\n\t\tif ( $.isPlainObject( mSource ) )\n\t\t{\n\t\t\t/* Build an object of get functions, and wrap them in a single call */\n\t\t\tvar o = {};\n\t\t\t$.each( mSource, function (key, val) {\n\t\t\t\tif ( val ) {\n\t\t\t\t\to[key] = _fnGetObjectDataFn( val );\n\t\t\t\t}\n\t\t\t} );\n\t\n\t\t\treturn function (data, type, row, meta) {\n\t\t\t\tvar t = o[type] || o._;\n\t\t\t\treturn t !== undefined ?\n\t\t\t\t\tt(data, type, row, meta) :\n\t\t\t\t\tdata;\n\t\t\t};\n\t\t}\n\t\telse if ( mSource === null )\n\t\t{\n\t\t\t/* Give an empty string for rendering / sorting etc */\n\t\t\treturn function (data) { // type, row and meta also passed, but not used\n\t\t\t\treturn data;\n\t\t\t};\n\t\t}\n\t\telse if ( typeof mSource === 'function' )\n\t\t{\n\t\t\treturn function (data, type, row, meta) {\n\t\t\t\treturn mSource( data, type, row, meta );\n\t\t\t};\n\t\t}\n\t\telse if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||\n\t\t\t      mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) )\n\t\t{\n\t\t\t/* If there is a . in the source string then the data source is in a\n\t\t\t * nested object so we loop over the data for each level to get the next\n\t\t\t * level down. On each loop we test for undefined, and if found immediately\n\t\t\t * return. This allows entire objects to be missing and sDefaultContent to\n\t\t\t * be used if defined, rather than throwing an error\n\t\t\t */\n\t\t\tvar fetchData = function (data, type, src) {\n\t\t\t\tvar arrayNotation, funcNotation, out, innerSrc;\n\t\n\t\t\t\tif ( src !== \"\" )\n\t\t\t\t{\n\t\t\t\t\tvar a = _fnSplitObjNotation( src );\n\t\n\t\t\t\t\tfor ( var i=0, iLen=a.length ; i<iLen ; i++ )\n\t\t\t\t\t{\n\t\t\t\t\t\t// Check if we are dealing with special notation\n\t\t\t\t\t\tarrayNotation = a[i].match(__reArray);\n\t\t\t\t\t\tfuncNotation = a[i].match(__reFn);\n\t\n\t\t\t\t\t\tif ( arrayNotation )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Array notation\n\t\t\t\t\t\t\ta[i] = a[i].replace(__reArray, '');\n\t\n\t\t\t\t\t\t\t// Condition allows simply [] to be passed in\n\t\t\t\t\t\t\tif ( a[i] !== \"\" ) {\n\t\t\t\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tout = [];\n\t\n\t\t\t\t\t\t\t// Get the remainder of the nested object to get\n\t\t\t\t\t\t\ta.splice( 0, i+1 );\n\t\t\t\t\t\t\tinnerSrc = a.join('.');\n\t\n\t\t\t\t\t\t\t// Traverse each entry in the array getting the properties requested\n\t\t\t\t\t\t\tif ( $.isArray( data ) ) {\n\t\t\t\t\t\t\t\tfor ( var j=0, jLen=data.length ; j<jLen ; j++ ) {\n\t\t\t\t\t\t\t\t\tout.push( fetchData( data[j], type, innerSrc ) );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t\t// If a string is given in between the array notation indicators, that\n\t\t\t\t\t\t\t// is used to join the strings together, otherwise an array is returned\n\t\t\t\t\t\t\tvar join = arrayNotation[0].substring(1, arrayNotation[0].length-1);\n\t\t\t\t\t\t\tdata = (join===\"\") ? out : out.join(join);\n\t\n\t\t\t\t\t\t\t// The inner call to fetchData has already traversed through the remainder\n\t\t\t\t\t\t\t// of the source requested, so we exit from the loop\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( funcNotation )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Function call\n\t\t\t\t\t\t\ta[i] = a[i].replace(__reFn, '');\n\t\t\t\t\t\t\tdata = data[ a[i] ]();\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif ( data === null || data[ a[i] ] === undefined )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\treturn data;\n\t\t\t};\n\t\n\t\t\treturn function (data, type) { // row and meta also passed, but not used\n\t\t\t\treturn fetchData( data, type, mSource );\n\t\t\t};\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* Array or flat object mapping */\n\t\t\treturn function (data, type) { // row and meta also passed, but not used\n\t\t\t\treturn data[mSource];\n\t\t\t};\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Return a function that can be used to set data from a source object, taking\n\t * into account the ability to use nested objects as a source\n\t *  @param {string|int|function} mSource The data source for the object\n\t *  @returns {function} Data set function\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSetObjectDataFn( mSource )\n\t{\n\t\tif ( $.isPlainObject( mSource ) )\n\t\t{\n\t\t\t/* Unlike get, only the underscore (global) option is used for for\n\t\t\t * setting data since we don't know the type here. This is why an object\n\t\t\t * option is not documented for `mData` (which is read/write), but it is\n\t\t\t * for `mRender` which is read only.\n\t\t\t */\n\t\t\treturn _fnSetObjectDataFn( mSource._ );\n\t\t}\n\t\telse if ( mSource === null )\n\t\t{\n\t\t\t/* Nothing to do when the data source is null */\n\t\t\treturn function () {};\n\t\t}\n\t\telse if ( typeof mSource === 'function' )\n\t\t{\n\t\t\treturn function (data, val, meta) {\n\t\t\t\tmSource( data, 'set', val, meta );\n\t\t\t};\n\t\t}\n\t\telse if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||\n\t\t\t      mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) )\n\t\t{\n\t\t\t/* Like the get, we need to get data from a nested object */\n\t\t\tvar setData = function (data, val, src) {\n\t\t\t\tvar a = _fnSplitObjNotation( src ), b;\n\t\t\t\tvar aLast = a[a.length-1];\n\t\t\t\tvar arrayNotation, funcNotation, o, innerSrc;\n\t\n\t\t\t\tfor ( var i=0, iLen=a.length-1 ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\t// Check if we are dealing with an array notation request\n\t\t\t\t\tarrayNotation = a[i].match(__reArray);\n\t\t\t\t\tfuncNotation = a[i].match(__reFn);\n\t\n\t\t\t\t\tif ( arrayNotation )\n\t\t\t\t\t{\n\t\t\t\t\t\ta[i] = a[i].replace(__reArray, '');\n\t\t\t\t\t\tdata[ a[i] ] = [];\n\t\n\t\t\t\t\t\t// Get the remainder of the nested object to set so we can recurse\n\t\t\t\t\t\tb = a.slice();\n\t\t\t\t\t\tb.splice( 0, i+1 );\n\t\t\t\t\t\tinnerSrc = b.join('.');\n\t\n\t\t\t\t\t\t// Traverse each entry in the array setting the properties requested\n\t\t\t\t\t\tif ( $.isArray( val ) )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfor ( var j=0, jLen=val.length ; j<jLen ; j++ )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\to = {};\n\t\t\t\t\t\t\t\tsetData( o, val[j], innerSrc );\n\t\t\t\t\t\t\t\tdata[ a[i] ].push( o );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// We've been asked to save data to an array, but it\n\t\t\t\t\t\t\t// isn't array data to be saved. Best that can be done\n\t\t\t\t\t\t\t// is to just save the value.\n\t\t\t\t\t\t\tdata[ a[i] ] = val;\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// The inner call to setData has already traversed through the remainder\n\t\t\t\t\t\t// of the source and has set the data, thus we can exit here\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telse if ( funcNotation )\n\t\t\t\t\t{\n\t\t\t\t\t\t// Function call\n\t\t\t\t\t\ta[i] = a[i].replace(__reFn, '');\n\t\t\t\t\t\tdata = data[ a[i] ]( val );\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// If the nested object doesn't currently exist - since we are\n\t\t\t\t\t// trying to set the value - create it\n\t\t\t\t\tif ( data[ a[i] ] === null || data[ a[i] ] === undefined )\n\t\t\t\t\t{\n\t\t\t\t\t\tdata[ a[i] ] = {};\n\t\t\t\t\t}\n\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t}\n\t\n\t\t\t\t// Last item in the input - i.e, the actual set\n\t\t\t\tif ( aLast.match(__reFn ) )\n\t\t\t\t{\n\t\t\t\t\t// Function call\n\t\t\t\t\tdata = data[ aLast.replace(__reFn, '') ]( val );\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// If array notation is used, we just want to strip it and use the property name\n\t\t\t\t\t// and assign the value. If it isn't used, then we get the result we want anyway\n\t\t\t\t\tdata[ aLast.replace(__reArray, '') ] = val;\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t\treturn function (data, val) { // meta is also passed in, but not used\n\t\t\t\treturn setData( data, val, mSource );\n\t\t\t};\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* Array or flat object mapping */\n\t\t\treturn function (data, val) { // meta is also passed in, but not used\n\t\t\t\tdata[mSource] = val;\n\t\t\t};\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Return an array with the full table data\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns array {array} aData Master data array\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetDataMaster ( settings )\n\t{\n\t\treturn _pluck( settings.aoData, '_aData' );\n\t}\n\t\n\t\n\t/**\n\t * Nuke the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnClearTable( settings )\n\t{\n\t\tsettings.aoData.length = 0;\n\t\tsettings.aiDisplayMaster.length = 0;\n\t\tsettings.aiDisplay.length = 0;\n\t\tsettings.aIds = {};\n\t}\n\t\n\t\n\t /**\n\t * Take an array of integers (index array) and remove a target integer (value - not\n\t * the key!)\n\t *  @param {array} a Index array to target\n\t *  @param {int} iTarget value to find\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDeleteIndex( a, iTarget, splice )\n\t{\n\t\tvar iTargetIndex = -1;\n\t\n\t\tfor ( var i=0, iLen=a.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tif ( a[i] == iTarget )\n\t\t\t{\n\t\t\t\tiTargetIndex = i;\n\t\t\t}\n\t\t\telse if ( a[i] > iTarget )\n\t\t\t{\n\t\t\t\ta[i]--;\n\t\t\t}\n\t\t}\n\t\n\t\tif ( iTargetIndex != -1 && splice === undefined )\n\t\t{\n\t\t\ta.splice( iTargetIndex, 1 );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Mark cached data as invalid such that a re-read of the data will occur when\n\t * the cached data is next requested. Also update from the data source object.\n\t *\n\t * @param {object} settings DataTables settings object\n\t * @param {int}    rowIdx   Row index to invalidate\n\t * @param {string} [src]    Source to invalidate from: undefined, 'auto', 'dom'\n\t *     or 'data'\n\t * @param {int}    [colIdx] Column index to invalidate. If undefined the whole\n\t *     row will be invalidated\n\t * @memberof DataTable#oApi\n\t *\n\t * @todo For the modularisation of v1.11 this will need to become a callback, so\n\t *   the sort and filter methods can subscribe to it. That will required\n\t *   initialisation options for sorting, which is why it is not already baked in\n\t */\n\tfunction _fnInvalidate( settings, rowIdx, src, colIdx )\n\t{\n\t\tvar row = settings.aoData[ rowIdx ];\n\t\tvar i, ien;\n\t\tvar cellWrite = function ( cell, col ) {\n\t\t\t// This is very frustrating, but in IE if you just write directly\n\t\t\t// to innerHTML, and elements that are overwritten are GC'ed,\n\t\t\t// even if there is a reference to them elsewhere\n\t\t\twhile ( cell.childNodes.length ) {\n\t\t\t\tcell.removeChild( cell.firstChild );\n\t\t\t}\n\t\n\t\t\tcell.innerHTML = _fnGetCellData( settings, rowIdx, col, 'display' );\n\t\t};\n\t\n\t\t// Are we reading last data from DOM or the data object?\n\t\tif ( src === 'dom' || ((! src || src === 'auto') && row.src === 'dom') ) {\n\t\t\t// Read the data from the DOM\n\t\t\trow._aData = _fnGetRowElements(\n\t\t\t\t\tsettings, row, colIdx, colIdx === undefined ? undefined : row._aData\n\t\t\t\t)\n\t\t\t\t.data;\n\t\t}\n\t\telse {\n\t\t\t// Reading from data object, update the DOM\n\t\t\tvar cells = row.anCells;\n\t\n\t\t\tif ( cells ) {\n\t\t\t\tif ( colIdx !== undefined ) {\n\t\t\t\t\tcellWrite( cells[colIdx], colIdx );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfor ( i=0, ien=cells.length ; i<ien ; i++ ) {\n\t\t\t\t\t\tcellWrite( cells[i], i );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\t// For both row and cell invalidation, the cached data for sorting and\n\t\t// filtering is nulled out\n\t\trow._aSortData = null;\n\t\trow._aFilterData = null;\n\t\n\t\t// Invalidate the type for a specific column (if given) or all columns since\n\t\t// the data might have changed\n\t\tvar cols = settings.aoColumns;\n\t\tif ( colIdx !== undefined ) {\n\t\t\tcols[ colIdx ].sType = null;\n\t\t}\n\t\telse {\n\t\t\tfor ( i=0, ien=cols.length ; i<ien ; i++ ) {\n\t\t\t\tcols[i].sType = null;\n\t\t\t}\n\t\n\t\t\t// Update DataTables special `DT_*` attributes for the row\n\t\t\t_fnRowAttributes( settings, row );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Build a data source object from an HTML row, reading the contents of the\n\t * cells that are in the row.\n\t *\n\t * @param {object} settings DataTables settings object\n\t * @param {node|object} TR element from which to read data or existing row\n\t *   object from which to re-read the data from the cells\n\t * @param {int} [colIdx] Optional column index\n\t * @param {array|object} [d] Data source object. If `colIdx` is given then this\n\t *   parameter should also be given and will be used to write the data into.\n\t *   Only the column in question will be written\n\t * @returns {object} Object with two parameters: `data` the data read, in\n\t *   document order, and `cells` and array of nodes (they can be useful to the\n\t *   caller, so rather than needing a second traversal to get them, just return\n\t *   them from here).\n\t * @memberof DataTable#oApi\n\t */\n\tfunction _fnGetRowElements( settings, row, colIdx, d )\n\t{\n\t\tvar\n\t\t\ttds = [],\n\t\t\ttd = row.firstChild,\n\t\t\tname, col, o, i=0, contents,\n\t\t\tcolumns = settings.aoColumns,\n\t\t\tobjectRead = settings._rowReadObject;\n\t\n\t\t// Allow the data object to be passed in, or construct\n\t\td = d !== undefined ?\n\t\t\td :\n\t\t\tobjectRead ?\n\t\t\t\t{} :\n\t\t\t\t[];\n\t\n\t\tvar attr = function ( str, td  ) {\n\t\t\tif ( typeof str === 'string' ) {\n\t\t\t\tvar idx = str.indexOf('@');\n\t\n\t\t\t\tif ( idx !== -1 ) {\n\t\t\t\t\tvar attr = str.substring( idx+1 );\n\t\t\t\t\tvar setter = _fnSetObjectDataFn( str );\n\t\t\t\t\tsetter( d, td.getAttribute( attr ) );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\n\t\t// Read data from a cell and store into the data object\n\t\tvar cellProcess = function ( cell ) {\n\t\t\tif ( colIdx === undefined || colIdx === i ) {\n\t\t\t\tcol = columns[i];\n\t\t\t\tcontents = $.trim(cell.innerHTML);\n\t\n\t\t\t\tif ( col && col._bAttrSrc ) {\n\t\t\t\t\tvar setter = _fnSetObjectDataFn( col.mData._ );\n\t\t\t\t\tsetter( d, contents );\n\t\n\t\t\t\t\tattr( col.mData.sort, cell );\n\t\t\t\t\tattr( col.mData.type, cell );\n\t\t\t\t\tattr( col.mData.filter, cell );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Depending on the `data` option for the columns the data can\n\t\t\t\t\t// be read to either an object or an array.\n\t\t\t\t\tif ( objectRead ) {\n\t\t\t\t\t\tif ( ! col._setter ) {\n\t\t\t\t\t\t\t// Cache the setter function\n\t\t\t\t\t\t\tcol._setter = _fnSetObjectDataFn( col.mData );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcol._setter( d, contents );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\td[i] = contents;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\ti++;\n\t\t};\n\t\n\t\tif ( td ) {\n\t\t\t// `tr` element was passed in\n\t\t\twhile ( td ) {\n\t\t\t\tname = td.nodeName.toUpperCase();\n\t\n\t\t\t\tif ( name == \"TD\" || name == \"TH\" ) {\n\t\t\t\t\tcellProcess( td );\n\t\t\t\t\ttds.push( td );\n\t\t\t\t}\n\t\n\t\t\t\ttd = td.nextSibling;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// Existing row object passed in\n\t\t\ttds = row.anCells;\n\t\n\t\t\tfor ( var j=0, jen=tds.length ; j<jen ; j++ ) {\n\t\t\t\tcellProcess( tds[j] );\n\t\t\t}\n\t\t}\n\t\n\t\t// Read the ID from the DOM if present\n\t\tvar rowNode = row.firstChild ? row : row.nTr;\n\t\n\t\tif ( rowNode ) {\n\t\t\tvar id = rowNode.getAttribute( 'id' );\n\t\n\t\t\tif ( id ) {\n\t\t\t\t_fnSetObjectDataFn( settings.rowId )( d, id );\n\t\t\t}\n\t\t}\n\t\n\t\treturn {\n\t\t\tdata: d,\n\t\t\tcells: tds\n\t\t};\n\t}\n\t/**\n\t * Create a new TR element (and it's TD children) for a row\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {int} iRow Row to consider\n\t *  @param {node} [nTrIn] TR element to add to the table - optional. If not given,\n\t *    DataTables will create a row automatically\n\t *  @param {array} [anTds] Array of TD|TH elements for the row - must be given\n\t *    if nTr is.\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCreateTr ( oSettings, iRow, nTrIn, anTds )\n\t{\n\t\tvar\n\t\t\trow = oSettings.aoData[iRow],\n\t\t\trowData = row._aData,\n\t\t\tcells = [],\n\t\t\tnTr, nTd, oCol,\n\t\t\ti, iLen;\n\t\n\t\tif ( row.nTr === null )\n\t\t{\n\t\t\tnTr = nTrIn || document.createElement('tr');\n\t\n\t\t\trow.nTr = nTr;\n\t\t\trow.anCells = cells;\n\t\n\t\t\t/* Use a private property on the node to allow reserve mapping from the node\n\t\t\t * to the aoData array for fast look up\n\t\t\t */\n\t\t\tnTr._DT_RowIndex = iRow;\n\t\n\t\t\t/* Special parameters can be given by the data source to be used on the row */\n\t\t\t_fnRowAttributes( oSettings, row );\n\t\n\t\t\t/* Process each column */\n\t\t\tfor ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\toCol = oSettings.aoColumns[i];\n\t\n\t\t\t\tnTd = nTrIn ? anTds[i] : document.createElement( oCol.sCellType );\n\t\t\t\tnTd._DT_CellIndex = {\n\t\t\t\t\trow: iRow,\n\t\t\t\t\tcolumn: i\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tcells.push( nTd );\n\t\n\t\t\t\t// Need to create the HTML if new, or if a rendering function is defined\n\t\t\t\tif ( (!nTrIn || oCol.mRender || oCol.mData !== i) &&\n\t\t\t\t\t (!$.isPlainObject(oCol.mData) || oCol.mData._ !== i+'.display')\n\t\t\t\t) {\n\t\t\t\t\tnTd.innerHTML = _fnGetCellData( oSettings, iRow, i, 'display' );\n\t\t\t\t}\n\t\n\t\t\t\t/* Add user defined class */\n\t\t\t\tif ( oCol.sClass )\n\t\t\t\t{\n\t\t\t\t\tnTd.className += ' '+oCol.sClass;\n\t\t\t\t}\n\t\n\t\t\t\t// Visibility - add or remove as required\n\t\t\t\tif ( oCol.bVisible && ! nTrIn )\n\t\t\t\t{\n\t\t\t\t\tnTr.appendChild( nTd );\n\t\t\t\t}\n\t\t\t\telse if ( ! oCol.bVisible && nTrIn )\n\t\t\t\t{\n\t\t\t\t\tnTd.parentNode.removeChild( nTd );\n\t\t\t\t}\n\t\n\t\t\t\tif ( oCol.fnCreatedCell )\n\t\t\t\t{\n\t\t\t\t\toCol.fnCreatedCell.call( oSettings.oInstance,\n\t\t\t\t\t\tnTd, _fnGetCellData( oSettings, iRow, i ), rowData, iRow, i\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow] );\n\t\t}\n\t\n\t\t// Remove once webkit bug 131819 and Chromium bug 365619 have been resolved\n\t\t// and deployed\n\t\trow.nTr.setAttribute( 'role', 'row' );\n\t}\n\t\n\t\n\t/**\n\t * Add attributes to a row based on the special `DT_*` parameters in a data\n\t * source object.\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} DataTables row object for the row to be modified\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnRowAttributes( settings, row )\n\t{\n\t\tvar tr = row.nTr;\n\t\tvar data = row._aData;\n\t\n\t\tif ( tr ) {\n\t\t\tvar id = settings.rowIdFn( data );\n\t\n\t\t\tif ( id ) {\n\t\t\t\ttr.id = id;\n\t\t\t}\n\t\n\t\t\tif ( data.DT_RowClass ) {\n\t\t\t\t// Remove any classes added by DT_RowClass before\n\t\t\t\tvar a = data.DT_RowClass.split(' ');\n\t\t\t\trow.__rowc = row.__rowc ?\n\t\t\t\t\t_unique( row.__rowc.concat( a ) ) :\n\t\t\t\t\ta;\n\t\n\t\t\t\t$(tr)\n\t\t\t\t\t.removeClass( row.__rowc.join(' ') )\n\t\t\t\t\t.addClass( data.DT_RowClass );\n\t\t\t}\n\t\n\t\t\tif ( data.DT_RowAttr ) {\n\t\t\t\t$(tr).attr( data.DT_RowAttr );\n\t\t\t}\n\t\n\t\t\tif ( data.DT_RowData ) {\n\t\t\t\t$(tr).data( data.DT_RowData );\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Create the HTML header for the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnBuildHead( oSettings )\n\t{\n\t\tvar i, ien, cell, row, column;\n\t\tvar thead = oSettings.nTHead;\n\t\tvar tfoot = oSettings.nTFoot;\n\t\tvar createHeader = $('th, td', thead).length === 0;\n\t\tvar classes = oSettings.oClasses;\n\t\tvar columns = oSettings.aoColumns;\n\t\n\t\tif ( createHeader ) {\n\t\t\trow = $('<tr/>').appendTo( thead );\n\t\t}\n\t\n\t\tfor ( i=0, ien=columns.length ; i<ien ; i++ ) {\n\t\t\tcolumn = columns[i];\n\t\t\tcell = $( column.nTh ).addClass( column.sClass );\n\t\n\t\t\tif ( createHeader ) {\n\t\t\t\tcell.appendTo( row );\n\t\t\t}\n\t\n\t\t\t// 1.11 move into sorting\n\t\t\tif ( oSettings.oFeatures.bSort ) {\n\t\t\t\tcell.addClass( column.sSortingClass );\n\t\n\t\t\t\tif ( column.bSortable !== false ) {\n\t\t\t\t\tcell\n\t\t\t\t\t\t.attr( 'tabindex', oSettings.iTabIndex )\n\t\t\t\t\t\t.attr( 'aria-controls', oSettings.sTableId );\n\t\n\t\t\t\t\t_fnSortAttachListener( oSettings, column.nTh, i );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tif ( column.sTitle != cell[0].innerHTML ) {\n\t\t\t\tcell.html( column.sTitle );\n\t\t\t}\n\t\n\t\t\t_fnRenderer( oSettings, 'header' )(\n\t\t\t\toSettings, cell, column, classes\n\t\t\t);\n\t\t}\n\t\n\t\tif ( createHeader ) {\n\t\t\t_fnDetectHeader( oSettings.aoHeader, thead );\n\t\t}\n\t\t\n\t\t/* ARIA role for the rows */\n\t \t$(thead).find('>tr').attr('role', 'row');\n\t\n\t\t/* Deal with the footer - add classes if required */\n\t\t$(thead).find('>tr>th, >tr>td').addClass( classes.sHeaderTH );\n\t\t$(tfoot).find('>tr>th, >tr>td').addClass( classes.sFooterTH );\n\t\n\t\t// Cache the footer cells. Note that we only take the cells from the first\n\t\t// row in the footer. If there is more than one row the user wants to\n\t\t// interact with, they need to use the table().foot() method. Note also this\n\t\t// allows cells to be used for multiple columns using colspan\n\t\tif ( tfoot !== null ) {\n\t\t\tvar cells = oSettings.aoFooter[0];\n\t\n\t\t\tfor ( i=0, ien=cells.length ; i<ien ; i++ ) {\n\t\t\t\tcolumn = columns[i];\n\t\t\t\tcolumn.nTf = cells[i].cell;\n\t\n\t\t\t\tif ( column.sClass ) {\n\t\t\t\t\t$(column.nTf).addClass( column.sClass );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Draw the header (or footer) element based on the column visibility states. The\n\t * methodology here is to use the layout array from _fnDetectHeader, modified for\n\t * the instantaneous column visibility, to construct the new layout. The grid is\n\t * traversed over cell at a time in a rows x columns grid fashion, although each\n\t * cell insert can cover multiple elements in the grid - which is tracks using the\n\t * aApplied array. Cell inserts in the grid will only occur where there isn't\n\t * already a cell in that position.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param array {objects} aoSource Layout array from _fnDetectHeader\n\t *  @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc,\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDrawHead( oSettings, aoSource, bIncludeHidden )\n\t{\n\t\tvar i, iLen, j, jLen, k, kLen, n, nLocalTr;\n\t\tvar aoLocal = [];\n\t\tvar aApplied = [];\n\t\tvar iColumns = oSettings.aoColumns.length;\n\t\tvar iRowspan, iColspan;\n\t\n\t\tif ( ! aoSource )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\n\t\tif (  bIncludeHidden === undefined )\n\t\t{\n\t\t\tbIncludeHidden = false;\n\t\t}\n\t\n\t\t/* Make a copy of the master layout array, but without the visible columns in it */\n\t\tfor ( i=0, iLen=aoSource.length ; i<iLen ; i++ )\n\t\t{\n\t\t\taoLocal[i] = aoSource[i].slice();\n\t\t\taoLocal[i].nTr = aoSource[i].nTr;\n\t\n\t\t\t/* Remove any columns which are currently hidden */\n\t\t\tfor ( j=iColumns-1 ; j>=0 ; j-- )\n\t\t\t{\n\t\t\t\tif ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )\n\t\t\t\t{\n\t\t\t\t\taoLocal[i].splice( j, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t/* Prep the applied array - it needs an element for each row */\n\t\t\taApplied.push( [] );\n\t\t}\n\t\n\t\tfor ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tnLocalTr = aoLocal[i].nTr;\n\t\n\t\t\t/* All cells are going to be replaced, so empty out the row */\n\t\t\tif ( nLocalTr )\n\t\t\t{\n\t\t\t\twhile( (n = nLocalTr.firstChild) )\n\t\t\t\t{\n\t\t\t\t\tnLocalTr.removeChild( n );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tfor ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )\n\t\t\t{\n\t\t\t\tiRowspan = 1;\n\t\t\t\tiColspan = 1;\n\t\n\t\t\t\t/* Check to see if there is already a cell (row/colspan) covering our target\n\t\t\t\t * insert point. If there is, then there is nothing to do.\n\t\t\t\t */\n\t\t\t\tif ( aApplied[i][j] === undefined )\n\t\t\t\t{\n\t\t\t\t\tnLocalTr.appendChild( aoLocal[i][j].cell );\n\t\t\t\t\taApplied[i][j] = 1;\n\t\n\t\t\t\t\t/* Expand the cell to cover as many rows as needed */\n\t\t\t\t\twhile ( aoLocal[i+iRowspan] !== undefined &&\n\t\t\t\t\t        aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )\n\t\t\t\t\t{\n\t\t\t\t\t\taApplied[i+iRowspan][j] = 1;\n\t\t\t\t\t\tiRowspan++;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t/* Expand the cell to cover as many columns as needed */\n\t\t\t\t\twhile ( aoLocal[i][j+iColspan] !== undefined &&\n\t\t\t\t\t        aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Must update the applied array over the rows for the columns */\n\t\t\t\t\t\tfor ( k=0 ; k<iRowspan ; k++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\taApplied[i+k][j+iColspan] = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tiColspan++;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t/* Do the actual expansion in the DOM */\n\t\t\t\t\t$(aoLocal[i][j].cell)\n\t\t\t\t\t\t.attr('rowspan', iRowspan)\n\t\t\t\t\t\t.attr('colspan', iColspan);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Insert the required TR nodes into the table for display\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDraw( oSettings )\n\t{\n\t\t/* Provide a pre-callback function which can be used to cancel the draw is false is returned */\n\t\tvar aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );\n\t\tif ( $.inArray( false, aPreDraw ) !== -1 )\n\t\t{\n\t\t\t_fnProcessingDisplay( oSettings, false );\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar i, iLen, n;\n\t\tvar anRows = [];\n\t\tvar iRowCount = 0;\n\t\tvar asStripeClasses = oSettings.asStripeClasses;\n\t\tvar iStripes = asStripeClasses.length;\n\t\tvar iOpenRows = oSettings.aoOpenRows.length;\n\t\tvar oLang = oSettings.oLanguage;\n\t\tvar iInitDisplayStart = oSettings.iInitDisplayStart;\n\t\tvar bServerSide = _fnDataSource( oSettings ) == 'ssp';\n\t\tvar aiDisplay = oSettings.aiDisplay;\n\t\n\t\toSettings.bDrawing = true;\n\t\n\t\t/* Check and see if we have an initial draw position from state saving */\n\t\tif ( iInitDisplayStart !== undefined && iInitDisplayStart !== -1 )\n\t\t{\n\t\t\toSettings._iDisplayStart = bServerSide ?\n\t\t\t\tiInitDisplayStart :\n\t\t\t\tiInitDisplayStart >= oSettings.fnRecordsDisplay() ?\n\t\t\t\t\t0 :\n\t\t\t\t\tiInitDisplayStart;\n\t\n\t\t\toSettings.iInitDisplayStart = -1;\n\t\t}\n\t\n\t\tvar iDisplayStart = oSettings._iDisplayStart;\n\t\tvar iDisplayEnd = oSettings.fnDisplayEnd();\n\t\n\t\t/* Server-side processing draw intercept */\n\t\tif ( oSettings.bDeferLoading )\n\t\t{\n\t\t\toSettings.bDeferLoading = false;\n\t\t\toSettings.iDraw++;\n\t\t\t_fnProcessingDisplay( oSettings, false );\n\t\t}\n\t\telse if ( !bServerSide )\n\t\t{\n\t\t\toSettings.iDraw++;\n\t\t}\n\t\telse if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\n\t\tif ( aiDisplay.length !== 0 )\n\t\t{\n\t\t\tvar iStart = bServerSide ? 0 : iDisplayStart;\n\t\t\tvar iEnd = bServerSide ? oSettings.aoData.length : iDisplayEnd;\n\t\n\t\t\tfor ( var j=iStart ; j<iEnd ; j++ )\n\t\t\t{\n\t\t\t\tvar iDataIndex = aiDisplay[j];\n\t\t\t\tvar aoData = oSettings.aoData[ iDataIndex ];\n\t\t\t\tif ( aoData.nTr === null )\n\t\t\t\t{\n\t\t\t\t\t_fnCreateTr( oSettings, iDataIndex );\n\t\t\t\t}\n\t\n\t\t\t\tvar nRow = aoData.nTr;\n\t\n\t\t\t\t/* Remove the old striping classes and then add the new one */\n\t\t\t\tif ( iStripes !== 0 )\n\t\t\t\t{\n\t\t\t\t\tvar sStripe = asStripeClasses[ iRowCount % iStripes ];\n\t\t\t\t\tif ( aoData._sRowStripe != sStripe )\n\t\t\t\t\t{\n\t\t\t\t\t\t$(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe );\n\t\t\t\t\t\taoData._sRowStripe = sStripe;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\t// Row callback functions - might want to manipulate the row\n\t\t\t\t// iRowCount and j are not currently documented. Are they at all\n\t\t\t\t// useful?\n\t\t\t\t_fnCallbackFire( oSettings, 'aoRowCallback', null,\n\t\t\t\t\t[nRow, aoData._aData, iRowCount, j] );\n\t\n\t\t\t\tanRows.push( nRow );\n\t\t\t\tiRowCount++;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* Table is empty - create a row with an empty message in it */\n\t\t\tvar sZero = oLang.sZeroRecords;\n\t\t\tif ( oSettings.iDraw == 1 &&  _fnDataSource( oSettings ) == 'ajax' )\n\t\t\t{\n\t\t\t\tsZero = oLang.sLoadingRecords;\n\t\t\t}\n\t\t\telse if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )\n\t\t\t{\n\t\t\t\tsZero = oLang.sEmptyTable;\n\t\t\t}\n\t\n\t\t\tanRows[ 0 ] = $( '<tr/>', { 'class': iStripes ? asStripeClasses[0] : '' } )\n\t\t\t\t.append( $('<td />', {\n\t\t\t\t\t'valign':  'top',\n\t\t\t\t\t'colSpan': _fnVisbleColumns( oSettings ),\n\t\t\t\t\t'class':   oSettings.oClasses.sRowEmpty\n\t\t\t\t} ).html( sZero ) )[0];\n\t\t}\n\t\n\t\t/* Header and footer callbacks */\n\t\t_fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0],\n\t\t\t_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );\n\t\n\t\t_fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0],\n\t\t\t_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );\n\t\n\t\tvar body = $(oSettings.nTBody);\n\t\n\t\tbody.children().detach();\n\t\tbody.append( $(anRows) );\n\t\n\t\t/* Call all required callback functions for the end of a draw */\n\t\t_fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );\n\t\n\t\t/* Draw is complete, sorting and filtering must be as well */\n\t\toSettings.bSorted = false;\n\t\toSettings.bFiltered = false;\n\t\toSettings.bDrawing = false;\n\t}\n\t\n\t\n\t/**\n\t * Redraw the table - taking account of the various features which are enabled\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {boolean} [holdPosition] Keep the current paging position. By default\n\t *    the paging is reset to the first page\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnReDraw( settings, holdPosition )\n\t{\n\t\tvar\n\t\t\tfeatures = settings.oFeatures,\n\t\t\tsort     = features.bSort,\n\t\t\tfilter   = features.bFilter;\n\t\n\t\tif ( sort ) {\n\t\t\t_fnSort( settings );\n\t\t}\n\t\n\t\tif ( filter ) {\n\t\t\t_fnFilterComplete( settings, settings.oPreviousSearch );\n\t\t}\n\t\telse {\n\t\t\t// No filtering, so we want to just use the display master\n\t\t\tsettings.aiDisplay = settings.aiDisplayMaster.slice();\n\t\t}\n\t\n\t\tif ( holdPosition !== true ) {\n\t\t\tsettings._iDisplayStart = 0;\n\t\t}\n\t\n\t\t// Let any modules know about the draw hold position state (used by\n\t\t// scrolling internally)\n\t\tsettings._drawHold = holdPosition;\n\t\n\t\t_fnDraw( settings );\n\t\n\t\tsettings._drawHold = false;\n\t}\n\t\n\t\n\t/**\n\t * Add the options to the page HTML for the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAddOptionsHtml ( oSettings )\n\t{\n\t\tvar classes = oSettings.oClasses;\n\t\tvar table = $(oSettings.nTable);\n\t\tvar holding = $('<div/>').insertBefore( table ); // Holding element for speed\n\t\tvar features = oSettings.oFeatures;\n\t\n\t\t// All DataTables are wrapped in a div\n\t\tvar insert = $('<div/>', {\n\t\t\tid:      oSettings.sTableId+'_wrapper',\n\t\t\t'class': classes.sWrapper + (oSettings.nTFoot ? '' : ' '+classes.sNoFooter)\n\t\t} );\n\t\n\t\toSettings.nHolding = holding[0];\n\t\toSettings.nTableWrapper = insert[0];\n\t\toSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;\n\t\n\t\t/* Loop over the user set positioning and place the elements as needed */\n\t\tvar aDom = oSettings.sDom.split('');\n\t\tvar featureNode, cOption, nNewNode, cNext, sAttr, j;\n\t\tfor ( var i=0 ; i<aDom.length ; i++ )\n\t\t{\n\t\t\tfeatureNode = null;\n\t\t\tcOption = aDom[i];\n\t\n\t\t\tif ( cOption == '<' )\n\t\t\t{\n\t\t\t\t/* New container div */\n\t\t\t\tnNewNode = $('<div/>')[0];\n\t\n\t\t\t\t/* Check to see if we should append an id and/or a class name to the container */\n\t\t\t\tcNext = aDom[i+1];\n\t\t\t\tif ( cNext == \"'\" || cNext == '\"' )\n\t\t\t\t{\n\t\t\t\t\tsAttr = \"\";\n\t\t\t\t\tj = 2;\n\t\t\t\t\twhile ( aDom[i+j] != cNext )\n\t\t\t\t\t{\n\t\t\t\t\t\tsAttr += aDom[i+j];\n\t\t\t\t\t\tj++;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t/* Replace jQuery UI constants @todo depreciated */\n\t\t\t\t\tif ( sAttr == \"H\" )\n\t\t\t\t\t{\n\t\t\t\t\t\tsAttr = classes.sJUIHeader;\n\t\t\t\t\t}\n\t\t\t\t\telse if ( sAttr == \"F\" )\n\t\t\t\t\t{\n\t\t\t\t\t\tsAttr = classes.sJUIFooter;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t/* The attribute can be in the format of \"#id.class\", \"#id\" or \"class\" This logic\n\t\t\t\t\t * breaks the string into parts and applies them as needed\n\t\t\t\t\t */\n\t\t\t\t\tif ( sAttr.indexOf('.') != -1 )\n\t\t\t\t\t{\n\t\t\t\t\t\tvar aSplit = sAttr.split('.');\n\t\t\t\t\t\tnNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);\n\t\t\t\t\t\tnNewNode.className = aSplit[1];\n\t\t\t\t\t}\n\t\t\t\t\telse if ( sAttr.charAt(0) == \"#\" )\n\t\t\t\t\t{\n\t\t\t\t\t\tnNewNode.id = sAttr.substr(1, sAttr.length-1);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tnNewNode.className = sAttr;\n\t\t\t\t\t}\n\t\n\t\t\t\t\ti += j; /* Move along the position array */\n\t\t\t\t}\n\t\n\t\t\t\tinsert.append( nNewNode );\n\t\t\t\tinsert = $(nNewNode);\n\t\t\t}\n\t\t\telse if ( cOption == '>' )\n\t\t\t{\n\t\t\t\t/* End container div */\n\t\t\t\tinsert = insert.parent();\n\t\t\t}\n\t\t\t// @todo Move options into their own plugins?\n\t\t\telse if ( cOption == 'l' && features.bPaginate && features.bLengthChange )\n\t\t\t{\n\t\t\t\t/* Length */\n\t\t\t\tfeatureNode = _fnFeatureHtmlLength( oSettings );\n\t\t\t}\n\t\t\telse if ( cOption == 'f' && features.bFilter )\n\t\t\t{\n\t\t\t\t/* Filter */\n\t\t\t\tfeatureNode = _fnFeatureHtmlFilter( oSettings );\n\t\t\t}\n\t\t\telse if ( cOption == 'r' && features.bProcessing )\n\t\t\t{\n\t\t\t\t/* pRocessing */\n\t\t\t\tfeatureNode = _fnFeatureHtmlProcessing( oSettings );\n\t\t\t}\n\t\t\telse if ( cOption == 't' )\n\t\t\t{\n\t\t\t\t/* Table */\n\t\t\t\tfeatureNode = _fnFeatureHtmlTable( oSettings );\n\t\t\t}\n\t\t\telse if ( cOption ==  'i' && features.bInfo )\n\t\t\t{\n\t\t\t\t/* Info */\n\t\t\t\tfeatureNode = _fnFeatureHtmlInfo( oSettings );\n\t\t\t}\n\t\t\telse if ( cOption == 'p' && features.bPaginate )\n\t\t\t{\n\t\t\t\t/* Pagination */\n\t\t\t\tfeatureNode = _fnFeatureHtmlPaginate( oSettings );\n\t\t\t}\n\t\t\telse if ( DataTable.ext.feature.length !== 0 )\n\t\t\t{\n\t\t\t\t/* Plug-in features */\n\t\t\t\tvar aoFeatures = DataTable.ext.feature;\n\t\t\t\tfor ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )\n\t\t\t\t{\n\t\t\t\t\tif ( cOption == aoFeatures[k].cFeature )\n\t\t\t\t\t{\n\t\t\t\t\t\tfeatureNode = aoFeatures[k].fnInit( oSettings );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t/* Add to the 2D features array */\n\t\t\tif ( featureNode )\n\t\t\t{\n\t\t\t\tvar aanFeatures = oSettings.aanFeatures;\n\t\n\t\t\t\tif ( ! aanFeatures[cOption] )\n\t\t\t\t{\n\t\t\t\t\taanFeatures[cOption] = [];\n\t\t\t\t}\n\t\n\t\t\t\taanFeatures[cOption].push( featureNode );\n\t\t\t\tinsert.append( featureNode );\n\t\t\t}\n\t\t}\n\t\n\t\t/* Built our DOM structure - replace the holding div with what we want */\n\t\tholding.replaceWith( insert );\n\t\toSettings.nHolding = null;\n\t}\n\t\n\t\n\t/**\n\t * Use the DOM source to create up an array of header cells. The idea here is to\n\t * create a layout grid (array) of rows x columns, which contains a reference\n\t * to the cell that that point in the grid (regardless of col/rowspan), such that\n\t * any column / row could be removed and the new grid constructed\n\t *  @param array {object} aLayout Array to store the calculated layout in\n\t *  @param {node} nThead The header/footer element for the table\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDetectHeader ( aLayout, nThead )\n\t{\n\t\tvar nTrs = $(nThead).children('tr');\n\t\tvar nTr, nCell;\n\t\tvar i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;\n\t\tvar bUnique;\n\t\tvar fnShiftCol = function ( a, i, j ) {\n\t\t\tvar k = a[i];\n\t                while ( k[j] ) {\n\t\t\t\tj++;\n\t\t\t}\n\t\t\treturn j;\n\t\t};\n\t\n\t\taLayout.splice( 0, aLayout.length );\n\t\n\t\t/* We know how many rows there are in the layout - so prep it */\n\t\tfor ( i=0, iLen=nTrs.length ; i<iLen ; i++ )\n\t\t{\n\t\t\taLayout.push( [] );\n\t\t}\n\t\n\t\t/* Calculate a layout array */\n\t\tfor ( i=0, iLen=nTrs.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tnTr = nTrs[i];\n\t\t\tiColumn = 0;\n\t\n\t\t\t/* For every cell in the row... */\n\t\t\tnCell = nTr.firstChild;\n\t\t\twhile ( nCell ) {\n\t\t\t\tif ( nCell.nodeName.toUpperCase() == \"TD\" ||\n\t\t\t\t     nCell.nodeName.toUpperCase() == \"TH\" )\n\t\t\t\t{\n\t\t\t\t\t/* Get the col and rowspan attributes from the DOM and sanitise them */\n\t\t\t\t\tiColspan = nCell.getAttribute('colspan') * 1;\n\t\t\t\t\tiRowspan = nCell.getAttribute('rowspan') * 1;\n\t\t\t\t\tiColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;\n\t\t\t\t\tiRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;\n\t\n\t\t\t\t\t/* There might be colspan cells already in this row, so shift our target\n\t\t\t\t\t * accordingly\n\t\t\t\t\t */\n\t\t\t\t\tiColShifted = fnShiftCol( aLayout, i, iColumn );\n\t\n\t\t\t\t\t/* Cache calculation for unique columns */\n\t\t\t\t\tbUnique = iColspan === 1 ? true : false;\n\t\n\t\t\t\t\t/* If there is col / rowspan, copy the information into the layout grid */\n\t\t\t\t\tfor ( l=0 ; l<iColspan ; l++ )\n\t\t\t\t\t{\n\t\t\t\t\t\tfor ( k=0 ; k<iRowspan ; k++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\taLayout[i+k][iColShifted+l] = {\n\t\t\t\t\t\t\t\t\"cell\": nCell,\n\t\t\t\t\t\t\t\t\"unique\": bUnique\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\taLayout[i+k].nTr = nTr;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnCell = nCell.nextSibling;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Get an array of unique th elements, one for each column\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {node} nHeader automatically detect the layout from this node - optional\n\t *  @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional\n\t *  @returns array {node} aReturn list of unique th's\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetUniqueThs ( oSettings, nHeader, aLayout )\n\t{\n\t\tvar aReturn = [];\n\t\tif ( !aLayout )\n\t\t{\n\t\t\taLayout = oSettings.aoHeader;\n\t\t\tif ( nHeader )\n\t\t\t{\n\t\t\t\taLayout = [];\n\t\t\t\t_fnDetectHeader( aLayout, nHeader );\n\t\t\t}\n\t\t}\n\t\n\t\tfor ( var i=0, iLen=aLayout.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tfor ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ )\n\t\t\t{\n\t\t\t\tif ( aLayout[i][j].unique &&\n\t\t\t\t\t (!aReturn[j] || !oSettings.bSortCellsTop) )\n\t\t\t\t{\n\t\t\t\t\taReturn[j] = aLayout[i][j].cell;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\treturn aReturn;\n\t}\n\t\n\t/**\n\t * Create an Ajax call based on the table's settings, taking into account that\n\t * parameters can have multiple forms, and backwards compatibility.\n\t *\n\t * @param {object} oSettings dataTables settings object\n\t * @param {array} data Data to send to the server, required by\n\t *     DataTables - may be augmented by developer callbacks\n\t * @param {function} fn Callback function to run when data is obtained\n\t */\n\tfunction _fnBuildAjax( oSettings, data, fn )\n\t{\n\t\t// Compatibility with 1.9-, allow fnServerData and event to manipulate\n\t\t_fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [data] );\n\t\n\t\t// Convert to object based for 1.10+ if using the old array scheme which can\n\t\t// come from server-side processing or serverParams\n\t\tif ( data && $.isArray(data) ) {\n\t\t\tvar tmp = {};\n\t\t\tvar rbracket = /(.*?)\\[\\]$/;\n\t\n\t\t\t$.each( data, function (key, val) {\n\t\t\t\tvar match = val.name.match(rbracket);\n\t\n\t\t\t\tif ( match ) {\n\t\t\t\t\t// Support for arrays\n\t\t\t\t\tvar name = match[0];\n\t\n\t\t\t\t\tif ( ! tmp[ name ] ) {\n\t\t\t\t\t\ttmp[ name ] = [];\n\t\t\t\t\t}\n\t\t\t\t\ttmp[ name ].push( val.value );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttmp[val.name] = val.value;\n\t\t\t\t}\n\t\t\t} );\n\t\t\tdata = tmp;\n\t\t}\n\t\n\t\tvar ajaxData;\n\t\tvar ajax = oSettings.ajax;\n\t\tvar instance = oSettings.oInstance;\n\t\tvar callback = function ( json ) {\n\t\t\t_fnCallbackFire( oSettings, null, 'xhr', [oSettings, json, oSettings.jqXHR] );\n\t\t\tfn( json );\n\t\t};\n\t\n\t\tif ( $.isPlainObject( ajax ) && ajax.data )\n\t\t{\n\t\t\tajaxData = ajax.data;\n\t\n\t\t\tvar newData = $.isFunction( ajaxData ) ?\n\t\t\t\tajaxData( data, oSettings ) :  // fn can manipulate data or return\n\t\t\t\tajaxData;                      // an object object or array to merge\n\t\n\t\t\t// If the function returned something, use that alone\n\t\t\tdata = $.isFunction( ajaxData ) && newData ?\n\t\t\t\tnewData :\n\t\t\t\t$.extend( true, data, newData );\n\t\n\t\t\t// Remove the data property as we've resolved it already and don't want\n\t\t\t// jQuery to do it again (it is restored at the end of the function)\n\t\t\tdelete ajax.data;\n\t\t}\n\t\n\t\tvar baseAjax = {\n\t\t\t\"data\": data,\n\t\t\t\"success\": function (json) {\n\t\t\t\tvar error = json.error || json.sError;\n\t\t\t\tif ( error ) {\n\t\t\t\t\t_fnLog( oSettings, 0, error );\n\t\t\t\t}\n\t\n\t\t\t\toSettings.json = json;\n\t\t\t\tcallback( json );\n\t\t\t},\n\t\t\t\"dataType\": \"json\",\n\t\t\t\"cache\": false,\n\t\t\t\"type\": oSettings.sServerMethod,\n\t\t\t\"error\": function (xhr, error, thrown) {\n\t\t\t\tvar ret = _fnCallbackFire( oSettings, null, 'xhr', [oSettings, null, oSettings.jqXHR] );\n\t\n\t\t\t\tif ( $.inArray( true, ret ) === -1 ) {\n\t\t\t\t\tif ( error == \"parsererror\" ) {\n\t\t\t\t\t\t_fnLog( oSettings, 0, 'Invalid JSON response', 1 );\n\t\t\t\t\t}\n\t\t\t\t\telse if ( xhr.readyState === 4 ) {\n\t\t\t\t\t\t_fnLog( oSettings, 0, 'Ajax error', 7 );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\t_fnProcessingDisplay( oSettings, false );\n\t\t\t}\n\t\t};\n\t\n\t\t// Store the data submitted for the API\n\t\toSettings.oAjaxData = data;\n\t\n\t\t// Allow plug-ins and external processes to modify the data\n\t\t_fnCallbackFire( oSettings, null, 'preXhr', [oSettings, data] );\n\t\n\t\tif ( oSettings.fnServerData )\n\t\t{\n\t\t\t// DataTables 1.9- compatibility\n\t\t\toSettings.fnServerData.call( instance,\n\t\t\t\toSettings.sAjaxSource,\n\t\t\t\t$.map( data, function (val, key) { // Need to convert back to 1.9 trad format\n\t\t\t\t\treturn { name: key, value: val };\n\t\t\t\t} ),\n\t\t\t\tcallback,\n\t\t\t\toSettings\n\t\t\t);\n\t\t}\n\t\telse if ( oSettings.sAjaxSource || typeof ajax === 'string' )\n\t\t{\n\t\t\t// DataTables 1.9- compatibility\n\t\t\toSettings.jqXHR = $.ajax( $.extend( baseAjax, {\n\t\t\t\turl: ajax || oSettings.sAjaxSource\n\t\t\t} ) );\n\t\t}\n\t\telse if ( $.isFunction( ajax ) )\n\t\t{\n\t\t\t// Is a function - let the caller define what needs to be done\n\t\t\toSettings.jqXHR = ajax.call( instance, data, callback, oSettings );\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Object to extend the base settings\n\t\t\toSettings.jqXHR = $.ajax( $.extend( baseAjax, ajax ) );\n\t\n\t\t\t// Restore for next time around\n\t\t\tajax.data = ajaxData;\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Update the table using an Ajax call\n\t *  @param {object} settings dataTables settings object\n\t *  @returns {boolean} Block the table drawing or not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAjaxUpdate( settings )\n\t{\n\t\tif ( settings.bAjaxDataGet ) {\n\t\t\tsettings.iDraw++;\n\t\t\t_fnProcessingDisplay( settings, true );\n\t\n\t\t\t_fnBuildAjax(\n\t\t\t\tsettings,\n\t\t\t\t_fnAjaxParameters( settings ),\n\t\t\t\tfunction(json) {\n\t\t\t\t\t_fnAjaxUpdateDraw( settings, json );\n\t\t\t\t}\n\t\t\t);\n\t\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\t\n\t\n\t/**\n\t * Build up the parameters in an object needed for a server-side processing\n\t * request. Note that this is basically done twice, is different ways - a modern\n\t * method which is used by default in DataTables 1.10 which uses objects and\n\t * arrays, or the 1.9- method with is name / value pairs. 1.9 method is used if\n\t * the sAjaxSource option is used in the initialisation, or the legacyAjax\n\t * option is set.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {bool} block the table drawing or not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAjaxParameters( settings )\n\t{\n\t\tvar\n\t\t\tcolumns = settings.aoColumns,\n\t\t\tcolumnCount = columns.length,\n\t\t\tfeatures = settings.oFeatures,\n\t\t\tpreSearch = settings.oPreviousSearch,\n\t\t\tpreColSearch = settings.aoPreSearchCols,\n\t\t\ti, data = [], dataProp, column, columnSearch,\n\t\t\tsort = _fnSortFlatten( settings ),\n\t\t\tdisplayStart = settings._iDisplayStart,\n\t\t\tdisplayLength = features.bPaginate !== false ?\n\t\t\t\tsettings._iDisplayLength :\n\t\t\t\t-1;\n\t\n\t\tvar param = function ( name, value ) {\n\t\t\tdata.push( { 'name': name, 'value': value } );\n\t\t};\n\t\n\t\t// DataTables 1.9- compatible method\n\t\tparam( 'sEcho',          settings.iDraw );\n\t\tparam( 'iColumns',       columnCount );\n\t\tparam( 'sColumns',       _pluck( columns, 'sName' ).join(',') );\n\t\tparam( 'iDisplayStart',  displayStart );\n\t\tparam( 'iDisplayLength', displayLength );\n\t\n\t\t// DataTables 1.10+ method\n\t\tvar d = {\n\t\t\tdraw:    settings.iDraw,\n\t\t\tcolumns: [],\n\t\t\torder:   [],\n\t\t\tstart:   displayStart,\n\t\t\tlength:  displayLength,\n\t\t\tsearch:  {\n\t\t\t\tvalue: preSearch.sSearch,\n\t\t\t\tregex: preSearch.bRegex\n\t\t\t}\n\t\t};\n\t\n\t\tfor ( i=0 ; i<columnCount ; i++ ) {\n\t\t\tcolumn = columns[i];\n\t\t\tcolumnSearch = preColSearch[i];\n\t\t\tdataProp = typeof column.mData==\"function\" ? 'function' : column.mData ;\n\t\n\t\t\td.columns.push( {\n\t\t\t\tdata:       dataProp,\n\t\t\t\tname:       column.sName,\n\t\t\t\tsearchable: column.bSearchable,\n\t\t\t\torderable:  column.bSortable,\n\t\t\t\tsearch:     {\n\t\t\t\t\tvalue: columnSearch.sSearch,\n\t\t\t\t\tregex: columnSearch.bRegex\n\t\t\t\t}\n\t\t\t} );\n\t\n\t\t\tparam( \"mDataProp_\"+i, dataProp );\n\t\n\t\t\tif ( features.bFilter ) {\n\t\t\t\tparam( 'sSearch_'+i,     columnSearch.sSearch );\n\t\t\t\tparam( 'bRegex_'+i,      columnSearch.bRegex );\n\t\t\t\tparam( 'bSearchable_'+i, column.bSearchable );\n\t\t\t}\n\t\n\t\t\tif ( features.bSort ) {\n\t\t\t\tparam( 'bSortable_'+i, column.bSortable );\n\t\t\t}\n\t\t}\n\t\n\t\tif ( features.bFilter ) {\n\t\t\tparam( 'sSearch', preSearch.sSearch );\n\t\t\tparam( 'bRegex', preSearch.bRegex );\n\t\t}\n\t\n\t\tif ( features.bSort ) {\n\t\t\t$.each( sort, function ( i, val ) {\n\t\t\t\td.order.push( { column: val.col, dir: val.dir } );\n\t\n\t\t\t\tparam( 'iSortCol_'+i, val.col );\n\t\t\t\tparam( 'sSortDir_'+i, val.dir );\n\t\t\t} );\n\t\n\t\t\tparam( 'iSortingCols', sort.length );\n\t\t}\n\t\n\t\t// If the legacy.ajax parameter is null, then we automatically decide which\n\t\t// form to use, based on sAjaxSource\n\t\tvar legacy = DataTable.ext.legacy.ajax;\n\t\tif ( legacy === null ) {\n\t\t\treturn settings.sAjaxSource ? data : d;\n\t\t}\n\t\n\t\t// Otherwise, if legacy has been specified then we use that to decide on the\n\t\t// form\n\t\treturn legacy ? data : d;\n\t}\n\t\n\t\n\t/**\n\t * Data the data from the server (nuking the old) and redraw the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {object} json json data return from the server.\n\t *  @param {string} json.sEcho Tracking flag for DataTables to match requests\n\t *  @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering\n\t *  @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering\n\t *  @param {array} json.aaData The data to display on this page\n\t *  @param {string} [json.sColumns] Column ordering (sName, comma separated)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAjaxUpdateDraw ( settings, json )\n\t{\n\t\t// v1.10 uses camelCase variables, while 1.9 uses Hungarian notation.\n\t\t// Support both\n\t\tvar compat = function ( old, modern ) {\n\t\t\treturn json[old] !== undefined ? json[old] : json[modern];\n\t\t};\n\t\n\t\tvar data = _fnAjaxDataSrc( settings, json );\n\t\tvar draw            = compat( 'sEcho',                'draw' );\n\t\tvar recordsTotal    = compat( 'iTotalRecords',        'recordsTotal' );\n\t\tvar recordsFiltered = compat( 'iTotalDisplayRecords', 'recordsFiltered' );\n\t\n\t\tif ( draw ) {\n\t\t\t// Protect against out of sequence returns\n\t\t\tif ( draw*1 < settings.iDraw ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsettings.iDraw = draw * 1;\n\t\t}\n\t\n\t\t_fnClearTable( settings );\n\t\tsettings._iRecordsTotal   = parseInt(recordsTotal, 10);\n\t\tsettings._iRecordsDisplay = parseInt(recordsFiltered, 10);\n\t\n\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t_fnAddData( settings, data[i] );\n\t\t}\n\t\tsettings.aiDisplay = settings.aiDisplayMaster.slice();\n\t\n\t\tsettings.bAjaxDataGet = false;\n\t\t_fnDraw( settings );\n\t\n\t\tif ( ! settings._bInitComplete ) {\n\t\t\t_fnInitComplete( settings, json );\n\t\t}\n\t\n\t\tsettings.bAjaxDataGet = true;\n\t\t_fnProcessingDisplay( settings, false );\n\t}\n\t\n\t\n\t/**\n\t * Get the data from the JSON data source to use for drawing a table. Using\n\t * `_fnGetObjectDataFn` allows the data to be sourced from a property of the\n\t * source object, or from a processing function.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param  {object} json Data source object / array from the server\n\t *  @return {array} Array of data to use\n\t */\n\tfunction _fnAjaxDataSrc ( oSettings, json )\n\t{\n\t\tvar dataSrc = $.isPlainObject( oSettings.ajax ) && oSettings.ajax.dataSrc !== undefined ?\n\t\t\toSettings.ajax.dataSrc :\n\t\t\toSettings.sAjaxDataProp; // Compatibility with 1.9-.\n\t\n\t\t// Compatibility with 1.9-. In order to read from aaData, check if the\n\t\t// default has been changed, if not, check for aaData\n\t\tif ( dataSrc === 'data' ) {\n\t\t\treturn json.aaData || json[dataSrc];\n\t\t}\n\t\n\t\treturn dataSrc !== \"\" ?\n\t\t\t_fnGetObjectDataFn( dataSrc )( json ) :\n\t\t\tjson;\n\t}\n\t\n\t/**\n\t * Generate the node required for filtering text\n\t *  @returns {node} Filter control element\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlFilter ( settings )\n\t{\n\t\tvar classes = settings.oClasses;\n\t\tvar tableId = settings.sTableId;\n\t\tvar language = settings.oLanguage;\n\t\tvar previousSearch = settings.oPreviousSearch;\n\t\tvar features = settings.aanFeatures;\n\t\tvar input = '<input type=\"search\" class=\"'+classes.sFilterInput+'\"/>';\n\t\n\t\tvar str = language.sSearch;\n\t\tstr = str.match(/_INPUT_/) ?\n\t\t\tstr.replace('_INPUT_', input) :\n\t\t\tstr+input;\n\t\n\t\tvar filter = $('<div/>', {\n\t\t\t\t'id': ! features.f ? tableId+'_filter' : null,\n\t\t\t\t'class': classes.sFilter\n\t\t\t} )\n\t\t\t.append( $('<label/>' ).append( str ) );\n\t\n\t\tvar searchFn = function() {\n\t\t\t/* Update all other filter input elements for the new display */\n\t\t\tvar n = features.f;\n\t\t\tvar val = !this.value ? \"\" : this.value; // mental IE8 fix :-(\n\t\n\t\t\t/* Now do the filter */\n\t\t\tif ( val != previousSearch.sSearch ) {\n\t\t\t\t_fnFilterComplete( settings, {\n\t\t\t\t\t\"sSearch\": val,\n\t\t\t\t\t\"bRegex\": previousSearch.bRegex,\n\t\t\t\t\t\"bSmart\": previousSearch.bSmart ,\n\t\t\t\t\t\"bCaseInsensitive\": previousSearch.bCaseInsensitive\n\t\t\t\t} );\n\t\n\t\t\t\t// Need to redraw, without resorting\n\t\t\t\tsettings._iDisplayStart = 0;\n\t\t\t\t_fnDraw( settings );\n\t\t\t}\n\t\t};\n\t\n\t\tvar searchDelay = settings.searchDelay !== null ?\n\t\t\tsettings.searchDelay :\n\t\t\t_fnDataSource( settings ) === 'ssp' ?\n\t\t\t\t400 :\n\t\t\t\t0;\n\t\n\t\tvar jqFilter = $('input', filter)\n\t\t\t.val( previousSearch.sSearch )\n\t\t\t.attr( 'placeholder', language.sSearchPlaceholder )\n\t\t\t.on(\n\t\t\t\t'keyup.DT search.DT input.DT paste.DT cut.DT',\n\t\t\t\tsearchDelay ?\n\t\t\t\t\t_fnThrottle( searchFn, searchDelay ) :\n\t\t\t\t\tsearchFn\n\t\t\t)\n\t\t\t.on( 'keypress.DT', function(e) {\n\t\t\t\t/* Prevent form submission */\n\t\t\t\tif ( e.keyCode == 13 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.attr('aria-controls', tableId);\n\t\n\t\t// Update the input elements whenever the table is filtered\n\t\t$(settings.nTable).on( 'search.dt.DT', function ( ev, s ) {\n\t\t\tif ( settings === s ) {\n\t\t\t\t// IE9 throws an 'unknown error' if document.activeElement is used\n\t\t\t\t// inside an iframe or frame...\n\t\t\t\ttry {\n\t\t\t\t\tif ( jqFilter[0] !== document.activeElement ) {\n\t\t\t\t\t\tjqFilter.val( previousSearch.sSearch );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch ( e ) {}\n\t\t\t}\n\t\t} );\n\t\n\t\treturn filter[0];\n\t}\n\t\n\t\n\t/**\n\t * Filter the table using both the global filter and column based filtering\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {object} oSearch search information\n\t *  @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilterComplete ( oSettings, oInput, iForce )\n\t{\n\t\tvar oPrevSearch = oSettings.oPreviousSearch;\n\t\tvar aoPrevSearch = oSettings.aoPreSearchCols;\n\t\tvar fnSaveFilter = function ( oFilter ) {\n\t\t\t/* Save the filtering values */\n\t\t\toPrevSearch.sSearch = oFilter.sSearch;\n\t\t\toPrevSearch.bRegex = oFilter.bRegex;\n\t\t\toPrevSearch.bSmart = oFilter.bSmart;\n\t\t\toPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;\n\t\t};\n\t\tvar fnRegex = function ( o ) {\n\t\t\t// Backwards compatibility with the bEscapeRegex option\n\t\t\treturn o.bEscapeRegex !== undefined ? !o.bEscapeRegex : o.bRegex;\n\t\t};\n\t\n\t\t// Resolve any column types that are unknown due to addition or invalidation\n\t\t// @todo As per sort - can this be moved into an event handler?\n\t\t_fnColumnTypes( oSettings );\n\t\n\t\t/* In server-side processing all filtering is done by the server, so no point hanging around here */\n\t\tif ( _fnDataSource( oSettings ) != 'ssp' )\n\t\t{\n\t\t\t/* Global filter */\n\t\t\t_fnFilter( oSettings, oInput.sSearch, iForce, fnRegex(oInput), oInput.bSmart, oInput.bCaseInsensitive );\n\t\t\tfnSaveFilter( oInput );\n\t\n\t\t\t/* Now do the individual column filter */\n\t\t\tfor ( var i=0 ; i<aoPrevSearch.length ; i++ )\n\t\t\t{\n\t\t\t\t_fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, fnRegex(aoPrevSearch[i]),\n\t\t\t\t\taoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive );\n\t\t\t}\n\t\n\t\t\t/* Custom filtering */\n\t\t\t_fnFilterCustom( oSettings );\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfnSaveFilter( oInput );\n\t\t}\n\t\n\t\t/* Tell the draw function we have been filtering */\n\t\toSettings.bFiltered = true;\n\t\t_fnCallbackFire( oSettings, null, 'search', [oSettings] );\n\t}\n\t\n\t\n\t/**\n\t * Apply custom filtering functions\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilterCustom( settings )\n\t{\n\t\tvar filters = DataTable.ext.search;\n\t\tvar displayRows = settings.aiDisplay;\n\t\tvar row, rowIdx;\n\t\n\t\tfor ( var i=0, ien=filters.length ; i<ien ; i++ ) {\n\t\t\tvar rows = [];\n\t\n\t\t\t// Loop over each row and see if it should be included\n\t\t\tfor ( var j=0, jen=displayRows.length ; j<jen ; j++ ) {\n\t\t\t\trowIdx = displayRows[ j ];\n\t\t\t\trow = settings.aoData[ rowIdx ];\n\t\n\t\t\t\tif ( filters[i]( settings, row._aFilterData, rowIdx, row._aData, j ) ) {\n\t\t\t\t\trows.push( rowIdx );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// So the array reference doesn't break set the results into the\n\t\t\t// existing array\n\t\t\tdisplayRows.length = 0;\n\t\t\t$.merge( displayRows, rows );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Filter the table on a per-column basis\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {string} sInput string to filter on\n\t *  @param {int} iColumn column to filter\n\t *  @param {bool} bRegex treat search string as a regular expression or not\n\t *  @param {bool} bSmart use smart filtering or not\n\t *  @param {bool} bCaseInsensitive Do case insenstive matching or not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilterColumn ( settings, searchStr, colIdx, regex, smart, caseInsensitive )\n\t{\n\t\tif ( searchStr === '' ) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar data;\n\t\tvar out = [];\n\t\tvar display = settings.aiDisplay;\n\t\tvar rpSearch = _fnFilterCreateSearch( searchStr, regex, smart, caseInsensitive );\n\t\n\t\tfor ( var i=0 ; i<display.length ; i++ ) {\n\t\t\tdata = settings.aoData[ display[i] ]._aFilterData[ colIdx ];\n\t\n\t\t\tif ( rpSearch.test( data ) ) {\n\t\t\t\tout.push( display[i] );\n\t\t\t}\n\t\t}\n\t\n\t\tsettings.aiDisplay = out;\n\t}\n\t\n\t\n\t/**\n\t * Filter the data table based on user input and draw the table\n\t *  @param {object} settings dataTables settings object\n\t *  @param {string} input string to filter on\n\t *  @param {int} force optional - force a research of the master array (1) or not (undefined or 0)\n\t *  @param {bool} regex treat as a regular expression or not\n\t *  @param {bool} smart perform smart filtering or not\n\t *  @param {bool} caseInsensitive Do case insenstive matching or not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilter( settings, input, force, regex, smart, caseInsensitive )\n\t{\n\t\tvar rpSearch = _fnFilterCreateSearch( input, regex, smart, caseInsensitive );\n\t\tvar prevSearch = settings.oPreviousSearch.sSearch;\n\t\tvar displayMaster = settings.aiDisplayMaster;\n\t\tvar display, invalidated, i;\n\t\tvar filtered = [];\n\t\n\t\t// Need to take account of custom filtering functions - always filter\n\t\tif ( DataTable.ext.search.length !== 0 ) {\n\t\t\tforce = true;\n\t\t}\n\t\n\t\t// Check if any of the rows were invalidated\n\t\tinvalidated = _fnFilterData( settings );\n\t\n\t\t// If the input is blank - we just want the full data set\n\t\tif ( input.length <= 0 ) {\n\t\t\tsettings.aiDisplay = displayMaster.slice();\n\t\t}\n\t\telse {\n\t\t\t// New search - start from the master array\n\t\t\tif ( invalidated ||\n\t\t\t\t force ||\n\t\t\t\t prevSearch.length > input.length ||\n\t\t\t\t input.indexOf(prevSearch) !== 0 ||\n\t\t\t\t settings.bSorted // On resort, the display master needs to be\n\t\t\t\t                  // re-filtered since indexes will have changed\n\t\t\t) {\n\t\t\t\tsettings.aiDisplay = displayMaster.slice();\n\t\t\t}\n\t\n\t\t\t// Search the display array\n\t\t\tdisplay = settings.aiDisplay;\n\t\n\t\t\tfor ( i=0 ; i<display.length ; i++ ) {\n\t\t\t\tif ( rpSearch.test( settings.aoData[ display[i] ]._sFilterRow ) ) {\n\t\t\t\t\tfiltered.push( display[i] );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tsettings.aiDisplay = filtered;\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Build a regular expression object suitable for searching a table\n\t *  @param {string} sSearch string to search for\n\t *  @param {bool} bRegex treat as a regular expression or not\n\t *  @param {bool} bSmart perform smart filtering or not\n\t *  @param {bool} bCaseInsensitive Do case insensitive matching or not\n\t *  @returns {RegExp} constructed object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilterCreateSearch( search, regex, smart, caseInsensitive )\n\t{\n\t\tsearch = regex ?\n\t\t\tsearch :\n\t\t\t_fnEscapeRegex( search );\n\t\t\n\t\tif ( smart ) {\n\t\t\t/* For smart filtering we want to allow the search to work regardless of\n\t\t\t * word order. We also want double quoted text to be preserved, so word\n\t\t\t * order is important - a la google. So this is what we want to\n\t\t\t * generate:\n\t\t\t * \n\t\t\t * ^(?=.*?\\bone\\b)(?=.*?\\btwo three\\b)(?=.*?\\bfour\\b).*$\n\t\t\t */\n\t\t\tvar a = $.map( search.match( /\"[^\"]+\"|[^ ]+/g ) || [''], function ( word ) {\n\t\t\t\tif ( word.charAt(0) === '\"' ) {\n\t\t\t\t\tvar m = word.match( /^\"(.*)\"$/ );\n\t\t\t\t\tword = m ? m[1] : word;\n\t\t\t\t}\n\t\n\t\t\t\treturn word.replace('\"', '');\n\t\t\t} );\n\t\n\t\t\tsearch = '^(?=.*?'+a.join( ')(?=.*?' )+').*$';\n\t\t}\n\t\n\t\treturn new RegExp( search, caseInsensitive ? 'i' : '' );\n\t}\n\t\n\t\n\t/**\n\t * Escape a string such that it can be used in a regular expression\n\t *  @param {string} sVal string to escape\n\t *  @returns {string} escaped string\n\t *  @memberof DataTable#oApi\n\t */\n\tvar _fnEscapeRegex = DataTable.util.escapeRegex;\n\t\n\tvar __filter_div = $('<div>')[0];\n\tvar __filter_div_textContent = __filter_div.textContent !== undefined;\n\t\n\t// Update the filtering data for each row if needed (by invalidation or first run)\n\tfunction _fnFilterData ( settings )\n\t{\n\t\tvar columns = settings.aoColumns;\n\t\tvar column;\n\t\tvar i, j, ien, jen, filterData, cellData, row;\n\t\tvar fomatters = DataTable.ext.type.search;\n\t\tvar wasInvalidated = false;\n\t\n\t\tfor ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\trow = settings.aoData[i];\n\t\n\t\t\tif ( ! row._aFilterData ) {\n\t\t\t\tfilterData = [];\n\t\n\t\t\t\tfor ( j=0, jen=columns.length ; j<jen ; j++ ) {\n\t\t\t\t\tcolumn = columns[j];\n\t\n\t\t\t\t\tif ( column.bSearchable ) {\n\t\t\t\t\t\tcellData = _fnGetCellData( settings, i, j, 'filter' );\n\t\n\t\t\t\t\t\tif ( fomatters[ column.sType ] ) {\n\t\t\t\t\t\t\tcellData = fomatters[ column.sType ]( cellData );\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Search in DataTables 1.10 is string based. In 1.11 this\n\t\t\t\t\t\t// should be altered to also allow strict type checking.\n\t\t\t\t\t\tif ( cellData === null ) {\n\t\t\t\t\t\t\tcellData = '';\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif ( typeof cellData !== 'string' && cellData.toString ) {\n\t\t\t\t\t\t\tcellData = cellData.toString();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tcellData = '';\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// If it looks like there is an HTML entity in the string,\n\t\t\t\t\t// attempt to decode it so sorting works as expected. Note that\n\t\t\t\t\t// we could use a single line of jQuery to do this, but the DOM\n\t\t\t\t\t// method used here is much faster http://jsperf.com/html-decode\n\t\t\t\t\tif ( cellData.indexOf && cellData.indexOf('&') !== -1 ) {\n\t\t\t\t\t\t__filter_div.innerHTML = cellData;\n\t\t\t\t\t\tcellData = __filter_div_textContent ?\n\t\t\t\t\t\t\t__filter_div.textContent :\n\t\t\t\t\t\t\t__filter_div.innerText;\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif ( cellData.replace ) {\n\t\t\t\t\t\tcellData = cellData.replace(/[\\r\\n]/g, '');\n\t\t\t\t\t}\n\t\n\t\t\t\t\tfilterData.push( cellData );\n\t\t\t\t}\n\t\n\t\t\t\trow._aFilterData = filterData;\n\t\t\t\trow._sFilterRow = filterData.join('  ');\n\t\t\t\twasInvalidated = true;\n\t\t\t}\n\t\t}\n\t\n\t\treturn wasInvalidated;\n\t}\n\t\n\t\n\t/**\n\t * Convert from the internal Hungarian notation to camelCase for external\n\t * interaction\n\t *  @param {object} obj Object to convert\n\t *  @returns {object} Inverted object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSearchToCamel ( obj )\n\t{\n\t\treturn {\n\t\t\tsearch:          obj.sSearch,\n\t\t\tsmart:           obj.bSmart,\n\t\t\tregex:           obj.bRegex,\n\t\t\tcaseInsensitive: obj.bCaseInsensitive\n\t\t};\n\t}\n\t\n\t\n\t\n\t/**\n\t * Convert from camelCase notation to the internal Hungarian. We could use the\n\t * Hungarian convert function here, but this is cleaner\n\t *  @param {object} obj Object to convert\n\t *  @returns {object} Inverted object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSearchToHung ( obj )\n\t{\n\t\treturn {\n\t\t\tsSearch:          obj.search,\n\t\t\tbSmart:           obj.smart,\n\t\t\tbRegex:           obj.regex,\n\t\t\tbCaseInsensitive: obj.caseInsensitive\n\t\t};\n\t}\n\t\n\t/**\n\t * Generate the node required for the info display\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {node} Information element\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlInfo ( settings )\n\t{\n\t\tvar\n\t\t\ttid = settings.sTableId,\n\t\t\tnodes = settings.aanFeatures.i,\n\t\t\tn = $('<div/>', {\n\t\t\t\t'class': settings.oClasses.sInfo,\n\t\t\t\t'id': ! nodes ? tid+'_info' : null\n\t\t\t} );\n\t\n\t\tif ( ! nodes ) {\n\t\t\t// Update display on each draw\n\t\t\tsettings.aoDrawCallback.push( {\n\t\t\t\t\"fn\": _fnUpdateInfo,\n\t\t\t\t\"sName\": \"information\"\n\t\t\t} );\n\t\n\t\t\tn\n\t\t\t\t.attr( 'role', 'status' )\n\t\t\t\t.attr( 'aria-live', 'polite' );\n\t\n\t\t\t// Table is described by our info div\n\t\t\t$(settings.nTable).attr( 'aria-describedby', tid+'_info' );\n\t\t}\n\t\n\t\treturn n[0];\n\t}\n\t\n\t\n\t/**\n\t * Update the information elements in the display\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnUpdateInfo ( settings )\n\t{\n\t\t/* Show information about the table */\n\t\tvar nodes = settings.aanFeatures.i;\n\t\tif ( nodes.length === 0 ) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar\n\t\t\tlang  = settings.oLanguage,\n\t\t\tstart = settings._iDisplayStart+1,\n\t\t\tend   = settings.fnDisplayEnd(),\n\t\t\tmax   = settings.fnRecordsTotal(),\n\t\t\ttotal = settings.fnRecordsDisplay(),\n\t\t\tout   = total ?\n\t\t\t\tlang.sInfo :\n\t\t\t\tlang.sInfoEmpty;\n\t\n\t\tif ( total !== max ) {\n\t\t\t/* Record set after filtering */\n\t\t\tout += ' ' + lang.sInfoFiltered;\n\t\t}\n\t\n\t\t// Convert the macros\n\t\tout += lang.sInfoPostFix;\n\t\tout = _fnInfoMacros( settings, out );\n\t\n\t\tvar callback = lang.fnInfoCallback;\n\t\tif ( callback !== null ) {\n\t\t\tout = callback.call( settings.oInstance,\n\t\t\t\tsettings, start, end, max, total, out\n\t\t\t);\n\t\t}\n\t\n\t\t$(nodes).html( out );\n\t}\n\t\n\t\n\tfunction _fnInfoMacros ( settings, str )\n\t{\n\t\t// When infinite scrolling, we are always starting at 1. _iDisplayStart is used only\n\t\t// internally\n\t\tvar\n\t\t\tformatter  = settings.fnFormatNumber,\n\t\t\tstart      = settings._iDisplayStart+1,\n\t\t\tlen        = settings._iDisplayLength,\n\t\t\tvis        = settings.fnRecordsDisplay(),\n\t\t\tall        = len === -1;\n\t\n\t\treturn str.\n\t\t\treplace(/_START_/g, formatter.call( settings, start ) ).\n\t\t\treplace(/_END_/g,   formatter.call( settings, settings.fnDisplayEnd() ) ).\n\t\t\treplace(/_MAX_/g,   formatter.call( settings, settings.fnRecordsTotal() ) ).\n\t\t\treplace(/_TOTAL_/g, formatter.call( settings, vis ) ).\n\t\t\treplace(/_PAGE_/g,  formatter.call( settings, all ? 1 : Math.ceil( start / len ) ) ).\n\t\t\treplace(/_PAGES_/g, formatter.call( settings, all ? 1 : Math.ceil( vis / len ) ) );\n\t}\n\t\n\t\n\t\n\t/**\n\t * Draw the table for the first time, adding all required features\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnInitialise ( settings )\n\t{\n\t\tvar i, iLen, iAjaxStart=settings.iInitDisplayStart;\n\t\tvar columns = settings.aoColumns, column;\n\t\tvar features = settings.oFeatures;\n\t\tvar deferLoading = settings.bDeferLoading; // value modified by the draw\n\t\n\t\t/* Ensure that the table data is fully initialised */\n\t\tif ( ! settings.bInitialised ) {\n\t\t\tsetTimeout( function(){ _fnInitialise( settings ); }, 200 );\n\t\t\treturn;\n\t\t}\n\t\n\t\t/* Show the display HTML options */\n\t\t_fnAddOptionsHtml( settings );\n\t\n\t\t/* Build and draw the header / footer for the table */\n\t\t_fnBuildHead( settings );\n\t\t_fnDrawHead( settings, settings.aoHeader );\n\t\t_fnDrawHead( settings, settings.aoFooter );\n\t\n\t\t/* Okay to show that something is going on now */\n\t\t_fnProcessingDisplay( settings, true );\n\t\n\t\t/* Calculate sizes for columns */\n\t\tif ( features.bAutoWidth ) {\n\t\t\t_fnCalculateColumnWidths( settings );\n\t\t}\n\t\n\t\tfor ( i=0, iLen=columns.length ; i<iLen ; i++ ) {\n\t\t\tcolumn = columns[i];\n\t\n\t\t\tif ( column.sWidth ) {\n\t\t\t\tcolumn.nTh.style.width = _fnStringToCss( column.sWidth );\n\t\t\t}\n\t\t}\n\t\n\t\t_fnCallbackFire( settings, null, 'preInit', [settings] );\n\t\n\t\t// If there is default sorting required - let's do it. The sort function\n\t\t// will do the drawing for us. Otherwise we draw the table regardless of the\n\t\t// Ajax source - this allows the table to look initialised for Ajax sourcing\n\t\t// data (show 'loading' message possibly)\n\t\t_fnReDraw( settings );\n\t\n\t\t// Server-side processing init complete is done by _fnAjaxUpdateDraw\n\t\tvar dataSrc = _fnDataSource( settings );\n\t\tif ( dataSrc != 'ssp' || deferLoading ) {\n\t\t\t// if there is an ajax source load the data\n\t\t\tif ( dataSrc == 'ajax' ) {\n\t\t\t\t_fnBuildAjax( settings, [], function(json) {\n\t\t\t\t\tvar aData = _fnAjaxDataSrc( settings, json );\n\t\n\t\t\t\t\t// Got the data - add it to the table\n\t\t\t\t\tfor ( i=0 ; i<aData.length ; i++ ) {\n\t\t\t\t\t\t_fnAddData( settings, aData[i] );\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Reset the init display for cookie saving. We've already done\n\t\t\t\t\t// a filter, and therefore cleared it before. So we need to make\n\t\t\t\t\t// it appear 'fresh'\n\t\t\t\t\tsettings.iInitDisplayStart = iAjaxStart;\n\t\n\t\t\t\t\t_fnReDraw( settings );\n\t\n\t\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t\t\t_fnInitComplete( settings, json );\n\t\t\t\t}, settings );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t\t_fnInitComplete( settings );\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Draw the table for the first time, adding all required features\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {object} [json] JSON from the server that completed the table, if using Ajax source\n\t *    with client-side processing (optional)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnInitComplete ( settings, json )\n\t{\n\t\tsettings._bInitComplete = true;\n\t\n\t\t// When data was added after the initialisation (data or Ajax) we need to\n\t\t// calculate the column sizing\n\t\tif ( json || settings.oInit.aaData ) {\n\t\t\t_fnAdjustColumnSizing( settings );\n\t\t}\n\t\n\t\t_fnCallbackFire( settings, null, 'plugin-init', [settings, json] );\n\t\t_fnCallbackFire( settings, 'aoInitComplete', 'init', [settings, json] );\n\t}\n\t\n\t\n\tfunction _fnLengthChange ( settings, val )\n\t{\n\t\tvar len = parseInt( val, 10 );\n\t\tsettings._iDisplayLength = len;\n\t\n\t\t_fnLengthOverflow( settings );\n\t\n\t\t// Fire length change event\n\t\t_fnCallbackFire( settings, null, 'length', [settings, len] );\n\t}\n\t\n\t\n\t/**\n\t * Generate the node required for user display length changing\n\t *  @param {object} settings dataTables settings object\n\t *  @returns {node} Display length feature node\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlLength ( settings )\n\t{\n\t\tvar\n\t\t\tclasses  = settings.oClasses,\n\t\t\ttableId  = settings.sTableId,\n\t\t\tmenu     = settings.aLengthMenu,\n\t\t\td2       = $.isArray( menu[0] ),\n\t\t\tlengths  = d2 ? menu[0] : menu,\n\t\t\tlanguage = d2 ? menu[1] : menu;\n\t\n\t\tvar select = $('<select/>', {\n\t\t\t'name':          tableId+'_length',\n\t\t\t'aria-controls': tableId,\n\t\t\t'class':         classes.sLengthSelect\n\t\t} );\n\t\n\t\tfor ( var i=0, ien=lengths.length ; i<ien ; i++ ) {\n\t\t\tselect[0][ i ] = new Option( language[i], lengths[i] );\n\t\t}\n\t\n\t\tvar div = $('<div><label/></div>').addClass( classes.sLength );\n\t\tif ( ! settings.aanFeatures.l ) {\n\t\t\tdiv[0].id = tableId+'_length';\n\t\t}\n\t\n\t\tdiv.children().append(\n\t\t\tsettings.oLanguage.sLengthMenu.replace( '_MENU_', select[0].outerHTML )\n\t\t);\n\t\n\t\t// Can't use `select` variable as user might provide their own and the\n\t\t// reference is broken by the use of outerHTML\n\t\t$('select', div)\n\t\t\t.val( settings._iDisplayLength )\n\t\t\t.on( 'change.DT', function(e) {\n\t\t\t\t_fnLengthChange( settings, $(this).val() );\n\t\t\t\t_fnDraw( settings );\n\t\t\t} );\n\t\n\t\t// Update node value whenever anything changes the table's length\n\t\t$(settings.nTable).on( 'length.dt.DT', function (e, s, len) {\n\t\t\tif ( settings === s ) {\n\t\t\t\t$('select', div).val( len );\n\t\t\t}\n\t\t} );\n\t\n\t\treturn div[0];\n\t}\n\t\n\t\n\t\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Note that most of the paging logic is done in\n\t * DataTable.ext.pager\n\t */\n\t\n\t/**\n\t * Generate the node required for default pagination\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {node} Pagination feature node\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlPaginate ( settings )\n\t{\n\t\tvar\n\t\t\ttype   = settings.sPaginationType,\n\t\t\tplugin = DataTable.ext.pager[ type ],\n\t\t\tmodern = typeof plugin === 'function',\n\t\t\tredraw = function( settings ) {\n\t\t\t\t_fnDraw( settings );\n\t\t\t},\n\t\t\tnode = $('<div/>').addClass( settings.oClasses.sPaging + type )[0],\n\t\t\tfeatures = settings.aanFeatures;\n\t\n\t\tif ( ! modern ) {\n\t\t\tplugin.fnInit( settings, node, redraw );\n\t\t}\n\t\n\t\t/* Add a draw callback for the pagination on first instance, to update the paging display */\n\t\tif ( ! features.p )\n\t\t{\n\t\t\tnode.id = settings.sTableId+'_paginate';\n\t\n\t\t\tsettings.aoDrawCallback.push( {\n\t\t\t\t\"fn\": function( settings ) {\n\t\t\t\t\tif ( modern ) {\n\t\t\t\t\t\tvar\n\t\t\t\t\t\t\tstart      = settings._iDisplayStart,\n\t\t\t\t\t\t\tlen        = settings._iDisplayLength,\n\t\t\t\t\t\t\tvisRecords = settings.fnRecordsDisplay(),\n\t\t\t\t\t\t\tall        = len === -1,\n\t\t\t\t\t\t\tpage = all ? 0 : Math.ceil( start / len ),\n\t\t\t\t\t\t\tpages = all ? 1 : Math.ceil( visRecords / len ),\n\t\t\t\t\t\t\tbuttons = plugin(page, pages),\n\t\t\t\t\t\t\ti, ien;\n\t\n\t\t\t\t\t\tfor ( i=0, ien=features.p.length ; i<ien ; i++ ) {\n\t\t\t\t\t\t\t_fnRenderer( settings, 'pageButton' )(\n\t\t\t\t\t\t\t\tsettings, features.p[i], i, buttons, page, pages\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tplugin.fnUpdate( settings, redraw );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t\"sName\": \"pagination\"\n\t\t\t} );\n\t\t}\n\t\n\t\treturn node;\n\t}\n\t\n\t\n\t/**\n\t * Alter the display settings to change the page\n\t *  @param {object} settings DataTables settings object\n\t *  @param {string|int} action Paging action to take: \"first\", \"previous\",\n\t *    \"next\" or \"last\" or page number to jump to (integer)\n\t *  @param [bool] redraw Automatically draw the update or not\n\t *  @returns {bool} true page has changed, false - no change\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnPageChange ( settings, action, redraw )\n\t{\n\t\tvar\n\t\t\tstart     = settings._iDisplayStart,\n\t\t\tlen       = settings._iDisplayLength,\n\t\t\trecords   = settings.fnRecordsDisplay();\n\t\n\t\tif ( records === 0 || len === -1 )\n\t\t{\n\t\t\tstart = 0;\n\t\t}\n\t\telse if ( typeof action === \"number\" )\n\t\t{\n\t\t\tstart = action * len;\n\t\n\t\t\tif ( start > records )\n\t\t\t{\n\t\t\t\tstart = 0;\n\t\t\t}\n\t\t}\n\t\telse if ( action == \"first\" )\n\t\t{\n\t\t\tstart = 0;\n\t\t}\n\t\telse if ( action == \"previous\" )\n\t\t{\n\t\t\tstart = len >= 0 ?\n\t\t\t\tstart - len :\n\t\t\t\t0;\n\t\n\t\t\tif ( start < 0 )\n\t\t\t{\n\t\t\t  start = 0;\n\t\t\t}\n\t\t}\n\t\telse if ( action == \"next\" )\n\t\t{\n\t\t\tif ( start + len < records )\n\t\t\t{\n\t\t\t\tstart += len;\n\t\t\t}\n\t\t}\n\t\telse if ( action == \"last\" )\n\t\t{\n\t\t\tstart = Math.floor( (records-1) / len) * len;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t_fnLog( settings, 0, \"Unknown paging action: \"+action, 5 );\n\t\t}\n\t\n\t\tvar changed = settings._iDisplayStart !== start;\n\t\tsettings._iDisplayStart = start;\n\t\n\t\tif ( changed ) {\n\t\t\t_fnCallbackFire( settings, null, 'page', [settings] );\n\t\n\t\t\tif ( redraw ) {\n\t\t\t\t_fnDraw( settings );\n\t\t\t}\n\t\t}\n\t\n\t\treturn changed;\n\t}\n\t\n\t\n\t\n\t/**\n\t * Generate the node required for the processing node\n\t *  @param {object} settings dataTables settings object\n\t *  @returns {node} Processing element\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlProcessing ( settings )\n\t{\n\t\treturn $('<div/>', {\n\t\t\t\t'id': ! settings.aanFeatures.r ? settings.sTableId+'_processing' : null,\n\t\t\t\t'class': settings.oClasses.sProcessing\n\t\t\t} )\n\t\t\t.html( settings.oLanguage.sProcessing )\n\t\t\t.insertBefore( settings.nTable )[0];\n\t}\n\t\n\t\n\t/**\n\t * Display or hide the processing indicator\n\t *  @param {object} settings dataTables settings object\n\t *  @param {bool} show Show the processing indicator (true) or not (false)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnProcessingDisplay ( settings, show )\n\t{\n\t\tif ( settings.oFeatures.bProcessing ) {\n\t\t\t$(settings.aanFeatures.r).css( 'display', show ? 'block' : 'none' );\n\t\t}\n\t\n\t\t_fnCallbackFire( settings, null, 'processing', [settings, show] );\n\t}\n\t\n\t/**\n\t * Add any control elements for the table - specifically scrolling\n\t *  @param {object} settings dataTables settings object\n\t *  @returns {node} Node to add to the DOM\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlTable ( settings )\n\t{\n\t\tvar table = $(settings.nTable);\n\t\n\t\t// Add the ARIA grid role to the table\n\t\ttable.attr( 'role', 'grid' );\n\t\n\t\t// Scrolling from here on in\n\t\tvar scroll = settings.oScroll;\n\t\n\t\tif ( scroll.sX === '' && scroll.sY === '' ) {\n\t\t\treturn settings.nTable;\n\t\t}\n\t\n\t\tvar scrollX = scroll.sX;\n\t\tvar scrollY = scroll.sY;\n\t\tvar classes = settings.oClasses;\n\t\tvar caption = table.children('caption');\n\t\tvar captionSide = caption.length ? caption[0]._captionSide : null;\n\t\tvar headerClone = $( table[0].cloneNode(false) );\n\t\tvar footerClone = $( table[0].cloneNode(false) );\n\t\tvar footer = table.children('tfoot');\n\t\tvar _div = '<div/>';\n\t\tvar size = function ( s ) {\n\t\t\treturn !s ? null : _fnStringToCss( s );\n\t\t};\n\t\n\t\tif ( ! footer.length ) {\n\t\t\tfooter = null;\n\t\t}\n\t\n\t\t/*\n\t\t * The HTML structure that we want to generate in this function is:\n\t\t *  div - scroller\n\t\t *    div - scroll head\n\t\t *      div - scroll head inner\n\t\t *        table - scroll head table\n\t\t *          thead - thead\n\t\t *    div - scroll body\n\t\t *      table - table (master table)\n\t\t *        thead - thead clone for sizing\n\t\t *        tbody - tbody\n\t\t *    div - scroll foot\n\t\t *      div - scroll foot inner\n\t\t *        table - scroll foot table\n\t\t *          tfoot - tfoot\n\t\t */\n\t\tvar scroller = $( _div, { 'class': classes.sScrollWrapper } )\n\t\t\t.append(\n\t\t\t\t$(_div, { 'class': classes.sScrollHead } )\n\t\t\t\t\t.css( {\n\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\tposition: 'relative',\n\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\twidth: scrollX ? size(scrollX) : '100%'\n\t\t\t\t\t} )\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$(_div, { 'class': classes.sScrollHeadInner } )\n\t\t\t\t\t\t\t.css( {\n\t\t\t\t\t\t\t\t'box-sizing': 'content-box',\n\t\t\t\t\t\t\t\twidth: scroll.sXInner || '100%'\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\theaderClone\n\t\t\t\t\t\t\t\t\t.removeAttr('id')\n\t\t\t\t\t\t\t\t\t.css( 'margin-left', 0 )\n\t\t\t\t\t\t\t\t\t.append( captionSide === 'top' ? caption : null )\n\t\t\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\t\t\ttable.children('thead')\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t)\n\t\t\t.append(\n\t\t\t\t$(_div, { 'class': classes.sScrollBody } )\n\t\t\t\t\t.css( {\n\t\t\t\t\t\tposition: 'relative',\n\t\t\t\t\t\toverflow: 'auto',\n\t\t\t\t\t\twidth: size( scrollX )\n\t\t\t\t\t} )\n\t\t\t\t\t.append( table )\n\t\t\t);\n\t\n\t\tif ( footer ) {\n\t\t\tscroller.append(\n\t\t\t\t$(_div, { 'class': classes.sScrollFoot } )\n\t\t\t\t\t.css( {\n\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\twidth: scrollX ? size(scrollX) : '100%'\n\t\t\t\t\t} )\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$(_div, { 'class': classes.sScrollFootInner } )\n\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\tfooterClone\n\t\t\t\t\t\t\t\t\t.removeAttr('id')\n\t\t\t\t\t\t\t\t\t.css( 'margin-left', 0 )\n\t\t\t\t\t\t\t\t\t.append( captionSide === 'bottom' ? caption : null )\n\t\t\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\t\t\ttable.children('tfoot')\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\n\t\tvar children = scroller.children();\n\t\tvar scrollHead = children[0];\n\t\tvar scrollBody = children[1];\n\t\tvar scrollFoot = footer ? children[2] : null;\n\t\n\t\t// When the body is scrolled, then we also want to scroll the headers\n\t\tif ( scrollX ) {\n\t\t\t$(scrollBody).on( 'scroll.DT', function (e) {\n\t\t\t\tvar scrollLeft = this.scrollLeft;\n\t\n\t\t\t\tscrollHead.scrollLeft = scrollLeft;\n\t\n\t\t\t\tif ( footer ) {\n\t\t\t\t\tscrollFoot.scrollLeft = scrollLeft;\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\n\t\t$(scrollBody).css(\n\t\t\tscrollY && scroll.bCollapse ? 'max-height' : 'height', \n\t\t\tscrollY\n\t\t);\n\t\n\t\tsettings.nScrollHead = scrollHead;\n\t\tsettings.nScrollBody = scrollBody;\n\t\tsettings.nScrollFoot = scrollFoot;\n\t\n\t\t// On redraw - align columns\n\t\tsettings.aoDrawCallback.push( {\n\t\t\t\"fn\": _fnScrollDraw,\n\t\t\t\"sName\": \"scrolling\"\n\t\t} );\n\t\n\t\treturn scroller[0];\n\t}\n\t\n\t\n\t\n\t/**\n\t * Update the header, footer and body tables for resizing - i.e. column\n\t * alignment.\n\t *\n\t * Welcome to the most horrible function DataTables. The process that this\n\t * function follows is basically:\n\t *   1. Re-create the table inside the scrolling div\n\t *   2. Take live measurements from the DOM\n\t *   3. Apply the measurements to align the columns\n\t *   4. Clean up\n\t *\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnScrollDraw ( settings )\n\t{\n\t\t// Given that this is such a monster function, a lot of variables are use\n\t\t// to try and keep the minimised size as small as possible\n\t\tvar\n\t\t\tscroll         = settings.oScroll,\n\t\t\tscrollX        = scroll.sX,\n\t\t\tscrollXInner   = scroll.sXInner,\n\t\t\tscrollY        = scroll.sY,\n\t\t\tbarWidth       = scroll.iBarWidth,\n\t\t\tdivHeader      = $(settings.nScrollHead),\n\t\t\tdivHeaderStyle = divHeader[0].style,\n\t\t\tdivHeaderInner = divHeader.children('div'),\n\t\t\tdivHeaderInnerStyle = divHeaderInner[0].style,\n\t\t\tdivHeaderTable = divHeaderInner.children('table'),\n\t\t\tdivBodyEl      = settings.nScrollBody,\n\t\t\tdivBody        = $(divBodyEl),\n\t\t\tdivBodyStyle   = divBodyEl.style,\n\t\t\tdivFooter      = $(settings.nScrollFoot),\n\t\t\tdivFooterInner = divFooter.children('div'),\n\t\t\tdivFooterTable = divFooterInner.children('table'),\n\t\t\theader         = $(settings.nTHead),\n\t\t\ttable          = $(settings.nTable),\n\t\t\ttableEl        = table[0],\n\t\t\ttableStyle     = tableEl.style,\n\t\t\tfooter         = settings.nTFoot ? $(settings.nTFoot) : null,\n\t\t\tbrowser        = settings.oBrowser,\n\t\t\tie67           = browser.bScrollOversize,\n\t\t\tdtHeaderCells  = _pluck( settings.aoColumns, 'nTh' ),\n\t\t\theaderTrgEls, footerTrgEls,\n\t\t\theaderSrcEls, footerSrcEls,\n\t\t\theaderCopy, footerCopy,\n\t\t\theaderWidths=[], footerWidths=[],\n\t\t\theaderContent=[], footerContent=[],\n\t\t\tidx, correction, sanityWidth,\n\t\t\tzeroOut = function(nSizer) {\n\t\t\t\tvar style = nSizer.style;\n\t\t\t\tstyle.paddingTop = \"0\";\n\t\t\t\tstyle.paddingBottom = \"0\";\n\t\t\t\tstyle.borderTopWidth = \"0\";\n\t\t\t\tstyle.borderBottomWidth = \"0\";\n\t\t\t\tstyle.height = 0;\n\t\t\t};\n\t\n\t\t// If the scrollbar visibility has changed from the last draw, we need to\n\t\t// adjust the column sizes as the table width will have changed to account\n\t\t// for the scrollbar\n\t\tvar scrollBarVis = divBodyEl.scrollHeight > divBodyEl.clientHeight;\n\t\t\n\t\tif ( settings.scrollBarVis !== scrollBarVis && settings.scrollBarVis !== undefined ) {\n\t\t\tsettings.scrollBarVis = scrollBarVis;\n\t\t\t_fnAdjustColumnSizing( settings );\n\t\t\treturn; // adjust column sizing will call this function again\n\t\t}\n\t\telse {\n\t\t\tsettings.scrollBarVis = scrollBarVis;\n\t\t}\n\t\n\t\t/*\n\t\t * 1. Re-create the table inside the scrolling div\n\t\t */\n\t\n\t\t// Remove the old minimised thead and tfoot elements in the inner table\n\t\ttable.children('thead, tfoot').remove();\n\t\n\t\tif ( footer ) {\n\t\t\tfooterCopy = footer.clone().prependTo( table );\n\t\t\tfooterTrgEls = footer.find('tr'); // the original tfoot is in its own table and must be sized\n\t\t\tfooterSrcEls = footerCopy.find('tr');\n\t\t}\n\t\n\t\t// Clone the current header and footer elements and then place it into the inner table\n\t\theaderCopy = header.clone().prependTo( table );\n\t\theaderTrgEls = header.find('tr'); // original header is in its own table\n\t\theaderSrcEls = headerCopy.find('tr');\n\t\theaderCopy.find('th, td').removeAttr('tabindex');\n\t\n\t\n\t\t/*\n\t\t * 2. Take live measurements from the DOM - do not alter the DOM itself!\n\t\t */\n\t\n\t\t// Remove old sizing and apply the calculated column widths\n\t\t// Get the unique column headers in the newly created (cloned) header. We want to apply the\n\t\t// calculated sizes to this header\n\t\tif ( ! scrollX )\n\t\t{\n\t\t\tdivBodyStyle.width = '100%';\n\t\t\tdivHeader[0].style.width = '100%';\n\t\t}\n\t\n\t\t$.each( _fnGetUniqueThs( settings, headerCopy ), function ( i, el ) {\n\t\t\tidx = _fnVisibleToColumnIndex( settings, i );\n\t\t\tel.style.width = settings.aoColumns[idx].sWidth;\n\t\t} );\n\t\n\t\tif ( footer ) {\n\t\t\t_fnApplyToChildren( function(n) {\n\t\t\t\tn.style.width = \"\";\n\t\t\t}, footerSrcEls );\n\t\t}\n\t\n\t\t// Size the table as a whole\n\t\tsanityWidth = table.outerWidth();\n\t\tif ( scrollX === \"\" ) {\n\t\t\t// No x scrolling\n\t\t\ttableStyle.width = \"100%\";\n\t\n\t\t\t// IE7 will make the width of the table when 100% include the scrollbar\n\t\t\t// - which is shouldn't. When there is a scrollbar we need to take this\n\t\t\t// into account.\n\t\t\tif ( ie67 && (table.find('tbody').height() > divBodyEl.offsetHeight ||\n\t\t\t\tdivBody.css('overflow-y') == \"scroll\")\n\t\t\t) {\n\t\t\t\ttableStyle.width = _fnStringToCss( table.outerWidth() - barWidth);\n\t\t\t}\n\t\n\t\t\t// Recalculate the sanity width\n\t\t\tsanityWidth = table.outerWidth();\n\t\t}\n\t\telse if ( scrollXInner !== \"\" ) {\n\t\t\t// legacy x scroll inner has been given - use it\n\t\t\ttableStyle.width = _fnStringToCss(scrollXInner);\n\t\n\t\t\t// Recalculate the sanity width\n\t\t\tsanityWidth = table.outerWidth();\n\t\t}\n\t\n\t\t// Hidden header should have zero height, so remove padding and borders. Then\n\t\t// set the width based on the real headers\n\t\n\t\t// Apply all styles in one pass\n\t\t_fnApplyToChildren( zeroOut, headerSrcEls );\n\t\n\t\t// Read all widths in next pass\n\t\t_fnApplyToChildren( function(nSizer) {\n\t\t\theaderContent.push( nSizer.innerHTML );\n\t\t\theaderWidths.push( _fnStringToCss( $(nSizer).css('width') ) );\n\t\t}, headerSrcEls );\n\t\n\t\t// Apply all widths in final pass\n\t\t_fnApplyToChildren( function(nToSize, i) {\n\t\t\t// Only apply widths to the DataTables detected header cells - this\n\t\t\t// prevents complex headers from having contradictory sizes applied\n\t\t\tif ( $.inArray( nToSize, dtHeaderCells ) !== -1 ) {\n\t\t\t\tnToSize.style.width = headerWidths[i];\n\t\t\t}\n\t\t}, headerTrgEls );\n\t\n\t\t$(headerSrcEls).height(0);\n\t\n\t\t/* Same again with the footer if we have one */\n\t\tif ( footer )\n\t\t{\n\t\t\t_fnApplyToChildren( zeroOut, footerSrcEls );\n\t\n\t\t\t_fnApplyToChildren( function(nSizer) {\n\t\t\t\tfooterContent.push( nSizer.innerHTML );\n\t\t\t\tfooterWidths.push( _fnStringToCss( $(nSizer).css('width') ) );\n\t\t\t}, footerSrcEls );\n\t\n\t\t\t_fnApplyToChildren( function(nToSize, i) {\n\t\t\t\tnToSize.style.width = footerWidths[i];\n\t\t\t}, footerTrgEls );\n\t\n\t\t\t$(footerSrcEls).height(0);\n\t\t}\n\t\n\t\n\t\t/*\n\t\t * 3. Apply the measurements\n\t\t */\n\t\n\t\t// \"Hide\" the header and footer that we used for the sizing. We need to keep\n\t\t// the content of the cell so that the width applied to the header and body\n\t\t// both match, but we want to hide it completely. We want to also fix their\n\t\t// width to what they currently are\n\t\t_fnApplyToChildren( function(nSizer, i) {\n\t\t\tnSizer.innerHTML = '<div class=\"dataTables_sizing\" style=\"height:0;overflow:hidden;\">'+headerContent[i]+'</div>';\n\t\t\tnSizer.style.width = headerWidths[i];\n\t\t}, headerSrcEls );\n\t\n\t\tif ( footer )\n\t\t{\n\t\t\t_fnApplyToChildren( function(nSizer, i) {\n\t\t\t\tnSizer.innerHTML = '<div class=\"dataTables_sizing\" style=\"height:0;overflow:hidden;\">'+footerContent[i]+'</div>';\n\t\t\t\tnSizer.style.width = footerWidths[i];\n\t\t\t}, footerSrcEls );\n\t\t}\n\t\n\t\t// Sanity check that the table is of a sensible width. If not then we are going to get\n\t\t// misalignment - try to prevent this by not allowing the table to shrink below its min width\n\t\tif ( table.outerWidth() < sanityWidth )\n\t\t{\n\t\t\t// The min width depends upon if we have a vertical scrollbar visible or not */\n\t\t\tcorrection = ((divBodyEl.scrollHeight > divBodyEl.offsetHeight ||\n\t\t\t\tdivBody.css('overflow-y') == \"scroll\")) ?\n\t\t\t\t\tsanityWidth+barWidth :\n\t\t\t\t\tsanityWidth;\n\t\n\t\t\t// IE6/7 are a law unto themselves...\n\t\t\tif ( ie67 && (divBodyEl.scrollHeight >\n\t\t\t\tdivBodyEl.offsetHeight || divBody.css('overflow-y') == \"scroll\")\n\t\t\t) {\n\t\t\t\ttableStyle.width = _fnStringToCss( correction-barWidth );\n\t\t\t}\n\t\n\t\t\t// And give the user a warning that we've stopped the table getting too small\n\t\t\tif ( scrollX === \"\" || scrollXInner !== \"\" ) {\n\t\t\t\t_fnLog( settings, 1, 'Possible column misalignment', 6 );\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcorrection = '100%';\n\t\t}\n\t\n\t\t// Apply to the container elements\n\t\tdivBodyStyle.width = _fnStringToCss( correction );\n\t\tdivHeaderStyle.width = _fnStringToCss( correction );\n\t\n\t\tif ( footer ) {\n\t\t\tsettings.nScrollFoot.style.width = _fnStringToCss( correction );\n\t\t}\n\t\n\t\n\t\t/*\n\t\t * 4. Clean up\n\t\t */\n\t\tif ( ! scrollY ) {\n\t\t\t/* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting\n\t\t\t * the scrollbar height from the visible display, rather than adding it on. We need to\n\t\t\t * set the height in order to sort this. Don't want to do it in any other browsers.\n\t\t\t */\n\t\t\tif ( ie67 ) {\n\t\t\t\tdivBodyStyle.height = _fnStringToCss( tableEl.offsetHeight+barWidth );\n\t\t\t}\n\t\t}\n\t\n\t\t/* Finally set the width's of the header and footer tables */\n\t\tvar iOuterWidth = table.outerWidth();\n\t\tdivHeaderTable[0].style.width = _fnStringToCss( iOuterWidth );\n\t\tdivHeaderInnerStyle.width = _fnStringToCss( iOuterWidth );\n\t\n\t\t// Figure out if there are scrollbar present - if so then we need a the header and footer to\n\t\t// provide a bit more space to allow \"overflow\" scrolling (i.e. past the scrollbar)\n\t\tvar bScrolling = table.height() > divBodyEl.clientHeight || divBody.css('overflow-y') == \"scroll\";\n\t\tvar padding = 'padding' + (browser.bScrollbarLeft ? 'Left' : 'Right' );\n\t\tdivHeaderInnerStyle[ padding ] = bScrolling ? barWidth+\"px\" : \"0px\";\n\t\n\t\tif ( footer ) {\n\t\t\tdivFooterTable[0].style.width = _fnStringToCss( iOuterWidth );\n\t\t\tdivFooterInner[0].style.width = _fnStringToCss( iOuterWidth );\n\t\t\tdivFooterInner[0].style[padding] = bScrolling ? barWidth+\"px\" : \"0px\";\n\t\t}\n\t\n\t\t// Correct DOM ordering for colgroup - comes before the thead\n\t\ttable.children('colgroup').insertBefore( table.children('thead') );\n\t\n\t\t/* Adjust the position of the header in case we loose the y-scrollbar */\n\t\tdivBody.scroll();\n\t\n\t\t// If sorting or filtering has occurred, jump the scrolling back to the top\n\t\t// only if we aren't holding the position\n\t\tif ( (settings.bSorted || settings.bFiltered) && ! settings._drawHold ) {\n\t\t\tdivBodyEl.scrollTop = 0;\n\t\t}\n\t}\n\t\n\t\n\t\n\t/**\n\t * Apply a given function to the display child nodes of an element array (typically\n\t * TD children of TR rows\n\t *  @param {function} fn Method to apply to the objects\n\t *  @param array {nodes} an1 List of elements to look through for display children\n\t *  @param array {nodes} an2 Another list (identical structure to the first) - optional\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnApplyToChildren( fn, an1, an2 )\n\t{\n\t\tvar index=0, i=0, iLen=an1.length;\n\t\tvar nNode1, nNode2;\n\t\n\t\twhile ( i < iLen ) {\n\t\t\tnNode1 = an1[i].firstChild;\n\t\t\tnNode2 = an2 ? an2[i].firstChild : null;\n\t\n\t\t\twhile ( nNode1 ) {\n\t\t\t\tif ( nNode1.nodeType === 1 ) {\n\t\t\t\t\tif ( an2 ) {\n\t\t\t\t\t\tfn( nNode1, nNode2, index );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfn( nNode1, index );\n\t\t\t\t\t}\n\t\n\t\t\t\t\tindex++;\n\t\t\t\t}\n\t\n\t\t\t\tnNode1 = nNode1.nextSibling;\n\t\t\t\tnNode2 = an2 ? nNode2.nextSibling : null;\n\t\t\t}\n\t\n\t\t\ti++;\n\t\t}\n\t}\n\t\n\t\n\t\n\tvar __re_html_remove = /<.*?>/g;\n\t\n\t\n\t/**\n\t * Calculate the width of columns for the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCalculateColumnWidths ( oSettings )\n\t{\n\t\tvar\n\t\t\ttable = oSettings.nTable,\n\t\t\tcolumns = oSettings.aoColumns,\n\t\t\tscroll = oSettings.oScroll,\n\t\t\tscrollY = scroll.sY,\n\t\t\tscrollX = scroll.sX,\n\t\t\tscrollXInner = scroll.sXInner,\n\t\t\tcolumnCount = columns.length,\n\t\t\tvisibleColumns = _fnGetColumns( oSettings, 'bVisible' ),\n\t\t\theaderCells = $('th', oSettings.nTHead),\n\t\t\ttableWidthAttr = table.getAttribute('width'), // from DOM element\n\t\t\ttableContainer = table.parentNode,\n\t\t\tuserInputs = false,\n\t\t\ti, column, columnIdx, width, outerWidth,\n\t\t\tbrowser = oSettings.oBrowser,\n\t\t\tie67 = browser.bScrollOversize;\n\t\n\t\tvar styleWidth = table.style.width;\n\t\tif ( styleWidth && styleWidth.indexOf('%') !== -1 ) {\n\t\t\ttableWidthAttr = styleWidth;\n\t\t}\n\t\n\t\t/* Convert any user input sizes into pixel sizes */\n\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\tcolumn = columns[ visibleColumns[i] ];\n\t\n\t\t\tif ( column.sWidth !== null ) {\n\t\t\t\tcolumn.sWidth = _fnConvertToWidth( column.sWidthOrig, tableContainer );\n\t\n\t\t\t\tuserInputs = true;\n\t\t\t}\n\t\t}\n\t\n\t\t/* If the number of columns in the DOM equals the number that we have to\n\t\t * process in DataTables, then we can use the offsets that are created by\n\t\t * the web- browser. No custom sizes can be set in order for this to happen,\n\t\t * nor scrolling used\n\t\t */\n\t\tif ( ie67 || ! userInputs && ! scrollX && ! scrollY &&\n\t\t     columnCount == _fnVisbleColumns( oSettings ) &&\n\t\t     columnCount == headerCells.length\n\t\t) {\n\t\t\tfor ( i=0 ; i<columnCount ; i++ ) {\n\t\t\t\tvar colIdx = _fnVisibleToColumnIndex( oSettings, i );\n\t\n\t\t\t\tif ( colIdx !== null ) {\n\t\t\t\t\tcolumns[ colIdx ].sWidth = _fnStringToCss( headerCells.eq(i).width() );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Otherwise construct a single row, worst case, table with the widest\n\t\t\t// node in the data, assign any user defined widths, then insert it into\n\t\t\t// the DOM and allow the browser to do all the hard work of calculating\n\t\t\t// table widths\n\t\t\tvar tmpTable = $(table).clone() // don't use cloneNode - IE8 will remove events on the main table\n\t\t\t\t.css( 'visibility', 'hidden' )\n\t\t\t\t.removeAttr( 'id' );\n\t\n\t\t\t// Clean up the table body\n\t\t\ttmpTable.find('tbody tr').remove();\n\t\t\tvar tr = $('<tr/>').appendTo( tmpTable.find('tbody') );\n\t\n\t\t\t// Clone the table header and footer - we can't use the header / footer\n\t\t\t// from the cloned table, since if scrolling is active, the table's\n\t\t\t// real header and footer are contained in different table tags\n\t\t\ttmpTable.find('thead, tfoot').remove();\n\t\t\ttmpTable\n\t\t\t\t.append( $(oSettings.nTHead).clone() )\n\t\t\t\t.append( $(oSettings.nTFoot).clone() );\n\t\n\t\t\t// Remove any assigned widths from the footer (from scrolling)\n\t\t\ttmpTable.find('tfoot th, tfoot td').css('width', '');\n\t\n\t\t\t// Apply custom sizing to the cloned header\n\t\t\theaderCells = _fnGetUniqueThs( oSettings, tmpTable.find('thead')[0] );\n\t\n\t\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\t\tcolumn = columns[ visibleColumns[i] ];\n\t\n\t\t\t\theaderCells[i].style.width = column.sWidthOrig !== null && column.sWidthOrig !== '' ?\n\t\t\t\t\t_fnStringToCss( column.sWidthOrig ) :\n\t\t\t\t\t'';\n\t\n\t\t\t\t// For scrollX we need to force the column width otherwise the\n\t\t\t\t// browser will collapse it. If this width is smaller than the\n\t\t\t\t// width the column requires, then it will have no effect\n\t\t\t\tif ( column.sWidthOrig && scrollX ) {\n\t\t\t\t\t$( headerCells[i] ).append( $('<div/>').css( {\n\t\t\t\t\t\twidth: column.sWidthOrig,\n\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\theight: 1\n\t\t\t\t\t} ) );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Find the widest cell for each column and put it into the table\n\t\t\tif ( oSettings.aoData.length ) {\n\t\t\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\t\t\tcolumnIdx = visibleColumns[i];\n\t\t\t\t\tcolumn = columns[ columnIdx ];\n\t\n\t\t\t\t\t$( _fnGetWidestNode( oSettings, columnIdx ) )\n\t\t\t\t\t\t.clone( false )\n\t\t\t\t\t\t.append( column.sContentPadding )\n\t\t\t\t\t\t.appendTo( tr );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Tidy the temporary table - remove name attributes so there aren't\n\t\t\t// duplicated in the dom (radio elements for example)\n\t\t\t$('[name]', tmpTable).removeAttr('name');\n\t\n\t\t\t// Table has been built, attach to the document so we can work with it.\n\t\t\t// A holding element is used, positioned at the top of the container\n\t\t\t// with minimal height, so it has no effect on if the container scrolls\n\t\t\t// or not. Otherwise it might trigger scrolling when it actually isn't\n\t\t\t// needed\n\t\t\tvar holder = $('<div/>').css( scrollX || scrollY ?\n\t\t\t\t\t{\n\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\theight: 1,\n\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\toverflow: 'hidden'\n\t\t\t\t\t} :\n\t\t\t\t\t{}\n\t\t\t\t)\n\t\t\t\t.append( tmpTable )\n\t\t\t\t.appendTo( tableContainer );\n\t\n\t\t\t// When scrolling (X or Y) we want to set the width of the table as \n\t\t\t// appropriate. However, when not scrolling leave the table width as it\n\t\t\t// is. This results in slightly different, but I think correct behaviour\n\t\t\tif ( scrollX && scrollXInner ) {\n\t\t\t\ttmpTable.width( scrollXInner );\n\t\t\t}\n\t\t\telse if ( scrollX ) {\n\t\t\t\ttmpTable.css( 'width', 'auto' );\n\t\t\t\ttmpTable.removeAttr('width');\n\t\n\t\t\t\t// If there is no width attribute or style, then allow the table to\n\t\t\t\t// collapse\n\t\t\t\tif ( tmpTable.width() < tableContainer.clientWidth && tableWidthAttr ) {\n\t\t\t\t\ttmpTable.width( tableContainer.clientWidth );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( scrollY ) {\n\t\t\t\ttmpTable.width( tableContainer.clientWidth );\n\t\t\t}\n\t\t\telse if ( tableWidthAttr ) {\n\t\t\t\ttmpTable.width( tableWidthAttr );\n\t\t\t}\n\t\n\t\t\t// Get the width of each column in the constructed table - we need to\n\t\t\t// know the inner width (so it can be assigned to the other table's\n\t\t\t// cells) and the outer width so we can calculate the full width of the\n\t\t\t// table. This is safe since DataTables requires a unique cell for each\n\t\t\t// column, but if ever a header can span multiple columns, this will\n\t\t\t// need to be modified.\n\t\t\tvar total = 0;\n\t\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\t\tvar cell = $(headerCells[i]);\n\t\t\t\tvar border = cell.outerWidth() - cell.width();\n\t\n\t\t\t\t// Use getBounding... where possible (not IE8-) because it can give\n\t\t\t\t// sub-pixel accuracy, which we then want to round up!\n\t\t\t\tvar bounding = browser.bBounding ?\n\t\t\t\t\tMath.ceil( headerCells[i].getBoundingClientRect().width ) :\n\t\t\t\t\tcell.outerWidth();\n\t\n\t\t\t\t// Total is tracked to remove any sub-pixel errors as the outerWidth\n\t\t\t\t// of the table might not equal the total given here (IE!).\n\t\t\t\ttotal += bounding;\n\t\n\t\t\t\t// Width for each column to use\n\t\t\t\tcolumns[ visibleColumns[i] ].sWidth = _fnStringToCss( bounding - border );\n\t\t\t}\n\t\n\t\t\ttable.style.width = _fnStringToCss( total );\n\t\n\t\t\t// Finished with the table - ditch it\n\t\t\tholder.remove();\n\t\t}\n\t\n\t\t// If there is a width attr, we want to attach an event listener which\n\t\t// allows the table sizing to automatically adjust when the window is\n\t\t// resized. Use the width attr rather than CSS, since we can't know if the\n\t\t// CSS is a relative value or absolute - DOM read is always px.\n\t\tif ( tableWidthAttr ) {\n\t\t\ttable.style.width = _fnStringToCss( tableWidthAttr );\n\t\t}\n\t\n\t\tif ( (tableWidthAttr || scrollX) && ! oSettings._reszEvt ) {\n\t\t\tvar bindResize = function () {\n\t\t\t\t$(window).on('resize.DT-'+oSettings.sInstance, _fnThrottle( function () {\n\t\t\t\t\t_fnAdjustColumnSizing( oSettings );\n\t\t\t\t} ) );\n\t\t\t};\n\t\n\t\t\t// IE6/7 will crash if we bind a resize event handler on page load.\n\t\t\t// To be removed in 1.11 which drops IE6/7 support\n\t\t\tif ( ie67 ) {\n\t\t\t\tsetTimeout( bindResize, 1000 );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbindResize();\n\t\t\t}\n\t\n\t\t\toSettings._reszEvt = true;\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Throttle the calls to a function. Arguments and context are maintained for\n\t * the throttled function\n\t *  @param {function} fn Function to be called\n\t *  @param {int} [freq=200] call frequency in mS\n\t *  @returns {function} wrapped function\n\t *  @memberof DataTable#oApi\n\t */\n\tvar _fnThrottle = DataTable.util.throttle;\n\t\n\t\n\t/**\n\t * Convert a CSS unit width to pixels (e.g. 2em)\n\t *  @param {string} width width to be converted\n\t *  @param {node} parent parent to get the with for (required for relative widths) - optional\n\t *  @returns {int} width in pixels\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnConvertToWidth ( width, parent )\n\t{\n\t\tif ( ! width ) {\n\t\t\treturn 0;\n\t\t}\n\t\n\t\tvar n = $('<div/>')\n\t\t\t.css( 'width', _fnStringToCss( width ) )\n\t\t\t.appendTo( parent || document.body );\n\t\n\t\tvar val = n[0].offsetWidth;\n\t\tn.remove();\n\t\n\t\treturn val;\n\t}\n\t\n\t\n\t/**\n\t * Get the widest node\n\t *  @param {object} settings dataTables settings object\n\t *  @param {int} colIdx column of interest\n\t *  @returns {node} widest table node\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetWidestNode( settings, colIdx )\n\t{\n\t\tvar idx = _fnGetMaxLenString( settings, colIdx );\n\t\tif ( idx < 0 ) {\n\t\t\treturn null;\n\t\t}\n\t\n\t\tvar data = settings.aoData[ idx ];\n\t\treturn ! data.nTr ? // Might not have been created when deferred rendering\n\t\t\t$('<td/>').html( _fnGetCellData( settings, idx, colIdx, 'display' ) )[0] :\n\t\t\tdata.anCells[ colIdx ];\n\t}\n\t\n\t\n\t/**\n\t * Get the maximum strlen for each data column\n\t *  @param {object} settings dataTables settings object\n\t *  @param {int} colIdx column of interest\n\t *  @returns {string} max string length for each column\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetMaxLenString( settings, colIdx )\n\t{\n\t\tvar s, max=-1, maxIdx = -1;\n\t\n\t\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\ts = _fnGetCellData( settings, i, colIdx, 'display' )+'';\n\t\t\ts = s.replace( __re_html_remove, '' );\n\t\t\ts = s.replace( /&nbsp;/g, ' ' );\n\t\n\t\t\tif ( s.length > max ) {\n\t\t\t\tmax = s.length;\n\t\t\t\tmaxIdx = i;\n\t\t\t}\n\t\t}\n\t\n\t\treturn maxIdx;\n\t}\n\t\n\t\n\t/**\n\t * Append a CSS unit (only if required) to a string\n\t *  @param {string} value to css-ify\n\t *  @returns {string} value with css unit\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnStringToCss( s )\n\t{\n\t\tif ( s === null ) {\n\t\t\treturn '0px';\n\t\t}\n\t\n\t\tif ( typeof s == 'number' ) {\n\t\t\treturn s < 0 ?\n\t\t\t\t'0px' :\n\t\t\t\ts+'px';\n\t\t}\n\t\n\t\t// Check it has a unit character already\n\t\treturn s.match(/\\d$/) ?\n\t\t\ts+'px' :\n\t\t\ts;\n\t}\n\t\n\t\n\t\n\tfunction _fnSortFlatten ( settings )\n\t{\n\t\tvar\n\t\t\ti, iLen, k, kLen,\n\t\t\taSort = [],\n\t\t\taiOrig = [],\n\t\t\taoColumns = settings.aoColumns,\n\t\t\taDataSort, iCol, sType, srcCol,\n\t\t\tfixed = settings.aaSortingFixed,\n\t\t\tfixedObj = $.isPlainObject( fixed ),\n\t\t\tnestedSort = [],\n\t\t\tadd = function ( a ) {\n\t\t\t\tif ( a.length && ! $.isArray( a[0] ) ) {\n\t\t\t\t\t// 1D array\n\t\t\t\t\tnestedSort.push( a );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// 2D array\n\t\t\t\t\t$.merge( nestedSort, a );\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t// Build the sort array, with pre-fix and post-fix options if they have been\n\t\t// specified\n\t\tif ( $.isArray( fixed ) ) {\n\t\t\tadd( fixed );\n\t\t}\n\t\n\t\tif ( fixedObj && fixed.pre ) {\n\t\t\tadd( fixed.pre );\n\t\t}\n\t\n\t\tadd( settings.aaSorting );\n\t\n\t\tif (fixedObj && fixed.post ) {\n\t\t\tadd( fixed.post );\n\t\t}\n\t\n\t\tfor ( i=0 ; i<nestedSort.length ; i++ )\n\t\t{\n\t\t\tsrcCol = nestedSort[i][0];\n\t\t\taDataSort = aoColumns[ srcCol ].aDataSort;\n\t\n\t\t\tfor ( k=0, kLen=aDataSort.length ; k<kLen ; k++ )\n\t\t\t{\n\t\t\t\tiCol = aDataSort[k];\n\t\t\t\tsType = aoColumns[ iCol ].sType || 'string';\n\t\n\t\t\t\tif ( nestedSort[i]._idx === undefined ) {\n\t\t\t\t\tnestedSort[i]._idx = $.inArray( nestedSort[i][1], aoColumns[iCol].asSorting );\n\t\t\t\t}\n\t\n\t\t\t\taSort.push( {\n\t\t\t\t\tsrc:       srcCol,\n\t\t\t\t\tcol:       iCol,\n\t\t\t\t\tdir:       nestedSort[i][1],\n\t\t\t\t\tindex:     nestedSort[i]._idx,\n\t\t\t\t\ttype:      sType,\n\t\t\t\t\tformatter: DataTable.ext.type.order[ sType+\"-pre\" ]\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t\n\t\treturn aSort;\n\t}\n\t\n\t/**\n\t * Change the order of the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t *  @todo This really needs split up!\n\t */\n\tfunction _fnSort ( oSettings )\n\t{\n\t\tvar\n\t\t\ti, ien, iLen, j, jLen, k, kLen,\n\t\t\tsDataType, nTh,\n\t\t\taiOrig = [],\n\t\t\toExtSort = DataTable.ext.type.order,\n\t\t\taoData = oSettings.aoData,\n\t\t\taoColumns = oSettings.aoColumns,\n\t\t\taDataSort, data, iCol, sType, oSort,\n\t\t\tformatters = 0,\n\t\t\tsortCol,\n\t\t\tdisplayMaster = oSettings.aiDisplayMaster,\n\t\t\taSort;\n\t\n\t\t// Resolve any column types that are unknown due to addition or invalidation\n\t\t// @todo Can this be moved into a 'data-ready' handler which is called when\n\t\t//   data is going to be used in the table?\n\t\t_fnColumnTypes( oSettings );\n\t\n\t\taSort = _fnSortFlatten( oSettings );\n\t\n\t\tfor ( i=0, ien=aSort.length ; i<ien ; i++ ) {\n\t\t\tsortCol = aSort[i];\n\t\n\t\t\t// Track if we can use the fast sort algorithm\n\t\t\tif ( sortCol.formatter ) {\n\t\t\t\tformatters++;\n\t\t\t}\n\t\n\t\t\t// Load the data needed for the sort, for each cell\n\t\t\t_fnSortData( oSettings, sortCol.col );\n\t\t}\n\t\n\t\t/* No sorting required if server-side or no sorting array */\n\t\tif ( _fnDataSource( oSettings ) != 'ssp' && aSort.length !== 0 )\n\t\t{\n\t\t\t// Create a value - key array of the current row positions such that we can use their\n\t\t\t// current position during the sort, if values match, in order to perform stable sorting\n\t\t\tfor ( i=0, iLen=displayMaster.length ; i<iLen ; i++ ) {\n\t\t\t\taiOrig[ displayMaster[i] ] = i;\n\t\t\t}\n\t\n\t\t\t/* Do the sort - here we want multi-column sorting based on a given data source (column)\n\t\t\t * and sorting function (from oSort) in a certain direction. It's reasonably complex to\n\t\t\t * follow on it's own, but this is what we want (example two column sorting):\n\t\t\t *  fnLocalSorting = function(a,b){\n\t\t\t *    var iTest;\n\t\t\t *    iTest = oSort['string-asc']('data11', 'data12');\n\t\t\t *      if (iTest !== 0)\n\t\t\t *        return iTest;\n\t\t\t *    iTest = oSort['numeric-desc']('data21', 'data22');\n\t\t\t *    if (iTest !== 0)\n\t\t\t *      return iTest;\n\t\t\t *    return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );\n\t\t\t *  }\n\t\t\t * Basically we have a test for each sorting column, if the data in that column is equal,\n\t\t\t * test the next column. If all columns match, then we use a numeric sort on the row\n\t\t\t * positions in the original data array to provide a stable sort.\n\t\t\t *\n\t\t\t * Note - I know it seems excessive to have two sorting methods, but the first is around\n\t\t\t * 15% faster, so the second is only maintained for backwards compatibility with sorting\n\t\t\t * methods which do not have a pre-sort formatting function.\n\t\t\t */\n\t\t\tif ( formatters === aSort.length ) {\n\t\t\t\t// All sort types have formatting functions\n\t\t\t\tdisplayMaster.sort( function ( a, b ) {\n\t\t\t\t\tvar\n\t\t\t\t\t\tx, y, k, test, sort,\n\t\t\t\t\t\tlen=aSort.length,\n\t\t\t\t\t\tdataA = aoData[a]._aSortData,\n\t\t\t\t\t\tdataB = aoData[b]._aSortData;\n\t\n\t\t\t\t\tfor ( k=0 ; k<len ; k++ ) {\n\t\t\t\t\t\tsort = aSort[k];\n\t\n\t\t\t\t\t\tx = dataA[ sort.col ];\n\t\t\t\t\t\ty = dataB[ sort.col ];\n\t\n\t\t\t\t\t\ttest = x<y ? -1 : x>y ? 1 : 0;\n\t\t\t\t\t\tif ( test !== 0 ) {\n\t\t\t\t\t\t\treturn sort.dir === 'asc' ? test : -test;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tx = aiOrig[a];\n\t\t\t\t\ty = aiOrig[b];\n\t\t\t\t\treturn x<y ? -1 : x>y ? 1 : 0;\n\t\t\t\t} );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Depreciated - remove in 1.11 (providing a plug-in option)\n\t\t\t\t// Not all sort types have formatting methods, so we have to call their sorting\n\t\t\t\t// methods.\n\t\t\t\tdisplayMaster.sort( function ( a, b ) {\n\t\t\t\t\tvar\n\t\t\t\t\t\tx, y, k, l, test, sort, fn,\n\t\t\t\t\t\tlen=aSort.length,\n\t\t\t\t\t\tdataA = aoData[a]._aSortData,\n\t\t\t\t\t\tdataB = aoData[b]._aSortData;\n\t\n\t\t\t\t\tfor ( k=0 ; k<len ; k++ ) {\n\t\t\t\t\t\tsort = aSort[k];\n\t\n\t\t\t\t\t\tx = dataA[ sort.col ];\n\t\t\t\t\t\ty = dataB[ sort.col ];\n\t\n\t\t\t\t\t\tfn = oExtSort[ sort.type+\"-\"+sort.dir ] || oExtSort[ \"string-\"+sort.dir ];\n\t\t\t\t\t\ttest = fn( x, y );\n\t\t\t\t\t\tif ( test !== 0 ) {\n\t\t\t\t\t\t\treturn test;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tx = aiOrig[a];\n\t\t\t\t\ty = aiOrig[b];\n\t\t\t\t\treturn x<y ? -1 : x>y ? 1 : 0;\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t\n\t\t/* Tell the draw function that we have sorted the data */\n\t\toSettings.bSorted = true;\n\t}\n\t\n\t\n\tfunction _fnSortAria ( settings )\n\t{\n\t\tvar label;\n\t\tvar nextSort;\n\t\tvar columns = settings.aoColumns;\n\t\tvar aSort = _fnSortFlatten( settings );\n\t\tvar oAria = settings.oLanguage.oAria;\n\t\n\t\t// ARIA attributes - need to loop all columns, to update all (removing old\n\t\t// attributes as needed)\n\t\tfor ( var i=0, iLen=columns.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tvar col = columns[i];\n\t\t\tvar asSorting = col.asSorting;\n\t\t\tvar sTitle = col.sTitle.replace( /<.*?>/g, \"\" );\n\t\t\tvar th = col.nTh;\n\t\n\t\t\t// IE7 is throwing an error when setting these properties with jQuery's\n\t\t\t// attr() and removeAttr() methods...\n\t\t\tth.removeAttribute('aria-sort');\n\t\n\t\t\t/* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */\n\t\t\tif ( col.bSortable ) {\n\t\t\t\tif ( aSort.length > 0 && aSort[0].col == i ) {\n\t\t\t\t\tth.setAttribute('aria-sort', aSort[0].dir==\"asc\" ? \"ascending\" : \"descending\" );\n\t\t\t\t\tnextSort = asSorting[ aSort[0].index+1 ] || asSorting[0];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tnextSort = asSorting[0];\n\t\t\t\t}\n\t\n\t\t\t\tlabel = sTitle + ( nextSort === \"asc\" ?\n\t\t\t\t\toAria.sSortAscending :\n\t\t\t\t\toAria.sSortDescending\n\t\t\t\t);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlabel = sTitle;\n\t\t\t}\n\t\n\t\t\tth.setAttribute('aria-label', label);\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Function to run on user sort request\n\t *  @param {object} settings dataTables settings object\n\t *  @param {node} attachTo node to attach the handler to\n\t *  @param {int} colIdx column sorting index\n\t *  @param {boolean} [append=false] Append the requested sort to the existing\n\t *    sort if true (i.e. multi-column sort)\n\t *  @param {function} [callback] callback function\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSortListener ( settings, colIdx, append, callback )\n\t{\n\t\tvar col = settings.aoColumns[ colIdx ];\n\t\tvar sorting = settings.aaSorting;\n\t\tvar asSorting = col.asSorting;\n\t\tvar nextSortIdx;\n\t\tvar next = function ( a, overflow ) {\n\t\t\tvar idx = a._idx;\n\t\t\tif ( idx === undefined ) {\n\t\t\t\tidx = $.inArray( a[1], asSorting );\n\t\t\t}\n\t\n\t\t\treturn idx+1 < asSorting.length ?\n\t\t\t\tidx+1 :\n\t\t\t\toverflow ?\n\t\t\t\t\tnull :\n\t\t\t\t\t0;\n\t\t};\n\t\n\t\t// Convert to 2D array if needed\n\t\tif ( typeof sorting[0] === 'number' ) {\n\t\t\tsorting = settings.aaSorting = [ sorting ];\n\t\t}\n\t\n\t\t// If appending the sort then we are multi-column sorting\n\t\tif ( append && settings.oFeatures.bSortMulti ) {\n\t\t\t// Are we already doing some kind of sort on this column?\n\t\t\tvar sortIdx = $.inArray( colIdx, _pluck(sorting, '0') );\n\t\n\t\t\tif ( sortIdx !== -1 ) {\n\t\t\t\t// Yes, modify the sort\n\t\t\t\tnextSortIdx = next( sorting[sortIdx], true );\n\t\n\t\t\t\tif ( nextSortIdx === null && sorting.length === 1 ) {\n\t\t\t\t\tnextSortIdx = 0; // can't remove sorting completely\n\t\t\t\t}\n\t\n\t\t\t\tif ( nextSortIdx === null ) {\n\t\t\t\t\tsorting.splice( sortIdx, 1 );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tsorting[sortIdx][1] = asSorting[ nextSortIdx ];\n\t\t\t\t\tsorting[sortIdx]._idx = nextSortIdx;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// No sort on this column yet\n\t\t\t\tsorting.push( [ colIdx, asSorting[0], 0 ] );\n\t\t\t\tsorting[sorting.length-1]._idx = 0;\n\t\t\t}\n\t\t}\n\t\telse if ( sorting.length && sorting[0][0] == colIdx ) {\n\t\t\t// Single column - already sorting on this column, modify the sort\n\t\t\tnextSortIdx = next( sorting[0] );\n\t\n\t\t\tsorting.length = 1;\n\t\t\tsorting[0][1] = asSorting[ nextSortIdx ];\n\t\t\tsorting[0]._idx = nextSortIdx;\n\t\t}\n\t\telse {\n\t\t\t// Single column - sort only on this column\n\t\t\tsorting.length = 0;\n\t\t\tsorting.push( [ colIdx, asSorting[0] ] );\n\t\t\tsorting[0]._idx = 0;\n\t\t}\n\t\n\t\t// Run the sort by calling a full redraw\n\t\t_fnReDraw( settings );\n\t\n\t\t// callback used for async user interaction\n\t\tif ( typeof callback == 'function' ) {\n\t\t\tcallback( settings );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Attach a sort handler (click) to a node\n\t *  @param {object} settings dataTables settings object\n\t *  @param {node} attachTo node to attach the handler to\n\t *  @param {int} colIdx column sorting index\n\t *  @param {function} [callback] callback function\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSortAttachListener ( settings, attachTo, colIdx, callback )\n\t{\n\t\tvar col = settings.aoColumns[ colIdx ];\n\t\n\t\t_fnBindAction( attachTo, {}, function (e) {\n\t\t\t/* If the column is not sortable - don't to anything */\n\t\t\tif ( col.bSortable === false ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// If processing is enabled use a timeout to allow the processing\n\t\t\t// display to be shown - otherwise to it synchronously\n\t\t\tif ( settings.oFeatures.bProcessing ) {\n\t\t\t\t_fnProcessingDisplay( settings, true );\n\t\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t_fnSortListener( settings, colIdx, e.shiftKey, callback );\n\t\n\t\t\t\t\t// In server-side processing, the draw callback will remove the\n\t\t\t\t\t// processing display\n\t\t\t\t\tif ( _fnDataSource( settings ) !== 'ssp' ) {\n\t\t\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t\t\t}\n\t\t\t\t}, 0 );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_fnSortListener( settings, colIdx, e.shiftKey, callback );\n\t\t\t}\n\t\t} );\n\t}\n\t\n\t\n\t/**\n\t * Set the sorting classes on table's body, Note: it is safe to call this function\n\t * when bSort and bSortClasses are false\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSortingClasses( settings )\n\t{\n\t\tvar oldSort = settings.aLastSort;\n\t\tvar sortClass = settings.oClasses.sSortColumn;\n\t\tvar sort = _fnSortFlatten( settings );\n\t\tvar features = settings.oFeatures;\n\t\tvar i, ien, colIdx;\n\t\n\t\tif ( features.bSort && features.bSortClasses ) {\n\t\t\t// Remove old sorting classes\n\t\t\tfor ( i=0, ien=oldSort.length ; i<ien ; i++ ) {\n\t\t\t\tcolIdx = oldSort[i].src;\n\t\n\t\t\t\t// Remove column sorting\n\t\t\t\t$( _pluck( settings.aoData, 'anCells', colIdx ) )\n\t\t\t\t\t.removeClass( sortClass + (i<2 ? i+1 : 3) );\n\t\t\t}\n\t\n\t\t\t// Add new column sorting\n\t\t\tfor ( i=0, ien=sort.length ; i<ien ; i++ ) {\n\t\t\t\tcolIdx = sort[i].src;\n\t\n\t\t\t\t$( _pluck( settings.aoData, 'anCells', colIdx ) )\n\t\t\t\t\t.addClass( sortClass + (i<2 ? i+1 : 3) );\n\t\t\t}\n\t\t}\n\t\n\t\tsettings.aLastSort = sort;\n\t}\n\t\n\t\n\t// Get the data to sort a column, be it from cache, fresh (populating the\n\t// cache), or from a sort formatter\n\tfunction _fnSortData( settings, idx )\n\t{\n\t\t// Custom sorting function - provided by the sort data type\n\t\tvar column = settings.aoColumns[ idx ];\n\t\tvar customSort = DataTable.ext.order[ column.sSortDataType ];\n\t\tvar customData;\n\t\n\t\tif ( customSort ) {\n\t\t\tcustomData = customSort.call( settings.oInstance, settings, idx,\n\t\t\t\t_fnColumnIndexToVisible( settings, idx )\n\t\t\t);\n\t\t}\n\t\n\t\t// Use / populate cache\n\t\tvar row, cellData;\n\t\tvar formatter = DataTable.ext.type.order[ column.sType+\"-pre\" ];\n\t\n\t\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\trow = settings.aoData[i];\n\t\n\t\t\tif ( ! row._aSortData ) {\n\t\t\t\trow._aSortData = [];\n\t\t\t}\n\t\n\t\t\tif ( ! row._aSortData[idx] || customSort ) {\n\t\t\t\tcellData = customSort ?\n\t\t\t\t\tcustomData[i] : // If there was a custom sort function, use data from there\n\t\t\t\t\t_fnGetCellData( settings, i, idx, 'sort' );\n\t\n\t\t\t\trow._aSortData[ idx ] = formatter ?\n\t\t\t\t\tformatter( cellData ) :\n\t\t\t\t\tcellData;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t\n\t/**\n\t * Save the state of a table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSaveState ( settings )\n\t{\n\t\tif ( !settings.oFeatures.bStateSave || settings.bDestroying )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\n\t\t/* Store the interesting variables */\n\t\tvar state = {\n\t\t\ttime:    +new Date(),\n\t\t\tstart:   settings._iDisplayStart,\n\t\t\tlength:  settings._iDisplayLength,\n\t\t\torder:   $.extend( true, [], settings.aaSorting ),\n\t\t\tsearch:  _fnSearchToCamel( settings.oPreviousSearch ),\n\t\t\tcolumns: $.map( settings.aoColumns, function ( col, i ) {\n\t\t\t\treturn {\n\t\t\t\t\tvisible: col.bVisible,\n\t\t\t\t\tsearch: _fnSearchToCamel( settings.aoPreSearchCols[i] )\n\t\t\t\t};\n\t\t\t} )\n\t\t};\n\t\n\t\t_fnCallbackFire( settings, \"aoStateSaveParams\", 'stateSaveParams', [settings, state] );\n\t\n\t\tsettings.oSavedState = state;\n\t\tsettings.fnStateSaveCallback.call( settings.oInstance, settings, state );\n\t}\n\t\n\t\n\t/**\n\t * Attempt to load a saved table state\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {object} oInit DataTables init object so we can override settings\n\t *  @param {function} callback Callback to execute when the state has been loaded\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnLoadState ( settings, oInit, callback )\n\t{\n\t\tvar i, ien;\n\t\tvar columns = settings.aoColumns;\n\t\tvar loaded = function ( s ) {\n\t\t\tif ( ! s || ! s.time ) {\n\t\t\t\tcallback();\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// Allow custom and plug-in manipulation functions to alter the saved data set and\n\t\t\t// cancelling of loading by returning false\n\t\t\tvar abStateLoad = _fnCallbackFire( settings, 'aoStateLoadParams', 'stateLoadParams', [settings, s] );\n\t\t\tif ( $.inArray( false, abStateLoad ) !== -1 ) {\n\t\t\t\tcallback();\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// Reject old data\n\t\t\tvar duration = settings.iStateDuration;\n\t\t\tif ( duration > 0 && s.time < +new Date() - (duration*1000) ) {\n\t\t\t\tcallback();\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// Number of columns have changed - all bets are off, no restore of settings\n\t\t\tif ( s.columns && columns.length !== s.columns.length ) {\n\t\t\t\tcallback();\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// Store the saved state so it might be accessed at any time\n\t\t\tsettings.oLoadedState = $.extend( true, {}, s );\n\t\n\t\t\t// Restore key features - todo - for 1.11 this needs to be done by\n\t\t\t// subscribed events\n\t\t\tif ( s.start !== undefined ) {\n\t\t\t\tsettings._iDisplayStart    = s.start;\n\t\t\t\tsettings.iInitDisplayStart = s.start;\n\t\t\t}\n\t\t\tif ( s.length !== undefined ) {\n\t\t\t\tsettings._iDisplayLength   = s.length;\n\t\t\t}\n\t\n\t\t\t// Order\n\t\t\tif ( s.order !== undefined ) {\n\t\t\t\tsettings.aaSorting = [];\n\t\t\t\t$.each( s.order, function ( i, col ) {\n\t\t\t\t\tsettings.aaSorting.push( col[0] >= columns.length ?\n\t\t\t\t\t\t[ 0, col[1] ] :\n\t\t\t\t\t\tcol\n\t\t\t\t\t);\n\t\t\t\t} );\n\t\t\t}\n\t\n\t\t\t// Search\n\t\t\tif ( s.search !== undefined ) {\n\t\t\t\t$.extend( settings.oPreviousSearch, _fnSearchToHung( s.search ) );\n\t\t\t}\n\t\n\t\t\t// Columns\n\t\t\t//\n\t\t\tif ( s.columns ) {\n\t\t\t\tfor ( i=0, ien=s.columns.length ; i<ien ; i++ ) {\n\t\t\t\t\tvar col = s.columns[i];\n\t\n\t\t\t\t\t// Visibility\n\t\t\t\t\tif ( col.visible !== undefined ) {\n\t\t\t\t\t\tcolumns[i].bVisible = col.visible;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Search\n\t\t\t\t\tif ( col.search !== undefined ) {\n\t\t\t\t\t\t$.extend( settings.aoPreSearchCols[i], _fnSearchToHung( col.search ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t_fnCallbackFire( settings, 'aoStateLoaded', 'stateLoaded', [settings, s] );\n\t\t\tcallback();\n\t\t}\n\t\n\t\tif ( ! settings.oFeatures.bStateSave ) {\n\t\t\tcallback();\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar state = settings.fnStateLoadCallback.call( settings.oInstance, settings, loaded );\n\t\n\t\tif ( state !== undefined ) {\n\t\t\tloaded( state );\n\t\t}\n\t\t// otherwise, wait for the loaded callback to be executed\n\t}\n\t\n\t\n\t/**\n\t * Return the settings object for a particular table\n\t *  @param {node} table table we are using as a dataTable\n\t *  @returns {object} Settings object - or null if not found\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSettingsFromNode ( table )\n\t{\n\t\tvar settings = DataTable.settings;\n\t\tvar idx = $.inArray( table, _pluck( settings, 'nTable' ) );\n\t\n\t\treturn idx !== -1 ?\n\t\t\tsettings[ idx ] :\n\t\t\tnull;\n\t}\n\t\n\t\n\t/**\n\t * Log an error message\n\t *  @param {object} settings dataTables settings object\n\t *  @param {int} level log error messages, or display them to the user\n\t *  @param {string} msg error message\n\t *  @param {int} tn Technical note id to get more information about the error.\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnLog( settings, level, msg, tn )\n\t{\n\t\tmsg = 'DataTables warning: '+\n\t\t\t(settings ? 'table id='+settings.sTableId+' - ' : '')+msg;\n\t\n\t\tif ( tn ) {\n\t\t\tmsg += '. For more information about this error, please see '+\n\t\t\t'http://datatables.net/tn/'+tn;\n\t\t}\n\t\n\t\tif ( ! level  ) {\n\t\t\t// Backwards compatibility pre 1.10\n\t\t\tvar ext = DataTable.ext;\n\t\t\tvar type = ext.sErrMode || ext.errMode;\n\t\n\t\t\tif ( settings ) {\n\t\t\t\t_fnCallbackFire( settings, null, 'error', [ settings, tn, msg ] );\n\t\t\t}\n\t\n\t\t\tif ( type == 'alert' ) {\n\t\t\t\talert( msg );\n\t\t\t}\n\t\t\telse if ( type == 'throw' ) {\n\t\t\t\tthrow new Error(msg);\n\t\t\t}\n\t\t\telse if ( typeof type == 'function' ) {\n\t\t\t\ttype( settings, tn, msg );\n\t\t\t}\n\t\t}\n\t\telse if ( window.console && console.log ) {\n\t\t\tconsole.log( msg );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * See if a property is defined on one object, if so assign it to the other object\n\t *  @param {object} ret target object\n\t *  @param {object} src source object\n\t *  @param {string} name property\n\t *  @param {string} [mappedName] name to map too - optional, name used if not given\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnMap( ret, src, name, mappedName )\n\t{\n\t\tif ( $.isArray( name ) ) {\n\t\t\t$.each( name, function (i, val) {\n\t\t\t\tif ( $.isArray( val ) ) {\n\t\t\t\t\t_fnMap( ret, src, val[0], val[1] );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t_fnMap( ret, src, val );\n\t\t\t\t}\n\t\t\t} );\n\t\n\t\t\treturn;\n\t\t}\n\t\n\t\tif ( mappedName === undefined ) {\n\t\t\tmappedName = name;\n\t\t}\n\t\n\t\tif ( src[name] !== undefined ) {\n\t\t\tret[mappedName] = src[name];\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Extend objects - very similar to jQuery.extend, but deep copy objects, and\n\t * shallow copy arrays. The reason we need to do this, is that we don't want to\n\t * deep copy array init values (such as aaSorting) since the dev wouldn't be\n\t * able to override them, but we do want to deep copy arrays.\n\t *  @param {object} out Object to extend\n\t *  @param {object} extender Object from which the properties will be applied to\n\t *      out\n\t *  @param {boolean} breakRefs If true, then arrays will be sliced to take an\n\t *      independent copy with the exception of the `data` or `aaData` parameters\n\t *      if they are present. This is so you can pass in a collection to\n\t *      DataTables and have that used as your data source without breaking the\n\t *      references\n\t *  @returns {object} out Reference, just for convenience - out === the return.\n\t *  @memberof DataTable#oApi\n\t *  @todo This doesn't take account of arrays inside the deep copied objects.\n\t */\n\tfunction _fnExtend( out, extender, breakRefs )\n\t{\n\t\tvar val;\n\t\n\t\tfor ( var prop in extender ) {\n\t\t\tif ( extender.hasOwnProperty(prop) ) {\n\t\t\t\tval = extender[prop];\n\t\n\t\t\t\tif ( $.isPlainObject( val ) ) {\n\t\t\t\t\tif ( ! $.isPlainObject( out[prop] ) ) {\n\t\t\t\t\t\tout[prop] = {};\n\t\t\t\t\t}\n\t\t\t\t\t$.extend( true, out[prop], val );\n\t\t\t\t}\n\t\t\t\telse if ( breakRefs && prop !== 'data' && prop !== 'aaData' && $.isArray(val) ) {\n\t\t\t\t\tout[prop] = val.slice();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tout[prop] = val;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\treturn out;\n\t}\n\t\n\t\n\t/**\n\t * Bind an event handers to allow a click or return key to activate the callback.\n\t * This is good for accessibility since a return on the keyboard will have the\n\t * same effect as a click, if the element has focus.\n\t *  @param {element} n Element to bind the action to\n\t *  @param {object} oData Data object to pass to the triggered function\n\t *  @param {function} fn Callback function for when the event is triggered\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnBindAction( n, oData, fn )\n\t{\n\t\t$(n)\n\t\t\t.on( 'click.DT', oData, function (e) {\n\t\t\t\t\tn.blur(); // Remove focus outline for mouse users\n\t\t\t\t\tfn(e);\n\t\t\t\t} )\n\t\t\t.on( 'keypress.DT', oData, function (e){\n\t\t\t\t\tif ( e.which === 13 ) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tfn(e);\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t\t.on( 'selectstart.DT', function () {\n\t\t\t\t\t/* Take the brutal approach to cancelling text selection */\n\t\t\t\t\treturn false;\n\t\t\t\t} );\n\t}\n\t\n\t\n\t/**\n\t * Register a callback function. Easily allows a callback function to be added to\n\t * an array store of callback functions that can then all be called together.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {string} sStore Name of the array storage for the callbacks in oSettings\n\t *  @param {function} fn Function to be called back\n\t *  @param {string} sName Identifying name for the callback (i.e. a label)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCallbackReg( oSettings, sStore, fn, sName )\n\t{\n\t\tif ( fn )\n\t\t{\n\t\t\toSettings[sStore].push( {\n\t\t\t\t\"fn\": fn,\n\t\t\t\t\"sName\": sName\n\t\t\t} );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Fire callback functions and trigger events. Note that the loop over the\n\t * callback array store is done backwards! Further note that you do not want to\n\t * fire off triggers in time sensitive applications (for example cell creation)\n\t * as its slow.\n\t *  @param {object} settings dataTables settings object\n\t *  @param {string} callbackArr Name of the array storage for the callbacks in\n\t *      oSettings\n\t *  @param {string} eventName Name of the jQuery custom event to trigger. If\n\t *      null no trigger is fired\n\t *  @param {array} args Array of arguments to pass to the callback function /\n\t *      trigger\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCallbackFire( settings, callbackArr, eventName, args )\n\t{\n\t\tvar ret = [];\n\t\n\t\tif ( callbackArr ) {\n\t\t\tret = $.map( settings[callbackArr].slice().reverse(), function (val, i) {\n\t\t\t\treturn val.fn.apply( settings.oInstance, args );\n\t\t\t} );\n\t\t}\n\t\n\t\tif ( eventName !== null ) {\n\t\t\tvar e = $.Event( eventName+'.dt' );\n\t\n\t\t\t$(settings.nTable).trigger( e, args );\n\t\n\t\t\tret.push( e.result );\n\t\t}\n\t\n\t\treturn ret;\n\t}\n\t\n\t\n\tfunction _fnLengthOverflow ( settings )\n\t{\n\t\tvar\n\t\t\tstart = settings._iDisplayStart,\n\t\t\tend = settings.fnDisplayEnd(),\n\t\t\tlen = settings._iDisplayLength;\n\t\n\t\t/* If we have space to show extra rows (backing up from the end point - then do so */\n\t\tif ( start >= end )\n\t\t{\n\t\t\tstart = end - len;\n\t\t}\n\t\n\t\t// Keep the start record on the current page\n\t\tstart -= (start % len);\n\t\n\t\tif ( len === -1 || start < 0 )\n\t\t{\n\t\t\tstart = 0;\n\t\t}\n\t\n\t\tsettings._iDisplayStart = start;\n\t}\n\t\n\t\n\tfunction _fnRenderer( settings, type )\n\t{\n\t\tvar renderer = settings.renderer;\n\t\tvar host = DataTable.ext.renderer[type];\n\t\n\t\tif ( $.isPlainObject( renderer ) && renderer[type] ) {\n\t\t\t// Specific renderer for this type. If available use it, otherwise use\n\t\t\t// the default.\n\t\t\treturn host[renderer[type]] || host._;\n\t\t}\n\t\telse if ( typeof renderer === 'string' ) {\n\t\t\t// Common renderer - if there is one available for this type use it,\n\t\t\t// otherwise use the default\n\t\t\treturn host[renderer] || host._;\n\t\t}\n\t\n\t\t// Use the default\n\t\treturn host._;\n\t}\n\t\n\t\n\t/**\n\t * Detect the data source being used for the table. Used to simplify the code\n\t * a little (ajax) and to make it compress a little smaller.\n\t *\n\t *  @param {object} settings dataTables settings object\n\t *  @returns {string} Data source\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDataSource ( settings )\n\t{\n\t\tif ( settings.oFeatures.bServerSide ) {\n\t\t\treturn 'ssp';\n\t\t}\n\t\telse if ( settings.ajax || settings.sAjaxSource ) {\n\t\t\treturn 'ajax';\n\t\t}\n\t\treturn 'dom';\n\t}\n\t\n\n\t\n\t\n\t/**\n\t * Computed structure of the DataTables API, defined by the options passed to\n\t * `DataTable.Api.register()` when building the API.\n\t *\n\t * The structure is built in order to speed creation and extension of the Api\n\t * objects since the extensions are effectively pre-parsed.\n\t *\n\t * The array is an array of objects with the following structure, where this\n\t * base array represents the Api prototype base:\n\t *\n\t *     [\n\t *       {\n\t *         name:      'data'                -- string   - Property name\n\t *         val:       function () {},       -- function - Api method (or undefined if just an object\n\t *         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result\n\t *         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property\n\t *       },\n\t *       {\n\t *         name:     'row'\n\t *         val:       {},\n\t *         methodExt: [ ... ],\n\t *         propExt:   [\n\t *           {\n\t *             name:      'data'\n\t *             val:       function () {},\n\t *             methodExt: [ ... ],\n\t *             propExt:   [ ... ]\n\t *           },\n\t *           ...\n\t *         ]\n\t *       }\n\t *     ]\n\t *\n\t * @type {Array}\n\t * @ignore\n\t */\n\tvar __apiStruct = [];\n\t\n\t\n\t/**\n\t * `Array.prototype` reference.\n\t *\n\t * @type object\n\t * @ignore\n\t */\n\tvar __arrayProto = Array.prototype;\n\t\n\t\n\t/**\n\t * Abstraction for `context` parameter of the `Api` constructor to allow it to\n\t * take several different forms for ease of use.\n\t *\n\t * Each of the input parameter types will be converted to a DataTables settings\n\t * object where possible.\n\t *\n\t * @param  {string|node|jQuery|object} mixed DataTable identifier. Can be one\n\t *   of:\n\t *\n\t *   * `string` - jQuery selector. Any DataTables' matching the given selector\n\t *     with be found and used.\n\t *   * `node` - `TABLE` node which has already been formed into a DataTable.\n\t *   * `jQuery` - A jQuery object of `TABLE` nodes.\n\t *   * `object` - DataTables settings object\n\t *   * `DataTables.Api` - API instance\n\t * @return {array|null} Matching DataTables settings objects. `null` or\n\t *   `undefined` is returned if no matching DataTable is found.\n\t * @ignore\n\t */\n\tvar _toSettings = function ( mixed )\n\t{\n\t\tvar idx, jq;\n\t\tvar settings = DataTable.settings;\n\t\tvar tables = $.map( settings, function (el, i) {\n\t\t\treturn el.nTable;\n\t\t} );\n\t\n\t\tif ( ! mixed ) {\n\t\t\treturn [];\n\t\t}\n\t\telse if ( mixed.nTable && mixed.oApi ) {\n\t\t\t// DataTables settings object\n\t\t\treturn [ mixed ];\n\t\t}\n\t\telse if ( mixed.nodeName && mixed.nodeName.toLowerCase() === 'table' ) {\n\t\t\t// Table node\n\t\t\tidx = $.inArray( mixed, tables );\n\t\t\treturn idx !== -1 ? [ settings[idx] ] : null;\n\t\t}\n\t\telse if ( mixed && typeof mixed.settings === 'function' ) {\n\t\t\treturn mixed.settings().toArray();\n\t\t}\n\t\telse if ( typeof mixed === 'string' ) {\n\t\t\t// jQuery selector\n\t\t\tjq = $(mixed);\n\t\t}\n\t\telse if ( mixed instanceof $ ) {\n\t\t\t// jQuery object (also DataTables instance)\n\t\t\tjq = mixed;\n\t\t}\n\t\n\t\tif ( jq ) {\n\t\t\treturn jq.map( function(i) {\n\t\t\t\tidx = $.inArray( this, tables );\n\t\t\t\treturn idx !== -1 ? settings[idx] : null;\n\t\t\t} ).toArray();\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * DataTables API class - used to control and interface with  one or more\n\t * DataTables enhanced tables.\n\t *\n\t * The API class is heavily based on jQuery, presenting a chainable interface\n\t * that you can use to interact with tables. Each instance of the API class has\n\t * a \"context\" - i.e. the tables that it will operate on. This could be a single\n\t * table, all tables on a page or a sub-set thereof.\n\t *\n\t * Additionally the API is designed to allow you to easily work with the data in\n\t * the tables, retrieving and manipulating it as required. This is done by\n\t * presenting the API class as an array like interface. The contents of the\n\t * array depend upon the actions requested by each method (for example\n\t * `rows().nodes()` will return an array of nodes, while `rows().data()` will\n\t * return an array of objects or arrays depending upon your table's\n\t * configuration). The API object has a number of array like methods (`push`,\n\t * `pop`, `reverse` etc) as well as additional helper methods (`each`, `pluck`,\n\t * `unique` etc) to assist your working with the data held in a table.\n\t *\n\t * Most methods (those which return an Api instance) are chainable, which means\n\t * the return from a method call also has all of the methods available that the\n\t * top level object had. For example, these two calls are equivalent:\n\t *\n\t *     // Not chained\n\t *     api.row.add( {...} );\n\t *     api.draw();\n\t *\n\t *     // Chained\n\t *     api.row.add( {...} ).draw();\n\t *\n\t * @class DataTable.Api\n\t * @param {array|object|string|jQuery} context DataTable identifier. This is\n\t *   used to define which DataTables enhanced tables this API will operate on.\n\t *   Can be one of:\n\t *\n\t *   * `string` - jQuery selector. Any DataTables' matching the given selector\n\t *     with be found and used.\n\t *   * `node` - `TABLE` node which has already been formed into a DataTable.\n\t *   * `jQuery` - A jQuery object of `TABLE` nodes.\n\t *   * `object` - DataTables settings object\n\t * @param {array} [data] Data to initialise the Api instance with.\n\t *\n\t * @example\n\t *   // Direct initialisation during DataTables construction\n\t *   var api = $('#example').DataTable();\n\t *\n\t * @example\n\t *   // Initialisation using a DataTables jQuery object\n\t *   var api = $('#example').dataTable().api();\n\t *\n\t * @example\n\t *   // Initialisation as a constructor\n\t *   var api = new $.fn.DataTable.Api( 'table.dataTable' );\n\t */\n\t_Api = function ( context, data )\n\t{\n\t\tif ( ! (this instanceof _Api) ) {\n\t\t\treturn new _Api( context, data );\n\t\t}\n\t\n\t\tvar settings = [];\n\t\tvar ctxSettings = function ( o ) {\n\t\t\tvar a = _toSettings( o );\n\t\t\tif ( a ) {\n\t\t\t\tsettings = settings.concat( a );\n\t\t\t}\n\t\t};\n\t\n\t\tif ( $.isArray( context ) ) {\n\t\t\tfor ( var i=0, ien=context.length ; i<ien ; i++ ) {\n\t\t\t\tctxSettings( context[i] );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctxSettings( context );\n\t\t}\n\t\n\t\t// Remove duplicates\n\t\tthis.context = _unique( settings );\n\t\n\t\t// Initial data\n\t\tif ( data ) {\n\t\t\t$.merge( this, data );\n\t\t}\n\t\n\t\t// selector\n\t\tthis.selector = {\n\t\t\trows: null,\n\t\t\tcols: null,\n\t\t\topts: null\n\t\t};\n\t\n\t\t_Api.extend( this, this, __apiStruct );\n\t};\n\t\n\tDataTable.Api = _Api;\n\t\n\t// Don't destroy the existing prototype, just extend it. Required for jQuery 2's\n\t// isPlainObject.\n\t$.extend( _Api.prototype, {\n\t\tany: function ()\n\t\t{\n\t\t\treturn this.count() !== 0;\n\t\t},\n\t\n\t\n\t\tconcat:  __arrayProto.concat,\n\t\n\t\n\t\tcontext: [], // array of table settings objects\n\t\n\t\n\t\tcount: function ()\n\t\t{\n\t\t\treturn this.flatten().length;\n\t\t},\n\t\n\t\n\t\teach: function ( fn )\n\t\t{\n\t\t\tfor ( var i=0, ien=this.length ; i<ien; i++ ) {\n\t\t\t\tfn.call( this, this[i], i, this );\n\t\t\t}\n\t\n\t\t\treturn this;\n\t\t},\n\t\n\t\n\t\teq: function ( idx )\n\t\t{\n\t\t\tvar ctx = this.context;\n\t\n\t\t\treturn ctx.length > idx ?\n\t\t\t\tnew _Api( ctx[idx], this[idx] ) :\n\t\t\t\tnull;\n\t\t},\n\t\n\t\n\t\tfilter: function ( fn )\n\t\t{\n\t\t\tvar a = [];\n\t\n\t\t\tif ( __arrayProto.filter ) {\n\t\t\t\ta = __arrayProto.filter.call( this, fn, this );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Compatibility for browsers without EMCA-252-5 (JS 1.6)\n\t\t\t\tfor ( var i=0, ien=this.length ; i<ien ; i++ ) {\n\t\t\t\t\tif ( fn.call( this, this[i], i, this ) ) {\n\t\t\t\t\t\ta.push( this[i] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn new _Api( this.context, a );\n\t\t},\n\t\n\t\n\t\tflatten: function ()\n\t\t{\n\t\t\tvar a = [];\n\t\t\treturn new _Api( this.context, a.concat.apply( a, this.toArray() ) );\n\t\t},\n\t\n\t\n\t\tjoin:    __arrayProto.join,\n\t\n\t\n\t\tindexOf: __arrayProto.indexOf || function (obj, start)\n\t\t{\n\t\t\tfor ( var i=(start || 0), ien=this.length ; i<ien ; i++ ) {\n\t\t\t\tif ( this[i] === obj ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1;\n\t\t},\n\t\n\t\titerator: function ( flatten, type, fn, alwaysNew ) {\n\t\t\tvar\n\t\t\t\ta = [], ret,\n\t\t\t\ti, ien, j, jen,\n\t\t\t\tcontext = this.context,\n\t\t\t\trows, items, item,\n\t\t\t\tselector = this.selector;\n\t\n\t\t\t// Argument shifting\n\t\t\tif ( typeof flatten === 'string' ) {\n\t\t\t\talwaysNew = fn;\n\t\t\t\tfn = type;\n\t\t\t\ttype = flatten;\n\t\t\t\tflatten = false;\n\t\t\t}\n\t\n\t\t\tfor ( i=0, ien=context.length ; i<ien ; i++ ) {\n\t\t\t\tvar apiInst = new _Api( context[i] );\n\t\n\t\t\t\tif ( type === 'table' ) {\n\t\t\t\t\tret = fn.call( apiInst, context[i], i );\n\t\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\ta.push( ret );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ( type === 'columns' || type === 'rows' ) {\n\t\t\t\t\t// this has same length as context - one entry for each table\n\t\t\t\t\tret = fn.call( apiInst, context[i], this[i], i );\n\t\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\ta.push( ret );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ( type === 'column' || type === 'column-rows' || type === 'row' || type === 'cell' ) {\n\t\t\t\t\t// columns and rows share the same structure.\n\t\t\t\t\t// 'this' is an array of column indexes for each context\n\t\t\t\t\titems = this[i];\n\t\n\t\t\t\t\tif ( type === 'column-rows' ) {\n\t\t\t\t\t\trows = _selector_row_indexes( context[i], selector.opts );\n\t\t\t\t\t}\n\t\n\t\t\t\t\tfor ( j=0, jen=items.length ; j<jen ; j++ ) {\n\t\t\t\t\t\titem = items[j];\n\t\n\t\t\t\t\t\tif ( type === 'cell' ) {\n\t\t\t\t\t\t\tret = fn.call( apiInst, context[i], item.row, item.column, i, j );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tret = fn.call( apiInst, context[i], item, i, j, rows );\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\t\ta.push( ret );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tif ( a.length || alwaysNew ) {\n\t\t\t\tvar api = new _Api( context, flatten ? a.concat.apply( [], a ) : a );\n\t\t\t\tvar apiSelector = api.selector;\n\t\t\t\tapiSelector.rows = selector.rows;\n\t\t\t\tapiSelector.cols = selector.cols;\n\t\t\t\tapiSelector.opts = selector.opts;\n\t\t\t\treturn api;\n\t\t\t}\n\t\t\treturn this;\n\t\t},\n\t\n\t\n\t\tlastIndexOf: __arrayProto.lastIndexOf || function (obj, start)\n\t\t{\n\t\t\t// Bit cheeky...\n\t\t\treturn this.indexOf.apply( this.toArray.reverse(), arguments );\n\t\t},\n\t\n\t\n\t\tlength:  0,\n\t\n\t\n\t\tmap: function ( fn )\n\t\t{\n\t\t\tvar a = [];\n\t\n\t\t\tif ( __arrayProto.map ) {\n\t\t\t\ta = __arrayProto.map.call( this, fn, this );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Compatibility for browsers without EMCA-252-5 (JS 1.6)\n\t\t\t\tfor ( var i=0, ien=this.length ; i<ien ; i++ ) {\n\t\t\t\t\ta.push( fn.call( this, this[i], i ) );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn new _Api( this.context, a );\n\t\t},\n\t\n\t\n\t\tpluck: function ( prop )\n\t\t{\n\t\t\treturn this.map( function ( el ) {\n\t\t\t\treturn el[ prop ];\n\t\t\t} );\n\t\t},\n\t\n\t\tpop:     __arrayProto.pop,\n\t\n\t\n\t\tpush:    __arrayProto.push,\n\t\n\t\n\t\t// Does not return an API instance\n\t\treduce: __arrayProto.reduce || function ( fn, init )\n\t\t{\n\t\t\treturn _fnReduce( this, fn, init, 0, this.length, 1 );\n\t\t},\n\t\n\t\n\t\treduceRight: __arrayProto.reduceRight || function ( fn, init )\n\t\t{\n\t\t\treturn _fnReduce( this, fn, init, this.length-1, -1, -1 );\n\t\t},\n\t\n\t\n\t\treverse: __arrayProto.reverse,\n\t\n\t\n\t\t// Object with rows, columns and opts\n\t\tselector: null,\n\t\n\t\n\t\tshift:   __arrayProto.shift,\n\t\n\t\n\t\tslice: function () {\n\t\t\treturn new _Api( this.context, this );\n\t\t},\n\t\n\t\n\t\tsort:    __arrayProto.sort, // ? name - order?\n\t\n\t\n\t\tsplice:  __arrayProto.splice,\n\t\n\t\n\t\ttoArray: function ()\n\t\t{\n\t\t\treturn __arrayProto.slice.call( this );\n\t\t},\n\t\n\t\n\t\tto$: function ()\n\t\t{\n\t\t\treturn $( this );\n\t\t},\n\t\n\t\n\t\ttoJQuery: function ()\n\t\t{\n\t\t\treturn $( this );\n\t\t},\n\t\n\t\n\t\tunique: function ()\n\t\t{\n\t\t\treturn new _Api( this.context, _unique(this) );\n\t\t},\n\t\n\t\n\t\tunshift: __arrayProto.unshift\n\t} );\n\t\n\t\n\t_Api.extend = function ( scope, obj, ext )\n\t{\n\t\t// Only extend API instances and static properties of the API\n\t\tif ( ! ext.length || ! obj || ( ! (obj instanceof _Api) && ! obj.__dt_wrapper ) ) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar\n\t\t\ti, ien,\n\t\t\tj, jen,\n\t\t\tstruct, inner,\n\t\t\tmethodScoping = function ( scope, fn, struc ) {\n\t\t\t\treturn function () {\n\t\t\t\t\tvar ret = fn.apply( scope, arguments );\n\t\n\t\t\t\t\t// Method extension\n\t\t\t\t\t_Api.extend( ret, ret, struc.methodExt );\n\t\t\t\t\treturn ret;\n\t\t\t\t};\n\t\t\t};\n\t\n\t\tfor ( i=0, ien=ext.length ; i<ien ; i++ ) {\n\t\t\tstruct = ext[i];\n\t\n\t\t\t// Value\n\t\t\tobj[ struct.name ] = typeof struct.val === 'function' ?\n\t\t\t\tmethodScoping( scope, struct.val, struct ) :\n\t\t\t\t$.isPlainObject( struct.val ) ?\n\t\t\t\t\t{} :\n\t\t\t\t\tstruct.val;\n\t\n\t\t\tobj[ struct.name ].__dt_wrapper = true;\n\t\n\t\t\t// Property extension\n\t\t\t_Api.extend( scope, obj[ struct.name ], struct.propExt );\n\t\t}\n\t};\n\t\n\t\n\t// @todo - Is there need for an augment function?\n\t// _Api.augment = function ( inst, name )\n\t// {\n\t// \t// Find src object in the structure from the name\n\t// \tvar parts = name.split('.');\n\t\n\t// \t_Api.extend( inst, obj );\n\t// };\n\t\n\t\n\t//     [\n\t//       {\n\t//         name:      'data'                -- string   - Property name\n\t//         val:       function () {},       -- function - Api method (or undefined if just an object\n\t//         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result\n\t//         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property\n\t//       },\n\t//       {\n\t//         name:     'row'\n\t//         val:       {},\n\t//         methodExt: [ ... ],\n\t//         propExt:   [\n\t//           {\n\t//             name:      'data'\n\t//             val:       function () {},\n\t//             methodExt: [ ... ],\n\t//             propExt:   [ ... ]\n\t//           },\n\t//           ...\n\t//         ]\n\t//       }\n\t//     ]\n\t\n\t_Api.register = _api_register = function ( name, val )\n\t{\n\t\tif ( $.isArray( name ) ) {\n\t\t\tfor ( var j=0, jen=name.length ; j<jen ; j++ ) {\n\t\t\t\t_Api.register( name[j], val );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar\n\t\t\ti, ien,\n\t\t\their = name.split('.'),\n\t\t\tstruct = __apiStruct,\n\t\t\tkey, method;\n\t\n\t\tvar find = function ( src, name ) {\n\t\t\tfor ( var i=0, ien=src.length ; i<ien ; i++ ) {\n\t\t\t\tif ( src[i].name === name ) {\n\t\t\t\t\treturn src[i];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t};\n\t\n\t\tfor ( i=0, ien=heir.length ; i<ien ; i++ ) {\n\t\t\tmethod = heir[i].indexOf('()') !== -1;\n\t\t\tkey = method ?\n\t\t\t\their[i].replace('()', '') :\n\t\t\t\their[i];\n\t\n\t\t\tvar src = find( struct, key );\n\t\t\tif ( ! src ) {\n\t\t\t\tsrc = {\n\t\t\t\t\tname:      key,\n\t\t\t\t\tval:       {},\n\t\t\t\t\tmethodExt: [],\n\t\t\t\t\tpropExt:   []\n\t\t\t\t};\n\t\t\t\tstruct.push( src );\n\t\t\t}\n\t\n\t\t\tif ( i === ien-1 ) {\n\t\t\t\tsrc.val = val;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tstruct = method ?\n\t\t\t\t\tsrc.methodExt :\n\t\t\t\t\tsrc.propExt;\n\t\t\t}\n\t\t}\n\t};\n\t\n\t\n\t_Api.registerPlural = _api_registerPlural = function ( pluralName, singularName, val ) {\n\t\t_Api.register( pluralName, val );\n\t\n\t\t_Api.register( singularName, function () {\n\t\t\tvar ret = val.apply( this, arguments );\n\t\n\t\t\tif ( ret === this ) {\n\t\t\t\t// Returned item is the API instance that was passed in, return it\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\telse if ( ret instanceof _Api ) {\n\t\t\t\t// New API instance returned, want the value from the first item\n\t\t\t\t// in the returned array for the singular result.\n\t\t\t\treturn ret.length ?\n\t\t\t\t\t$.isArray( ret[0] ) ?\n\t\t\t\t\t\tnew _Api( ret.context, ret[0] ) : // Array results are 'enhanced'\n\t\t\t\t\t\tret[0] :\n\t\t\t\t\tundefined;\n\t\t\t}\n\t\n\t\t\t// Non-API return - just fire it back\n\t\t\treturn ret;\n\t\t} );\n\t};\n\t\n\t\n\t/**\n\t * Selector for HTML tables. Apply the given selector to the give array of\n\t * DataTables settings objects.\n\t *\n\t * @param {string|integer} [selector] jQuery selector string or integer\n\t * @param  {array} Array of DataTables settings objects to be filtered\n\t * @return {array}\n\t * @ignore\n\t */\n\tvar __table_selector = function ( selector, a )\n\t{\n\t\t// Integer is used to pick out a table by index\n\t\tif ( typeof selector === 'number' ) {\n\t\t\treturn [ a[ selector ] ];\n\t\t}\n\t\n\t\t// Perform a jQuery selector on the table nodes\n\t\tvar nodes = $.map( a, function (el, i) {\n\t\t\treturn el.nTable;\n\t\t} );\n\t\n\t\treturn $(nodes)\n\t\t\t.filter( selector )\n\t\t\t.map( function (i) {\n\t\t\t\t// Need to translate back from the table node to the settings\n\t\t\t\tvar idx = $.inArray( this, nodes );\n\t\t\t\treturn a[ idx ];\n\t\t\t} )\n\t\t\t.toArray();\n\t};\n\t\n\t\n\t\n\t/**\n\t * Context selector for the API's context (i.e. the tables the API instance\n\t * refers to.\n\t *\n\t * @name    DataTable.Api#tables\n\t * @param {string|integer} [selector] Selector to pick which tables the iterator\n\t *   should operate on. If not given, all tables in the current context are\n\t *   used. This can be given as a jQuery selector (for example `':gt(0)'`) to\n\t *   select multiple tables or as an integer to select a single table.\n\t * @returns {DataTable.Api} Returns a new API instance if a selector is given.\n\t */\n\t_api_register( 'tables()', function ( selector ) {\n\t\t// A new instance is created if there was a selector specified\n\t\treturn selector ?\n\t\t\tnew _Api( __table_selector( selector, this.context ) ) :\n\t\t\tthis;\n\t} );\n\t\n\t\n\t_api_register( 'table()', function ( selector ) {\n\t\tvar tables = this.tables( selector );\n\t\tvar ctx = tables.context;\n\t\n\t\t// Truncate to the first matched table\n\t\treturn ctx.length ?\n\t\t\tnew _Api( ctx[0] ) :\n\t\t\ttables;\n\t} );\n\t\n\t\n\t_api_registerPlural( 'tables().nodes()', 'table().node()' , function () {\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\treturn ctx.nTable;\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'tables().body()', 'table().body()' , function () {\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\treturn ctx.nTBody;\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'tables().header()', 'table().header()' , function () {\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\treturn ctx.nTHead;\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'tables().footer()', 'table().footer()' , function () {\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\treturn ctx.nTFoot;\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'tables().containers()', 'table().container()' , function () {\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\treturn ctx.nTableWrapper;\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t\n\t/**\n\t * Redraw the tables in the current context.\n\t */\n\t_api_register( 'draw()', function ( paging ) {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tif ( paging === 'page' ) {\n\t\t\t\t_fnDraw( settings );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif ( typeof paging === 'string' ) {\n\t\t\t\t\tpaging = paging === 'full-hold' ?\n\t\t\t\t\t\tfalse :\n\t\t\t\t\t\ttrue;\n\t\t\t\t}\n\t\n\t\t\t\t_fnReDraw( settings, paging===false );\n\t\t\t}\n\t\t} );\n\t} );\n\t\n\t\n\t\n\t/**\n\t * Get the current page index.\n\t *\n\t * @return {integer} Current page index (zero based)\n\t *//**\n\t * Set the current page.\n\t *\n\t * Note that if you attempt to show a page which does not exist, DataTables will\n\t * not throw an error, but rather reset the paging.\n\t *\n\t * @param {integer|string} action The paging action to take. This can be one of:\n\t *  * `integer` - The page index to jump to\n\t *  * `string` - An action to take:\n\t *    * `first` - Jump to first page.\n\t *    * `next` - Jump to the next page\n\t *    * `previous` - Jump to previous page\n\t *    * `last` - Jump to the last page.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'page()', function ( action ) {\n\t\tif ( action === undefined ) {\n\t\t\treturn this.page.info().page; // not an expensive call\n\t\t}\n\t\n\t\t// else, have an action to take on all tables\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnPageChange( settings, action );\n\t\t} );\n\t} );\n\t\n\t\n\t/**\n\t * Paging information for the first table in the current context.\n\t *\n\t * If you require paging information for another table, use the `table()` method\n\t * with a suitable selector.\n\t *\n\t * @return {object} Object with the following properties set:\n\t *  * `page` - Current page index (zero based - i.e. the first page is `0`)\n\t *  * `pages` - Total number of pages\n\t *  * `start` - Display index for the first record shown on the current page\n\t *  * `end` - Display index for the last record shown on the current page\n\t *  * `length` - Display length (number of records). Note that generally `start\n\t *    + length = end`, but this is not always true, for example if there are\n\t *    only 2 records to show on the final page, with a length of 10.\n\t *  * `recordsTotal` - Full data set length\n\t *  * `recordsDisplay` - Data set length once the current filtering criterion\n\t *    are applied.\n\t */\n\t_api_register( 'page.info()', function ( action ) {\n\t\tif ( this.context.length === 0 ) {\n\t\t\treturn undefined;\n\t\t}\n\t\n\t\tvar\n\t\t\tsettings   = this.context[0],\n\t\t\tstart      = settings._iDisplayStart,\n\t\t\tlen        = settings.oFeatures.bPaginate ? settings._iDisplayLength : -1,\n\t\t\tvisRecords = settings.fnRecordsDisplay(),\n\t\t\tall        = len === -1;\n\t\n\t\treturn {\n\t\t\t\"page\":           all ? 0 : Math.floor( start / len ),\n\t\t\t\"pages\":          all ? 1 : Math.ceil( visRecords / len ),\n\t\t\t\"start\":          start,\n\t\t\t\"end\":            settings.fnDisplayEnd(),\n\t\t\t\"length\":         len,\n\t\t\t\"recordsTotal\":   settings.fnRecordsTotal(),\n\t\t\t\"recordsDisplay\": visRecords,\n\t\t\t\"serverSide\":     _fnDataSource( settings ) === 'ssp'\n\t\t};\n\t} );\n\t\n\t\n\t/**\n\t * Get the current page length.\n\t *\n\t * @return {integer} Current page length. Note `-1` indicates that all records\n\t *   are to be shown.\n\t *//**\n\t * Set the current page length.\n\t *\n\t * @param {integer} Page length to set. Use `-1` to show all records.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'page.len()', function ( len ) {\n\t\t// Note that we can't call this function 'length()' because `length`\n\t\t// is a Javascript property of functions which defines how many arguments\n\t\t// the function expects.\n\t\tif ( len === undefined ) {\n\t\t\treturn this.context.length !== 0 ?\n\t\t\t\tthis.context[0]._iDisplayLength :\n\t\t\t\tundefined;\n\t\t}\n\t\n\t\t// else, set the page length\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnLengthChange( settings, len );\n\t\t} );\n\t} );\n\t\n\t\n\t\n\tvar __reload = function ( settings, holdPosition, callback ) {\n\t\t// Use the draw event to trigger a callback\n\t\tif ( callback ) {\n\t\t\tvar api = new _Api( settings );\n\t\n\t\t\tapi.one( 'draw', function () {\n\t\t\t\tcallback( api.ajax.json() );\n\t\t\t} );\n\t\t}\n\t\n\t\tif ( _fnDataSource( settings ) == 'ssp' ) {\n\t\t\t_fnReDraw( settings, holdPosition );\n\t\t}\n\t\telse {\n\t\t\t_fnProcessingDisplay( settings, true );\n\t\n\t\t\t// Cancel an existing request\n\t\t\tvar xhr = settings.jqXHR;\n\t\t\tif ( xhr && xhr.readyState !== 4 ) {\n\t\t\t\txhr.abort();\n\t\t\t}\n\t\n\t\t\t// Trigger xhr\n\t\t\t_fnBuildAjax( settings, [], function( json ) {\n\t\t\t\t_fnClearTable( settings );\n\t\n\t\t\t\tvar data = _fnAjaxDataSrc( settings, json );\n\t\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\t\t_fnAddData( settings, data[i] );\n\t\t\t\t}\n\t\n\t\t\t\t_fnReDraw( settings, holdPosition );\n\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t} );\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * Get the JSON response from the last Ajax request that DataTables made to the\n\t * server. Note that this returns the JSON from the first table in the current\n\t * context.\n\t *\n\t * @return {object} JSON received from the server.\n\t */\n\t_api_register( 'ajax.json()', function () {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( ctx.length > 0 ) {\n\t\t\treturn ctx[0].json;\n\t\t}\n\t\n\t\t// else return undefined;\n\t} );\n\t\n\t\n\t/**\n\t * Get the data submitted in the last Ajax request\n\t */\n\t_api_register( 'ajax.params()', function () {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( ctx.length > 0 ) {\n\t\t\treturn ctx[0].oAjaxData;\n\t\t}\n\t\n\t\t// else return undefined;\n\t} );\n\t\n\t\n\t/**\n\t * Reload tables from the Ajax data source. Note that this function will\n\t * automatically re-draw the table when the remote data has been loaded.\n\t *\n\t * @param {boolean} [reset=true] Reset (default) or hold the current paging\n\t *   position. A full re-sort and re-filter is performed when this method is\n\t *   called, which is why the pagination reset is the default action.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'ajax.reload()', function ( callback, resetPaging ) {\n\t\treturn this.iterator( 'table', function (settings) {\n\t\t\t__reload( settings, resetPaging===false, callback );\n\t\t} );\n\t} );\n\t\n\t\n\t/**\n\t * Get the current Ajax URL. Note that this returns the URL from the first\n\t * table in the current context.\n\t *\n\t * @return {string} Current Ajax source URL\n\t *//**\n\t * Set the Ajax URL. Note that this will set the URL for all tables in the\n\t * current context.\n\t *\n\t * @param {string} url URL to set.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'ajax.url()', function ( url ) {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( url === undefined ) {\n\t\t\t// get\n\t\t\tif ( ctx.length === 0 ) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tctx = ctx[0];\n\t\n\t\t\treturn ctx.ajax ?\n\t\t\t\t$.isPlainObject( ctx.ajax ) ?\n\t\t\t\t\tctx.ajax.url :\n\t\t\t\t\tctx.ajax :\n\t\t\t\tctx.sAjaxSource;\n\t\t}\n\t\n\t\t// set\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tif ( $.isPlainObject( settings.ajax ) ) {\n\t\t\t\tsettings.ajax.url = url;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsettings.ajax = url;\n\t\t\t}\n\t\t\t// No need to consider sAjaxSource here since DataTables gives priority\n\t\t\t// to `ajax` over `sAjaxSource`. So setting `ajax` here, renders any\n\t\t\t// value of `sAjaxSource` redundant.\n\t\t} );\n\t} );\n\t\n\t\n\t/**\n\t * Load data from the newly set Ajax URL. Note that this method is only\n\t * available when `ajax.url()` is used to set a URL. Additionally, this method\n\t * has the same effect as calling `ajax.reload()` but is provided for\n\t * convenience when setting a new URL. Like `ajax.reload()` it will\n\t * automatically redraw the table once the remote data has been loaded.\n\t *\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'ajax.url().load()', function ( callback, resetPaging ) {\n\t\t// Same as a reload, but makes sense to present it for easy access after a\n\t\t// url change\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\t__reload( ctx, resetPaging===false, callback );\n\t\t} );\n\t} );\n\t\n\t\n\t\n\t\n\tvar _selector_run = function ( type, selector, selectFn, settings, opts )\n\t{\n\t\tvar\n\t\t\tout = [], res,\n\t\t\ta, i, ien, j, jen,\n\t\t\tselectorType = typeof selector;\n\t\n\t\t// Can't just check for isArray here, as an API or jQuery instance might be\n\t\t// given with their array like look\n\t\tif ( ! selector || selectorType === 'string' || selectorType === 'function' || selector.length === undefined ) {\n\t\t\tselector = [ selector ];\n\t\t}\n\t\n\t\tfor ( i=0, ien=selector.length ; i<ien ; i++ ) {\n\t\t\t// Only split on simple strings - complex expressions will be jQuery selectors\n\t\t\ta = selector[i] && selector[i].split && ! selector[i].match(/[\\[\\(:]/) ?\n\t\t\t\tselector[i].split(',') :\n\t\t\t\t[ selector[i] ];\n\t\n\t\t\tfor ( j=0, jen=a.length ; j<jen ; j++ ) {\n\t\t\t\tres = selectFn( typeof a[j] === 'string' ? $.trim(a[j]) : a[j] );\n\t\n\t\t\t\tif ( res && res.length ) {\n\t\t\t\t\tout = out.concat( res );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\t// selector extensions\n\t\tvar ext = _ext.selector[ type ];\n\t\tif ( ext.length ) {\n\t\t\tfor ( i=0, ien=ext.length ; i<ien ; i++ ) {\n\t\t\t\tout = ext[i]( settings, opts, out );\n\t\t\t}\n\t\t}\n\t\n\t\treturn _unique( out );\n\t};\n\t\n\t\n\tvar _selector_opts = function ( opts )\n\t{\n\t\tif ( ! opts ) {\n\t\t\topts = {};\n\t\t}\n\t\n\t\t// Backwards compatibility for 1.9- which used the terminology filter rather\n\t\t// than search\n\t\tif ( opts.filter && opts.search === undefined ) {\n\t\t\topts.search = opts.filter;\n\t\t}\n\t\n\t\treturn $.extend( {\n\t\t\tsearch: 'none',\n\t\t\torder: 'current',\n\t\t\tpage: 'all'\n\t\t}, opts );\n\t};\n\t\n\t\n\tvar _selector_first = function ( inst )\n\t{\n\t\t// Reduce the API instance to the first item found\n\t\tfor ( var i=0, ien=inst.length ; i<ien ; i++ ) {\n\t\t\tif ( inst[i].length > 0 ) {\n\t\t\t\t// Assign the first element to the first item in the instance\n\t\t\t\t// and truncate the instance and context\n\t\t\t\tinst[0] = inst[i];\n\t\t\t\tinst[0].length = 1;\n\t\t\t\tinst.length = 1;\n\t\t\t\tinst.context = [ inst.context[i] ];\n\t\n\t\t\t\treturn inst;\n\t\t\t}\n\t\t}\n\t\n\t\t// Not found - return an empty instance\n\t\tinst.length = 0;\n\t\treturn inst;\n\t};\n\t\n\t\n\tvar _selector_row_indexes = function ( settings, opts )\n\t{\n\t\tvar\n\t\t\ti, ien, tmp, a=[],\n\t\t\tdisplayFiltered = settings.aiDisplay,\n\t\t\tdisplayMaster = settings.aiDisplayMaster;\n\t\n\t\tvar\n\t\t\tsearch = opts.search,  // none, applied, removed\n\t\t\torder  = opts.order,   // applied, current, index (original - compatibility with 1.9)\n\t\t\tpage   = opts.page;    // all, current\n\t\n\t\tif ( _fnDataSource( settings ) == 'ssp' ) {\n\t\t\t// In server-side processing mode, most options are irrelevant since\n\t\t\t// rows not shown don't exist and the index order is the applied order\n\t\t\t// Removed is a special case - for consistency just return an empty\n\t\t\t// array\n\t\t\treturn search === 'removed' ?\n\t\t\t\t[] :\n\t\t\t\t_range( 0, displayMaster.length );\n\t\t}\n\t\telse if ( page == 'current' ) {\n\t\t\t// Current page implies that order=current and fitler=applied, since it is\n\t\t\t// fairly senseless otherwise, regardless of what order and search actually\n\t\t\t// are\n\t\t\tfor ( i=settings._iDisplayStart, ien=settings.fnDisplayEnd() ; i<ien ; i++ ) {\n\t\t\t\ta.push( displayFiltered[i] );\n\t\t\t}\n\t\t}\n\t\telse if ( order == 'current' || order == 'applied' ) {\n\t\t\ta = search == 'none' ?\n\t\t\t\tdisplayMaster.slice() :                      // no search\n\t\t\t\tsearch == 'applied' ?\n\t\t\t\t\tdisplayFiltered.slice() :                // applied search\n\t\t\t\t\t$.map( displayMaster, function (el, i) { // removed search\n\t\t\t\t\t\treturn $.inArray( el, displayFiltered ) === -1 ? el : null;\n\t\t\t\t\t} );\n\t\t}\n\t\telse if ( order == 'index' || order == 'original' ) {\n\t\t\tfor ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\t\tif ( search == 'none' ) {\n\t\t\t\t\ta.push( i );\n\t\t\t\t}\n\t\t\t\telse { // applied | removed\n\t\t\t\t\ttmp = $.inArray( i, displayFiltered );\n\t\n\t\t\t\t\tif ((tmp === -1 && search == 'removed') ||\n\t\t\t\t\t\t(tmp >= 0   && search == 'applied') )\n\t\t\t\t\t{\n\t\t\t\t\t\ta.push( i );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\treturn a;\n\t};\n\t\n\t\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Rows\n\t *\n\t * {}          - no selector - use all available rows\n\t * {integer}   - row aoData index\n\t * {node}      - TR node\n\t * {string}    - jQuery selector to apply to the TR elements\n\t * {array}     - jQuery array of nodes, or simply an array of TR nodes\n\t *\n\t */\n\t\n\t\n\tvar __row_selector = function ( settings, selector, opts )\n\t{\n\t\tvar rows;\n\t\tvar run = function ( sel ) {\n\t\t\tvar selInt = _intVal( sel );\n\t\t\tvar i, ien;\n\t\n\t\t\t// Short cut - selector is a number and no options provided (default is\n\t\t\t// all records, so no need to check if the index is in there, since it\n\t\t\t// must be - dev error if the index doesn't exist).\n\t\t\tif ( selInt !== null && ! opts ) {\n\t\t\t\treturn [ selInt ];\n\t\t\t}\n\t\n\t\t\tif ( ! rows ) {\n\t\t\t\trows = _selector_row_indexes( settings, opts );\n\t\t\t}\n\t\n\t\t\tif ( selInt !== null && $.inArray( selInt, rows ) !== -1 ) {\n\t\t\t\t// Selector - integer\n\t\t\t\treturn [ selInt ];\n\t\t\t}\n\t\t\telse if ( sel === null || sel === undefined || sel === '' ) {\n\t\t\t\t// Selector - none\n\t\t\t\treturn rows;\n\t\t\t}\n\t\n\t\t\t// Selector - function\n\t\t\tif ( typeof sel === 'function' ) {\n\t\t\t\treturn $.map( rows, function (idx) {\n\t\t\t\t\tvar row = settings.aoData[ idx ];\n\t\t\t\t\treturn sel( idx, row._aData, row.nTr ) ? idx : null;\n\t\t\t\t} );\n\t\t\t}\n\t\n\t\t\t// Get nodes in the order from the `rows` array with null values removed\n\t\t\tvar nodes = _removeEmpty(\n\t\t\t\t_pluck_order( settings.aoData, rows, 'nTr' )\n\t\t\t);\n\t\n\t\t\t// Selector - node\n\t\t\tif ( sel.nodeName ) {\n\t\t\t\tif ( sel._DT_RowIndex !== undefined ) {\n\t\t\t\t\treturn [ sel._DT_RowIndex ]; // Property added by DT for fast lookup\n\t\t\t\t}\n\t\t\t\telse if ( sel._DT_CellIndex ) {\n\t\t\t\t\treturn [ sel._DT_CellIndex.row ];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tvar host = $(sel).closest('*[data-dt-row]');\n\t\t\t\t\treturn host.length ?\n\t\t\t\t\t\t[ host.data('dt-row') ] :\n\t\t\t\t\t\t[];\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// ID selector. Want to always be able to select rows by id, regardless\n\t\t\t// of if the tr element has been created or not, so can't rely upon\n\t\t\t// jQuery here - hence a custom implementation. This does not match\n\t\t\t// Sizzle's fast selector or HTML4 - in HTML5 the ID can be anything,\n\t\t\t// but to select it using a CSS selector engine (like Sizzle or\n\t\t\t// querySelect) it would need to need to be escaped for some characters.\n\t\t\t// DataTables simplifies this for row selectors since you can select\n\t\t\t// only a row. A # indicates an id any anything that follows is the id -\n\t\t\t// unescaped.\n\t\t\tif ( typeof sel === 'string' && sel.charAt(0) === '#' ) {\n\t\t\t\t// get row index from id\n\t\t\t\tvar rowObj = settings.aIds[ sel.replace( /^#/, '' ) ];\n\t\t\t\tif ( rowObj !== undefined ) {\n\t\t\t\t\treturn [ rowObj.idx ];\n\t\t\t\t}\n\t\n\t\t\t\t// need to fall through to jQuery in case there is DOM id that\n\t\t\t\t// matches\n\t\t\t}\n\t\n\t\t\t// Selector - jQuery selector string, array of nodes or jQuery object/\n\t\t\t// As jQuery's .filter() allows jQuery objects to be passed in filter,\n\t\t\t// it also allows arrays, so this will cope with all three options\n\t\t\treturn $(nodes)\n\t\t\t\t.filter( sel )\n\t\t\t\t.map( function () {\n\t\t\t\t\treturn this._DT_RowIndex;\n\t\t\t\t} )\n\t\t\t\t.toArray();\n\t\t};\n\t\n\t\treturn _selector_run( 'row', selector, run, settings, opts );\n\t};\n\t\n\t\n\t_api_register( 'rows()', function ( selector, opts ) {\n\t\t// argument shifting\n\t\tif ( selector === undefined ) {\n\t\t\tselector = '';\n\t\t}\n\t\telse if ( $.isPlainObject( selector ) ) {\n\t\t\topts = selector;\n\t\t\tselector = '';\n\t\t}\n\t\n\t\topts = _selector_opts( opts );\n\t\n\t\tvar inst = this.iterator( 'table', function ( settings ) {\n\t\t\treturn __row_selector( settings, selector, opts );\n\t\t}, 1 );\n\t\n\t\t// Want argument shifting here and in __row_selector?\n\t\tinst.selector.rows = selector;\n\t\tinst.selector.opts = opts;\n\t\n\t\treturn inst;\n\t} );\n\t\n\t_api_register( 'rows().nodes()', function () {\n\t\treturn this.iterator( 'row', function ( settings, row ) {\n\t\t\treturn settings.aoData[ row ].nTr || undefined;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_register( 'rows().data()', function () {\n\t\treturn this.iterator( true, 'rows', function ( settings, rows ) {\n\t\t\treturn _pluck_order( settings.aoData, rows, '_aData' );\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'rows().cache()', 'row().cache()', function ( type ) {\n\t\treturn this.iterator( 'row', function ( settings, row ) {\n\t\t\tvar r = settings.aoData[ row ];\n\t\t\treturn type === 'search' ? r._aFilterData : r._aSortData;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'rows().invalidate()', 'row().invalidate()', function ( src ) {\n\t\treturn this.iterator( 'row', function ( settings, row ) {\n\t\t\t_fnInvalidate( settings, row, src );\n\t\t} );\n\t} );\n\t\n\t_api_registerPlural( 'rows().indexes()', 'row().index()', function () {\n\t\treturn this.iterator( 'row', function ( settings, row ) {\n\t\t\treturn row;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'rows().ids()', 'row().id()', function ( hash ) {\n\t\tvar a = [];\n\t\tvar context = this.context;\n\t\n\t\t// `iterator` will drop undefined values, but in this case we want them\n\t\tfor ( var i=0, ien=context.length ; i<ien ; i++ ) {\n\t\t\tfor ( var j=0, jen=this[i].length ; j<jen ; j++ ) {\n\t\t\t\tvar id = context[i].rowIdFn( context[i].aoData[ this[i][j] ]._aData );\n\t\t\t\ta.push( (hash === true ? '#' : '' )+ id );\n\t\t\t}\n\t\t}\n\t\n\t\treturn new _Api( context, a );\n\t} );\n\t\n\t_api_registerPlural( 'rows().remove()', 'row().remove()', function () {\n\t\tvar that = this;\n\t\n\t\tthis.iterator( 'row', function ( settings, row, thatIdx ) {\n\t\t\tvar data = settings.aoData;\n\t\t\tvar rowData = data[ row ];\n\t\t\tvar i, ien, j, jen;\n\t\t\tvar loopRow, loopCells;\n\t\n\t\t\tdata.splice( row, 1 );\n\t\n\t\t\t// Update the cached indexes\n\t\t\tfor ( i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\tloopRow = data[i];\n\t\t\t\tloopCells = loopRow.anCells;\n\t\n\t\t\t\t// Rows\n\t\t\t\tif ( loopRow.nTr !== null ) {\n\t\t\t\t\tloopRow.nTr._DT_RowIndex = i;\n\t\t\t\t}\n\t\n\t\t\t\t// Cells\n\t\t\t\tif ( loopCells !== null ) {\n\t\t\t\t\tfor ( j=0, jen=loopCells.length ; j<jen ; j++ ) {\n\t\t\t\t\t\tloopCells[j]._DT_CellIndex.row = i;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Delete from the display arrays\n\t\t\t_fnDeleteIndex( settings.aiDisplayMaster, row );\n\t\t\t_fnDeleteIndex( settings.aiDisplay, row );\n\t\t\t_fnDeleteIndex( that[ thatIdx ], row, false ); // maintain local indexes\n\t\n\t\t\t// Check for an 'overflow' they case for displaying the table\n\t\t\t_fnLengthOverflow( settings );\n\t\n\t\t\t// Remove the row's ID reference if there is one\n\t\t\tvar id = settings.rowIdFn( rowData._aData );\n\t\t\tif ( id !== undefined ) {\n\t\t\t\tdelete settings.aIds[ id ];\n\t\t\t}\n\t\t} );\n\t\n\t\tthis.iterator( 'table', function ( settings ) {\n\t\t\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\t\tsettings.aoData[i].idx = i;\n\t\t\t}\n\t\t} );\n\t\n\t\treturn this;\n\t} );\n\t\n\t\n\t_api_register( 'rows.add()', function ( rows ) {\n\t\tvar newRows = this.iterator( 'table', function ( settings ) {\n\t\t\t\tvar row, i, ien;\n\t\t\t\tvar out = [];\n\t\n\t\t\t\tfor ( i=0, ien=rows.length ; i<ien ; i++ ) {\n\t\t\t\t\trow = rows[i];\n\t\n\t\t\t\t\tif ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {\n\t\t\t\t\t\tout.push( _fnAddTr( settings, row )[0] );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tout.push( _fnAddData( settings, row ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\treturn out;\n\t\t\t}, 1 );\n\t\n\t\t// Return an Api.rows() extended instance, so rows().nodes() etc can be used\n\t\tvar modRows = this.rows( -1 );\n\t\tmodRows.pop();\n\t\t$.merge( modRows, newRows );\n\t\n\t\treturn modRows;\n\t} );\n\t\n\t\n\t\n\t\n\t\n\t/**\n\t *\n\t */\n\t_api_register( 'row()', function ( selector, opts ) {\n\t\treturn _selector_first( this.rows( selector, opts ) );\n\t} );\n\t\n\t\n\t_api_register( 'row().data()', function ( data ) {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( data === undefined ) {\n\t\t\t// Get\n\t\t\treturn ctx.length && this.length ?\n\t\t\t\tctx[0].aoData[ this[0] ]._aData :\n\t\t\t\tundefined;\n\t\t}\n\t\n\t\t// Set\n\t\tctx[0].aoData[ this[0] ]._aData = data;\n\t\n\t\t// Automatically invalidate\n\t\t_fnInvalidate( ctx[0], this[0], 'data' );\n\t\n\t\treturn this;\n\t} );\n\t\n\t\n\t_api_register( 'row().node()', function () {\n\t\tvar ctx = this.context;\n\t\n\t\treturn ctx.length && this.length ?\n\t\t\tctx[0].aoData[ this[0] ].nTr || null :\n\t\t\tnull;\n\t} );\n\t\n\t\n\t_api_register( 'row.add()', function ( row ) {\n\t\t// Allow a jQuery object to be passed in - only a single row is added from\n\t\t// it though - the first element in the set\n\t\tif ( row instanceof $ && row.length ) {\n\t\t\trow = row[0];\n\t\t}\n\t\n\t\tvar rows = this.iterator( 'table', function ( settings ) {\n\t\t\tif ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {\n\t\t\t\treturn _fnAddTr( settings, row )[0];\n\t\t\t}\n\t\t\treturn _fnAddData( settings, row );\n\t\t} );\n\t\n\t\t// Return an Api.rows() extended instance, with the newly added row selected\n\t\treturn this.row( rows[0] );\n\t} );\n\t\n\t\n\t\n\tvar __details_add = function ( ctx, row, data, klass )\n\t{\n\t\t// Convert to array of TR elements\n\t\tvar rows = [];\n\t\tvar addRow = function ( r, k ) {\n\t\t\t// Recursion to allow for arrays of jQuery objects\n\t\t\tif ( $.isArray( r ) || r instanceof $ ) {\n\t\t\t\tfor ( var i=0, ien=r.length ; i<ien ; i++ ) {\n\t\t\t\t\taddRow( r[i], k );\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// If we get a TR element, then just add it directly - up to the dev\n\t\t\t// to add the correct number of columns etc\n\t\t\tif ( r.nodeName && r.nodeName.toLowerCase() === 'tr' ) {\n\t\t\t\trows.push( r );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Otherwise create a row with a wrapper\n\t\t\t\tvar created = $('<tr><td/></tr>').addClass( k );\n\t\t\t\t$('td', created)\n\t\t\t\t\t.addClass( k )\n\t\t\t\t\t.html( r )\n\t\t\t\t\t[0].colSpan = _fnVisbleColumns( ctx );\n\t\n\t\t\t\trows.push( created[0] );\n\t\t\t}\n\t\t};\n\t\n\t\taddRow( data, klass );\n\t\n\t\tif ( row._details ) {\n\t\t\trow._details.detach();\n\t\t}\n\t\n\t\trow._details = $(rows);\n\t\n\t\t// If the children were already shown, that state should be retained\n\t\tif ( row._detailsShow ) {\n\t\t\trow._details.insertAfter( row.nTr );\n\t\t}\n\t};\n\t\n\t\n\tvar __details_remove = function ( api, idx )\n\t{\n\t\tvar ctx = api.context;\n\t\n\t\tif ( ctx.length ) {\n\t\t\tvar row = ctx[0].aoData[ idx !== undefined ? idx : api[0] ];\n\t\n\t\t\tif ( row && row._details ) {\n\t\t\t\trow._details.remove();\n\t\n\t\t\t\trow._detailsShow = undefined;\n\t\t\t\trow._details = undefined;\n\t\t\t}\n\t\t}\n\t};\n\t\n\t\n\tvar __details_display = function ( api, show ) {\n\t\tvar ctx = api.context;\n\t\n\t\tif ( ctx.length && api.length ) {\n\t\t\tvar row = ctx[0].aoData[ api[0] ];\n\t\n\t\t\tif ( row._details ) {\n\t\t\t\trow._detailsShow = show;\n\t\n\t\t\t\tif ( show ) {\n\t\t\t\t\trow._details.insertAfter( row.nTr );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\trow._details.detach();\n\t\t\t\t}\n\t\n\t\t\t\t__details_events( ctx[0] );\n\t\t\t}\n\t\t}\n\t};\n\t\n\t\n\tvar __details_events = function ( settings )\n\t{\n\t\tvar api = new _Api( settings );\n\t\tvar namespace = '.dt.DT_details';\n\t\tvar drawEvent = 'draw'+namespace;\n\t\tvar colvisEvent = 'column-visibility'+namespace;\n\t\tvar destroyEvent = 'destroy'+namespace;\n\t\tvar data = settings.aoData;\n\t\n\t\tapi.off( drawEvent +' '+ colvisEvent +' '+ destroyEvent );\n\t\n\t\tif ( _pluck( data, '_details' ).length > 0 ) {\n\t\t\t// On each draw, insert the required elements into the document\n\t\t\tapi.on( drawEvent, function ( e, ctx ) {\n\t\t\t\tif ( settings !== ctx ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\tapi.rows( {page:'current'} ).eq(0).each( function (idx) {\n\t\t\t\t\t// Internal data grab\n\t\t\t\t\tvar row = data[ idx ];\n\t\n\t\t\t\t\tif ( row._detailsShow ) {\n\t\t\t\t\t\trow._details.insertAfter( row.nTr );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} );\n\t\n\t\t\t// Column visibility change - update the colspan\n\t\t\tapi.on( colvisEvent, function ( e, ctx, idx, vis ) {\n\t\t\t\tif ( settings !== ctx ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\t// Update the colspan for the details rows (note, only if it already has\n\t\t\t\t// a colspan)\n\t\t\t\tvar row, visible = _fnVisbleColumns( ctx );\n\t\n\t\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\t\trow = data[i];\n\t\n\t\t\t\t\tif ( row._details ) {\n\t\t\t\t\t\trow._details.children('td[colspan]').attr('colspan', visible );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\n\t\t\t// Table destroyed - nuke any child rows\n\t\t\tapi.on( destroyEvent, function ( e, ctx ) {\n\t\t\t\tif ( settings !== ctx ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\t\tif ( data[i]._details ) {\n\t\t\t\t\t\t__details_remove( api, i );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t};\n\t\n\t// Strings for the method names to help minification\n\tvar _emp = '';\n\tvar _child_obj = _emp+'row().child';\n\tvar _child_mth = _child_obj+'()';\n\t\n\t// data can be:\n\t//  tr\n\t//  string\n\t//  jQuery or array of any of the above\n\t_api_register( _child_mth, function ( data, klass ) {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( data === undefined ) {\n\t\t\t// get\n\t\t\treturn ctx.length && this.length ?\n\t\t\t\tctx[0].aoData[ this[0] ]._details :\n\t\t\t\tundefined;\n\t\t}\n\t\telse if ( data === true ) {\n\t\t\t// show\n\t\t\tthis.child.show();\n\t\t}\n\t\telse if ( data === false ) {\n\t\t\t// remove\n\t\t\t__details_remove( this );\n\t\t}\n\t\telse if ( ctx.length && this.length ) {\n\t\t\t// set\n\t\t\t__details_add( ctx[0], ctx[0].aoData[ this[0] ], data, klass );\n\t\t}\n\t\n\t\treturn this;\n\t} );\n\t\n\t\n\t_api_register( [\n\t\t_child_obj+'.show()',\n\t\t_child_mth+'.show()' // only when `child()` was called with parameters (without\n\t], function ( show ) {   // it returns an object and this method is not executed)\n\t\t__details_display( this, true );\n\t\treturn this;\n\t} );\n\t\n\t\n\t_api_register( [\n\t\t_child_obj+'.hide()',\n\t\t_child_mth+'.hide()' // only when `child()` was called with parameters (without\n\t], function () {         // it returns an object and this method is not executed)\n\t\t__details_display( this, false );\n\t\treturn this;\n\t} );\n\t\n\t\n\t_api_register( [\n\t\t_child_obj+'.remove()',\n\t\t_child_mth+'.remove()' // only when `child()` was called with parameters (without\n\t], function () {           // it returns an object and this method is not executed)\n\t\t__details_remove( this );\n\t\treturn this;\n\t} );\n\t\n\t\n\t_api_register( _child_obj+'.isShown()', function () {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( ctx.length && this.length ) {\n\t\t\t// _detailsShown as false or undefined will fall through to return false\n\t\t\treturn ctx[0].aoData[ this[0] ]._detailsShow || false;\n\t\t}\n\t\treturn false;\n\t} );\n\t\n\t\n\t\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Columns\n\t *\n\t * {integer}           - column index (>=0 count from left, <0 count from right)\n\t * \"{integer}:visIdx\"  - visible column index (i.e. translate to column index)  (>=0 count from left, <0 count from right)\n\t * \"{integer}:visible\" - alias for {integer}:visIdx  (>=0 count from left, <0 count from right)\n\t * \"{string}:name\"     - column name\n\t * \"{string}\"          - jQuery selector on column header nodes\n\t *\n\t */\n\t\n\t// can be an array of these items, comma separated list, or an array of comma\n\t// separated lists\n\t\n\tvar __re_column_selector = /^([^:]+):(name|visIdx|visible)$/;\n\t\n\t\n\t// r1 and r2 are redundant - but it means that the parameters match for the\n\t// iterator callback in columns().data()\n\tvar __columnData = function ( settings, column, r1, r2, rows ) {\n\t\tvar a = [];\n\t\tfor ( var row=0, ien=rows.length ; row<ien ; row++ ) {\n\t\t\ta.push( _fnGetCellData( settings, rows[row], column ) );\n\t\t}\n\t\treturn a;\n\t};\n\t\n\t\n\tvar __column_selector = function ( settings, selector, opts )\n\t{\n\t\tvar\n\t\t\tcolumns = settings.aoColumns,\n\t\t\tnames = _pluck( columns, 'sName' ),\n\t\t\tnodes = _pluck( columns, 'nTh' );\n\t\n\t\tvar run = function ( s ) {\n\t\t\tvar selInt = _intVal( s );\n\t\n\t\t\t// Selector - all\n\t\t\tif ( s === '' ) {\n\t\t\t\treturn _range( columns.length );\n\t\t\t}\n\t\n\t\t\t// Selector - index\n\t\t\tif ( selInt !== null ) {\n\t\t\t\treturn [ selInt >= 0 ?\n\t\t\t\t\tselInt : // Count from left\n\t\t\t\t\tcolumns.length + selInt // Count from right (+ because its a negative value)\n\t\t\t\t];\n\t\t\t}\n\t\n\t\t\t// Selector = function\n\t\t\tif ( typeof s === 'function' ) {\n\t\t\t\tvar rows = _selector_row_indexes( settings, opts );\n\t\n\t\t\t\treturn $.map( columns, function (col, idx) {\n\t\t\t\t\treturn s(\n\t\t\t\t\t\t\tidx,\n\t\t\t\t\t\t\t__columnData( settings, idx, 0, 0, rows ),\n\t\t\t\t\t\t\tnodes[ idx ]\n\t\t\t\t\t\t) ? idx : null;\n\t\t\t\t} );\n\t\t\t}\n\t\n\t\t\t// jQuery or string selector\n\t\t\tvar match = typeof s === 'string' ?\n\t\t\t\ts.match( __re_column_selector ) :\n\t\t\t\t'';\n\t\n\t\t\tif ( match ) {\n\t\t\t\tswitch( match[2] ) {\n\t\t\t\t\tcase 'visIdx':\n\t\t\t\t\tcase 'visible':\n\t\t\t\t\t\tvar idx = parseInt( match[1], 10 );\n\t\t\t\t\t\t// Visible index given, convert to column index\n\t\t\t\t\t\tif ( idx < 0 ) {\n\t\t\t\t\t\t\t// Counting from the right\n\t\t\t\t\t\t\tvar visColumns = $.map( columns, function (col,i) {\n\t\t\t\t\t\t\t\treturn col.bVisible ? i : null;\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\treturn [ visColumns[ visColumns.length + idx ] ];\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Counting from the left\n\t\t\t\t\t\treturn [ _fnVisibleToColumnIndex( settings, idx ) ];\n\t\n\t\t\t\t\tcase 'name':\n\t\t\t\t\t\t// match by name. `names` is column index complete and in order\n\t\t\t\t\t\treturn $.map( names, function (name, i) {\n\t\t\t\t\t\t\treturn name === match[1] ? i : null;\n\t\t\t\t\t\t} );\n\t\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Cell in the table body\n\t\t\tif ( s.nodeName && s._DT_CellIndex ) {\n\t\t\t\treturn [ s._DT_CellIndex.column ];\n\t\t\t}\n\t\n\t\t\t// jQuery selector on the TH elements for the columns\n\t\t\tvar jqResult = $( nodes )\n\t\t\t\t.filter( s )\n\t\t\t\t.map( function () {\n\t\t\t\t\treturn $.inArray( this, nodes ); // `nodes` is column index complete and in order\n\t\t\t\t} )\n\t\t\t\t.toArray();\n\t\n\t\t\tif ( jqResult.length || ! s.nodeName ) {\n\t\t\t\treturn jqResult;\n\t\t\t}\n\t\n\t\t\t// Otherwise a node which might have a `dt-column` data attribute, or be\n\t\t\t// a child or such an element\n\t\t\tvar host = $(s).closest('*[data-dt-column]');\n\t\t\treturn host.length ?\n\t\t\t\t[ host.data('dt-column') ] :\n\t\t\t\t[];\n\t\t};\n\t\n\t\treturn _selector_run( 'column', selector, run, settings, opts );\n\t};\n\t\n\t\n\tvar __setColumnVis = function ( settings, column, vis ) {\n\t\tvar\n\t\t\tcols = settings.aoColumns,\n\t\t\tcol  = cols[ column ],\n\t\t\tdata = settings.aoData,\n\t\t\trow, cells, i, ien, tr;\n\t\n\t\t// Get\n\t\tif ( vis === undefined ) {\n\t\t\treturn col.bVisible;\n\t\t}\n\t\n\t\t// Set\n\t\t// No change\n\t\tif ( col.bVisible === vis ) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tif ( vis ) {\n\t\t\t// Insert column\n\t\t\t// Need to decide if we should use appendChild or insertBefore\n\t\t\tvar insertBefore = $.inArray( true, _pluck(cols, 'bVisible'), column+1 );\n\t\n\t\t\tfor ( i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\ttr = data[i].nTr;\n\t\t\t\tcells = data[i].anCells;\n\t\n\t\t\t\tif ( tr ) {\n\t\t\t\t\t// insertBefore can act like appendChild if 2nd arg is null\n\t\t\t\t\ttr.insertBefore( cells[ column ], cells[ insertBefore ] || null );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// Remove column\n\t\t\t$( _pluck( settings.aoData, 'anCells', column ) ).detach();\n\t\t}\n\t\n\t\t// Common actions\n\t\tcol.bVisible = vis;\n\t\t_fnDrawHead( settings, settings.aoHeader );\n\t\t_fnDrawHead( settings, settings.aoFooter );\n\t\n\t\t_fnSaveState( settings );\n\t};\n\t\n\t\n\t_api_register( 'columns()', function ( selector, opts ) {\n\t\t// argument shifting\n\t\tif ( selector === undefined ) {\n\t\t\tselector = '';\n\t\t}\n\t\telse if ( $.isPlainObject( selector ) ) {\n\t\t\topts = selector;\n\t\t\tselector = '';\n\t\t}\n\t\n\t\topts = _selector_opts( opts );\n\t\n\t\tvar inst = this.iterator( 'table', function ( settings ) {\n\t\t\treturn __column_selector( settings, selector, opts );\n\t\t}, 1 );\n\t\n\t\t// Want argument shifting here and in _row_selector?\n\t\tinst.selector.cols = selector;\n\t\tinst.selector.opts = opts;\n\t\n\t\treturn inst;\n\t} );\n\t\n\t_api_registerPlural( 'columns().header()', 'column().header()', function ( selector, opts ) {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\treturn settings.aoColumns[column].nTh;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'columns().footer()', 'column().footer()', function ( selector, opts ) {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\treturn settings.aoColumns[column].nTf;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'columns().data()', 'column().data()', function () {\n\t\treturn this.iterator( 'column-rows', __columnData, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'columns().dataSrc()', 'column().dataSrc()', function () {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\treturn settings.aoColumns[column].mData;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'columns().cache()', 'column().cache()', function ( type ) {\n\t\treturn this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {\n\t\t\treturn _pluck_order( settings.aoData, rows,\n\t\t\t\ttype === 'search' ? '_aFilterData' : '_aSortData', column\n\t\t\t);\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'columns().nodes()', 'column().nodes()', function () {\n\t\treturn this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {\n\t\t\treturn _pluck_order( settings.aoData, rows, 'anCells', column ) ;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'columns().visible()', 'column().visible()', function ( vis, calc ) {\n\t\tvar ret = this.iterator( 'column', function ( settings, column ) {\n\t\t\tif ( vis === undefined ) {\n\t\t\t\treturn settings.aoColumns[ column ].bVisible;\n\t\t\t} // else\n\t\t\t__setColumnVis( settings, column, vis );\n\t\t} );\n\t\n\t\t// Group the column visibility changes\n\t\tif ( vis !== undefined ) {\n\t\t\t// Second loop once the first is done for events\n\t\t\tthis.iterator( 'column', function ( settings, column ) {\n\t\t\t\t_fnCallbackFire( settings, null, 'column-visibility', [settings, column, vis, calc] );\n\t\t\t} );\n\t\n\t\t\tif ( calc === undefined || calc ) {\n\t\t\t\tthis.columns.adjust();\n\t\t\t}\n\t\t}\n\t\n\t\treturn ret;\n\t} );\n\t\n\t_api_registerPlural( 'columns().indexes()', 'column().index()', function ( type ) {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\treturn type === 'visible' ?\n\t\t\t\t_fnColumnIndexToVisible( settings, column ) :\n\t\t\t\tcolumn;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_register( 'columns.adjust()', function () {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnAdjustColumnSizing( settings );\n\t\t}, 1 );\n\t} );\n\t\n\t_api_register( 'column.index()', function ( type, idx ) {\n\t\tif ( this.context.length !== 0 ) {\n\t\t\tvar ctx = this.context[0];\n\t\n\t\t\tif ( type === 'fromVisible' || type === 'toData' ) {\n\t\t\t\treturn _fnVisibleToColumnIndex( ctx, idx );\n\t\t\t}\n\t\t\telse if ( type === 'fromData' || type === 'toVisible' ) {\n\t\t\t\treturn _fnColumnIndexToVisible( ctx, idx );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\t_api_register( 'column()', function ( selector, opts ) {\n\t\treturn _selector_first( this.columns( selector, opts ) );\n\t} );\n\t\n\t\n\t\n\tvar __cell_selector = function ( settings, selector, opts )\n\t{\n\t\tvar data = settings.aoData;\n\t\tvar rows = _selector_row_indexes( settings, opts );\n\t\tvar cells = _removeEmpty( _pluck_order( data, rows, 'anCells' ) );\n\t\tvar allCells = $( [].concat.apply([], cells) );\n\t\tvar row;\n\t\tvar columns = settings.aoColumns.length;\n\t\tvar a, i, ien, j, o, host;\n\t\n\t\tvar run = function ( s ) {\n\t\t\tvar fnSelector = typeof s === 'function';\n\t\n\t\t\tif ( s === null || s === undefined || fnSelector ) {\n\t\t\t\t// All cells and function selectors\n\t\t\t\ta = [];\n\t\n\t\t\t\tfor ( i=0, ien=rows.length ; i<ien ; i++ ) {\n\t\t\t\t\trow = rows[i];\n\t\n\t\t\t\t\tfor ( j=0 ; j<columns ; j++ ) {\n\t\t\t\t\t\to = {\n\t\t\t\t\t\t\trow: row,\n\t\t\t\t\t\t\tcolumn: j\n\t\t\t\t\t\t};\n\t\n\t\t\t\t\t\tif ( fnSelector ) {\n\t\t\t\t\t\t\t// Selector - function\n\t\t\t\t\t\t\thost = data[ row ];\n\t\n\t\t\t\t\t\t\tif ( s( o, _fnGetCellData(settings, row, j), host.anCells ? host.anCells[j] : null ) ) {\n\t\t\t\t\t\t\t\ta.push( o );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// Selector - all\n\t\t\t\t\t\t\ta.push( o );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\treturn a;\n\t\t\t}\n\t\t\t\n\t\t\t// Selector - index\n\t\t\tif ( $.isPlainObject( s ) ) {\n\t\t\t\treturn [s];\n\t\t\t}\n\t\n\t\t\t// Selector - jQuery filtered cells\n\t\t\tvar jqResult = allCells\n\t\t\t\t.filter( s )\n\t\t\t\t.map( function (i, el) {\n\t\t\t\t\treturn { // use a new object, in case someone changes the values\n\t\t\t\t\t\trow:    el._DT_CellIndex.row,\n\t\t\t\t\t\tcolumn: el._DT_CellIndex.column\n\t \t\t\t\t};\n\t\t\t\t} )\n\t\t\t\t.toArray();\n\t\n\t\t\tif ( jqResult.length || ! s.nodeName ) {\n\t\t\t\treturn jqResult;\n\t\t\t}\n\t\n\t\t\t// Otherwise the selector is a node, and there is one last option - the\n\t\t\t// element might be a child of an element which has dt-row and dt-column\n\t\t\t// data attributes\n\t\t\thost = $(s).closest('*[data-dt-row]');\n\t\t\treturn host.length ?\n\t\t\t\t[ {\n\t\t\t\t\trow: host.data('dt-row'),\n\t\t\t\t\tcolumn: host.data('dt-column')\n\t\t\t\t} ] :\n\t\t\t\t[];\n\t\t};\n\t\n\t\treturn _selector_run( 'cell', selector, run, settings, opts );\n\t};\n\t\n\t\n\t\n\t\n\t_api_register( 'cells()', function ( rowSelector, columnSelector, opts ) {\n\t\t// Argument shifting\n\t\tif ( $.isPlainObject( rowSelector ) ) {\n\t\t\t// Indexes\n\t\t\tif ( rowSelector.row === undefined ) {\n\t\t\t\t// Selector options in first parameter\n\t\t\t\topts = rowSelector;\n\t\t\t\trowSelector = null;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Cell index objects in first parameter\n\t\t\t\topts = columnSelector;\n\t\t\t\tcolumnSelector = null;\n\t\t\t}\n\t\t}\n\t\tif ( $.isPlainObject( columnSelector ) ) {\n\t\t\topts = columnSelector;\n\t\t\tcolumnSelector = null;\n\t\t}\n\t\n\t\t// Cell selector\n\t\tif ( columnSelector === null || columnSelector === undefined ) {\n\t\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t\treturn __cell_selector( settings, rowSelector, _selector_opts( opts ) );\n\t\t\t} );\n\t\t}\n\t\n\t\t// Row + column selector\n\t\tvar columns = this.columns( columnSelector, opts );\n\t\tvar rows = this.rows( rowSelector, opts );\n\t\tvar a, i, ien, j, jen;\n\t\n\t\tvar cells = this.iterator( 'table', function ( settings, idx ) {\n\t\t\ta = [];\n\t\n\t\t\tfor ( i=0, ien=rows[idx].length ; i<ien ; i++ ) {\n\t\t\t\tfor ( j=0, jen=columns[idx].length ; j<jen ; j++ ) {\n\t\t\t\t\ta.push( {\n\t\t\t\t\t\trow:    rows[idx][i],\n\t\t\t\t\t\tcolumn: columns[idx][j]\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn a;\n\t\t}, 1 );\n\t\n\t\t$.extend( cells.selector, {\n\t\t\tcols: columnSelector,\n\t\t\trows: rowSelector,\n\t\t\topts: opts\n\t\t} );\n\t\n\t\treturn cells;\n\t} );\n\t\n\t\n\t_api_registerPlural( 'cells().nodes()', 'cell().node()', function () {\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\tvar data = settings.aoData[ row ];\n\t\n\t\t\treturn data && data.anCells ?\n\t\t\t\tdata.anCells[ column ] :\n\t\t\t\tundefined;\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_register( 'cells().data()', function () {\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\treturn _fnGetCellData( settings, row, column );\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'cells().cache()', 'cell().cache()', function ( type ) {\n\t\ttype = type === 'search' ? '_aFilterData' : '_aSortData';\n\t\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\treturn settings.aoData[ row ][ type ][ column ];\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'cells().render()', 'cell().render()', function ( type ) {\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\treturn _fnGetCellData( settings, row, column, type );\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'cells().indexes()', 'cell().index()', function () {\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\treturn {\n\t\t\t\trow: row,\n\t\t\t\tcolumn: column,\n\t\t\t\tcolumnVisible: _fnColumnIndexToVisible( settings, column )\n\t\t\t};\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'cells().invalidate()', 'cell().invalidate()', function ( src ) {\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\t_fnInvalidate( settings, row, src, column );\n\t\t} );\n\t} );\n\t\n\t\n\t\n\t_api_register( 'cell()', function ( rowSelector, columnSelector, opts ) {\n\t\treturn _selector_first( this.cells( rowSelector, columnSelector, opts ) );\n\t} );\n\t\n\t\n\t_api_register( 'cell().data()', function ( data ) {\n\t\tvar ctx = this.context;\n\t\tvar cell = this[0];\n\t\n\t\tif ( data === undefined ) {\n\t\t\t// Get\n\t\t\treturn ctx.length && cell.length ?\n\t\t\t\t_fnGetCellData( ctx[0], cell[0].row, cell[0].column ) :\n\t\t\t\tundefined;\n\t\t}\n\t\n\t\t// Set\n\t\t_fnSetCellData( ctx[0], cell[0].row, cell[0].column, data );\n\t\t_fnInvalidate( ctx[0], cell[0].row, 'data', cell[0].column );\n\t\n\t\treturn this;\n\t} );\n\t\n\t\n\t\n\t/**\n\t * Get current ordering (sorting) that has been applied to the table.\n\t *\n\t * @returns {array} 2D array containing the sorting information for the first\n\t *   table in the current context. Each element in the parent array represents\n\t *   a column being sorted upon (i.e. multi-sorting with two columns would have\n\t *   2 inner arrays). The inner arrays may have 2 or 3 elements. The first is\n\t *   the column index that the sorting condition applies to, the second is the\n\t *   direction of the sort (`desc` or `asc`) and, optionally, the third is the\n\t *   index of the sorting order from the `column.sorting` initialisation array.\n\t *//**\n\t * Set the ordering for the table.\n\t *\n\t * @param {integer} order Column index to sort upon.\n\t * @param {string} direction Direction of the sort to be applied (`asc` or `desc`)\n\t * @returns {DataTables.Api} this\n\t *//**\n\t * Set the ordering for the table.\n\t *\n\t * @param {array} order 1D array of sorting information to be applied.\n\t * @param {array} [...] Optional additional sorting conditions\n\t * @returns {DataTables.Api} this\n\t *//**\n\t * Set the ordering for the table.\n\t *\n\t * @param {array} order 2D array of sorting information to be applied.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'order()', function ( order, dir ) {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( order === undefined ) {\n\t\t\t// get\n\t\t\treturn ctx.length !== 0 ?\n\t\t\t\tctx[0].aaSorting :\n\t\t\t\tundefined;\n\t\t}\n\t\n\t\t// set\n\t\tif ( typeof order === 'number' ) {\n\t\t\t// Simple column / direction passed in\n\t\t\torder = [ [ order, dir ] ];\n\t\t}\n\t\telse if ( order.length && ! $.isArray( order[0] ) ) {\n\t\t\t// Arguments passed in (list of 1D arrays)\n\t\t\torder = Array.prototype.slice.call( arguments );\n\t\t}\n\t\t// otherwise a 2D array was passed in\n\t\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tsettings.aaSorting = order.slice();\n\t\t} );\n\t} );\n\t\n\t\n\t/**\n\t * Attach a sort listener to an element for a given column\n\t *\n\t * @param {node|jQuery|string} node Identifier for the element(s) to attach the\n\t *   listener to. This can take the form of a single DOM node, a jQuery\n\t *   collection of nodes or a jQuery selector which will identify the node(s).\n\t * @param {integer} column the column that a click on this node will sort on\n\t * @param {function} [callback] callback function when sort is run\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'order.listener()', function ( node, column, callback ) {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnSortAttachListener( settings, node, column, callback );\n\t\t} );\n\t} );\n\t\n\t\n\t_api_register( 'order.fixed()', function ( set ) {\n\t\tif ( ! set ) {\n\t\t\tvar ctx = this.context;\n\t\t\tvar fixed = ctx.length ?\n\t\t\t\tctx[0].aaSortingFixed :\n\t\t\t\tundefined;\n\t\n\t\t\treturn $.isArray( fixed ) ?\n\t\t\t\t{ pre: fixed } :\n\t\t\t\tfixed;\n\t\t}\n\t\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tsettings.aaSortingFixed = $.extend( true, {}, set );\n\t\t} );\n\t} );\n\t\n\t\n\t// Order by the selected column(s)\n\t_api_register( [\n\t\t'columns().order()',\n\t\t'column().order()'\n\t], function ( dir ) {\n\t\tvar that = this;\n\t\n\t\treturn this.iterator( 'table', function ( settings, i ) {\n\t\t\tvar sort = [];\n\t\n\t\t\t$.each( that[i], function (j, col) {\n\t\t\t\tsort.push( [ col, dir ] );\n\t\t\t} );\n\t\n\t\t\tsettings.aaSorting = sort;\n\t\t} );\n\t} );\n\t\n\t\n\t\n\t_api_register( 'search()', function ( input, regex, smart, caseInsen ) {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( input === undefined ) {\n\t\t\t// get\n\t\t\treturn ctx.length !== 0 ?\n\t\t\t\tctx[0].oPreviousSearch.sSearch :\n\t\t\t\tundefined;\n\t\t}\n\t\n\t\t// set\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tif ( ! settings.oFeatures.bFilter ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t_fnFilterComplete( settings, $.extend( {}, settings.oPreviousSearch, {\n\t\t\t\t\"sSearch\": input+\"\",\n\t\t\t\t\"bRegex\":  regex === null ? false : regex,\n\t\t\t\t\"bSmart\":  smart === null ? true  : smart,\n\t\t\t\t\"bCaseInsensitive\": caseInsen === null ? true : caseInsen\n\t\t\t} ), 1 );\n\t\t} );\n\t} );\n\t\n\t\n\t_api_registerPlural(\n\t\t'columns().search()',\n\t\t'column().search()',\n\t\tfunction ( input, regex, smart, caseInsen ) {\n\t\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\t\tvar preSearch = settings.aoPreSearchCols;\n\t\n\t\t\t\tif ( input === undefined ) {\n\t\t\t\t\t// get\n\t\t\t\t\treturn preSearch[ column ].sSearch;\n\t\t\t\t}\n\t\n\t\t\t\t// set\n\t\t\t\tif ( ! settings.oFeatures.bFilter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\t$.extend( preSearch[ column ], {\n\t\t\t\t\t\"sSearch\": input+\"\",\n\t\t\t\t\t\"bRegex\":  regex === null ? false : regex,\n\t\t\t\t\t\"bSmart\":  smart === null ? true  : smart,\n\t\t\t\t\t\"bCaseInsensitive\": caseInsen === null ? true : caseInsen\n\t\t\t\t} );\n\t\n\t\t\t\t_fnFilterComplete( settings, settings.oPreviousSearch, 1 );\n\t\t\t} );\n\t\t}\n\t);\n\t\n\t/*\n\t * State API methods\n\t */\n\t\n\t_api_register( 'state()', function () {\n\t\treturn this.context.length ?\n\t\t\tthis.context[0].oSavedState :\n\t\t\tnull;\n\t} );\n\t\n\t\n\t_api_register( 'state.clear()', function () {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t// Save an empty object\n\t\t\tsettings.fnStateSaveCallback.call( settings.oInstance, settings, {} );\n\t\t} );\n\t} );\n\t\n\t\n\t_api_register( 'state.loaded()', function () {\n\t\treturn this.context.length ?\n\t\t\tthis.context[0].oLoadedState :\n\t\t\tnull;\n\t} );\n\t\n\t\n\t_api_register( 'state.save()', function () {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnSaveState( settings );\n\t\t} );\n\t} );\n\t\n\t\n\t\n\t/**\n\t * Provide a common method for plug-ins to check the version of DataTables being\n\t * used, in order to ensure compatibility.\n\t *\n\t *  @param {string} version Version string to check for, in the format \"X.Y.Z\".\n\t *    Note that the formats \"X\" and \"X.Y\" are also acceptable.\n\t *  @returns {boolean} true if this version of DataTables is greater or equal to\n\t *    the required version, or false if this version of DataTales is not\n\t *    suitable\n\t *  @static\n\t *  @dtopt API-Static\n\t *\n\t *  @example\n\t *    alert( $.fn.dataTable.versionCheck( '1.9.0' ) );\n\t */\n\tDataTable.versionCheck = DataTable.fnVersionCheck = function( version )\n\t{\n\t\tvar aThis = DataTable.version.split('.');\n\t\tvar aThat = version.split('.');\n\t\tvar iThis, iThat;\n\t\n\t\tfor ( var i=0, iLen=aThat.length ; i<iLen ; i++ ) {\n\t\t\tiThis = parseInt( aThis[i], 10 ) || 0;\n\t\t\tiThat = parseInt( aThat[i], 10 ) || 0;\n\t\n\t\t\t// Parts are the same, keep comparing\n\t\t\tif (iThis === iThat) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\n\t\t\t// Parts are different, return immediately\n\t\t\treturn iThis > iThat;\n\t\t}\n\t\n\t\treturn true;\n\t};\n\t\n\t\n\t/**\n\t * Check if a `<table>` node is a DataTable table already or not.\n\t *\n\t *  @param {node|jquery|string} table Table node, jQuery object or jQuery\n\t *      selector for the table to test. Note that if more than more than one\n\t *      table is passed on, only the first will be checked\n\t *  @returns {boolean} true the table given is a DataTable, or false otherwise\n\t *  @static\n\t *  @dtopt API-Static\n\t *\n\t *  @example\n\t *    if ( ! $.fn.DataTable.isDataTable( '#example' ) ) {\n\t *      $('#example').dataTable();\n\t *    }\n\t */\n\tDataTable.isDataTable = DataTable.fnIsDataTable = function ( table )\n\t{\n\t\tvar t = $(table).get(0);\n\t\tvar is = false;\n\t\n\t\tif ( table instanceof DataTable.Api ) {\n\t\t\treturn true;\n\t\t}\n\t\n\t\t$.each( DataTable.settings, function (i, o) {\n\t\t\tvar head = o.nScrollHead ? $('table', o.nScrollHead)[0] : null;\n\t\t\tvar foot = o.nScrollFoot ? $('table', o.nScrollFoot)[0] : null;\n\t\n\t\t\tif ( o.nTable === t || head === t || foot === t ) {\n\t\t\t\tis = true;\n\t\t\t}\n\t\t} );\n\t\n\t\treturn is;\n\t};\n\t\n\t\n\t/**\n\t * Get all DataTable tables that have been initialised - optionally you can\n\t * select to get only currently visible tables.\n\t *\n\t *  @param {boolean} [visible=false] Flag to indicate if you want all (default)\n\t *    or visible tables only.\n\t *  @returns {array} Array of `table` nodes (not DataTable instances) which are\n\t *    DataTables\n\t *  @static\n\t *  @dtopt API-Static\n\t *\n\t *  @example\n\t *    $.each( $.fn.dataTable.tables(true), function () {\n\t *      $(table).DataTable().columns.adjust();\n\t *    } );\n\t */\n\tDataTable.tables = DataTable.fnTables = function ( visible )\n\t{\n\t\tvar api = false;\n\t\n\t\tif ( $.isPlainObject( visible ) ) {\n\t\t\tapi = visible.api;\n\t\t\tvisible = visible.visible;\n\t\t}\n\t\n\t\tvar a = $.map( DataTable.settings, function (o) {\n\t\t\tif ( !visible || (visible && $(o.nTable).is(':visible')) ) {\n\t\t\t\treturn o.nTable;\n\t\t\t}\n\t\t} );\n\t\n\t\treturn api ?\n\t\t\tnew _Api( a ) :\n\t\t\ta;\n\t};\n\t\n\t\n\t/**\n\t * Convert from camel case parameters to Hungarian notation. This is made public\n\t * for the extensions to provide the same ability as DataTables core to accept\n\t * either the 1.9 style Hungarian notation, or the 1.10+ style camelCase\n\t * parameters.\n\t *\n\t *  @param {object} src The model object which holds all parameters that can be\n\t *    mapped.\n\t *  @param {object} user The object to convert from camel case to Hungarian.\n\t *  @param {boolean} force When set to `true`, properties which already have a\n\t *    Hungarian value in the `user` object will be overwritten. Otherwise they\n\t *    won't be.\n\t */\n\tDataTable.camelToHungarian = _fnCamelToHungarian;\n\t\n\t\n\t\n\t/**\n\t *\n\t */\n\t_api_register( '$()', function ( selector, opts ) {\n\t\tvar\n\t\t\trows   = this.rows( opts ).nodes(), // Get all rows\n\t\t\tjqRows = $(rows);\n\t\n\t\treturn $( [].concat(\n\t\t\tjqRows.filter( selector ).toArray(),\n\t\t\tjqRows.find( selector ).toArray()\n\t\t) );\n\t} );\n\t\n\t\n\t// jQuery functions to operate on the tables\n\t$.each( [ 'on', 'one', 'off' ], function (i, key) {\n\t\t_api_register( key+'()', function ( /* event, handler */ ) {\n\t\t\tvar args = Array.prototype.slice.call(arguments);\n\t\n\t\t\t// Add the `dt` namespace automatically if it isn't already present\n\t\t\targs[0] = $.map( args[0].split( /\\s/ ), function ( e ) {\n\t\t\t\treturn ! e.match(/\\.dt\\b/) ?\n\t\t\t\t\te+'.dt' :\n\t\t\t\t\te;\n\t\t\t\t} ).join( ' ' );\n\t\n\t\t\tvar inst = $( this.tables().nodes() );\n\t\t\tinst[key].apply( inst, args );\n\t\t\treturn this;\n\t\t} );\n\t} );\n\t\n\t\n\t_api_register( 'clear()', function () {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnClearTable( settings );\n\t\t} );\n\t} );\n\t\n\t\n\t_api_register( 'settings()', function () {\n\t\treturn new _Api( this.context, this.context );\n\t} );\n\t\n\t\n\t_api_register( 'init()', function () {\n\t\tvar ctx = this.context;\n\t\treturn ctx.length ? ctx[0].oInit : null;\n\t} );\n\t\n\t\n\t_api_register( 'data()', function () {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\treturn _pluck( settings.aoData, '_aData' );\n\t\t} ).flatten();\n\t} );\n\t\n\t\n\t_api_register( 'destroy()', function ( remove ) {\n\t\tremove = remove || false;\n\t\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tvar orig      = settings.nTableWrapper.parentNode;\n\t\t\tvar classes   = settings.oClasses;\n\t\t\tvar table     = settings.nTable;\n\t\t\tvar tbody     = settings.nTBody;\n\t\t\tvar thead     = settings.nTHead;\n\t\t\tvar tfoot     = settings.nTFoot;\n\t\t\tvar jqTable   = $(table);\n\t\t\tvar jqTbody   = $(tbody);\n\t\t\tvar jqWrapper = $(settings.nTableWrapper);\n\t\t\tvar rows      = $.map( settings.aoData, function (r) { return r.nTr; } );\n\t\t\tvar i, ien;\n\t\n\t\t\t// Flag to note that the table is currently being destroyed - no action\n\t\t\t// should be taken\n\t\t\tsettings.bDestroying = true;\n\t\n\t\t\t// Fire off the destroy callbacks for plug-ins etc\n\t\t\t_fnCallbackFire( settings, \"aoDestroyCallback\", \"destroy\", [settings] );\n\t\n\t\t\t// If not being removed from the document, make all columns visible\n\t\t\tif ( ! remove ) {\n\t\t\t\tnew _Api( settings ).columns().visible( true );\n\t\t\t}\n\t\n\t\t\t// Blitz all `DT` namespaced events (these are internal events, the\n\t\t\t// lowercase, `dt` events are user subscribed and they are responsible\n\t\t\t// for removing them\n\t\t\tjqWrapper.off('.DT').find(':not(tbody *)').off('.DT');\n\t\t\t$(window).off('.DT-'+settings.sInstance);\n\t\n\t\t\t// When scrolling we had to break the table up - restore it\n\t\t\tif ( table != thead.parentNode ) {\n\t\t\t\tjqTable.children('thead').detach();\n\t\t\t\tjqTable.append( thead );\n\t\t\t}\n\t\n\t\t\tif ( tfoot && table != tfoot.parentNode ) {\n\t\t\t\tjqTable.children('tfoot').detach();\n\t\t\t\tjqTable.append( tfoot );\n\t\t\t}\n\t\n\t\t\tsettings.aaSorting = [];\n\t\t\tsettings.aaSortingFixed = [];\n\t\t\t_fnSortingClasses( settings );\n\t\n\t\t\t$( rows ).removeClass( settings.asStripeClasses.join(' ') );\n\t\n\t\t\t$('th, td', thead).removeClass( classes.sSortable+' '+\n\t\t\t\tclasses.sSortableAsc+' '+classes.sSortableDesc+' '+classes.sSortableNone\n\t\t\t);\n\t\n\t\t\tif ( settings.bJUI ) {\n\t\t\t\t$('th span.'+classes.sSortIcon+ ', td span.'+classes.sSortIcon, thead).detach();\n\t\t\t\t$('th, td', thead).each( function () {\n\t\t\t\t\tvar wrapper = $('div.'+classes.sSortJUIWrapper, this);\n\t\t\t\t\t$(this).append( wrapper.contents() );\n\t\t\t\t\twrapper.detach();\n\t\t\t\t} );\n\t\t\t}\n\t\n\t\t\t// Add the TR elements back into the table in their original order\n\t\t\tjqTbody.children().detach();\n\t\t\tjqTbody.append( rows );\n\t\n\t\t\t// Remove the DataTables generated nodes, events and classes\n\t\t\tvar removedMethod = remove ? 'remove' : 'detach';\n\t\t\tjqTable[ removedMethod ]();\n\t\t\tjqWrapper[ removedMethod ]();\n\t\n\t\t\t// If we need to reattach the table to the document\n\t\t\tif ( ! remove && orig ) {\n\t\t\t\t// insertBefore acts like appendChild if !arg[1]\n\t\t\t\torig.insertBefore( table, settings.nTableReinsertBefore );\n\t\n\t\t\t\t// Restore the width of the original table - was read from the style property,\n\t\t\t\t// so we can restore directly to that\n\t\t\t\tjqTable\n\t\t\t\t\t.css( 'width', settings.sDestroyWidth )\n\t\t\t\t\t.removeClass( classes.sTable );\n\t\n\t\t\t\t// If the were originally stripe classes - then we add them back here.\n\t\t\t\t// Note this is not fool proof (for example if not all rows had stripe\n\t\t\t\t// classes - but it's a good effort without getting carried away\n\t\t\t\tien = settings.asDestroyStripes.length;\n\t\n\t\t\t\tif ( ien ) {\n\t\t\t\t\tjqTbody.children().each( function (i) {\n\t\t\t\t\t\t$(this).addClass( settings.asDestroyStripes[i % ien] );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t/* Remove the settings object from the settings array */\n\t\t\tvar idx = $.inArray( settings, DataTable.settings );\n\t\t\tif ( idx !== -1 ) {\n\t\t\t\tDataTable.settings.splice( idx, 1 );\n\t\t\t}\n\t\t} );\n\t} );\n\t\n\t\n\t// Add the `every()` method for rows, columns and cells in a compact form\n\t$.each( [ 'column', 'row', 'cell' ], function ( i, type ) {\n\t\t_api_register( type+'s().every()', function ( fn ) {\n\t\t\tvar opts = this.selector.opts;\n\t\t\tvar api = this;\n\t\n\t\t\treturn this.iterator( type, function ( settings, arg1, arg2, arg3, arg4 ) {\n\t\t\t\t// Rows and columns:\n\t\t\t\t//  arg1 - index\n\t\t\t\t//  arg2 - table counter\n\t\t\t\t//  arg3 - loop counter\n\t\t\t\t//  arg4 - undefined\n\t\t\t\t// Cells:\n\t\t\t\t//  arg1 - row index\n\t\t\t\t//  arg2 - column index\n\t\t\t\t//  arg3 - table counter\n\t\t\t\t//  arg4 - loop counter\n\t\t\t\tfn.call(\n\t\t\t\t\tapi[ type ](\n\t\t\t\t\t\targ1,\n\t\t\t\t\t\ttype==='cell' ? arg2 : opts,\n\t\t\t\t\t\ttype==='cell' ? opts : undefined\n\t\t\t\t\t),\n\t\t\t\t\targ1, arg2, arg3, arg4\n\t\t\t\t);\n\t\t\t} );\n\t\t} );\n\t} );\n\t\n\t\n\t// i18n method for extensions to be able to use the language object from the\n\t// DataTable\n\t_api_register( 'i18n()', function ( token, def, plural ) {\n\t\tvar ctx = this.context[0];\n\t\tvar resolved = _fnGetObjectDataFn( token )( ctx.oLanguage );\n\t\n\t\tif ( resolved === undefined ) {\n\t\t\tresolved = def;\n\t\t}\n\t\n\t\tif ( plural !== undefined && $.isPlainObject( resolved ) ) {\n\t\t\tresolved = resolved[ plural ] !== undefined ?\n\t\t\t\tresolved[ plural ] :\n\t\t\t\tresolved._;\n\t\t}\n\t\n\t\treturn resolved.replace( '%d', plural ); // nb: plural might be undefined,\n\t} );\n\t/**\n\t * Version string for plug-ins to check compatibility. Allowed format is\n\t * `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used\n\t * only for non-release builds. See http://semver.org/ for more information.\n\t *  @member\n\t *  @type string\n\t *  @default Version number\n\t */\n\tDataTable.version = \"1.10.15\";\n\n\t/**\n\t * Private data store, containing all of the settings objects that are\n\t * created for the tables on a given page.\n\t *\n\t * Note that the `DataTable.settings` object is aliased to\n\t * `jQuery.fn.dataTableExt` through which it may be accessed and\n\t * manipulated, or `jQuery.fn.dataTable.settings`.\n\t *  @member\n\t *  @type array\n\t *  @default []\n\t *  @private\n\t */\n\tDataTable.settings = [];\n\n\t/**\n\t * Object models container, for the various models that DataTables has\n\t * available to it. These models define the objects that are used to hold\n\t * the active state and configuration of the table.\n\t *  @namespace\n\t */\n\tDataTable.models = {};\n\t\n\t\n\t\n\t/**\n\t * Template object for the way in which DataTables holds information about\n\t * search information for the global filter and individual column filters.\n\t *  @namespace\n\t */\n\tDataTable.models.oSearch = {\n\t\t/**\n\t\t * Flag to indicate if the filtering should be case insensitive or not\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t */\n\t\t\"bCaseInsensitive\": true,\n\t\n\t\t/**\n\t\t * Applied search term\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t */\n\t\t\"sSearch\": \"\",\n\t\n\t\t/**\n\t\t * Flag to indicate if the search term should be interpreted as a\n\t\t * regular expression (true) or not (false) and therefore and special\n\t\t * regex characters escaped.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bRegex\": false,\n\t\n\t\t/**\n\t\t * Flag to indicate if DataTables is to use its smart filtering or not.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t */\n\t\t\"bSmart\": true\n\t};\n\t\n\t\n\t\n\t\n\t/**\n\t * Template object for the way in which DataTables holds information about\n\t * each individual row. This is the object format used for the settings\n\t * aoData array.\n\t *  @namespace\n\t */\n\tDataTable.models.oRow = {\n\t\t/**\n\t\t * TR element for the row\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTr\": null,\n\t\n\t\t/**\n\t\t * Array of TD elements for each row. This is null until the row has been\n\t\t * created.\n\t\t *  @type array nodes\n\t\t *  @default []\n\t\t */\n\t\t\"anCells\": null,\n\t\n\t\t/**\n\t\t * Data object from the original data source for the row. This is either\n\t\t * an array if using the traditional form of DataTables, or an object if\n\t\t * using mData options. The exact type will depend on the passed in\n\t\t * data from the data source, or will be an array if using DOM a data\n\t\t * source.\n\t\t *  @type array|object\n\t\t *  @default []\n\t\t */\n\t\t\"_aData\": [],\n\t\n\t\t/**\n\t\t * Sorting data cache - this array is ostensibly the same length as the\n\t\t * number of columns (although each index is generated only as it is\n\t\t * needed), and holds the data that is used for sorting each column in the\n\t\t * row. We do this cache generation at the start of the sort in order that\n\t\t * the formatting of the sort data need be done only once for each cell\n\t\t * per sort. This array should not be read from or written to by anything\n\t\t * other than the master sorting methods.\n\t\t *  @type array\n\t\t *  @default null\n\t\t *  @private\n\t\t */\n\t\t\"_aSortData\": null,\n\t\n\t\t/**\n\t\t * Per cell filtering data cache. As per the sort data cache, used to\n\t\t * increase the performance of the filtering in DataTables\n\t\t *  @type array\n\t\t *  @default null\n\t\t *  @private\n\t\t */\n\t\t\"_aFilterData\": null,\n\t\n\t\t/**\n\t\t * Filtering data cache. This is the same as the cell filtering cache, but\n\t\t * in this case a string rather than an array. This is easily computed with\n\t\t * a join on `_aFilterData`, but is provided as a cache so the join isn't\n\t\t * needed on every search (memory traded for performance)\n\t\t *  @type array\n\t\t *  @default null\n\t\t *  @private\n\t\t */\n\t\t\"_sFilterRow\": null,\n\t\n\t\t/**\n\t\t * Cache of the class name that DataTables has applied to the row, so we\n\t\t * can quickly look at this variable rather than needing to do a DOM check\n\t\t * on className for the nTr property.\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t *  @private\n\t\t */\n\t\t\"_sRowStripe\": \"\",\n\t\n\t\t/**\n\t\t * Denote if the original data source was from the DOM, or the data source\n\t\t * object. This is used for invalidating data, so DataTables can\n\t\t * automatically read data from the original source, unless uninstructed\n\t\t * otherwise.\n\t\t *  @type string\n\t\t *  @default null\n\t\t *  @private\n\t\t */\n\t\t\"src\": null,\n\t\n\t\t/**\n\t\t * Index in the aoData array. This saves an indexOf lookup when we have the\n\t\t * object, but want to know the index\n\t\t *  @type integer\n\t\t *  @default -1\n\t\t *  @private\n\t\t */\n\t\t\"idx\": -1\n\t};\n\t\n\t\n\t/**\n\t * Template object for the column information object in DataTables. This object\n\t * is held in the settings aoColumns array and contains all the information that\n\t * DataTables needs about each individual column.\n\t *\n\t * Note that this object is related to {@link DataTable.defaults.column}\n\t * but this one is the internal data store for DataTables's cache of columns.\n\t * It should NOT be manipulated outside of DataTables. Any configuration should\n\t * be done through the initialisation options.\n\t *  @namespace\n\t */\n\tDataTable.models.oColumn = {\n\t\t/**\n\t\t * Column index. This could be worked out on-the-fly with $.inArray, but it\n\t\t * is faster to just hold it as a variable\n\t\t *  @type integer\n\t\t *  @default null\n\t\t */\n\t\t\"idx\": null,\n\t\n\t\t/**\n\t\t * A list of the columns that sorting should occur on when this column\n\t\t * is sorted. That this property is an array allows multi-column sorting\n\t\t * to be defined for a column (for example first name / last name columns\n\t\t * would benefit from this). The values are integers pointing to the\n\t\t * columns to be sorted on (typically it will be a single integer pointing\n\t\t * at itself, but that doesn't need to be the case).\n\t\t *  @type array\n\t\t */\n\t\t\"aDataSort\": null,\n\t\n\t\t/**\n\t\t * Define the sorting directions that are applied to the column, in sequence\n\t\t * as the column is repeatedly sorted upon - i.e. the first value is used\n\t\t * as the sorting direction when the column if first sorted (clicked on).\n\t\t * Sort it again (click again) and it will move on to the next index.\n\t\t * Repeat until loop.\n\t\t *  @type array\n\t\t */\n\t\t\"asSorting\": null,\n\t\n\t\t/**\n\t\t * Flag to indicate if the column is searchable, and thus should be included\n\t\t * in the filtering or not.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bSearchable\": null,\n\t\n\t\t/**\n\t\t * Flag to indicate if the column is sortable or not.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bSortable\": null,\n\t\n\t\t/**\n\t\t * Flag to indicate if the column is currently visible in the table or not\n\t\t *  @type boolean\n\t\t */\n\t\t\"bVisible\": null,\n\t\n\t\t/**\n\t\t * Store for manual type assignment using the `column.type` option. This\n\t\t * is held in store so we can manipulate the column's `sType` property.\n\t\t *  @type string\n\t\t *  @default null\n\t\t *  @private\n\t\t */\n\t\t\"_sManualType\": null,\n\t\n\t\t/**\n\t\t * Flag to indicate if HTML5 data attributes should be used as the data\n\t\t * source for filtering or sorting. True is either are.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *  @private\n\t\t */\n\t\t\"_bAttrSrc\": false,\n\t\n\t\t/**\n\t\t * Developer definable function that is called whenever a cell is created (Ajax source,\n\t\t * etc) or processed for input (DOM source). This can be used as a compliment to mRender\n\t\t * allowing you to modify the DOM element (add background colour for example) when the\n\t\t * element is available.\n\t\t *  @type function\n\t\t *  @param {element} nTd The TD node that has been created\n\t\t *  @param {*} sData The Data for the cell\n\t\t *  @param {array|object} oData The data for the whole row\n\t\t *  @param {int} iRow The row index for the aoData data store\n\t\t *  @default null\n\t\t */\n\t\t\"fnCreatedCell\": null,\n\t\n\t\t/**\n\t\t * Function to get data from a cell in a column. You should <b>never</b>\n\t\t * access data directly through _aData internally in DataTables - always use\n\t\t * the method attached to this property. It allows mData to function as\n\t\t * required. This function is automatically assigned by the column\n\t\t * initialisation method\n\t\t *  @type function\n\t\t *  @param {array|object} oData The data array/object for the array\n\t\t *    (i.e. aoData[]._aData)\n\t\t *  @param {string} sSpecific The specific data type you want to get -\n\t\t *    'display', 'type' 'filter' 'sort'\n\t\t *  @returns {*} The data for the cell from the given row's data\n\t\t *  @default null\n\t\t */\n\t\t\"fnGetData\": null,\n\t\n\t\t/**\n\t\t * Function to set data for a cell in the column. You should <b>never</b>\n\t\t * set the data directly to _aData internally in DataTables - always use\n\t\t * this method. It allows mData to function as required. This function\n\t\t * is automatically assigned by the column initialisation method\n\t\t *  @type function\n\t\t *  @param {array|object} oData The data array/object for the array\n\t\t *    (i.e. aoData[]._aData)\n\t\t *  @param {*} sValue Value to set\n\t\t *  @default null\n\t\t */\n\t\t\"fnSetData\": null,\n\t\n\t\t/**\n\t\t * Property to read the value for the cells in the column from the data\n\t\t * source array / object. If null, then the default content is used, if a\n\t\t * function is given then the return from the function is used.\n\t\t *  @type function|int|string|null\n\t\t *  @default null\n\t\t */\n\t\t\"mData\": null,\n\t\n\t\t/**\n\t\t * Partner property to mData which is used (only when defined) to get\n\t\t * the data - i.e. it is basically the same as mData, but without the\n\t\t * 'set' option, and also the data fed to it is the result from mData.\n\t\t * This is the rendering method to match the data method of mData.\n\t\t *  @type function|int|string|null\n\t\t *  @default null\n\t\t */\n\t\t\"mRender\": null,\n\t\n\t\t/**\n\t\t * Unique header TH/TD element for this column - this is what the sorting\n\t\t * listener is attached to (if sorting is enabled.)\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTh\": null,\n\t\n\t\t/**\n\t\t * Unique footer TH/TD element for this column (if there is one). Not used\n\t\t * in DataTables as such, but can be used for plug-ins to reference the\n\t\t * footer for each column.\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTf\": null,\n\t\n\t\t/**\n\t\t * The class to apply to all TD elements in the table's TBODY for the column\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sClass\": null,\n\t\n\t\t/**\n\t\t * When DataTables calculates the column widths to assign to each column,\n\t\t * it finds the longest string in each column and then constructs a\n\t\t * temporary table and reads the widths from that. The problem with this\n\t\t * is that \"mmm\" is much wider then \"iiii\", but the latter is a longer\n\t\t * string - thus the calculation can go wrong (doing it properly and putting\n\t\t * it into an DOM object and measuring that is horribly(!) slow). Thus as\n\t\t * a \"work around\" we provide this option. It will append its value to the\n\t\t * text that is found to be the longest string for the column - i.e. padding.\n\t\t *  @type string\n\t\t */\n\t\t\"sContentPadding\": null,\n\t\n\t\t/**\n\t\t * Allows a default value to be given for a column's data, and will be used\n\t\t * whenever a null data source is encountered (this can be because mData\n\t\t * is set to null, or because the data source itself is null).\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sDefaultContent\": null,\n\t\n\t\t/**\n\t\t * Name for the column, allowing reference to the column by name as well as\n\t\t * by index (needs a lookup to work by name).\n\t\t *  @type string\n\t\t */\n\t\t\"sName\": null,\n\t\n\t\t/**\n\t\t * Custom sorting data type - defines which of the available plug-ins in\n\t\t * afnSortData the custom sorting will use - if any is defined.\n\t\t *  @type string\n\t\t *  @default std\n\t\t */\n\t\t\"sSortDataType\": 'std',\n\t\n\t\t/**\n\t\t * Class to be applied to the header element when sorting on this column\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sSortingClass\": null,\n\t\n\t\t/**\n\t\t * Class to be applied to the header element when sorting on this column -\n\t\t * when jQuery UI theming is used.\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sSortingClassJUI\": null,\n\t\n\t\t/**\n\t\t * Title of the column - what is seen in the TH element (nTh).\n\t\t *  @type string\n\t\t */\n\t\t\"sTitle\": null,\n\t\n\t\t/**\n\t\t * Column sorting and filtering type\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sType\": null,\n\t\n\t\t/**\n\t\t * Width of the column\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sWidth\": null,\n\t\n\t\t/**\n\t\t * Width of the column when it was first \"encountered\"\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sWidthOrig\": null\n\t};\n\t\n\t\n\t/*\n\t * Developer note: The properties of the object below are given in Hungarian\n\t * notation, that was used as the interface for DataTables prior to v1.10, however\n\t * from v1.10 onwards the primary interface is camel case. In order to avoid\n\t * breaking backwards compatibility utterly with this change, the Hungarian\n\t * version is still, internally the primary interface, but is is not documented\n\t * - hence the @name tags in each doc comment. This allows a Javascript function\n\t * to create a map from Hungarian notation to camel case (going the other direction\n\t * would require each property to be listed, which would at around 3K to the size\n\t * of DataTables, while this method is about a 0.5K hit.\n\t *\n\t * Ultimately this does pave the way for Hungarian notation to be dropped\n\t * completely, but that is a massive amount of work and will break current\n\t * installs (therefore is on-hold until v2).\n\t */\n\t\n\t/**\n\t * Initialisation options that can be given to DataTables at initialisation\n\t * time.\n\t *  @namespace\n\t */\n\tDataTable.defaults = {\n\t\t/**\n\t\t * An array of data to use for the table, passed in at initialisation which\n\t\t * will be used in preference to any data which is already in the DOM. This is\n\t\t * particularly useful for constructing tables purely in Javascript, for\n\t\t * example with a custom Ajax call.\n\t\t *  @type array\n\t\t *  @default null\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.data\n\t\t *\n\t\t *  @example\n\t\t *    // Using a 2D array data source\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"data\": [\n\t\t *          ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'],\n\t\t *          ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'],\n\t\t *        ],\n\t\t *        \"columns\": [\n\t\t *          { \"title\": \"Engine\" },\n\t\t *          { \"title\": \"Browser\" },\n\t\t *          { \"title\": \"Platform\" },\n\t\t *          { \"title\": \"Version\" },\n\t\t *          { \"title\": \"Grade\" }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using an array of objects as a data source (`data`)\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"data\": [\n\t\t *          {\n\t\t *            \"engine\":   \"Trident\",\n\t\t *            \"browser\":  \"Internet Explorer 4.0\",\n\t\t *            \"platform\": \"Win 95+\",\n\t\t *            \"version\":  4,\n\t\t *            \"grade\":    \"X\"\n\t\t *          },\n\t\t *          {\n\t\t *            \"engine\":   \"Trident\",\n\t\t *            \"browser\":  \"Internet Explorer 5.0\",\n\t\t *            \"platform\": \"Win 95+\",\n\t\t *            \"version\":  5,\n\t\t *            \"grade\":    \"C\"\n\t\t *          }\n\t\t *        ],\n\t\t *        \"columns\": [\n\t\t *          { \"title\": \"Engine\",   \"data\": \"engine\" },\n\t\t *          { \"title\": \"Browser\",  \"data\": \"browser\" },\n\t\t *          { \"title\": \"Platform\", \"data\": \"platform\" },\n\t\t *          { \"title\": \"Version\",  \"data\": \"version\" },\n\t\t *          { \"title\": \"Grade\",    \"data\": \"grade\" }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"aaData\": null,\n\t\n\t\n\t\t/**\n\t\t * If ordering is enabled, then DataTables will perform a first pass sort on\n\t\t * initialisation. You can define which column(s) the sort is performed\n\t\t * upon, and the sorting direction, with this variable. The `sorting` array\n\t\t * should contain an array for each column to be sorted initially containing\n\t\t * the column's index and a direction string ('asc' or 'desc').\n\t\t *  @type array\n\t\t *  @default [[0,'asc']]\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.order\n\t\t *\n\t\t *  @example\n\t\t *    // Sort by 3rd column first, and then 4th column\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"order\": [[2,'asc'], [3,'desc']]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *    // No initial sorting\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"order\": []\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"aaSorting\": [[0,'asc']],\n\t\n\t\n\t\t/**\n\t\t * This parameter is basically identical to the `sorting` parameter, but\n\t\t * cannot be overridden by user interaction with the table. What this means\n\t\t * is that you could have a column (visible or hidden) which the sorting\n\t\t * will always be forced on first - any sorting after that (from the user)\n\t\t * will then be performed as required. This can be useful for grouping rows\n\t\t * together.\n\t\t *  @type array\n\t\t *  @default null\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.orderFixed\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"orderFixed\": [[0,'asc']]\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"aaSortingFixed\": [],\n\t\n\t\n\t\t/**\n\t\t * DataTables can be instructed to load data to display in the table from a\n\t\t * Ajax source. This option defines how that Ajax call is made and where to.\n\t\t *\n\t\t * The `ajax` property has three different modes of operation, depending on\n\t\t * how it is defined. These are:\n\t\t *\n\t\t * * `string` - Set the URL from where the data should be loaded from.\n\t\t * * `object` - Define properties for `jQuery.ajax`.\n\t\t * * `function` - Custom data get function\n\t\t *\n\t\t * `string`\n\t\t * --------\n\t\t *\n\t\t * As a string, the `ajax` property simply defines the URL from which\n\t\t * DataTables will load data.\n\t\t *\n\t\t * `object`\n\t\t * --------\n\t\t *\n\t\t * As an object, the parameters in the object are passed to\n\t\t * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control\n\t\t * of the Ajax request. DataTables has a number of default parameters which\n\t\t * you can override using this option. Please refer to the jQuery\n\t\t * documentation for a full description of the options available, although\n\t\t * the following parameters provide additional options in DataTables or\n\t\t * require special consideration:\n\t\t *\n\t\t * * `data` - As with jQuery, `data` can be provided as an object, but it\n\t\t *   can also be used as a function to manipulate the data DataTables sends\n\t\t *   to the server. The function takes a single parameter, an object of\n\t\t *   parameters with the values that DataTables has readied for sending. An\n\t\t *   object may be returned which will be merged into the DataTables\n\t\t *   defaults, or you can add the items to the object that was passed in and\n\t\t *   not return anything from the function. This supersedes `fnServerParams`\n\t\t *   from DataTables 1.9-.\n\t\t *\n\t\t * * `dataSrc` - By default DataTables will look for the property `data` (or\n\t\t *   `aaData` for compatibility with DataTables 1.9-) when obtaining data\n\t\t *   from an Ajax source or for server-side processing - this parameter\n\t\t *   allows that property to be changed. You can use Javascript dotted\n\t\t *   object notation to get a data source for multiple levels of nesting, or\n\t\t *   it my be used as a function. As a function it takes a single parameter,\n\t\t *   the JSON returned from the server, which can be manipulated as\n\t\t *   required, with the returned value being that used by DataTables as the\n\t\t *   data source for the table. This supersedes `sAjaxDataProp` from\n\t\t *   DataTables 1.9-.\n\t\t *\n\t\t * * `success` - Should not be overridden it is used internally in\n\t\t *   DataTables. To manipulate / transform the data returned by the server\n\t\t *   use `ajax.dataSrc`, or use `ajax` as a function (see below).\n\t\t *\n\t\t * `function`\n\t\t * ----------\n\t\t *\n\t\t * As a function, making the Ajax call is left up to yourself allowing\n\t\t * complete control of the Ajax request. Indeed, if desired, a method other\n\t\t * than Ajax could be used to obtain the required data, such as Web storage\n\t\t * or an AIR database.\n\t\t *\n\t\t * The function is given four parameters and no return is required. The\n\t\t * parameters are:\n\t\t *\n\t\t * 1. _object_ - Data to send to the server\n\t\t * 2. _function_ - Callback function that must be executed when the required\n\t\t *    data has been obtained. That data should be passed into the callback\n\t\t *    as the only parameter\n\t\t * 3. _object_ - DataTables settings object for the table\n\t\t *\n\t\t * Note that this supersedes `fnServerData` from DataTables 1.9-.\n\t\t *\n\t\t *  @type string|object|function\n\t\t *  @default null\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.ajax\n\t\t *  @since 1.10.0\n\t\t *\n\t\t * @example\n\t\t *   // Get JSON data from a file via Ajax.\n\t\t *   // Note DataTables expects data in the form `{ data: [ ...data... ] }` by default).\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": \"data.json\"\n\t\t *   } );\n\t\t *\n\t\t * @example\n\t\t *   // Get JSON data from a file via Ajax, using `dataSrc` to change\n\t\t *   // `data` to `tableData` (i.e. `{ tableData: [ ...data... ] }`)\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": {\n\t\t *       \"url\": \"data.json\",\n\t\t *       \"dataSrc\": \"tableData\"\n\t\t *     }\n\t\t *   } );\n\t\t *\n\t\t * @example\n\t\t *   // Get JSON data from a file via Ajax, using `dataSrc` to read data\n\t\t *   // from a plain array rather than an array in an object\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": {\n\t\t *       \"url\": \"data.json\",\n\t\t *       \"dataSrc\": \"\"\n\t\t *     }\n\t\t *   } );\n\t\t *\n\t\t * @example\n\t\t *   // Manipulate the data returned from the server - add a link to data\n\t\t *   // (note this can, should, be done using `render` for the column - this\n\t\t *   // is just a simple example of how the data can be manipulated).\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": {\n\t\t *       \"url\": \"data.json\",\n\t\t *       \"dataSrc\": function ( json ) {\n\t\t *         for ( var i=0, ien=json.length ; i<ien ; i++ ) {\n\t\t *           json[i][0] = '<a href=\"/message/'+json[i][0]+'>View message</a>';\n\t\t *         }\n\t\t *         return json;\n\t\t *       }\n\t\t *     }\n\t\t *   } );\n\t\t *\n\t\t * @example\n\t\t *   // Add data to the request\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": {\n\t\t *       \"url\": \"data.json\",\n\t\t *       \"data\": function ( d ) {\n\t\t *         return {\n\t\t *           \"extra_search\": $('#extra').val()\n\t\t *         };\n\t\t *       }\n\t\t *     }\n\t\t *   } );\n\t\t *\n\t\t * @example\n\t\t *   // Send request as POST\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": {\n\t\t *       \"url\": \"data.json\",\n\t\t *       \"type\": \"POST\"\n\t\t *     }\n\t\t *   } );\n\t\t *\n\t\t * @example\n\t\t *   // Get the data from localStorage (could interface with a form for\n\t\t *   // adding, editing and removing rows).\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": function (data, callback, settings) {\n\t\t *       callback(\n\t\t *         JSON.parse( localStorage.getItem('dataTablesData') )\n\t\t *       );\n\t\t *     }\n\t\t *   } );\n\t\t */\n\t\t\"ajax\": null,\n\t\n\t\n\t\t/**\n\t\t * This parameter allows you to readily specify the entries in the length drop\n\t\t * down menu that DataTables shows when pagination is enabled. It can be\n\t\t * either a 1D array of options which will be used for both the displayed\n\t\t * option and the value, or a 2D array which will use the array in the first\n\t\t * position as the value, and the array in the second position as the\n\t\t * displayed options (useful for language strings such as 'All').\n\t\t *\n\t\t * Note that the `pageLength` property will be automatically set to the\n\t\t * first value given in this array, unless `pageLength` is also provided.\n\t\t *  @type array\n\t\t *  @default [ 10, 25, 50, 100 ]\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.lengthMenu\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"lengthMenu\": [[10, 25, 50, -1], [10, 25, 50, \"All\"]]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"aLengthMenu\": [ 10, 25, 50, 100 ],\n\t\n\t\n\t\t/**\n\t\t * The `columns` option in the initialisation parameter allows you to define\n\t\t * details about the way individual columns behave. For a full list of\n\t\t * column options that can be set, please see\n\t\t * {@link DataTable.defaults.column}. Note that if you use `columns` to\n\t\t * define your columns, you must have an entry in the array for every single\n\t\t * column that you have in your table (these can be null if you don't which\n\t\t * to specify any options).\n\t\t *  @member\n\t\t *\n\t\t *  @name DataTable.defaults.column\n\t\t */\n\t\t\"aoColumns\": null,\n\t\n\t\t/**\n\t\t * Very similar to `columns`, `columnDefs` allows you to target a specific\n\t\t * column, multiple columns, or all columns, using the `targets` property of\n\t\t * each object in the array. This allows great flexibility when creating\n\t\t * tables, as the `columnDefs` arrays can be of any length, targeting the\n\t\t * columns you specifically want. `columnDefs` may use any of the column\n\t\t * options available: {@link DataTable.defaults.column}, but it _must_\n\t\t * have `targets` defined in each object in the array. Values in the `targets`\n\t\t * array may be:\n\t\t *   <ul>\n\t\t *     <li>a string - class name will be matched on the TH for the column</li>\n\t\t *     <li>0 or a positive integer - column index counting from the left</li>\n\t\t *     <li>a negative integer - column index counting from the right</li>\n\t\t *     <li>the string \"_all\" - all columns (i.e. assign a default)</li>\n\t\t *   </ul>\n\t\t *  @member\n\t\t *\n\t\t *  @name DataTable.defaults.columnDefs\n\t\t */\n\t\t\"aoColumnDefs\": null,\n\t\n\t\n\t\t/**\n\t\t * Basically the same as `search`, this parameter defines the individual column\n\t\t * filtering state at initialisation time. The array must be of the same size\n\t\t * as the number of columns, and each element be an object with the parameters\n\t\t * `search` and `escapeRegex` (the latter is optional). 'null' is also\n\t\t * accepted and the default will be used.\n\t\t *  @type array\n\t\t *  @default []\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.searchCols\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"searchCols\": [\n\t\t *          null,\n\t\t *          { \"search\": \"My filter\" },\n\t\t *          null,\n\t\t *          { \"search\": \"^[0-9]\", \"escapeRegex\": false }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"aoSearchCols\": [],\n\t\n\t\n\t\t/**\n\t\t * An array of CSS classes that should be applied to displayed rows. This\n\t\t * array may be of any length, and DataTables will apply each class\n\t\t * sequentially, looping when required.\n\t\t *  @type array\n\t\t *  @default null <i>Will take the values determined by the `oClasses.stripe*`\n\t\t *    options</i>\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.stripeClasses\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stripeClasses\": [ 'strip1', 'strip2', 'strip3' ]\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"asStripeClasses\": null,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable automatic column width calculation. This can be disabled\n\t\t * as an optimisation (it takes some time to calculate the widths) if the\n\t\t * tables widths are passed in using `columns`.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.autoWidth\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"autoWidth\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bAutoWidth\": true,\n\t\n\t\n\t\t/**\n\t\t * Deferred rendering can provide DataTables with a huge speed boost when you\n\t\t * are using an Ajax or JS data source for the table. This option, when set to\n\t\t * true, will cause DataTables to defer the creation of the table elements for\n\t\t * each row until they are needed for a draw - saving a significant amount of\n\t\t * time.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.deferRender\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"ajax\": \"sources/arrays.txt\",\n\t\t *        \"deferRender\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bDeferRender\": false,\n\t\n\t\n\t\t/**\n\t\t * Replace a DataTable which matches the given selector and replace it with\n\t\t * one which has the properties of the new initialisation object passed. If no\n\t\t * table matches the selector, then the new DataTable will be constructed as\n\t\t * per normal.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.destroy\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"srollY\": \"200px\",\n\t\t *        \"paginate\": false\n\t\t *      } );\n\t\t *\n\t\t *      // Some time later....\n\t\t *      $('#example').dataTable( {\n\t\t *        \"filter\": false,\n\t\t *        \"destroy\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bDestroy\": false,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable filtering of data. Filtering in DataTables is \"smart\" in\n\t\t * that it allows the end user to input multiple words (space separated) and\n\t\t * will match a row containing those words, even if not in the order that was\n\t\t * specified (this allow matching across multiple columns). Note that if you\n\t\t * wish to use filtering in DataTables this must remain 'true' - to remove the\n\t\t * default filtering input box and retain filtering abilities, please use\n\t\t * {@link DataTable.defaults.dom}.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.searching\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"searching\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bFilter\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable the table information display. This shows information\n\t\t * about the data that is currently visible on the page, including information\n\t\t * about filtered data if that action is being performed.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.info\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"info\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bInfo\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable jQuery UI ThemeRoller support (required as ThemeRoller requires some\n\t\t * slightly different and additional mark-up from what DataTables has\n\t\t * traditionally used).\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.jQueryUI\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"jQueryUI\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bJQueryUI\": false,\n\t\n\t\n\t\t/**\n\t\t * Allows the end user to select the size of a formatted page from a select\n\t\t * menu (sizes are 10, 25, 50 and 100). Requires pagination (`paginate`).\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.lengthChange\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"lengthChange\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bLengthChange\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable pagination.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.paging\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"paging\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bPaginate\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable the display of a 'processing' indicator when the table is\n\t\t * being processed (e.g. a sort). This is particularly useful for tables with\n\t\t * large amounts of data where it can take a noticeable amount of time to sort\n\t\t * the entries.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.processing\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"processing\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bProcessing\": false,\n\t\n\t\n\t\t/**\n\t\t * Retrieve the DataTables object for the given selector. Note that if the\n\t\t * table has already been initialised, this parameter will cause DataTables\n\t\t * to simply return the object that has already been set up - it will not take\n\t\t * account of any changes you might have made to the initialisation object\n\t\t * passed to DataTables (setting this parameter to true is an acknowledgement\n\t\t * that you understand this). `destroy` can be used to reinitialise a table if\n\t\t * you need.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.retrieve\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      initTable();\n\t\t *      tableActions();\n\t\t *    } );\n\t\t *\n\t\t *    function initTable ()\n\t\t *    {\n\t\t *      return $('#example').dataTable( {\n\t\t *        \"scrollY\": \"200px\",\n\t\t *        \"paginate\": false,\n\t\t *        \"retrieve\": true\n\t\t *      } );\n\t\t *    }\n\t\t *\n\t\t *    function tableActions ()\n\t\t *    {\n\t\t *      var table = initTable();\n\t\t *      // perform API operations with oTable\n\t\t *    }\n\t\t */\n\t\t\"bRetrieve\": false,\n\t\n\t\n\t\t/**\n\t\t * When vertical (y) scrolling is enabled, DataTables will force the height of\n\t\t * the table's viewport to the given height at all times (useful for layout).\n\t\t * However, this can look odd when filtering data down to a small data set,\n\t\t * and the footer is left \"floating\" further down. This parameter (when\n\t\t * enabled) will cause DataTables to collapse the table's viewport down when\n\t\t * the result set will fit within the given Y height.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.scrollCollapse\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"scrollY\": \"200\",\n\t\t *        \"scrollCollapse\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bScrollCollapse\": false,\n\t\n\t\n\t\t/**\n\t\t * Configure DataTables to use server-side processing. Note that the\n\t\t * `ajax` parameter must also be given in order to give DataTables a\n\t\t * source to obtain the required data for each draw.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @dtopt Server-side\n\t\t *  @name DataTable.defaults.serverSide\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"serverSide\": true,\n\t\t *        \"ajax\": \"xhr.php\"\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bServerSide\": false,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable sorting of columns. Sorting of individual columns can be\n\t\t * disabled by the `sortable` option for each column.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.ordering\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"ordering\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bSort\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or display DataTables' ability to sort multiple columns at the\n\t\t * same time (activated by shift-click by the user).\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.orderMulti\n\t\t *\n\t\t *  @example\n\t\t *    // Disable multiple column sorting ability\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"orderMulti\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bSortMulti\": true,\n\t\n\t\n\t\t/**\n\t\t * Allows control over whether DataTables should use the top (true) unique\n\t\t * cell that is found for a single column, or the bottom (false - default).\n\t\t * This is useful when using complex headers.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.orderCellsTop\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"orderCellsTop\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bSortCellsTop\": false,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable the addition of the classes `sorting\\_1`, `sorting\\_2` and\n\t\t * `sorting\\_3` to the columns which are currently being sorted on. This is\n\t\t * presented as a feature switch as it can increase processing time (while\n\t\t * classes are removed and added) so for large data sets you might want to\n\t\t * turn this off.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.orderClasses\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"orderClasses\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bSortClasses\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable state saving. When enabled HTML5 `localStorage` will be\n\t\t * used to save table display information such as pagination information,\n\t\t * display length, filtering and sorting. As such when the end user reloads\n\t\t * the page the display display will match what thy had previously set up.\n\t\t *\n\t\t * Due to the use of `localStorage` the default state saving is not supported\n\t\t * in IE6 or 7. If state saving is required in those browsers, use\n\t\t * `stateSaveCallback` to provide a storage solution such as cookies.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.stateSave\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bStateSave\": false,\n\t\n\t\n\t\t/**\n\t\t * This function is called when a TR element is created (and all TD child\n\t\t * elements have been inserted), or registered if using a DOM source, allowing\n\t\t * manipulation of the TR element (adding classes etc).\n\t\t *  @type function\n\t\t *  @param {node} row \"TR\" element for the current row\n\t\t *  @param {array} data Raw data array for this row\n\t\t *  @param {int} dataIndex The index of this row in the internal aoData array\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.createdRow\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"createdRow\": function( row, data, dataIndex ) {\n\t\t *          // Bold the grade for all 'A' grade browsers\n\t\t *          if ( data[4] == \"A\" )\n\t\t *          {\n\t\t *            $('td:eq(4)', row).html( '<b>A</b>' );\n\t\t *          }\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnCreatedRow\": null,\n\t\n\t\n\t\t/**\n\t\t * This function is called on every 'draw' event, and allows you to\n\t\t * dynamically modify any aspect you want about the created DOM.\n\t\t *  @type function\n\t\t *  @param {object} settings DataTables settings object\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.drawCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"drawCallback\": function( settings ) {\n\t\t *          alert( 'DataTables has redrawn the table' );\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnDrawCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * Identical to fnHeaderCallback() but for the table footer this function\n\t\t * allows you to modify the table footer on every 'draw' event.\n\t\t *  @type function\n\t\t *  @param {node} foot \"TR\" element for the footer\n\t\t *  @param {array} data Full table data (as derived from the original HTML)\n\t\t *  @param {int} start Index for the current display starting point in the\n\t\t *    display array\n\t\t *  @param {int} end Index for the current display ending point in the\n\t\t *    display array\n\t\t *  @param {array int} display Index array to translate the visual position\n\t\t *    to the full data array\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.footerCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"footerCallback\": function( tfoot, data, start, end, display ) {\n\t\t *          tfoot.getElementsByTagName('th')[0].innerHTML = \"Starting index is \"+start;\n\t\t *        }\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"fnFooterCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * When rendering large numbers in the information element for the table\n\t\t * (i.e. \"Showing 1 to 10 of 57 entries\") DataTables will render large numbers\n\t\t * to have a comma separator for the 'thousands' units (e.g. 1 million is\n\t\t * rendered as \"1,000,000\") to help readability for the end user. This\n\t\t * function will override the default method DataTables uses.\n\t\t *  @type function\n\t\t *  @member\n\t\t *  @param {int} toFormat number to be formatted\n\t\t *  @returns {string} formatted string for DataTables to show the number\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.formatNumber\n\t\t *\n\t\t *  @example\n\t\t *    // Format a number using a single quote for the separator (note that\n\t\t *    // this can also be done with the language.thousands option)\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"formatNumber\": function ( toFormat ) {\n\t\t *          return toFormat.toString().replace(\n\t\t *            /\\B(?=(\\d{3})+(?!\\d))/g, \"'\"\n\t\t *          );\n\t\t *        };\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnFormatNumber\": function ( toFormat ) {\n\t\t\treturn toFormat.toString().replace(\n\t\t\t\t/\\B(?=(\\d{3})+(?!\\d))/g,\n\t\t\t\tthis.oLanguage.sThousands\n\t\t\t);\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * This function is called on every 'draw' event, and allows you to\n\t\t * dynamically modify the header row. This can be used to calculate and\n\t\t * display useful information about the table.\n\t\t *  @type function\n\t\t *  @param {node} head \"TR\" element for the header\n\t\t *  @param {array} data Full table data (as derived from the original HTML)\n\t\t *  @param {int} start Index for the current display starting point in the\n\t\t *    display array\n\t\t *  @param {int} end Index for the current display ending point in the\n\t\t *    display array\n\t\t *  @param {array int} display Index array to translate the visual position\n\t\t *    to the full data array\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.headerCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"fheaderCallback\": function( head, data, start, end, display ) {\n\t\t *          head.getElementsByTagName('th')[0].innerHTML = \"Displaying \"+(end-start)+\" records\";\n\t\t *        }\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"fnHeaderCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * The information element can be used to convey information about the current\n\t\t * state of the table. Although the internationalisation options presented by\n\t\t * DataTables are quite capable of dealing with most customisations, there may\n\t\t * be times where you wish to customise the string further. This callback\n\t\t * allows you to do exactly that.\n\t\t *  @type function\n\t\t *  @param {object} oSettings DataTables settings object\n\t\t *  @param {int} start Starting position in data for the draw\n\t\t *  @param {int} end End position in data for the draw\n\t\t *  @param {int} max Total number of rows in the table (regardless of\n\t\t *    filtering)\n\t\t *  @param {int} total Total number of rows in the data set, after filtering\n\t\t *  @param {string} pre The string that DataTables has formatted using it's\n\t\t *    own rules\n\t\t *  @returns {string} The string to be displayed in the information element.\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.infoCallback\n\t\t *\n\t\t *  @example\n\t\t *    $('#example').dataTable( {\n\t\t *      \"infoCallback\": function( settings, start, end, max, total, pre ) {\n\t\t *        return start +\" to \"+ end;\n\t\t *      }\n\t\t *    } );\n\t\t */\n\t\t\"fnInfoCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * Called when the table has been initialised. Normally DataTables will\n\t\t * initialise sequentially and there will be no need for this function,\n\t\t * however, this does not hold true when using external language information\n\t\t * since that is obtained using an async XHR call.\n\t\t *  @type function\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @param {object} json The JSON object request from the server - only\n\t\t *    present if client-side Ajax sourced data is used\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.initComplete\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"initComplete\": function(settings, json) {\n\t\t *          alert( 'DataTables has finished its initialisation.' );\n\t\t *        }\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"fnInitComplete\": null,\n\t\n\t\n\t\t/**\n\t\t * Called at the very start of each table draw and can be used to cancel the\n\t\t * draw by returning false, any other return (including undefined) results in\n\t\t * the full draw occurring).\n\t\t *  @type function\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @returns {boolean} False will cancel the draw, anything else (including no\n\t\t *    return) will allow it to complete.\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.preDrawCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"preDrawCallback\": function( settings ) {\n\t\t *          if ( $('#test').val() == 1 ) {\n\t\t *            return false;\n\t\t *          }\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnPreDrawCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * This function allows you to 'post process' each row after it have been\n\t\t * generated for each table draw, but before it is rendered on screen. This\n\t\t * function might be used for setting the row class name etc.\n\t\t *  @type function\n\t\t *  @param {node} row \"TR\" element for the current row\n\t\t *  @param {array} data Raw data array for this row\n\t\t *  @param {int} displayIndex The display index for the current table draw\n\t\t *  @param {int} displayIndexFull The index of the data in the full list of\n\t\t *    rows (after filtering)\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.rowCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"rowCallback\": function( row, data, displayIndex, displayIndexFull ) {\n\t\t *          // Bold the grade for all 'A' grade browsers\n\t\t *          if ( data[4] == \"A\" ) {\n\t\t *            $('td:eq(4)', row).html( '<b>A</b>' );\n\t\t *          }\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnRowCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t *\n\t\t * This parameter allows you to override the default function which obtains\n\t\t * the data from the server so something more suitable for your application.\n\t\t * For example you could use POST data, or pull information from a Gears or\n\t\t * AIR database.\n\t\t *  @type function\n\t\t *  @member\n\t\t *  @param {string} source HTTP source to obtain the data from (`ajax`)\n\t\t *  @param {array} data A key/value pair object containing the data to send\n\t\t *    to the server\n\t\t *  @param {function} callback to be called on completion of the data get\n\t\t *    process that will draw the data on the page.\n\t\t *  @param {object} settings DataTables settings object\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @dtopt Server-side\n\t\t *  @name DataTable.defaults.serverData\n\t\t *\n\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t */\n\t\t\"fnServerData\": null,\n\t\n\t\n\t\t/**\n\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t *\n\t\t *  It is often useful to send extra data to the server when making an Ajax\n\t\t * request - for example custom filtering information, and this callback\n\t\t * function makes it trivial to send extra information to the server. The\n\t\t * passed in parameter is the data set that has been constructed by\n\t\t * DataTables, and you can add to this or modify it as you require.\n\t\t *  @type function\n\t\t *  @param {array} data Data array (array of objects which are name/value\n\t\t *    pairs) that has been constructed by DataTables and will be sent to the\n\t\t *    server. In the case of Ajax sourced data with server-side processing\n\t\t *    this will be an empty array, for server-side processing there will be a\n\t\t *    significant number of parameters!\n\t\t *  @returns {undefined} Ensure that you modify the data array passed in,\n\t\t *    as this is passed by reference.\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @dtopt Server-side\n\t\t *  @name DataTable.defaults.serverParams\n\t\t *\n\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t */\n\t\t\"fnServerParams\": null,\n\t\n\t\n\t\t/**\n\t\t * Load the table state. With this function you can define from where, and how, the\n\t\t * state of a table is loaded. By default DataTables will load from `localStorage`\n\t\t * but you might wish to use a server-side database or cookies.\n\t\t *  @type function\n\t\t *  @member\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @param {object} callback Callback that can be executed when done. It\n\t\t *    should be passed the loaded state object.\n\t\t *  @return {object} The DataTables state object to be loaded\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.stateLoadCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true,\n\t\t *        \"stateLoadCallback\": function (settings, callback) {\n\t\t *          $.ajax( {\n\t\t *            \"url\": \"/state_load\",\n\t\t *            \"dataType\": \"json\",\n\t\t *            \"success\": function (json) {\n\t\t *              callback( json );\n\t\t *            }\n\t\t *          } );\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnStateLoadCallback\": function ( settings ) {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(\n\t\t\t\t\t(settings.iStateDuration === -1 ? sessionStorage : localStorage).getItem(\n\t\t\t\t\t\t'DataTables_'+settings.sInstance+'_'+location.pathname\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} catch (e) {}\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * Callback which allows modification of the saved state prior to loading that state.\n\t\t * This callback is called when the table is loading state from the stored data, but\n\t\t * prior to the settings object being modified by the saved state. Note that for\n\t\t * plug-in authors, you should use the `stateLoadParams` event to load parameters for\n\t\t * a plug-in.\n\t\t *  @type function\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @param {object} data The state object that is to be loaded\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.stateLoadParams\n\t\t *\n\t\t *  @example\n\t\t *    // Remove a saved filter, so filtering is never loaded\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true,\n\t\t *        \"stateLoadParams\": function (settings, data) {\n\t\t *          data.oSearch.sSearch = \"\";\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Disallow state loading by returning false\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true,\n\t\t *        \"stateLoadParams\": function (settings, data) {\n\t\t *          return false;\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnStateLoadParams\": null,\n\t\n\t\n\t\t/**\n\t\t * Callback that is called when the state has been loaded from the state saving method\n\t\t * and the DataTables settings object has been modified as a result of the loaded state.\n\t\t *  @type function\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @param {object} data The state object that was loaded\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.stateLoaded\n\t\t *\n\t\t *  @example\n\t\t *    // Show an alert with the filtering value that was saved\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true,\n\t\t *        \"stateLoaded\": function (settings, data) {\n\t\t *          alert( 'Saved filter was: '+data.oSearch.sSearch );\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnStateLoaded\": null,\n\t\n\t\n\t\t/**\n\t\t * Save the table state. This function allows you to define where and how the state\n\t\t * information for the table is stored By default DataTables will use `localStorage`\n\t\t * but you might wish to use a server-side database or cookies.\n\t\t *  @type function\n\t\t *  @member\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @param {object} data The state object to be saved\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.stateSaveCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true,\n\t\t *        \"stateSaveCallback\": function (settings, data) {\n\t\t *          // Send an Ajax request to the server with the state object\n\t\t *          $.ajax( {\n\t\t *            \"url\": \"/state_save\",\n\t\t *            \"data\": data,\n\t\t *            \"dataType\": \"json\",\n\t\t *            \"method\": \"POST\"\n\t\t *            \"success\": function () {}\n\t\t *          } );\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnStateSaveCallback\": function ( settings, data ) {\n\t\t\ttry {\n\t\t\t\t(settings.iStateDuration === -1 ? sessionStorage : localStorage).setItem(\n\t\t\t\t\t'DataTables_'+settings.sInstance+'_'+location.pathname,\n\t\t\t\t\tJSON.stringify( data )\n\t\t\t\t);\n\t\t\t} catch (e) {}\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * Callback which allows modification of the state to be saved. Called when the table\n\t\t * has changed state a new state save is required. This method allows modification of\n\t\t * the state saving object prior to actually doing the save, including addition or\n\t\t * other state properties or modification. Note that for plug-in authors, you should\n\t\t * use the `stateSaveParams` event to save parameters for a plug-in.\n\t\t *  @type function\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @param {object} data The state object to be saved\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.stateSaveParams\n\t\t *\n\t\t *  @example\n\t\t *    // Remove a saved filter, so filtering is never saved\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true,\n\t\t *        \"stateSaveParams\": function (settings, data) {\n\t\t *          data.oSearch.sSearch = \"\";\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnStateSaveParams\": null,\n\t\n\t\n\t\t/**\n\t\t * Duration for which the saved state information is considered valid. After this period\n\t\t * has elapsed the state will be returned to the default.\n\t\t * Value is given in seconds.\n\t\t *  @type int\n\t\t *  @default 7200 <i>(2 hours)</i>\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.stateDuration\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateDuration\": 60*60*24; // 1 day\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"iStateDuration\": 7200,\n\t\n\t\n\t\t/**\n\t\t * When enabled DataTables will not make a request to the server for the first\n\t\t * page draw - rather it will use the data already on the page (no sorting etc\n\t\t * will be applied to it), thus saving on an XHR at load time. `deferLoading`\n\t\t * is used to indicate that deferred loading is required, but it is also used\n\t\t * to tell DataTables how many records there are in the full table (allowing\n\t\t * the information element and pagination to be displayed correctly). In the case\n\t\t * where a filtering is applied to the table on initial load, this can be\n\t\t * indicated by giving the parameter as an array, where the first element is\n\t\t * the number of records available after filtering and the second element is the\n\t\t * number of records without filtering (allowing the table information element\n\t\t * to be shown correctly).\n\t\t *  @type int | array\n\t\t *  @default null\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.deferLoading\n\t\t *\n\t\t *  @example\n\t\t *    // 57 records available in the table, no filtering applied\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"serverSide\": true,\n\t\t *        \"ajax\": \"scripts/server_processing.php\",\n\t\t *        \"deferLoading\": 57\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // 57 records after filtering, 100 without filtering (an initial filter applied)\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"serverSide\": true,\n\t\t *        \"ajax\": \"scripts/server_processing.php\",\n\t\t *        \"deferLoading\": [ 57, 100 ],\n\t\t *        \"search\": {\n\t\t *          \"search\": \"my_filter\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"iDeferLoading\": null,\n\t\n\t\n\t\t/**\n\t\t * Number of rows to display on a single page when using pagination. If\n\t\t * feature enabled (`lengthChange`) then the end user will be able to override\n\t\t * this to a custom setting using a pop-up menu.\n\t\t *  @type int\n\t\t *  @default 10\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.pageLength\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"pageLength\": 50\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"iDisplayLength\": 10,\n\t\n\t\n\t\t/**\n\t\t * Define the starting point for data display when using DataTables with\n\t\t * pagination. Note that this parameter is the number of records, rather than\n\t\t * the page number, so if you have 10 records per page and want to start on\n\t\t * the third page, it should be \"20\".\n\t\t *  @type int\n\t\t *  @default 0\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.displayStart\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"displayStart\": 20\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"iDisplayStart\": 0,\n\t\n\t\n\t\t/**\n\t\t * By default DataTables allows keyboard navigation of the table (sorting, paging,\n\t\t * and filtering) by adding a `tabindex` attribute to the required elements. This\n\t\t * allows you to tab through the controls and press the enter key to activate them.\n\t\t * The tabindex is default 0, meaning that the tab follows the flow of the document.\n\t\t * You can overrule this using this parameter if you wish. Use a value of -1 to\n\t\t * disable built-in keyboard navigation.\n\t\t *  @type int\n\t\t *  @default 0\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.tabIndex\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"tabIndex\": 1\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"iTabIndex\": 0,\n\t\n\t\n\t\t/**\n\t\t * Classes that DataTables assigns to the various components and features\n\t\t * that it adds to the HTML table. This allows classes to be configured\n\t\t * during initialisation in addition to through the static\n\t\t * {@link DataTable.ext.oStdClasses} object).\n\t\t *  @namespace\n\t\t *  @name DataTable.defaults.classes\n\t\t */\n\t\t\"oClasses\": {},\n\t\n\t\n\t\t/**\n\t\t * All strings that DataTables uses in the user interface that it creates\n\t\t * are defined in this object, allowing you to modified them individually or\n\t\t * completely replace them all as required.\n\t\t *  @namespace\n\t\t *  @name DataTable.defaults.language\n\t\t */\n\t\t\"oLanguage\": {\n\t\t\t/**\n\t\t\t * Strings that are used for WAI-ARIA labels and controls only (these are not\n\t\t\t * actually visible on the page, but will be read by screenreaders, and thus\n\t\t\t * must be internationalised as well).\n\t\t\t *  @namespace\n\t\t\t *  @name DataTable.defaults.language.aria\n\t\t\t */\n\t\t\t\"oAria\": {\n\t\t\t\t/**\n\t\t\t\t * ARIA label that is added to the table headers when the column may be\n\t\t\t\t * sorted ascending by activing the column (click or return when focused).\n\t\t\t\t * Note that the column header is prefixed to this string.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default : activate to sort column ascending\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.aria.sortAscending\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"aria\": {\n\t\t\t\t *            \"sortAscending\": \" - click/return to sort ascending\"\n\t\t\t\t *          }\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sSortAscending\": \": activate to sort column ascending\",\n\t\n\t\t\t\t/**\n\t\t\t\t * ARIA label that is added to the table headers when the column may be\n\t\t\t\t * sorted descending by activing the column (click or return when focused).\n\t\t\t\t * Note that the column header is prefixed to this string.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default : activate to sort column ascending\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.aria.sortDescending\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"aria\": {\n\t\t\t\t *            \"sortDescending\": \" - click/return to sort descending\"\n\t\t\t\t *          }\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sSortDescending\": \": activate to sort column descending\"\n\t\t\t},\n\t\n\t\t\t/**\n\t\t\t * Pagination string used by DataTables for the built-in pagination\n\t\t\t * control types.\n\t\t\t *  @namespace\n\t\t\t *  @name DataTable.defaults.language.paginate\n\t\t\t */\n\t\t\t\"oPaginate\": {\n\t\t\t\t/**\n\t\t\t\t * Text to use when using the 'full_numbers' type of pagination for the\n\t\t\t\t * button to take the user to the first page.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default First\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.paginate.first\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"paginate\": {\n\t\t\t\t *            \"first\": \"First page\"\n\t\t\t\t *          }\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sFirst\": \"First\",\n\t\n\t\n\t\t\t\t/**\n\t\t\t\t * Text to use when using the 'full_numbers' type of pagination for the\n\t\t\t\t * button to take the user to the last page.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default Last\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.paginate.last\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"paginate\": {\n\t\t\t\t *            \"last\": \"Last page\"\n\t\t\t\t *          }\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sLast\": \"Last\",\n\t\n\t\n\t\t\t\t/**\n\t\t\t\t * Text to use for the 'next' pagination button (to take the user to the\n\t\t\t\t * next page).\n\t\t\t\t *  @type string\n\t\t\t\t *  @default Next\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.paginate.next\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"paginate\": {\n\t\t\t\t *            \"next\": \"Next page\"\n\t\t\t\t *          }\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sNext\": \"Next\",\n\t\n\t\n\t\t\t\t/**\n\t\t\t\t * Text to use for the 'previous' pagination button (to take the user to\n\t\t\t\t * the previous page).\n\t\t\t\t *  @type string\n\t\t\t\t *  @default Previous\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.paginate.previous\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"paginate\": {\n\t\t\t\t *            \"previous\": \"Previous page\"\n\t\t\t\t *          }\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sPrevious\": \"Previous\"\n\t\t\t},\n\t\n\t\t\t/**\n\t\t\t * This string is shown in preference to `zeroRecords` when the table is\n\t\t\t * empty of data (regardless of filtering). Note that this is an optional\n\t\t\t * parameter - if it is not given, the value of `zeroRecords` will be used\n\t\t\t * instead (either the default or given value).\n\t\t\t *  @type string\n\t\t\t *  @default No data available in table\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.emptyTable\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"emptyTable\": \"No data available in table\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sEmptyTable\": \"No data available in table\",\n\t\n\t\n\t\t\t/**\n\t\t\t * This string gives information to the end user about the information\n\t\t\t * that is current on display on the page. The following tokens can be\n\t\t\t * used in the string and will be dynamically replaced as the table\n\t\t\t * display updates. This tokens can be placed anywhere in the string, or\n\t\t\t * removed as needed by the language requires:\n\t\t\t *\n\t\t\t * * `\\_START\\_` - Display index of the first record on the current page\n\t\t\t * * `\\_END\\_` - Display index of the last record on the current page\n\t\t\t * * `\\_TOTAL\\_` - Number of records in the table after filtering\n\t\t\t * * `\\_MAX\\_` - Number of records in the table without filtering\n\t\t\t * * `\\_PAGE\\_` - Current page number\n\t\t\t * * `\\_PAGES\\_` - Total number of pages of data in the table\n\t\t\t *\n\t\t\t *  @type string\n\t\t\t *  @default Showing _START_ to _END_ of _TOTAL_ entries\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.info\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"info\": \"Showing page _PAGE_ of _PAGES_\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sInfo\": \"Showing _START_ to _END_ of _TOTAL_ entries\",\n\t\n\t\n\t\t\t/**\n\t\t\t * Display information string for when the table is empty. Typically the\n\t\t\t * format of this string should match `info`.\n\t\t\t *  @type string\n\t\t\t *  @default Showing 0 to 0 of 0 entries\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.infoEmpty\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"infoEmpty\": \"No entries to show\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sInfoEmpty\": \"Showing 0 to 0 of 0 entries\",\n\t\n\t\n\t\t\t/**\n\t\t\t * When a user filters the information in a table, this string is appended\n\t\t\t * to the information (`info`) to give an idea of how strong the filtering\n\t\t\t * is. The variable _MAX_ is dynamically updated.\n\t\t\t *  @type string\n\t\t\t *  @default (filtered from _MAX_ total entries)\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.infoFiltered\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"infoFiltered\": \" - filtering from _MAX_ records\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sInfoFiltered\": \"(filtered from _MAX_ total entries)\",\n\t\n\t\n\t\t\t/**\n\t\t\t * If can be useful to append extra information to the info string at times,\n\t\t\t * and this variable does exactly that. This information will be appended to\n\t\t\t * the `info` (`infoEmpty` and `infoFiltered` in whatever combination they are\n\t\t\t * being used) at all times.\n\t\t\t *  @type string\n\t\t\t *  @default <i>Empty string</i>\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.infoPostFix\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"infoPostFix\": \"All records shown are derived from real information.\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sInfoPostFix\": \"\",\n\t\n\t\n\t\t\t/**\n\t\t\t * This decimal place operator is a little different from the other\n\t\t\t * language options since DataTables doesn't output floating point\n\t\t\t * numbers, so it won't ever use this for display of a number. Rather,\n\t\t\t * what this parameter does is modify the sort methods of the table so\n\t\t\t * that numbers which are in a format which has a character other than\n\t\t\t * a period (`.`) as a decimal place will be sorted numerically.\n\t\t\t *\n\t\t\t * Note that numbers with different decimal places cannot be shown in\n\t\t\t * the same table and still be sortable, the table must be consistent.\n\t\t\t * However, multiple different tables on the page can use different\n\t\t\t * decimal place characters.\n\t\t\t *  @type string\n\t\t\t *  @default \n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.decimal\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"decimal\": \",\"\n\t\t\t *          \"thousands\": \".\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sDecimal\": \"\",\n\t\n\t\n\t\t\t/**\n\t\t\t * DataTables has a build in number formatter (`formatNumber`) which is\n\t\t\t * used to format large numbers that are used in the table information.\n\t\t\t * By default a comma is used, but this can be trivially changed to any\n\t\t\t * character you wish with this parameter.\n\t\t\t *  @type string\n\t\t\t *  @default ,\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.thousands\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"thousands\": \"'\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sThousands\": \",\",\n\t\n\t\n\t\t\t/**\n\t\t\t * Detail the action that will be taken when the drop down menu for the\n\t\t\t * pagination length option is changed. The '_MENU_' variable is replaced\n\t\t\t * with a default select list of 10, 25, 50 and 100, and can be replaced\n\t\t\t * with a custom select box if required.\n\t\t\t *  @type string\n\t\t\t *  @default Show _MENU_ entries\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.lengthMenu\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Language change only\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"lengthMenu\": \"Display _MENU_ records\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Language and options change\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"lengthMenu\": 'Display <select>'+\n\t\t\t *            '<option value=\"10\">10</option>'+\n\t\t\t *            '<option value=\"20\">20</option>'+\n\t\t\t *            '<option value=\"30\">30</option>'+\n\t\t\t *            '<option value=\"40\">40</option>'+\n\t\t\t *            '<option value=\"50\">50</option>'+\n\t\t\t *            '<option value=\"-1\">All</option>'+\n\t\t\t *            '</select> records'\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sLengthMenu\": \"Show _MENU_ entries\",\n\t\n\t\n\t\t\t/**\n\t\t\t * When using Ajax sourced data and during the first draw when DataTables is\n\t\t\t * gathering the data, this message is shown in an empty row in the table to\n\t\t\t * indicate to the end user the the data is being loaded. Note that this\n\t\t\t * parameter is not used when loading data by server-side processing, just\n\t\t\t * Ajax sourced data with client-side processing.\n\t\t\t *  @type string\n\t\t\t *  @default Loading...\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.loadingRecords\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"loadingRecords\": \"Please wait - loading...\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sLoadingRecords\": \"Loading...\",\n\t\n\t\n\t\t\t/**\n\t\t\t * Text which is displayed when the table is processing a user action\n\t\t\t * (usually a sort command or similar).\n\t\t\t *  @type string\n\t\t\t *  @default Processing...\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.processing\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"processing\": \"DataTables is currently busy\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sProcessing\": \"Processing...\",\n\t\n\t\n\t\t\t/**\n\t\t\t * Details the actions that will be taken when the user types into the\n\t\t\t * filtering input text box. The variable \"_INPUT_\", if used in the string,\n\t\t\t * is replaced with the HTML text box for the filtering input allowing\n\t\t\t * control over where it appears in the string. If \"_INPUT_\" is not given\n\t\t\t * then the input box is appended to the string automatically.\n\t\t\t *  @type string\n\t\t\t *  @default Search:\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.search\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Input text box will be appended at the end automatically\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"search\": \"Filter records:\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Specify where the filter should appear\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"search\": \"Apply filter _INPUT_ to table\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sSearch\": \"Search:\",\n\t\n\t\n\t\t\t/**\n\t\t\t * Assign a `placeholder` attribute to the search `input` element\n\t\t\t *  @type string\n\t\t\t *  @default \n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.searchPlaceholder\n\t\t\t */\n\t\t\t\"sSearchPlaceholder\": \"\",\n\t\n\t\n\t\t\t/**\n\t\t\t * All of the language information can be stored in a file on the\n\t\t\t * server-side, which DataTables will look up if this parameter is passed.\n\t\t\t * It must store the URL of the language file, which is in a JSON format,\n\t\t\t * and the object has the same properties as the oLanguage object in the\n\t\t\t * initialiser object (i.e. the above parameters). Please refer to one of\n\t\t\t * the example language files to see how this works in action.\n\t\t\t *  @type string\n\t\t\t *  @default <i>Empty string - i.e. disabled</i>\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.url\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"url\": \"http://www.sprymedia.co.uk/dataTables/lang.txt\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sUrl\": \"\",\n\t\n\t\n\t\t\t/**\n\t\t\t * Text shown inside the table records when the is no information to be\n\t\t\t * displayed after filtering. `emptyTable` is shown when there is simply no\n\t\t\t * information in the table at all (regardless of filtering).\n\t\t\t *  @type string\n\t\t\t *  @default No matching records found\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.zeroRecords\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"zeroRecords\": \"No records to display\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sZeroRecords\": \"No matching records found\"\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * This parameter allows you to have define the global filtering state at\n\t\t * initialisation time. As an object the `search` parameter must be\n\t\t * defined, but all other parameters are optional. When `regex` is true,\n\t\t * the search string will be treated as a regular expression, when false\n\t\t * (default) it will be treated as a straight string. When `smart`\n\t\t * DataTables will use it's smart filtering methods (to word match at\n\t\t * any point in the data), when false this will not be done.\n\t\t *  @namespace\n\t\t *  @extends DataTable.models.oSearch\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.search\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"search\": {\"search\": \"Initial search\"}\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"oSearch\": $.extend( {}, DataTable.models.oSearch ),\n\t\n\t\n\t\t/**\n\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t *\n\t\t * By default DataTables will look for the property `data` (or `aaData` for\n\t\t * compatibility with DataTables 1.9-) when obtaining data from an Ajax\n\t\t * source or for server-side processing - this parameter allows that\n\t\t * property to be changed. You can use Javascript dotted object notation to\n\t\t * get a data source for multiple levels of nesting.\n\t\t *  @type string\n\t\t *  @default data\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @dtopt Server-side\n\t\t *  @name DataTable.defaults.ajaxDataProp\n\t\t *\n\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t */\n\t\t\"sAjaxDataProp\": \"data\",\n\t\n\t\n\t\t/**\n\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t *\n\t\t * You can instruct DataTables to load data from an external\n\t\t * source using this parameter (use aData if you want to pass data in you\n\t\t * already have). Simply provide a url a JSON object can be obtained from.\n\t\t *  @type string\n\t\t *  @default null\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @dtopt Server-side\n\t\t *  @name DataTable.defaults.ajaxSource\n\t\t *\n\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t */\n\t\t\"sAjaxSource\": null,\n\t\n\t\n\t\t/**\n\t\t * This initialisation variable allows you to specify exactly where in the\n\t\t * DOM you want DataTables to inject the various controls it adds to the page\n\t\t * (for example you might want the pagination controls at the top of the\n\t\t * table). DIV elements (with or without a custom class) can also be added to\n\t\t * aid styling. The follow syntax is used:\n\t\t *   <ul>\n\t\t *     <li>The following options are allowed:\n\t\t *       <ul>\n\t\t *         <li>'l' - Length changing</li>\n\t\t *         <li>'f' - Filtering input</li>\n\t\t *         <li>'t' - The table!</li>\n\t\t *         <li>'i' - Information</li>\n\t\t *         <li>'p' - Pagination</li>\n\t\t *         <li>'r' - pRocessing</li>\n\t\t *       </ul>\n\t\t *     </li>\n\t\t *     <li>The following constants are allowed:\n\t\t *       <ul>\n\t\t *         <li>'H' - jQueryUI theme \"header\" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li>\n\t\t *         <li>'F' - jQueryUI theme \"footer\" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li>\n\t\t *       </ul>\n\t\t *     </li>\n\t\t *     <li>The following syntax is expected:\n\t\t *       <ul>\n\t\t *         <li>'&lt;' and '&gt;' - div elements</li>\n\t\t *         <li>'&lt;\"class\" and '&gt;' - div with a class</li>\n\t\t *         <li>'&lt;\"#id\" and '&gt;' - div with an ID</li>\n\t\t *       </ul>\n\t\t *     </li>\n\t\t *     <li>Examples:\n\t\t *       <ul>\n\t\t *         <li>'&lt;\"wrapper\"flipt&gt;'</li>\n\t\t *         <li>'&lt;lf&lt;t&gt;ip&gt;'</li>\n\t\t *       </ul>\n\t\t *     </li>\n\t\t *   </ul>\n\t\t *  @type string\n\t\t *  @default lfrtip <i>(when `jQueryUI` is false)</i> <b>or</b>\n\t\t *    <\"H\"lfr>t<\"F\"ip> <i>(when `jQueryUI` is true)</i>\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.dom\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"dom\": '&lt;\"top\"i&gt;rt&lt;\"bottom\"flp&gt;&lt;\"clear\"&gt;'\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sDom\": \"lfrtip\",\n\t\n\t\n\t\t/**\n\t\t * Search delay option. This will throttle full table searches that use the\n\t\t * DataTables provided search input element (it does not effect calls to\n\t\t * `dt-api search()`, providing a delay before the search is made.\n\t\t *  @type integer\n\t\t *  @default 0\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.searchDelay\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"searchDelay\": 200\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"searchDelay\": null,\n\t\n\t\n\t\t/**\n\t\t * DataTables features six different built-in options for the buttons to\n\t\t * display for pagination control:\n\t\t *\n\t\t * * `numbers` - Page number buttons only\n\t\t * * `simple` - 'Previous' and 'Next' buttons only\n\t\t * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers\n\t\t * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons\n\t\t * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus page numbers\n\t\t * * `first_last_numbers` - 'First' and 'Last' buttons, plus page numbers\n\t\t *  \n\t\t * Further methods can be added using {@link DataTable.ext.oPagination}.\n\t\t *  @type string\n\t\t *  @default simple_numbers\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.pagingType\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"pagingType\": \"full_numbers\"\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"sPaginationType\": \"simple_numbers\",\n\t\n\t\n\t\t/**\n\t\t * Enable horizontal scrolling. When a table is too wide to fit into a\n\t\t * certain layout, or you have a large number of columns in the table, you\n\t\t * can enable x-scrolling to show the table in a viewport, which can be\n\t\t * scrolled. This property can be `true` which will allow the table to\n\t\t * scroll horizontally when needed, or any CSS unit, or a number (in which\n\t\t * case it will be treated as a pixel measurement). Setting as simply `true`\n\t\t * is recommended.\n\t\t *  @type boolean|string\n\t\t *  @default <i>blank string - i.e. disabled</i>\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.scrollX\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"scrollX\": true,\n\t\t *        \"scrollCollapse\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sScrollX\": \"\",\n\t\n\t\n\t\t/**\n\t\t * This property can be used to force a DataTable to use more width than it\n\t\t * might otherwise do when x-scrolling is enabled. For example if you have a\n\t\t * table which requires to be well spaced, this parameter is useful for\n\t\t * \"over-sizing\" the table, and thus forcing scrolling. This property can by\n\t\t * any CSS unit, or a number (in which case it will be treated as a pixel\n\t\t * measurement).\n\t\t *  @type string\n\t\t *  @default <i>blank string - i.e. disabled</i>\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.scrollXInner\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"scrollX\": \"100%\",\n\t\t *        \"scrollXInner\": \"110%\"\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sScrollXInner\": \"\",\n\t\n\t\n\t\t/**\n\t\t * Enable vertical scrolling. Vertical scrolling will constrain the DataTable\n\t\t * to the given height, and enable scrolling for any data which overflows the\n\t\t * current viewport. This can be used as an alternative to paging to display\n\t\t * a lot of data in a small area (although paging and scrolling can both be\n\t\t * enabled at the same time). This property can be any CSS unit, or a number\n\t\t * (in which case it will be treated as a pixel measurement).\n\t\t *  @type string\n\t\t *  @default <i>blank string - i.e. disabled</i>\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.scrollY\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"scrollY\": \"200px\",\n\t\t *        \"paginate\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sScrollY\": \"\",\n\t\n\t\n\t\t/**\n\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t *\n\t\t * Set the HTTP method that is used to make the Ajax call for server-side\n\t\t * processing or Ajax sourced data.\n\t\t *  @type string\n\t\t *  @default GET\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @dtopt Server-side\n\t\t *  @name DataTable.defaults.serverMethod\n\t\t *\n\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t */\n\t\t\"sServerMethod\": \"GET\",\n\t\n\t\n\t\t/**\n\t\t * DataTables makes use of renderers when displaying HTML elements for\n\t\t * a table. These renderers can be added or modified by plug-ins to\n\t\t * generate suitable mark-up for a site. For example the Bootstrap\n\t\t * integration plug-in for DataTables uses a paging button renderer to\n\t\t * display pagination buttons in the mark-up required by Bootstrap.\n\t\t *\n\t\t * For further information about the renderers available see\n\t\t * DataTable.ext.renderer\n\t\t *  @type string|object\n\t\t *  @default null\n\t\t *\n\t\t *  @name DataTable.defaults.renderer\n\t\t *\n\t\t */\n\t\t\"renderer\": null,\n\t\n\t\n\t\t/**\n\t\t * Set the data property name that DataTables should use to get a row's id\n\t\t * to set as the `id` property in the node.\n\t\t *  @type string\n\t\t *  @default DT_RowId\n\t\t *\n\t\t *  @name DataTable.defaults.rowId\n\t\t */\n\t\t\"rowId\": \"DT_RowId\"\n\t};\n\t\n\t_fnHungarianMap( DataTable.defaults );\n\t\n\t\n\t\n\t/*\n\t * Developer note - See note in model.defaults.js about the use of Hungarian\n\t * notation and camel case.\n\t */\n\t\n\t/**\n\t * Column options that can be given to DataTables at initialisation time.\n\t *  @namespace\n\t */\n\tDataTable.defaults.column = {\n\t\t/**\n\t\t * Define which column(s) an order will occur on for this column. This\n\t\t * allows a column's ordering to take multiple columns into account when\n\t\t * doing a sort or use the data from a different column. For example first\n\t\t * name / last name columns make sense to do a multi-column sort over the\n\t\t * two columns.\n\t\t *  @type array|int\n\t\t *  @default null <i>Takes the value of the column index automatically</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.orderData\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"orderData\": [ 0, 1 ], \"targets\": [ 0 ] },\n\t\t *          { \"orderData\": [ 1, 0 ], \"targets\": [ 1 ] },\n\t\t *          { \"orderData\": 2, \"targets\": [ 2 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"orderData\": [ 0, 1 ] },\n\t\t *          { \"orderData\": [ 1, 0 ] },\n\t\t *          { \"orderData\": 2 },\n\t\t *          null,\n\t\t *          null\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"aDataSort\": null,\n\t\t\"iDataSort\": -1,\n\t\n\t\n\t\t/**\n\t\t * You can control the default ordering direction, and even alter the\n\t\t * behaviour of the sort handler (i.e. only allow ascending ordering etc)\n\t\t * using this parameter.\n\t\t *  @type array\n\t\t *  @default [ 'asc', 'desc' ]\n\t\t *\n\t\t *  @name DataTable.defaults.column.orderSequence\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"orderSequence\": [ \"asc\" ], \"targets\": [ 1 ] },\n\t\t *          { \"orderSequence\": [ \"desc\", \"asc\", \"asc\" ], \"targets\": [ 2 ] },\n\t\t *          { \"orderSequence\": [ \"desc\" ], \"targets\": [ 3 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          null,\n\t\t *          { \"orderSequence\": [ \"asc\" ] },\n\t\t *          { \"orderSequence\": [ \"desc\", \"asc\", \"asc\" ] },\n\t\t *          { \"orderSequence\": [ \"desc\" ] },\n\t\t *          null\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"asSorting\": [ 'asc', 'desc' ],\n\t\n\t\n\t\t/**\n\t\t * Enable or disable filtering on the data in this column.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @name DataTable.defaults.column.searchable\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"searchable\": false, \"targets\": [ 0 ] }\n\t\t *        ] } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"searchable\": false },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ] } );\n\t\t *    } );\n\t\t */\n\t\t\"bSearchable\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable ordering on this column.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @name DataTable.defaults.column.orderable\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"orderable\": false, \"targets\": [ 0 ] }\n\t\t *        ] } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"orderable\": false },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ] } );\n\t\t *    } );\n\t\t */\n\t\t\"bSortable\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable the display of this column.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @name DataTable.defaults.column.visible\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"visible\": false, \"targets\": [ 0 ] }\n\t\t *        ] } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"visible\": false },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ] } );\n\t\t *    } );\n\t\t */\n\t\t\"bVisible\": true,\n\t\n\t\n\t\t/**\n\t\t * Developer definable function that is called whenever a cell is created (Ajax source,\n\t\t * etc) or processed for input (DOM source). This can be used as a compliment to mRender\n\t\t * allowing you to modify the DOM element (add background colour for example) when the\n\t\t * element is available.\n\t\t *  @type function\n\t\t *  @param {element} td The TD node that has been created\n\t\t *  @param {*} cellData The Data for the cell\n\t\t *  @param {array|object} rowData The data for the whole row\n\t\t *  @param {int} row The row index for the aoData data store\n\t\t *  @param {int} col The column index for aoColumns\n\t\t *\n\t\t *  @name DataTable.defaults.column.createdCell\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [3],\n\t\t *          \"createdCell\": function (td, cellData, rowData, row, col) {\n\t\t *            if ( cellData == \"1.7\" ) {\n\t\t *              $(td).css('color', 'blue')\n\t\t *            }\n\t\t *          }\n\t\t *        } ]\n\t\t *      });\n\t\t *    } );\n\t\t */\n\t\t\"fnCreatedCell\": null,\n\t\n\t\n\t\t/**\n\t\t * This parameter has been replaced by `data` in DataTables to ensure naming\n\t\t * consistency. `dataProp` can still be used, as there is backwards\n\t\t * compatibility in DataTables for this option, but it is strongly\n\t\t * recommended that you use `data` in preference to `dataProp`.\n\t\t *  @name DataTable.defaults.column.dataProp\n\t\t */\n\t\n\t\n\t\t/**\n\t\t * This property can be used to read data from any data source property,\n\t\t * including deeply nested objects / properties. `data` can be given in a\n\t\t * number of different ways which effect its behaviour:\n\t\t *\n\t\t * * `integer` - treated as an array index for the data source. This is the\n\t\t *   default that DataTables uses (incrementally increased for each column).\n\t\t * * `string` - read an object property from the data source. There are\n\t\t *   three 'special' options that can be used in the string to alter how\n\t\t *   DataTables reads the data from the source object:\n\t\t *    * `.` - Dotted Javascript notation. Just as you use a `.` in\n\t\t *      Javascript to read from nested objects, so to can the options\n\t\t *      specified in `data`. For example: `browser.version` or\n\t\t *      `browser.name`. If your object parameter name contains a period, use\n\t\t *      `\\\\` to escape it - i.e. `first\\\\.name`.\n\t\t *    * `[]` - Array notation. DataTables can automatically combine data\n\t\t *      from and array source, joining the data with the characters provided\n\t\t *      between the two brackets. For example: `name[, ]` would provide a\n\t\t *      comma-space separated list from the source array. If no characters\n\t\t *      are provided between the brackets, the original array source is\n\t\t *      returned.\n\t\t *    * `()` - Function notation. Adding `()` to the end of a parameter will\n\t\t *      execute a function of the name given. For example: `browser()` for a\n\t\t *      simple function on the data source, `browser.version()` for a\n\t\t *      function in a nested property or even `browser().version` to get an\n\t\t *      object property if the function called returns an object. Note that\n\t\t *      function notation is recommended for use in `render` rather than\n\t\t *      `data` as it is much simpler to use as a renderer.\n\t\t * * `null` - use the original data source for the row rather than plucking\n\t\t *   data directly from it. This action has effects on two other\n\t\t *   initialisation options:\n\t\t *    * `defaultContent` - When null is given as the `data` option and\n\t\t *      `defaultContent` is specified for the column, the value defined by\n\t\t *      `defaultContent` will be used for the cell.\n\t\t *    * `render` - When null is used for the `data` option and the `render`\n\t\t *      option is specified for the column, the whole data source for the\n\t\t *      row is used for the renderer.\n\t\t * * `function` - the function given will be executed whenever DataTables\n\t\t *   needs to set or get the data for a cell in the column. The function\n\t\t *   takes three parameters:\n\t\t *    * Parameters:\n\t\t *      * `{array|object}` The data source for the row\n\t\t *      * `{string}` The type call data requested - this will be 'set' when\n\t\t *        setting data or 'filter', 'display', 'type', 'sort' or undefined\n\t\t *        when gathering data. Note that when `undefined` is given for the\n\t\t *        type DataTables expects to get the raw data for the object back<\n\t\t *      * `{*}` Data to set when the second parameter is 'set'.\n\t\t *    * Return:\n\t\t *      * The return value from the function is not required when 'set' is\n\t\t *        the type of call, but otherwise the return is what will be used\n\t\t *        for the data requested.\n\t\t *\n\t\t * Note that `data` is a getter and setter option. If you just require\n\t\t * formatting of data for output, you will likely want to use `render` which\n\t\t * is simply a getter and thus simpler to use.\n\t\t *\n\t\t * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The\n\t\t * name change reflects the flexibility of this property and is consistent\n\t\t * with the naming of mRender. If 'mDataProp' is given, then it will still\n\t\t * be used by DataTables, as it automatically maps the old name to the new\n\t\t * if required.\n\t\t *\n\t\t *  @type string|int|function|null\n\t\t *  @default null <i>Use automatically calculated column index</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.data\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Read table data from objects\n\t\t *    // JSON structure for each row:\n\t\t *    //   {\n\t\t *    //      \"engine\": {value},\n\t\t *    //      \"browser\": {value},\n\t\t *    //      \"platform\": {value},\n\t\t *    //      \"version\": {value},\n\t\t *    //      \"grade\": {value}\n\t\t *    //   }\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"ajaxSource\": \"sources/objects.txt\",\n\t\t *        \"columns\": [\n\t\t *          { \"data\": \"engine\" },\n\t\t *          { \"data\": \"browser\" },\n\t\t *          { \"data\": \"platform\" },\n\t\t *          { \"data\": \"version\" },\n\t\t *          { \"data\": \"grade\" }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Read information from deeply nested objects\n\t\t *    // JSON structure for each row:\n\t\t *    //   {\n\t\t *    //      \"engine\": {value},\n\t\t *    //      \"browser\": {value},\n\t\t *    //      \"platform\": {\n\t\t *    //         \"inner\": {value}\n\t\t *    //      },\n\t\t *    //      \"details\": [\n\t\t *    //         {value}, {value}\n\t\t *    //      ]\n\t\t *    //   }\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"ajaxSource\": \"sources/deep.txt\",\n\t\t *        \"columns\": [\n\t\t *          { \"data\": \"engine\" },\n\t\t *          { \"data\": \"browser\" },\n\t\t *          { \"data\": \"platform.inner\" },\n\t\t *          { \"data\": \"platform.details.0\" },\n\t\t *          { \"data\": \"platform.details.1\" }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `data` as a function to provide different information for\n\t\t *    // sorting, filtering and display. In this case, currency (price)\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"data\": function ( source, type, val ) {\n\t\t *            if (type === 'set') {\n\t\t *              source.price = val;\n\t\t *              // Store the computed dislay and filter values for efficiency\n\t\t *              source.price_display = val==\"\" ? \"\" : \"$\"+numberFormat(val);\n\t\t *              source.price_filter  = val==\"\" ? \"\" : \"$\"+numberFormat(val)+\" \"+val;\n\t\t *              return;\n\t\t *            }\n\t\t *            else if (type === 'display') {\n\t\t *              return source.price_display;\n\t\t *            }\n\t\t *            else if (type === 'filter') {\n\t\t *              return source.price_filter;\n\t\t *            }\n\t\t *            // 'sort', 'type' and undefined all just use the integer\n\t\t *            return source.price;\n\t\t *          }\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using default content\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"data\": null,\n\t\t *          \"defaultContent\": \"Click to edit\"\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using array notation - outputting a list from an array\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"data\": \"name[, ]\"\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t */\n\t\t\"mData\": null,\n\t\n\t\n\t\t/**\n\t\t * This property is the rendering partner to `data` and it is suggested that\n\t\t * when you want to manipulate data for display (including filtering,\n\t\t * sorting etc) without altering the underlying data for the table, use this\n\t\t * property. `render` can be considered to be the the read only companion to\n\t\t * `data` which is read / write (then as such more complex). Like `data`\n\t\t * this option can be given in a number of different ways to effect its\n\t\t * behaviour:\n\t\t *\n\t\t * * `integer` - treated as an array index for the data source. This is the\n\t\t *   default that DataTables uses (incrementally increased for each column).\n\t\t * * `string` - read an object property from the data source. There are\n\t\t *   three 'special' options that can be used in the string to alter how\n\t\t *   DataTables reads the data from the source object:\n\t\t *    * `.` - Dotted Javascript notation. Just as you use a `.` in\n\t\t *      Javascript to read from nested objects, so to can the options\n\t\t *      specified in `data`. For example: `browser.version` or\n\t\t *      `browser.name`. If your object parameter name contains a period, use\n\t\t *      `\\\\` to escape it - i.e. `first\\\\.name`.\n\t\t *    * `[]` - Array notation. DataTables can automatically combine data\n\t\t *      from and array source, joining the data with the characters provided\n\t\t *      between the two brackets. For example: `name[, ]` would provide a\n\t\t *      comma-space separated list from the source array. If no characters\n\t\t *      are provided between the brackets, the original array source is\n\t\t *      returned.\n\t\t *    * `()` - Function notation. Adding `()` to the end of a parameter will\n\t\t *      execute a function of the name given. For example: `browser()` for a\n\t\t *      simple function on the data source, `browser.version()` for a\n\t\t *      function in a nested property or even `browser().version` to get an\n\t\t *      object property if the function called returns an object.\n\t\t * * `object` - use different data for the different data types requested by\n\t\t *   DataTables ('filter', 'display', 'type' or 'sort'). The property names\n\t\t *   of the object is the data type the property refers to and the value can\n\t\t *   defined using an integer, string or function using the same rules as\n\t\t *   `render` normally does. Note that an `_` option _must_ be specified.\n\t\t *   This is the default value to use if you haven't specified a value for\n\t\t *   the data type requested by DataTables.\n\t\t * * `function` - the function given will be executed whenever DataTables\n\t\t *   needs to set or get the data for a cell in the column. The function\n\t\t *   takes three parameters:\n\t\t *    * Parameters:\n\t\t *      * {array|object} The data source for the row (based on `data`)\n\t\t *      * {string} The type call data requested - this will be 'filter',\n\t\t *        'display', 'type' or 'sort'.\n\t\t *      * {array|object} The full data source for the row (not based on\n\t\t *        `data`)\n\t\t *    * Return:\n\t\t *      * The return value from the function is what will be used for the\n\t\t *        data requested.\n\t\t *\n\t\t *  @type string|int|function|object|null\n\t\t *  @default null Use the data source value.\n\t\t *\n\t\t *  @name DataTable.defaults.column.render\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Create a comma separated list from an array of objects\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"ajaxSource\": \"sources/deep.txt\",\n\t\t *        \"columns\": [\n\t\t *          { \"data\": \"engine\" },\n\t\t *          { \"data\": \"browser\" },\n\t\t *          {\n\t\t *            \"data\": \"platform\",\n\t\t *            \"render\": \"[, ].name\"\n\t\t *          }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Execute a function to obtain data\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"data\": null, // Use the full data source object for the renderer's source\n\t\t *          \"render\": \"browserName()\"\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // As an object, extracting different data for the different types\n\t\t *    // This would be used with a data source such as:\n\t\t *    //   { \"phone\": 5552368, \"phone_filter\": \"5552368 555-2368\", \"phone_display\": \"555-2368\" }\n\t\t *    // Here the `phone` integer is used for sorting and type detection, while `phone_filter`\n\t\t *    // (which has both forms) is used for filtering for if a user inputs either format, while\n\t\t *    // the formatted phone number is the one that is shown in the table.\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"data\": null, // Use the full data source object for the renderer's source\n\t\t *          \"render\": {\n\t\t *            \"_\": \"phone\",\n\t\t *            \"filter\": \"phone_filter\",\n\t\t *            \"display\": \"phone_display\"\n\t\t *          }\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Use as a function to create a link from the data source\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"data\": \"download_link\",\n\t\t *          \"render\": function ( data, type, full ) {\n\t\t *            return '<a href=\"'+data+'\">Download</a>';\n\t\t *          }\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"mRender\": null,\n\t\n\t\n\t\t/**\n\t\t * Change the cell type created for the column - either TD cells or TH cells. This\n\t\t * can be useful as TH cells have semantic meaning in the table body, allowing them\n\t\t * to act as a header for a row (you may wish to add scope='row' to the TH elements).\n\t\t *  @type string\n\t\t *  @default td\n\t\t *\n\t\t *  @name DataTable.defaults.column.cellType\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Make the first column use TH cells\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"cellType\": \"th\"\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sCellType\": \"td\",\n\t\n\t\n\t\t/**\n\t\t * Class to give to each cell in this column.\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.class\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"class\": \"my_class\", \"targets\": [ 0 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"class\": \"my_class\" },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sClass\": \"\",\n\t\n\t\t/**\n\t\t * When DataTables calculates the column widths to assign to each column,\n\t\t * it finds the longest string in each column and then constructs a\n\t\t * temporary table and reads the widths from that. The problem with this\n\t\t * is that \"mmm\" is much wider then \"iiii\", but the latter is a longer\n\t\t * string - thus the calculation can go wrong (doing it properly and putting\n\t\t * it into an DOM object and measuring that is horribly(!) slow). Thus as\n\t\t * a \"work around\" we provide this option. It will append its value to the\n\t\t * text that is found to be the longest string for the column - i.e. padding.\n\t\t * Generally you shouldn't need this!\n\t\t *  @type string\n\t\t *  @default <i>Empty string<i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.contentPadding\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          {\n\t\t *            \"contentPadding\": \"mmm\"\n\t\t *          }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sContentPadding\": \"\",\n\t\n\t\n\t\t/**\n\t\t * Allows a default value to be given for a column's data, and will be used\n\t\t * whenever a null data source is encountered (this can be because `data`\n\t\t * is set to null, or because the data source itself is null).\n\t\t *  @type string\n\t\t *  @default null\n\t\t *\n\t\t *  @name DataTable.defaults.column.defaultContent\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          {\n\t\t *            \"data\": null,\n\t\t *            \"defaultContent\": \"Edit\",\n\t\t *            \"targets\": [ -1 ]\n\t\t *          }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          {\n\t\t *            \"data\": null,\n\t\t *            \"defaultContent\": \"Edit\"\n\t\t *          }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sDefaultContent\": null,\n\t\n\t\n\t\t/**\n\t\t * This parameter is only used in DataTables' server-side processing. It can\n\t\t * be exceptionally useful to know what columns are being displayed on the\n\t\t * client side, and to map these to database fields. When defined, the names\n\t\t * also allow DataTables to reorder information from the server if it comes\n\t\t * back in an unexpected order (i.e. if you switch your columns around on the\n\t\t * client-side, your server-side code does not also need updating).\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.name\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"name\": \"engine\", \"targets\": [ 0 ] },\n\t\t *          { \"name\": \"browser\", \"targets\": [ 1 ] },\n\t\t *          { \"name\": \"platform\", \"targets\": [ 2 ] },\n\t\t *          { \"name\": \"version\", \"targets\": [ 3 ] },\n\t\t *          { \"name\": \"grade\", \"targets\": [ 4 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"name\": \"engine\" },\n\t\t *          { \"name\": \"browser\" },\n\t\t *          { \"name\": \"platform\" },\n\t\t *          { \"name\": \"version\" },\n\t\t *          { \"name\": \"grade\" }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sName\": \"\",\n\t\n\t\n\t\t/**\n\t\t * Defines a data source type for the ordering which can be used to read\n\t\t * real-time information from the table (updating the internally cached\n\t\t * version) prior to ordering. This allows ordering to occur on user\n\t\t * editable elements such as form inputs.\n\t\t *  @type string\n\t\t *  @default std\n\t\t *\n\t\t *  @name DataTable.defaults.column.orderDataType\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"orderDataType\": \"dom-text\", \"targets\": [ 2, 3 ] },\n\t\t *          { \"type\": \"numeric\", \"targets\": [ 3 ] },\n\t\t *          { \"orderDataType\": \"dom-select\", \"targets\": [ 4 ] },\n\t\t *          { \"orderDataType\": \"dom-checkbox\", \"targets\": [ 5 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          null,\n\t\t *          null,\n\t\t *          { \"orderDataType\": \"dom-text\" },\n\t\t *          { \"orderDataType\": \"dom-text\", \"type\": \"numeric\" },\n\t\t *          { \"orderDataType\": \"dom-select\" },\n\t\t *          { \"orderDataType\": \"dom-checkbox\" }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sSortDataType\": \"std\",\n\t\n\t\n\t\t/**\n\t\t * The title of this column.\n\t\t *  @type string\n\t\t *  @default null <i>Derived from the 'TH' value for this column in the\n\t\t *    original HTML table.</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.title\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"title\": \"My column title\", \"targets\": [ 0 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"title\": \"My column title\" },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sTitle\": null,\n\t\n\t\n\t\t/**\n\t\t * The type allows you to specify how the data for this column will be\n\t\t * ordered. Four types (string, numeric, date and html (which will strip\n\t\t * HTML tags before ordering)) are currently available. Note that only date\n\t\t * formats understood by Javascript's Date() object will be accepted as type\n\t\t * date. For example: \"Mar 26, 2008 5:03 PM\". May take the values: 'string',\n\t\t * 'numeric', 'date' or 'html' (by default). Further types can be adding\n\t\t * through plug-ins.\n\t\t *  @type string\n\t\t *  @default null <i>Auto-detected from raw data</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.type\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"type\": \"html\", \"targets\": [ 0 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"type\": \"html\" },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sType\": null,\n\t\n\t\n\t\t/**\n\t\t * Defining the width of the column, this parameter may take any CSS value\n\t\t * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not\n\t\t * been given a specific width through this interface ensuring that the table\n\t\t * remains readable.\n\t\t *  @type string\n\t\t *  @default null <i>Automatic</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.width\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"width\": \"20%\", \"targets\": [ 0 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"width\": \"20%\" },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sWidth\": null\n\t};\n\t\n\t_fnHungarianMap( DataTable.defaults.column );\n\t\n\t\n\t\n\t/**\n\t * DataTables settings object - this holds all the information needed for a\n\t * given table, including configuration, data and current application of the\n\t * table options. DataTables does not have a single instance for each DataTable\n\t * with the settings attached to that instance, but rather instances of the\n\t * DataTable \"class\" are created on-the-fly as needed (typically by a\n\t * $().dataTable() call) and the settings object is then applied to that\n\t * instance.\n\t *\n\t * Note that this object is related to {@link DataTable.defaults} but this\n\t * one is the internal data store for DataTables's cache of columns. It should\n\t * NOT be manipulated outside of DataTables. Any configuration should be done\n\t * through the initialisation options.\n\t *  @namespace\n\t *  @todo Really should attach the settings object to individual instances so we\n\t *    don't need to create new instances on each $().dataTable() call (if the\n\t *    table already exists). It would also save passing oSettings around and\n\t *    into every single function. However, this is a very significant\n\t *    architecture change for DataTables and will almost certainly break\n\t *    backwards compatibility with older installations. This is something that\n\t *    will be done in 2.0.\n\t */\n\tDataTable.models.oSettings = {\n\t\t/**\n\t\t * Primary features of DataTables and their enablement state.\n\t\t *  @namespace\n\t\t */\n\t\t\"oFeatures\": {\n\t\n\t\t\t/**\n\t\t\t * Flag to say if DataTables should automatically try to calculate the\n\t\t\t * optimum table and columns widths (true) or not (false).\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bAutoWidth\": null,\n\t\n\t\t\t/**\n\t\t\t * Delay the creation of TR and TD elements until they are actually\n\t\t\t * needed by a driven page draw. This can give a significant speed\n\t\t\t * increase for Ajax source and Javascript source data, but makes no\n\t\t\t * difference at all fro DOM and server-side processing tables.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bDeferRender\": null,\n\t\n\t\t\t/**\n\t\t\t * Enable filtering on the table or not. Note that if this is disabled\n\t\t\t * then there is no filtering at all on the table, including fnFilter.\n\t\t\t * To just remove the filtering input use sDom and remove the 'f' option.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bFilter\": null,\n\t\n\t\t\t/**\n\t\t\t * Table information element (the 'Showing x of y records' div) enable\n\t\t\t * flag.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bInfo\": null,\n\t\n\t\t\t/**\n\t\t\t * Present a user control allowing the end user to change the page size\n\t\t\t * when pagination is enabled.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bLengthChange\": null,\n\t\n\t\t\t/**\n\t\t\t * Pagination enabled or not. Note that if this is disabled then length\n\t\t\t * changing must also be disabled.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bPaginate\": null,\n\t\n\t\t\t/**\n\t\t\t * Processing indicator enable flag whenever DataTables is enacting a\n\t\t\t * user request - typically an Ajax request for server-side processing.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bProcessing\": null,\n\t\n\t\t\t/**\n\t\t\t * Server-side processing enabled flag - when enabled DataTables will\n\t\t\t * get all data from the server for every draw - there is no filtering,\n\t\t\t * sorting or paging done on the client-side.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bServerSide\": null,\n\t\n\t\t\t/**\n\t\t\t * Sorting enablement flag.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bSort\": null,\n\t\n\t\t\t/**\n\t\t\t * Multi-column sorting\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bSortMulti\": null,\n\t\n\t\t\t/**\n\t\t\t * Apply a class to the columns which are being sorted to provide a\n\t\t\t * visual highlight or not. This can slow things down when enabled since\n\t\t\t * there is a lot of DOM interaction.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bSortClasses\": null,\n\t\n\t\t\t/**\n\t\t\t * State saving enablement flag.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bStateSave\": null\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * Scrolling settings for a table.\n\t\t *  @namespace\n\t\t */\n\t\t\"oScroll\": {\n\t\t\t/**\n\t\t\t * When the table is shorter in height than sScrollY, collapse the\n\t\t\t * table container down to the height of the table (when true).\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bCollapse\": null,\n\t\n\t\t\t/**\n\t\t\t * Width of the scrollbar for the web-browser's platform. Calculated\n\t\t\t * during table initialisation.\n\t\t\t *  @type int\n\t\t\t *  @default 0\n\t\t\t */\n\t\t\t\"iBarWidth\": 0,\n\t\n\t\t\t/**\n\t\t\t * Viewport width for horizontal scrolling. Horizontal scrolling is\n\t\t\t * disabled if an empty string.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type string\n\t\t\t */\n\t\t\t\"sX\": null,\n\t\n\t\t\t/**\n\t\t\t * Width to expand the table to when using x-scrolling. Typically you\n\t\t\t * should not need to use this.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type string\n\t\t\t *  @deprecated\n\t\t\t */\n\t\t\t\"sXInner\": null,\n\t\n\t\t\t/**\n\t\t\t * Viewport height for vertical scrolling. Vertical scrolling is disabled\n\t\t\t * if an empty string.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type string\n\t\t\t */\n\t\t\t\"sY\": null\n\t\t},\n\t\n\t\t/**\n\t\t * Language information for the table.\n\t\t *  @namespace\n\t\t *  @extends DataTable.defaults.oLanguage\n\t\t */\n\t\t\"oLanguage\": {\n\t\t\t/**\n\t\t\t * Information callback function. See\n\t\t\t * {@link DataTable.defaults.fnInfoCallback}\n\t\t\t *  @type function\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"fnInfoCallback\": null\n\t\t},\n\t\n\t\t/**\n\t\t * Browser support parameters\n\t\t *  @namespace\n\t\t */\n\t\t\"oBrowser\": {\n\t\t\t/**\n\t\t\t * Indicate if the browser incorrectly calculates width:100% inside a\n\t\t\t * scrolling element (IE6/7)\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t */\n\t\t\t\"bScrollOversize\": false,\n\t\n\t\t\t/**\n\t\t\t * Determine if the vertical scrollbar is on the right or left of the\n\t\t\t * scrolling container - needed for rtl language layout, although not\n\t\t\t * all browsers move the scrollbar (Safari).\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t */\n\t\t\t\"bScrollbarLeft\": false,\n\t\n\t\t\t/**\n\t\t\t * Flag for if `getBoundingClientRect` is fully supported or not\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t */\n\t\t\t\"bBounding\": false,\n\t\n\t\t\t/**\n\t\t\t * Browser scrollbar width\n\t\t\t *  @type integer\n\t\t\t *  @default 0\n\t\t\t */\n\t\t\t\"barWidth\": 0\n\t\t},\n\t\n\t\n\t\t\"ajax\": null,\n\t\n\t\n\t\t/**\n\t\t * Array referencing the nodes which are used for the features. The\n\t\t * parameters of this object match what is allowed by sDom - i.e.\n\t\t *   <ul>\n\t\t *     <li>'l' - Length changing</li>\n\t\t *     <li>'f' - Filtering input</li>\n\t\t *     <li>'t' - The table!</li>\n\t\t *     <li>'i' - Information</li>\n\t\t *     <li>'p' - Pagination</li>\n\t\t *     <li>'r' - pRocessing</li>\n\t\t *   </ul>\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aanFeatures\": [],\n\t\n\t\t/**\n\t\t * Store data information - see {@link DataTable.models.oRow} for detailed\n\t\t * information.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoData\": [],\n\t\n\t\t/**\n\t\t * Array of indexes which are in the current display (after filtering etc)\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aiDisplay\": [],\n\t\n\t\t/**\n\t\t * Array of indexes for display - no filtering\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aiDisplayMaster\": [],\n\t\n\t\t/**\n\t\t * Map of row ids to data indexes\n\t\t *  @type object\n\t\t *  @default {}\n\t\t */\n\t\t\"aIds\": {},\n\t\n\t\t/**\n\t\t * Store information about each column that is in use\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoColumns\": [],\n\t\n\t\t/**\n\t\t * Store information about the table's header\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoHeader\": [],\n\t\n\t\t/**\n\t\t * Store information about the table's footer\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoFooter\": [],\n\t\n\t\t/**\n\t\t * Store the applied global search information in case we want to force a\n\t\t * research or compare the old search to a new one.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @namespace\n\t\t *  @extends DataTable.models.oSearch\n\t\t */\n\t\t\"oPreviousSearch\": {},\n\t\n\t\t/**\n\t\t * Store the applied search for each column - see\n\t\t * {@link DataTable.models.oSearch} for the format that is used for the\n\t\t * filtering information for each column.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoPreSearchCols\": [],\n\t\n\t\t/**\n\t\t * Sorting that is applied to the table. Note that the inner arrays are\n\t\t * used in the following manner:\n\t\t * <ul>\n\t\t *   <li>Index 0 - column number</li>\n\t\t *   <li>Index 1 - current sorting direction</li>\n\t\t * </ul>\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type array\n\t\t *  @todo These inner arrays should really be objects\n\t\t */\n\t\t\"aaSorting\": null,\n\t\n\t\t/**\n\t\t * Sorting that is always applied to the table (i.e. prefixed in front of\n\t\t * aaSorting).\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aaSortingFixed\": [],\n\t\n\t\t/**\n\t\t * Classes to use for the striping of a table.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"asStripeClasses\": null,\n\t\n\t\t/**\n\t\t * If restoring a table - we should restore its striping classes as well\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"asDestroyStripes\": [],\n\t\n\t\t/**\n\t\t * If restoring a table - we should restore its width\n\t\t *  @type int\n\t\t *  @default 0\n\t\t */\n\t\t\"sDestroyWidth\": 0,\n\t\n\t\t/**\n\t\t * Callback functions array for every time a row is inserted (i.e. on a draw).\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoRowCallback\": [],\n\t\n\t\t/**\n\t\t * Callback functions for the header on each draw.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoHeaderCallback\": [],\n\t\n\t\t/**\n\t\t * Callback function for the footer on each draw.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoFooterCallback\": [],\n\t\n\t\t/**\n\t\t * Array of callback functions for draw callback functions\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoDrawCallback\": [],\n\t\n\t\t/**\n\t\t * Array of callback functions for row created function\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoRowCreatedCallback\": [],\n\t\n\t\t/**\n\t\t * Callback functions for just before the table is redrawn. A return of\n\t\t * false will be used to cancel the draw.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoPreDrawCallback\": [],\n\t\n\t\t/**\n\t\t * Callback functions for when the table has been initialised.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoInitComplete\": [],\n\t\n\t\n\t\t/**\n\t\t * Callbacks for modifying the settings to be stored for state saving, prior to\n\t\t * saving state.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoStateSaveParams\": [],\n\t\n\t\t/**\n\t\t * Callbacks for modifying the settings that have been stored for state saving\n\t\t * prior to using the stored values to restore the state.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoStateLoadParams\": [],\n\t\n\t\t/**\n\t\t * Callbacks for operating on the settings object once the saved state has been\n\t\t * loaded\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoStateLoaded\": [],\n\t\n\t\t/**\n\t\t * Cache the table ID for quick access\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t */\n\t\t\"sTableId\": \"\",\n\t\n\t\t/**\n\t\t * The TABLE node for the main table\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTable\": null,\n\t\n\t\t/**\n\t\t * Permanent ref to the thead element\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTHead\": null,\n\t\n\t\t/**\n\t\t * Permanent ref to the tfoot element - if it exists\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTFoot\": null,\n\t\n\t\t/**\n\t\t * Permanent ref to the tbody element\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTBody\": null,\n\t\n\t\t/**\n\t\t * Cache the wrapper node (contains all DataTables controlled elements)\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTableWrapper\": null,\n\t\n\t\t/**\n\t\t * Indicate if when using server-side processing the loading of data\n\t\t * should be deferred until the second draw.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bDeferLoading\": false,\n\t\n\t\t/**\n\t\t * Indicate if all required information has been read in\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bInitialised\": false,\n\t\n\t\t/**\n\t\t * Information about open rows. Each object in the array has the parameters\n\t\t * 'nTr' and 'nParent'\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoOpenRows\": [],\n\t\n\t\t/**\n\t\t * Dictate the positioning of DataTables' control elements - see\n\t\t * {@link DataTable.model.oInit.sDom}.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sDom\": null,\n\t\n\t\t/**\n\t\t * Search delay (in mS)\n\t\t *  @type integer\n\t\t *  @default null\n\t\t */\n\t\t\"searchDelay\": null,\n\t\n\t\t/**\n\t\t * Which type of pagination should be used.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t *  @default two_button\n\t\t */\n\t\t\"sPaginationType\": \"two_button\",\n\t\n\t\t/**\n\t\t * The state duration (for `stateSave`) in seconds.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type int\n\t\t *  @default 0\n\t\t */\n\t\t\"iStateDuration\": 0,\n\t\n\t\t/**\n\t\t * Array of callback functions for state saving. Each array element is an\n\t\t * object with the following parameters:\n\t\t *   <ul>\n\t\t *     <li>function:fn - function to call. Takes two parameters, oSettings\n\t\t *       and the JSON string to save that has been thus far created. Returns\n\t\t *       a JSON string to be inserted into a json object\n\t\t *       (i.e. '\"param\": [ 0, 1, 2]')</li>\n\t\t *     <li>string:sName - name of callback</li>\n\t\t *   </ul>\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoStateSave\": [],\n\t\n\t\t/**\n\t\t * Array of callback functions for state loading. Each array element is an\n\t\t * object with the following parameters:\n\t\t *   <ul>\n\t\t *     <li>function:fn - function to call. Takes two parameters, oSettings\n\t\t *       and the object stored. May return false to cancel state loading</li>\n\t\t *     <li>string:sName - name of callback</li>\n\t\t *   </ul>\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoStateLoad\": [],\n\t\n\t\t/**\n\t\t * State that was saved. Useful for back reference\n\t\t *  @type object\n\t\t *  @default null\n\t\t */\n\t\t\"oSavedState\": null,\n\t\n\t\t/**\n\t\t * State that was loaded. Useful for back reference\n\t\t *  @type object\n\t\t *  @default null\n\t\t */\n\t\t\"oLoadedState\": null,\n\t\n\t\t/**\n\t\t * Source url for AJAX data for the table.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sAjaxSource\": null,\n\t\n\t\t/**\n\t\t * Property from a given object from which to read the table data from. This\n\t\t * can be an empty string (when not server-side processing), in which case\n\t\t * it is  assumed an an array is given directly.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t */\n\t\t\"sAjaxDataProp\": null,\n\t\n\t\t/**\n\t\t * Note if draw should be blocked while getting data\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t */\n\t\t\"bAjaxDataGet\": true,\n\t\n\t\t/**\n\t\t * The last jQuery XHR object that was used for server-side data gathering.\n\t\t * This can be used for working with the XHR information in one of the\n\t\t * callbacks\n\t\t *  @type object\n\t\t *  @default null\n\t\t */\n\t\t\"jqXHR\": null,\n\t\n\t\t/**\n\t\t * JSON returned from the server in the last Ajax request\n\t\t *  @type object\n\t\t *  @default undefined\n\t\t */\n\t\t\"json\": undefined,\n\t\n\t\t/**\n\t\t * Data submitted as part of the last Ajax request\n\t\t *  @type object\n\t\t *  @default undefined\n\t\t */\n\t\t\"oAjaxData\": undefined,\n\t\n\t\t/**\n\t\t * Function to get the server-side data.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type function\n\t\t */\n\t\t\"fnServerData\": null,\n\t\n\t\t/**\n\t\t * Functions which are called prior to sending an Ajax request so extra\n\t\t * parameters can easily be sent to the server\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoServerParams\": [],\n\t\n\t\t/**\n\t\t * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if\n\t\t * required).\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t */\n\t\t\"sServerMethod\": null,\n\t\n\t\t/**\n\t\t * Format numbers for display.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type function\n\t\t */\n\t\t\"fnFormatNumber\": null,\n\t\n\t\t/**\n\t\t * List of options that can be used for the user selectable length menu.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aLengthMenu\": null,\n\t\n\t\t/**\n\t\t * Counter for the draws that the table does. Also used as a tracker for\n\t\t * server-side processing\n\t\t *  @type int\n\t\t *  @default 0\n\t\t */\n\t\t\"iDraw\": 0,\n\t\n\t\t/**\n\t\t * Indicate if a redraw is being done - useful for Ajax\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bDrawing\": false,\n\t\n\t\t/**\n\t\t * Draw index (iDraw) of the last error when parsing the returned data\n\t\t *  @type int\n\t\t *  @default -1\n\t\t */\n\t\t\"iDrawError\": -1,\n\t\n\t\t/**\n\t\t * Paging display length\n\t\t *  @type int\n\t\t *  @default 10\n\t\t */\n\t\t\"_iDisplayLength\": 10,\n\t\n\t\t/**\n\t\t * Paging start point - aiDisplay index\n\t\t *  @type int\n\t\t *  @default 0\n\t\t */\n\t\t\"_iDisplayStart\": 0,\n\t\n\t\t/**\n\t\t * Server-side processing - number of records in the result set\n\t\t * (i.e. before filtering), Use fnRecordsTotal rather than\n\t\t * this property to get the value of the number of records, regardless of\n\t\t * the server-side processing setting.\n\t\t *  @type int\n\t\t *  @default 0\n\t\t *  @private\n\t\t */\n\t\t\"_iRecordsTotal\": 0,\n\t\n\t\t/**\n\t\t * Server-side processing - number of records in the current display set\n\t\t * (i.e. after filtering). Use fnRecordsDisplay rather than\n\t\t * this property to get the value of the number of records, regardless of\n\t\t * the server-side processing setting.\n\t\t *  @type boolean\n\t\t *  @default 0\n\t\t *  @private\n\t\t */\n\t\t\"_iRecordsDisplay\": 0,\n\t\n\t\t/**\n\t\t * Flag to indicate if jQuery UI marking and classes should be used.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bJUI\": null,\n\t\n\t\t/**\n\t\t * The classes to use for the table\n\t\t *  @type object\n\t\t *  @default {}\n\t\t */\n\t\t\"oClasses\": {},\n\t\n\t\t/**\n\t\t * Flag attached to the settings object so you can check in the draw\n\t\t * callback if filtering has been done in the draw. Deprecated in favour of\n\t\t * events.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *  @deprecated\n\t\t */\n\t\t\"bFiltered\": false,\n\t\n\t\t/**\n\t\t * Flag attached to the settings object so you can check in the draw\n\t\t * callback if sorting has been done in the draw. Deprecated in favour of\n\t\t * events.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *  @deprecated\n\t\t */\n\t\t\"bSorted\": false,\n\t\n\t\t/**\n\t\t * Indicate that if multiple rows are in the header and there is more than\n\t\t * one unique cell per column, if the top one (true) or bottom one (false)\n\t\t * should be used for sorting / title by DataTables.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bSortCellsTop\": null,\n\t\n\t\t/**\n\t\t * Initialisation object that is used for the table\n\t\t *  @type object\n\t\t *  @default null\n\t\t */\n\t\t\"oInit\": null,\n\t\n\t\t/**\n\t\t * Destroy callback functions - for plug-ins to attach themselves to the\n\t\t * destroy so they can clean up markup and events.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoDestroyCallback\": [],\n\t\n\t\n\t\t/**\n\t\t * Get the number of records in the current record set, before filtering\n\t\t *  @type function\n\t\t */\n\t\t\"fnRecordsTotal\": function ()\n\t\t{\n\t\t\treturn _fnDataSource( this ) == 'ssp' ?\n\t\t\t\tthis._iRecordsTotal * 1 :\n\t\t\t\tthis.aiDisplayMaster.length;\n\t\t},\n\t\n\t\t/**\n\t\t * Get the number of records in the current record set, after filtering\n\t\t *  @type function\n\t\t */\n\t\t\"fnRecordsDisplay\": function ()\n\t\t{\n\t\t\treturn _fnDataSource( this ) == 'ssp' ?\n\t\t\t\tthis._iRecordsDisplay * 1 :\n\t\t\t\tthis.aiDisplay.length;\n\t\t},\n\t\n\t\t/**\n\t\t * Get the display end point - aiDisplay index\n\t\t *  @type function\n\t\t */\n\t\t\"fnDisplayEnd\": function ()\n\t\t{\n\t\t\tvar\n\t\t\t\tlen      = this._iDisplayLength,\n\t\t\t\tstart    = this._iDisplayStart,\n\t\t\t\tcalc     = start + len,\n\t\t\t\trecords  = this.aiDisplay.length,\n\t\t\t\tfeatures = this.oFeatures,\n\t\t\t\tpaginate = features.bPaginate;\n\t\n\t\t\tif ( features.bServerSide ) {\n\t\t\t\treturn paginate === false || len === -1 ?\n\t\t\t\t\tstart + records :\n\t\t\t\t\tMath.min( start+len, this._iRecordsDisplay );\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn ! paginate || calc>records || len===-1 ?\n\t\t\t\t\trecords :\n\t\t\t\t\tcalc;\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * The DataTables object for this table\n\t\t *  @type object\n\t\t *  @default null\n\t\t */\n\t\t\"oInstance\": null,\n\t\n\t\t/**\n\t\t * Unique identifier for each instance of the DataTables object. If there\n\t\t * is an ID on the table node, then it takes that value, otherwise an\n\t\t * incrementing internal counter is used.\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sInstance\": null,\n\t\n\t\t/**\n\t\t * tabindex attribute value that is added to DataTables control elements, allowing\n\t\t * keyboard navigation of the table and its controls.\n\t\t */\n\t\t\"iTabIndex\": 0,\n\t\n\t\t/**\n\t\t * DIV container for the footer scrolling table if scrolling\n\t\t */\n\t\t\"nScrollHead\": null,\n\t\n\t\t/**\n\t\t * DIV container for the footer scrolling table if scrolling\n\t\t */\n\t\t\"nScrollFoot\": null,\n\t\n\t\t/**\n\t\t * Last applied sort\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aLastSort\": [],\n\t\n\t\t/**\n\t\t * Stored plug-in instances\n\t\t *  @type object\n\t\t *  @default {}\n\t\t */\n\t\t\"oPlugins\": {},\n\t\n\t\t/**\n\t\t * Function used to get a row's id from the row's data\n\t\t *  @type function\n\t\t *  @default null\n\t\t */\n\t\t\"rowIdFn\": null,\n\t\n\t\t/**\n\t\t * Data location where to store a row's id\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"rowId\": null\n\t};\n\n\t/**\n\t * Extension object for DataTables that is used to provide all extension\n\t * options.\n\t *\n\t * Note that the `DataTable.ext` object is available through\n\t * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is\n\t * also aliased to `jQuery.fn.dataTableExt` for historic reasons.\n\t *  @namespace\n\t *  @extends DataTable.models.ext\n\t */\n\t\n\t\n\t/**\n\t * DataTables extensions\n\t * \n\t * This namespace acts as a collection area for plug-ins that can be used to\n\t * extend DataTables capabilities. Indeed many of the build in methods\n\t * use this method to provide their own capabilities (sorting methods for\n\t * example).\n\t *\n\t * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy\n\t * reasons\n\t *\n\t *  @namespace\n\t */\n\tDataTable.ext = _ext = {\n\t\t/**\n\t\t * Buttons. For use with the Buttons extension for DataTables. This is\n\t\t * defined here so other extensions can define buttons regardless of load\n\t\t * order. It is _not_ used by DataTables core.\n\t\t *\n\t\t *  @type object\n\t\t *  @default {}\n\t\t */\n\t\tbuttons: {},\n\t\n\t\n\t\t/**\n\t\t * Element class names\n\t\t *\n\t\t *  @type object\n\t\t *  @default {}\n\t\t */\n\t\tclasses: {},\n\t\n\t\n\t\t/**\n\t\t * DataTables build type (expanded by the download builder)\n\t\t *\n\t\t *  @type string\n\t\t */\n\t\tbuilder: \"-source-\",\n\t\n\t\n\t\t/**\n\t\t * Error reporting.\n\t\t * \n\t\t * How should DataTables report an error. Can take the value 'alert',\n\t\t * 'throw', 'none' or a function.\n\t\t *\n\t\t *  @type string|function\n\t\t *  @default alert\n\t\t */\n\t\terrMode: \"alert\",\n\t\n\t\n\t\t/**\n\t\t * Feature plug-ins.\n\t\t * \n\t\t * This is an array of objects which describe the feature plug-ins that are\n\t\t * available to DataTables. These feature plug-ins are then available for\n\t\t * use through the `dom` initialisation option.\n\t\t * \n\t\t * Each feature plug-in is described by an object which must have the\n\t\t * following properties:\n\t\t * \n\t\t * * `fnInit` - function that is used to initialise the plug-in,\n\t\t * * `cFeature` - a character so the feature can be enabled by the `dom`\n\t\t *   instillation option. This is case sensitive.\n\t\t *\n\t\t * The `fnInit` function has the following input parameters:\n\t\t *\n\t\t * 1. `{object}` DataTables settings object: see\n\t\t *    {@link DataTable.models.oSettings}\n\t\t *\n\t\t * And the following return is expected:\n\t\t * \n\t\t * * {node|null} The element which contains your feature. Note that the\n\t\t *   return may also be void if your plug-in does not require to inject any\n\t\t *   DOM elements into DataTables control (`dom`) - for example this might\n\t\t *   be useful when developing a plug-in which allows table control via\n\t\t *   keyboard entry\n\t\t *\n\t\t *  @type array\n\t\t *\n\t\t *  @example\n\t\t *    $.fn.dataTable.ext.features.push( {\n\t\t *      \"fnInit\": function( oSettings ) {\n\t\t *        return new TableTools( { \"oDTSettings\": oSettings } );\n\t\t *      },\n\t\t *      \"cFeature\": \"T\"\n\t\t *    } );\n\t\t */\n\t\tfeature: [],\n\t\n\t\n\t\t/**\n\t\t * Row searching.\n\t\t * \n\t\t * This method of searching is complimentary to the default type based\n\t\t * searching, and a lot more comprehensive as it allows you complete control\n\t\t * over the searching logic. Each element in this array is a function\n\t\t * (parameters described below) that is called for every row in the table,\n\t\t * and your logic decides if it should be included in the searching data set\n\t\t * or not.\n\t\t *\n\t\t * Searching functions have the following input parameters:\n\t\t *\n\t\t * 1. `{object}` DataTables settings object: see\n\t\t *    {@link DataTable.models.oSettings}\n\t\t * 2. `{array|object}` Data for the row to be processed (same as the\n\t\t *    original format that was passed in as the data source, or an array\n\t\t *    from a DOM data source\n\t\t * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which\n\t\t *    can be useful to retrieve the `TR` element if you need DOM interaction.\n\t\t *\n\t\t * And the following return is expected:\n\t\t *\n\t\t * * {boolean} Include the row in the searched result set (true) or not\n\t\t *   (false)\n\t\t *\n\t\t * Note that as with the main search ability in DataTables, technically this\n\t\t * is \"filtering\", since it is subtractive. However, for consistency in\n\t\t * naming we call it searching here.\n\t\t *\n\t\t *  @type array\n\t\t *  @default []\n\t\t *\n\t\t *  @example\n\t\t *    // The following example shows custom search being applied to the\n\t\t *    // fourth column (i.e. the data[3] index) based on two input values\n\t\t *    // from the end-user, matching the data in a certain range.\n\t\t *    $.fn.dataTable.ext.search.push(\n\t\t *      function( settings, data, dataIndex ) {\n\t\t *        var min = document.getElementById('min').value * 1;\n\t\t *        var max = document.getElementById('max').value * 1;\n\t\t *        var version = data[3] == \"-\" ? 0 : data[3]*1;\n\t\t *\n\t\t *        if ( min == \"\" && max == \"\" ) {\n\t\t *          return true;\n\t\t *        }\n\t\t *        else if ( min == \"\" && version < max ) {\n\t\t *          return true;\n\t\t *        }\n\t\t *        else if ( min < version && \"\" == max ) {\n\t\t *          return true;\n\t\t *        }\n\t\t *        else if ( min < version && version < max ) {\n\t\t *          return true;\n\t\t *        }\n\t\t *        return false;\n\t\t *      }\n\t\t *    );\n\t\t */\n\t\tsearch: [],\n\t\n\t\n\t\t/**\n\t\t * Selector extensions\n\t\t *\n\t\t * The `selector` option can be used to extend the options available for the\n\t\t * selector modifier options (`selector-modifier` object data type) that\n\t\t * each of the three built in selector types offer (row, column and cell +\n\t\t * their plural counterparts). For example the Select extension uses this\n\t\t * mechanism to provide an option to select only rows, columns and cells\n\t\t * that have been marked as selected by the end user (`{selected: true}`),\n\t\t * which can be used in conjunction with the existing built in selector\n\t\t * options.\n\t\t *\n\t\t * Each property is an array to which functions can be pushed. The functions\n\t\t * take three attributes:\n\t\t *\n\t\t * * Settings object for the host table\n\t\t * * Options object (`selector-modifier` object type)\n\t\t * * Array of selected item indexes\n\t\t *\n\t\t * The return is an array of the resulting item indexes after the custom\n\t\t * selector has been applied.\n\t\t *\n\t\t *  @type object\n\t\t */\n\t\tselector: {\n\t\t\tcell: [],\n\t\t\tcolumn: [],\n\t\t\trow: []\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * Internal functions, exposed for used in plug-ins.\n\t\t * \n\t\t * Please note that you should not need to use the internal methods for\n\t\t * anything other than a plug-in (and even then, try to avoid if possible).\n\t\t * The internal function may change between releases.\n\t\t *\n\t\t *  @type object\n\t\t *  @default {}\n\t\t */\n\t\tinternal: {},\n\t\n\t\n\t\t/**\n\t\t * Legacy configuration options. Enable and disable legacy options that\n\t\t * are available in DataTables.\n\t\t *\n\t\t *  @type object\n\t\t */\n\t\tlegacy: {\n\t\t\t/**\n\t\t\t * Enable / disable DataTables 1.9 compatible server-side processing\n\t\t\t * requests\n\t\t\t *\n\t\t\t *  @type boolean\n\t\t\t *  @default null\n\t\t\t */\n\t\t\tajax: null\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * Pagination plug-in methods.\n\t\t * \n\t\t * Each entry in this object is a function and defines which buttons should\n\t\t * be shown by the pagination rendering method that is used for the table:\n\t\t * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the\n\t\t * buttons are displayed in the document, while the functions here tell it\n\t\t * what buttons to display. This is done by returning an array of button\n\t\t * descriptions (what each button will do).\n\t\t *\n\t\t * Pagination types (the four built in options and any additional plug-in\n\t\t * options defined here) can be used through the `paginationType`\n\t\t * initialisation parameter.\n\t\t *\n\t\t * The functions defined take two parameters:\n\t\t *\n\t\t * 1. `{int} page` The current page index\n\t\t * 2. `{int} pages` The number of pages in the table\n\t\t *\n\t\t * Each function is expected to return an array where each element of the\n\t\t * array can be one of:\n\t\t *\n\t\t * * `first` - Jump to first page when activated\n\t\t * * `last` - Jump to last page when activated\n\t\t * * `previous` - Show previous page when activated\n\t\t * * `next` - Show next page when activated\n\t\t * * `{int}` - Show page of the index given\n\t\t * * `{array}` - A nested array containing the above elements to add a\n\t\t *   containing 'DIV' element (might be useful for styling).\n\t\t *\n\t\t * Note that DataTables v1.9- used this object slightly differently whereby\n\t\t * an object with two functions would be defined for each plug-in. That\n\t\t * ability is still supported by DataTables 1.10+ to provide backwards\n\t\t * compatibility, but this option of use is now decremented and no longer\n\t\t * documented in DataTables 1.10+.\n\t\t *\n\t\t *  @type object\n\t\t *  @default {}\n\t\t *\n\t\t *  @example\n\t\t *    // Show previous, next and current page buttons only\n\t\t *    $.fn.dataTableExt.oPagination.current = function ( page, pages ) {\n\t\t *      return [ 'previous', page, 'next' ];\n\t\t *    };\n\t\t */\n\t\tpager: {},\n\t\n\t\n\t\trenderer: {\n\t\t\tpageButton: {},\n\t\t\theader: {}\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * Ordering plug-ins - custom data source\n\t\t * \n\t\t * The extension options for ordering of data available here is complimentary\n\t\t * to the default type based ordering that DataTables typically uses. It\n\t\t * allows much greater control over the the data that is being used to\n\t\t * order a column, but is necessarily therefore more complex.\n\t\t * \n\t\t * This type of ordering is useful if you want to do ordering based on data\n\t\t * live from the DOM (for example the contents of an 'input' element) rather\n\t\t * than just the static string that DataTables knows of.\n\t\t * \n\t\t * The way these plug-ins work is that you create an array of the values you\n\t\t * wish to be ordering for the column in question and then return that\n\t\t * array. The data in the array much be in the index order of the rows in\n\t\t * the table (not the currently ordering order!). Which order data gathering\n\t\t * function is run here depends on the `dt-init columns.orderDataType`\n\t\t * parameter that is used for the column (if any).\n\t\t *\n\t\t * The functions defined take two parameters:\n\t\t *\n\t\t * 1. `{object}` DataTables settings object: see\n\t\t *    {@link DataTable.models.oSettings}\n\t\t * 2. `{int}` Target column index\n\t\t *\n\t\t * Each function is expected to return an array:\n\t\t *\n\t\t * * `{array}` Data for the column to be ordering upon\n\t\t *\n\t\t *  @type array\n\t\t *\n\t\t *  @example\n\t\t *    // Ordering using `input` node values\n\t\t *    $.fn.dataTable.ext.order['dom-text'] = function  ( settings, col )\n\t\t *    {\n\t\t *      return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) {\n\t\t *        return $('input', td).val();\n\t\t *      } );\n\t\t *    }\n\t\t */\n\t\torder: {},\n\t\n\t\n\t\t/**\n\t\t * Type based plug-ins.\n\t\t *\n\t\t * Each column in DataTables has a type assigned to it, either by automatic\n\t\t * detection or by direct assignment using the `type` option for the column.\n\t\t * The type of a column will effect how it is ordering and search (plug-ins\n\t\t * can also make use of the column type if required).\n\t\t *\n\t\t * @namespace\n\t\t */\n\t\ttype: {\n\t\t\t/**\n\t\t\t * Type detection functions.\n\t\t\t *\n\t\t\t * The functions defined in this object are used to automatically detect\n\t\t\t * a column's type, making initialisation of DataTables super easy, even\n\t\t\t * when complex data is in the table.\n\t\t\t *\n\t\t\t * The functions defined take two parameters:\n\t\t\t *\n\t\t     *  1. `{*}` Data from the column cell to be analysed\n\t\t     *  2. `{settings}` DataTables settings object. This can be used to\n\t\t     *     perform context specific type detection - for example detection\n\t\t     *     based on language settings such as using a comma for a decimal\n\t\t     *     place. Generally speaking the options from the settings will not\n\t\t     *     be required\n\t\t\t *\n\t\t\t * Each function is expected to return:\n\t\t\t *\n\t\t\t * * `{string|null}` Data type detected, or null if unknown (and thus\n\t\t\t *   pass it on to the other type detection functions.\n\t\t\t *\n\t\t\t *  @type array\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Currency type detection plug-in:\n\t\t\t *    $.fn.dataTable.ext.type.detect.push(\n\t\t\t *      function ( data, settings ) {\n\t\t\t *        // Check the numeric part\n\t\t\t *        if ( ! $.isNumeric( data.substring(1) ) ) {\n\t\t\t *          return null;\n\t\t\t *        }\n\t\t\t *\n\t\t\t *        // Check prefixed by currency\n\t\t\t *        if ( data.charAt(0) == '$' || data.charAt(0) == '&pound;' ) {\n\t\t\t *          return 'currency';\n\t\t\t *        }\n\t\t\t *        return null;\n\t\t\t *      }\n\t\t\t *    );\n\t\t\t */\n\t\t\tdetect: [],\n\t\n\t\n\t\t\t/**\n\t\t\t * Type based search formatting.\n\t\t\t *\n\t\t\t * The type based searching functions can be used to pre-format the\n\t\t\t * data to be search on. For example, it can be used to strip HTML\n\t\t\t * tags or to de-format telephone numbers for numeric only searching.\n\t\t\t *\n\t\t\t * Note that is a search is not defined for a column of a given type,\n\t\t\t * no search formatting will be performed.\n\t\t\t * \n\t\t\t * Pre-processing of searching data plug-ins - When you assign the sType\n\t\t\t * for a column (or have it automatically detected for you by DataTables\n\t\t\t * or a type detection plug-in), you will typically be using this for\n\t\t\t * custom sorting, but it can also be used to provide custom searching\n\t\t\t * by allowing you to pre-processing the data and returning the data in\n\t\t\t * the format that should be searched upon. This is done by adding\n\t\t\t * functions this object with a parameter name which matches the sType\n\t\t\t * for that target column. This is the corollary of <i>afnSortData</i>\n\t\t\t * for searching data.\n\t\t\t *\n\t\t\t * The functions defined take a single parameter:\n\t\t\t *\n\t\t     *  1. `{*}` Data from the column cell to be prepared for searching\n\t\t\t *\n\t\t\t * Each function is expected to return:\n\t\t\t *\n\t\t\t * * `{string|null}` Formatted string that will be used for the searching.\n\t\t\t *\n\t\t\t *  @type object\n\t\t\t *  @default {}\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) {\n\t\t\t *      return d.replace(/\\n/g,\" \").replace( /<.*?>/g, \"\" );\n\t\t\t *    }\n\t\t\t */\n\t\t\tsearch: {},\n\t\n\t\n\t\t\t/**\n\t\t\t * Type based ordering.\n\t\t\t *\n\t\t\t * The column type tells DataTables what ordering to apply to the table\n\t\t\t * when a column is sorted upon. The order for each type that is defined,\n\t\t\t * is defined by the functions available in this object.\n\t\t\t *\n\t\t\t * Each ordering option can be described by three properties added to\n\t\t\t * this object:\n\t\t\t *\n\t\t\t * * `{type}-pre` - Pre-formatting function\n\t\t\t * * `{type}-asc` - Ascending order function\n\t\t\t * * `{type}-desc` - Descending order function\n\t\t\t *\n\t\t\t * All three can be used together, only `{type}-pre` or only\n\t\t\t * `{type}-asc` and `{type}-desc` together. It is generally recommended\n\t\t\t * that only `{type}-pre` is used, as this provides the optimal\n\t\t\t * implementation in terms of speed, although the others are provided\n\t\t\t * for compatibility with existing Javascript sort functions.\n\t\t\t *\n\t\t\t * `{type}-pre`: Functions defined take a single parameter:\n\t\t\t *\n\t\t     *  1. `{*}` Data from the column cell to be prepared for ordering\n\t\t\t *\n\t\t\t * And return:\n\t\t\t *\n\t\t\t * * `{*}` Data to be sorted upon\n\t\t\t *\n\t\t\t * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort\n\t\t\t * functions, taking two parameters:\n\t\t\t *\n\t\t     *  1. `{*}` Data to compare to the second parameter\n\t\t     *  2. `{*}` Data to compare to the first parameter\n\t\t\t *\n\t\t\t * And returning:\n\t\t\t *\n\t\t\t * * `{*}` Ordering match: <0 if first parameter should be sorted lower\n\t\t\t *   than the second parameter, ===0 if the two parameters are equal and\n\t\t\t *   >0 if the first parameter should be sorted height than the second\n\t\t\t *   parameter.\n\t\t\t * \n\t\t\t *  @type object\n\t\t\t *  @default {}\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Numeric ordering of formatted numbers with a pre-formatter\n\t\t\t *    $.extend( $.fn.dataTable.ext.type.order, {\n\t\t\t *      \"string-pre\": function(x) {\n\t\t\t *        a = (a === \"-\" || a === \"\") ? 0 : a.replace( /[^\\d\\-\\.]/g, \"\" );\n\t\t\t *        return parseFloat( a );\n\t\t\t *      }\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Case-sensitive string ordering, with no pre-formatting method\n\t\t\t *    $.extend( $.fn.dataTable.ext.order, {\n\t\t\t *      \"string-case-asc\": function(x,y) {\n\t\t\t *        return ((x < y) ? -1 : ((x > y) ? 1 : 0));\n\t\t\t *      },\n\t\t\t *      \"string-case-desc\": function(x,y) {\n\t\t\t *        return ((x < y) ? 1 : ((x > y) ? -1 : 0));\n\t\t\t *      }\n\t\t\t *    } );\n\t\t\t */\n\t\t\torder: {}\n\t\t},\n\t\n\t\t/**\n\t\t * Unique DataTables instance counter\n\t\t *\n\t\t * @type int\n\t\t * @private\n\t\t */\n\t\t_unique: 0,\n\t\n\t\n\t\t//\n\t\t// Depreciated\n\t\t// The following properties are retained for backwards compatiblity only.\n\t\t// The should not be used in new projects and will be removed in a future\n\t\t// version\n\t\t//\n\t\n\t\t/**\n\t\t * Version check function.\n\t\t *  @type function\n\t\t *  @depreciated Since 1.10\n\t\t */\n\t\tfnVersionCheck: DataTable.fnVersionCheck,\n\t\n\t\n\t\t/**\n\t\t * Index for what 'this' index API functions should use\n\t\t *  @type int\n\t\t *  @deprecated Since v1.10\n\t\t */\n\t\tiApiIndex: 0,\n\t\n\t\n\t\t/**\n\t\t * jQuery UI class container\n\t\t *  @type object\n\t\t *  @deprecated Since v1.10\n\t\t */\n\t\toJUIClasses: {},\n\t\n\t\n\t\t/**\n\t\t * Software version\n\t\t *  @type string\n\t\t *  @deprecated Since v1.10\n\t\t */\n\t\tsVersion: DataTable.version\n\t};\n\t\n\t\n\t//\n\t// Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts\n\t//\n\t$.extend( _ext, {\n\t\tafnFiltering: _ext.search,\n\t\taTypes:       _ext.type.detect,\n\t\tofnSearch:    _ext.type.search,\n\t\toSort:        _ext.type.order,\n\t\tafnSortData:  _ext.order,\n\t\taoFeatures:   _ext.feature,\n\t\toApi:         _ext.internal,\n\t\toStdClasses:  _ext.classes,\n\t\toPagination:  _ext.pager\n\t} );\n\t\n\t\n\t$.extend( DataTable.ext.classes, {\n\t\t\"sTable\": \"dataTable\",\n\t\t\"sNoFooter\": \"no-footer\",\n\t\n\t\t/* Paging buttons */\n\t\t\"sPageButton\": \"paginate_button\",\n\t\t\"sPageButtonActive\": \"current\",\n\t\t\"sPageButtonDisabled\": \"disabled\",\n\t\n\t\t/* Striping classes */\n\t\t\"sStripeOdd\": \"odd\",\n\t\t\"sStripeEven\": \"even\",\n\t\n\t\t/* Empty row */\n\t\t\"sRowEmpty\": \"dataTables_empty\",\n\t\n\t\t/* Features */\n\t\t\"sWrapper\": \"dataTables_wrapper\",\n\t\t\"sFilter\": \"dataTables_filter\",\n\t\t\"sInfo\": \"dataTables_info\",\n\t\t\"sPaging\": \"dataTables_paginate paging_\", /* Note that the type is postfixed */\n\t\t\"sLength\": \"dataTables_length\",\n\t\t\"sProcessing\": \"dataTables_processing\",\n\t\n\t\t/* Sorting */\n\t\t\"sSortAsc\": \"sorting_asc\",\n\t\t\"sSortDesc\": \"sorting_desc\",\n\t\t\"sSortable\": \"sorting\", /* Sortable in both directions */\n\t\t\"sSortableAsc\": \"sorting_asc_disabled\",\n\t\t\"sSortableDesc\": \"sorting_desc_disabled\",\n\t\t\"sSortableNone\": \"sorting_disabled\",\n\t\t\"sSortColumn\": \"sorting_\", /* Note that an int is postfixed for the sorting order */\n\t\n\t\t/* Filtering */\n\t\t\"sFilterInput\": \"\",\n\t\n\t\t/* Page length */\n\t\t\"sLengthSelect\": \"\",\n\t\n\t\t/* Scrolling */\n\t\t\"sScrollWrapper\": \"dataTables_scroll\",\n\t\t\"sScrollHead\": \"dataTables_scrollHead\",\n\t\t\"sScrollHeadInner\": \"dataTables_scrollHeadInner\",\n\t\t\"sScrollBody\": \"dataTables_scrollBody\",\n\t\t\"sScrollFoot\": \"dataTables_scrollFoot\",\n\t\t\"sScrollFootInner\": \"dataTables_scrollFootInner\",\n\t\n\t\t/* Misc */\n\t\t\"sHeaderTH\": \"\",\n\t\t\"sFooterTH\": \"\",\n\t\n\t\t// Deprecated\n\t\t\"sSortJUIAsc\": \"\",\n\t\t\"sSortJUIDesc\": \"\",\n\t\t\"sSortJUI\": \"\",\n\t\t\"sSortJUIAscAllowed\": \"\",\n\t\t\"sSortJUIDescAllowed\": \"\",\n\t\t\"sSortJUIWrapper\": \"\",\n\t\t\"sSortIcon\": \"\",\n\t\t\"sJUIHeader\": \"\",\n\t\t\"sJUIFooter\": \"\"\n\t} );\n\t\n\t\n\t(function() {\n\t\n\t// Reused strings for better compression. Closure compiler appears to have a\n\t// weird edge case where it is trying to expand strings rather than use the\n\t// variable version. This results in about 200 bytes being added, for very\n\t// little preference benefit since it this run on script load only.\n\tvar _empty = '';\n\t_empty = '';\n\t\n\tvar _stateDefault = _empty + 'ui-state-default';\n\tvar _sortIcon     = _empty + 'css_right ui-icon ui-icon-';\n\tvar _headerFooter = _empty + 'fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix';\n\t\n\t$.extend( DataTable.ext.oJUIClasses, DataTable.ext.classes, {\n\t\t/* Full numbers paging buttons */\n\t\t\"sPageButton\":         \"fg-button ui-button \"+_stateDefault,\n\t\t\"sPageButtonActive\":   \"ui-state-disabled\",\n\t\t\"sPageButtonDisabled\": \"ui-state-disabled\",\n\t\n\t\t/* Features */\n\t\t\"sPaging\": \"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi \"+\n\t\t\t\"ui-buttonset-multi paging_\", /* Note that the type is postfixed */\n\t\n\t\t/* Sorting */\n\t\t\"sSortAsc\":            _stateDefault+\" sorting_asc\",\n\t\t\"sSortDesc\":           _stateDefault+\" sorting_desc\",\n\t\t\"sSortable\":           _stateDefault+\" sorting\",\n\t\t\"sSortableAsc\":        _stateDefault+\" sorting_asc_disabled\",\n\t\t\"sSortableDesc\":       _stateDefault+\" sorting_desc_disabled\",\n\t\t\"sSortableNone\":       _stateDefault+\" sorting_disabled\",\n\t\t\"sSortJUIAsc\":         _sortIcon+\"triangle-1-n\",\n\t\t\"sSortJUIDesc\":        _sortIcon+\"triangle-1-s\",\n\t\t\"sSortJUI\":            _sortIcon+\"carat-2-n-s\",\n\t\t\"sSortJUIAscAllowed\":  _sortIcon+\"carat-1-n\",\n\t\t\"sSortJUIDescAllowed\": _sortIcon+\"carat-1-s\",\n\t\t\"sSortJUIWrapper\":     \"DataTables_sort_wrapper\",\n\t\t\"sSortIcon\":           \"DataTables_sort_icon\",\n\t\n\t\t/* Scrolling */\n\t\t\"sScrollHead\": \"dataTables_scrollHead \"+_stateDefault,\n\t\t\"sScrollFoot\": \"dataTables_scrollFoot \"+_stateDefault,\n\t\n\t\t/* Misc */\n\t\t\"sHeaderTH\":  _stateDefault,\n\t\t\"sFooterTH\":  _stateDefault,\n\t\t\"sJUIHeader\": _headerFooter+\" ui-corner-tl ui-corner-tr\",\n\t\t\"sJUIFooter\": _headerFooter+\" ui-corner-bl ui-corner-br\"\n\t} );\n\t\n\t}());\n\t\n\t\n\t\n\tvar extPagination = DataTable.ext.pager;\n\t\n\tfunction _numbers ( page, pages ) {\n\t\tvar\n\t\t\tnumbers = [],\n\t\t\tbuttons = extPagination.numbers_length,\n\t\t\thalf = Math.floor( buttons / 2 ),\n\t\t\ti = 1;\n\t\n\t\tif ( pages <= buttons ) {\n\t\t\tnumbers = _range( 0, pages );\n\t\t}\n\t\telse if ( page <= half ) {\n\t\t\tnumbers = _range( 0, buttons-2 );\n\t\t\tnumbers.push( 'ellipsis' );\n\t\t\tnumbers.push( pages-1 );\n\t\t}\n\t\telse if ( page >= pages - 1 - half ) {\n\t\t\tnumbers = _range( pages-(buttons-2), pages );\n\t\t\tnumbers.splice( 0, 0, 'ellipsis' ); // no unshift in ie6\n\t\t\tnumbers.splice( 0, 0, 0 );\n\t\t}\n\t\telse {\n\t\t\tnumbers = _range( page-half+2, page+half-1 );\n\t\t\tnumbers.push( 'ellipsis' );\n\t\t\tnumbers.push( pages-1 );\n\t\t\tnumbers.splice( 0, 0, 'ellipsis' );\n\t\t\tnumbers.splice( 0, 0, 0 );\n\t\t}\n\t\n\t\tnumbers.DT_el = 'span';\n\t\treturn numbers;\n\t}\n\t\n\t\n\t$.extend( extPagination, {\n\t\tsimple: function ( page, pages ) {\n\t\t\treturn [ 'previous', 'next' ];\n\t\t},\n\t\n\t\tfull: function ( page, pages ) {\n\t\t\treturn [  'first', 'previous', 'next', 'last' ];\n\t\t},\n\t\n\t\tnumbers: function ( page, pages ) {\n\t\t\treturn [ _numbers(page, pages) ];\n\t\t},\n\t\n\t\tsimple_numbers: function ( page, pages ) {\n\t\t\treturn [ 'previous', _numbers(page, pages), 'next' ];\n\t\t},\n\t\n\t\tfull_numbers: function ( page, pages ) {\n\t\t\treturn [ 'first', 'previous', _numbers(page, pages), 'next', 'last' ];\n\t\t},\n\t\t\n\t\tfirst_last_numbers: function (page, pages) {\n\t \t\treturn ['first', _numbers(page, pages), 'last'];\n\t \t},\n\t\n\t\t// For testing and plug-ins to use\n\t\t_numbers: _numbers,\n\t\n\t\t// Number of number buttons (including ellipsis) to show. _Must be odd!_\n\t\tnumbers_length: 7\n\t} );\n\t\n\t\n\t$.extend( true, DataTable.ext.renderer, {\n\t\tpageButton: {\n\t\t\t_: function ( settings, host, idx, buttons, page, pages ) {\n\t\t\t\tvar classes = settings.oClasses;\n\t\t\t\tvar lang = settings.oLanguage.oPaginate;\n\t\t\t\tvar aria = settings.oLanguage.oAria.paginate || {};\n\t\t\t\tvar btnDisplay, btnClass, counter=0;\n\t\n\t\t\t\tvar attach = function( container, buttons ) {\n\t\t\t\t\tvar i, ien, node, button;\n\t\t\t\t\tvar clickHandler = function ( e ) {\n\t\t\t\t\t\t_fnPageChange( settings, e.data.action, true );\n\t\t\t\t\t};\n\t\n\t\t\t\t\tfor ( i=0, ien=buttons.length ; i<ien ; i++ ) {\n\t\t\t\t\t\tbutton = buttons[i];\n\t\n\t\t\t\t\t\tif ( $.isArray( button ) ) {\n\t\t\t\t\t\t\tvar inner = $( '<'+(button.DT_el || 'div')+'/>' )\n\t\t\t\t\t\t\t\t.appendTo( container );\n\t\t\t\t\t\t\tattach( inner, button );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tbtnDisplay = null;\n\t\t\t\t\t\t\tbtnClass = '';\n\t\n\t\t\t\t\t\t\tswitch ( button ) {\n\t\t\t\t\t\t\t\tcase 'ellipsis':\n\t\t\t\t\t\t\t\t\tcontainer.append('<span class=\"ellipsis\">&#x2026;</span>');\n\t\t\t\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\t\t\t\tcase 'first':\n\t\t\t\t\t\t\t\t\tbtnDisplay = lang.sFirst;\n\t\t\t\t\t\t\t\t\tbtnClass = button + (page > 0 ?\n\t\t\t\t\t\t\t\t\t\t'' : ' '+classes.sPageButtonDisabled);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\t\t\t\tcase 'previous':\n\t\t\t\t\t\t\t\t\tbtnDisplay = lang.sPrevious;\n\t\t\t\t\t\t\t\t\tbtnClass = button + (page > 0 ?\n\t\t\t\t\t\t\t\t\t\t'' : ' '+classes.sPageButtonDisabled);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\t\t\t\tcase 'next':\n\t\t\t\t\t\t\t\t\tbtnDisplay = lang.sNext;\n\t\t\t\t\t\t\t\t\tbtnClass = button + (page < pages-1 ?\n\t\t\t\t\t\t\t\t\t\t'' : ' '+classes.sPageButtonDisabled);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\t\t\t\tcase 'last':\n\t\t\t\t\t\t\t\t\tbtnDisplay = lang.sLast;\n\t\t\t\t\t\t\t\t\tbtnClass = button + (page < pages-1 ?\n\t\t\t\t\t\t\t\t\t\t'' : ' '+classes.sPageButtonDisabled);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tbtnDisplay = button + 1;\n\t\t\t\t\t\t\t\t\tbtnClass = page === button ?\n\t\t\t\t\t\t\t\t\t\tclasses.sPageButtonActive : '';\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t\tif ( btnDisplay !== null ) {\n\t\t\t\t\t\t\t\tnode = $('<a>', {\n\t\t\t\t\t\t\t\t\t\t'class': classes.sPageButton+' '+btnClass,\n\t\t\t\t\t\t\t\t\t\t'aria-controls': settings.sTableId,\n\t\t\t\t\t\t\t\t\t\t'aria-label': aria[ button ],\n\t\t\t\t\t\t\t\t\t\t'data-dt-idx': counter,\n\t\t\t\t\t\t\t\t\t\t'tabindex': settings.iTabIndex,\n\t\t\t\t\t\t\t\t\t\t'id': idx === 0 && typeof button === 'string' ?\n\t\t\t\t\t\t\t\t\t\t\tsettings.sTableId +'_'+ button :\n\t\t\t\t\t\t\t\t\t\t\tnull\n\t\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t\t.html( btnDisplay )\n\t\t\t\t\t\t\t\t\t.appendTo( container );\n\t\n\t\t\t\t\t\t\t\t_fnBindAction(\n\t\t\t\t\t\t\t\t\tnode, {action: button}, clickHandler\n\t\t\t\t\t\t\t\t);\n\t\n\t\t\t\t\t\t\t\tcounter++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\n\t\t\t\t// IE9 throws an 'unknown error' if document.activeElement is used\n\t\t\t\t// inside an iframe or frame. Try / catch the error. Not good for\n\t\t\t\t// accessibility, but neither are frames.\n\t\t\t\tvar activeEl;\n\t\n\t\t\t\ttry {\n\t\t\t\t\t// Because this approach is destroying and recreating the paging\n\t\t\t\t\t// elements, focus is lost on the select button which is bad for\n\t\t\t\t\t// accessibility. So we want to restore focus once the draw has\n\t\t\t\t\t// completed\n\t\t\t\t\tactiveEl = $(host).find(document.activeElement).data('dt-idx');\n\t\t\t\t}\n\t\t\t\tcatch (e) {}\n\t\n\t\t\t\tattach( $(host).empty(), buttons );\n\t\n\t\t\t\tif ( activeEl !== undefined ) {\n\t\t\t\t\t$(host).find( '[data-dt-idx='+activeEl+']' ).focus();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} );\n\t\n\t\n\t\n\t// Built in type detection. See model.ext.aTypes for information about\n\t// what is required from this methods.\n\t$.extend( DataTable.ext.type.detect, [\n\t\t// Plain numbers - first since V8 detects some plain numbers as dates\n\t\t// e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...).\n\t\tfunction ( d, settings )\n\t\t{\n\t\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\t\treturn _isNumber( d, decimal ) ? 'num'+decimal : null;\n\t\t},\n\t\n\t\t// Dates (only those recognised by the browser's Date.parse)\n\t\tfunction ( d, settings )\n\t\t{\n\t\t\t// V8 tries _very_ hard to make a string passed into `Date.parse()`\n\t\t\t// valid, so we need to use a regex to restrict date formats. Use a\n\t\t\t// plug-in for anything other than ISO8601 style strings\n\t\t\tif ( d && !(d instanceof Date) && ! _re_date.test(d) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tvar parsed = Date.parse(d);\n\t\t\treturn (parsed !== null && !isNaN(parsed)) || _empty(d) ? 'date' : null;\n\t\t},\n\t\n\t\t// Formatted numbers\n\t\tfunction ( d, settings )\n\t\t{\n\t\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\t\treturn _isNumber( d, decimal, true ) ? 'num-fmt'+decimal : null;\n\t\t},\n\t\n\t\t// HTML numeric\n\t\tfunction ( d, settings )\n\t\t{\n\t\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\t\treturn _htmlNumeric( d, decimal ) ? 'html-num'+decimal : null;\n\t\t},\n\t\n\t\t// HTML numeric, formatted\n\t\tfunction ( d, settings )\n\t\t{\n\t\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\t\treturn _htmlNumeric( d, decimal, true ) ? 'html-num-fmt'+decimal : null;\n\t\t},\n\t\n\t\t// HTML (this is strict checking - there must be html)\n\t\tfunction ( d, settings )\n\t\t{\n\t\t\treturn _empty( d ) || (typeof d === 'string' && d.indexOf('<') !== -1) ?\n\t\t\t\t'html' : null;\n\t\t}\n\t] );\n\t\n\t\n\t\n\t// Filter formatting functions. See model.ext.ofnSearch for information about\n\t// what is required from these methods.\n\t// \n\t// Note that additional search methods are added for the html numbers and\n\t// html formatted numbers by `_addNumericSort()` when we know what the decimal\n\t// place is\n\t\n\t\n\t$.extend( DataTable.ext.type.search, {\n\t\thtml: function ( data ) {\n\t\t\treturn _empty(data) ?\n\t\t\t\tdata :\n\t\t\t\ttypeof data === 'string' ?\n\t\t\t\t\tdata\n\t\t\t\t\t\t.replace( _re_new_lines, \" \" )\n\t\t\t\t\t\t.replace( _re_html, \"\" ) :\n\t\t\t\t\t'';\n\t\t},\n\t\n\t\tstring: function ( data ) {\n\t\t\treturn _empty(data) ?\n\t\t\t\tdata :\n\t\t\t\ttypeof data === 'string' ?\n\t\t\t\t\tdata.replace( _re_new_lines, \" \" ) :\n\t\t\t\t\tdata;\n\t\t}\n\t} );\n\t\n\t\n\t\n\tvar __numericReplace = function ( d, decimalPlace, re1, re2 ) {\n\t\tif ( d !== 0 && (!d || d === '-') ) {\n\t\t\treturn -Infinity;\n\t\t}\n\t\n\t\t// If a decimal place other than `.` is used, it needs to be given to the\n\t\t// function so we can detect it and replace with a `.` which is the only\n\t\t// decimal place Javascript recognises - it is not locale aware.\n\t\tif ( decimalPlace ) {\n\t\t\td = _numToDecimal( d, decimalPlace );\n\t\t}\n\t\n\t\tif ( d.replace ) {\n\t\t\tif ( re1 ) {\n\t\t\t\td = d.replace( re1, '' );\n\t\t\t}\n\t\n\t\t\tif ( re2 ) {\n\t\t\t\td = d.replace( re2, '' );\n\t\t\t}\n\t\t}\n\t\n\t\treturn d * 1;\n\t};\n\t\n\t\n\t// Add the numeric 'deformatting' functions for sorting and search. This is done\n\t// in a function to provide an easy ability for the language options to add\n\t// additional methods if a non-period decimal place is used.\n\tfunction _addNumericSort ( decimalPlace ) {\n\t\t$.each(\n\t\t\t{\n\t\t\t\t// Plain numbers\n\t\t\t\t\"num\": function ( d ) {\n\t\t\t\t\treturn __numericReplace( d, decimalPlace );\n\t\t\t\t},\n\t\n\t\t\t\t// Formatted numbers\n\t\t\t\t\"num-fmt\": function ( d ) {\n\t\t\t\t\treturn __numericReplace( d, decimalPlace, _re_formatted_numeric );\n\t\t\t\t},\n\t\n\t\t\t\t// HTML numeric\n\t\t\t\t\"html-num\": function ( d ) {\n\t\t\t\t\treturn __numericReplace( d, decimalPlace, _re_html );\n\t\t\t\t},\n\t\n\t\t\t\t// HTML numeric, formatted\n\t\t\t\t\"html-num-fmt\": function ( d ) {\n\t\t\t\t\treturn __numericReplace( d, decimalPlace, _re_html, _re_formatted_numeric );\n\t\t\t\t}\n\t\t\t},\n\t\t\tfunction ( key, fn ) {\n\t\t\t\t// Add the ordering method\n\t\t\t\t_ext.type.order[ key+decimalPlace+'-pre' ] = fn;\n\t\n\t\t\t\t// For HTML types add a search formatter that will strip the HTML\n\t\t\t\tif ( key.match(/^html\\-/) ) {\n\t\t\t\t\t_ext.type.search[ key+decimalPlace ] = _ext.type.search.html;\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\t\n\t\n\t// Default sort methods\n\t$.extend( _ext.type.order, {\n\t\t// Dates\n\t\t\"date-pre\": function ( d ) {\n\t\t\treturn Date.parse( d ) || -Infinity;\n\t\t},\n\t\n\t\t// html\n\t\t\"html-pre\": function ( a ) {\n\t\t\treturn _empty(a) ?\n\t\t\t\t'' :\n\t\t\t\ta.replace ?\n\t\t\t\t\ta.replace( /<.*?>/g, \"\" ).toLowerCase() :\n\t\t\t\t\ta+'';\n\t\t},\n\t\n\t\t// string\n\t\t\"string-pre\": function ( a ) {\n\t\t\t// This is a little complex, but faster than always calling toString,\n\t\t\t// http://jsperf.com/tostring-v-check\n\t\t\treturn _empty(a) ?\n\t\t\t\t'' :\n\t\t\t\ttypeof a === 'string' ?\n\t\t\t\t\ta.toLowerCase() :\n\t\t\t\t\t! a.toString ?\n\t\t\t\t\t\t'' :\n\t\t\t\t\t\ta.toString();\n\t\t},\n\t\n\t\t// string-asc and -desc are retained only for compatibility with the old\n\t\t// sort methods\n\t\t\"string-asc\": function ( x, y ) {\n\t\t\treturn ((x < y) ? -1 : ((x > y) ? 1 : 0));\n\t\t},\n\t\n\t\t\"string-desc\": function ( x, y ) {\n\t\t\treturn ((x < y) ? 1 : ((x > y) ? -1 : 0));\n\t\t}\n\t} );\n\t\n\t\n\t// Numeric sorting types - order doesn't matter here\n\t_addNumericSort( '' );\n\t\n\t\n\t$.extend( true, DataTable.ext.renderer, {\n\t\theader: {\n\t\t\t_: function ( settings, cell, column, classes ) {\n\t\t\t\t// No additional mark-up required\n\t\t\t\t// Attach a sort listener to update on sort - note that using the\n\t\t\t\t// `DT` namespace will allow the event to be removed automatically\n\t\t\t\t// on destroy, while the `dt` namespaced event is the one we are\n\t\t\t\t// listening for\n\t\t\t\t$(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {\n\t\t\t\t\tif ( settings !== ctx ) { // need to check this this is the host\n\t\t\t\t\t\treturn;               // table, not a nested one\n\t\t\t\t\t}\n\t\n\t\t\t\t\tvar colIdx = column.idx;\n\t\n\t\t\t\t\tcell\n\t\t\t\t\t\t.removeClass(\n\t\t\t\t\t\t\tcolumn.sSortingClass +' '+\n\t\t\t\t\t\t\tclasses.sSortAsc +' '+\n\t\t\t\t\t\t\tclasses.sSortDesc\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.addClass( columns[ colIdx ] == 'asc' ?\n\t\t\t\t\t\t\tclasses.sSortAsc : columns[ colIdx ] == 'desc' ?\n\t\t\t\t\t\t\t\tclasses.sSortDesc :\n\t\t\t\t\t\t\t\tcolumn.sSortingClass\n\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t\t},\n\t\n\t\t\tjqueryui: function ( settings, cell, column, classes ) {\n\t\t\t\t$('<div/>')\n\t\t\t\t\t.addClass( classes.sSortJUIWrapper )\n\t\t\t\t\t.append( cell.contents() )\n\t\t\t\t\t.append( $('<span/>')\n\t\t\t\t\t\t.addClass( classes.sSortIcon+' '+column.sSortingClassJUI )\n\t\t\t\t\t)\n\t\t\t\t\t.appendTo( cell );\n\t\n\t\t\t\t// Attach a sort listener to update on sort\n\t\t\t\t$(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {\n\t\t\t\t\tif ( settings !== ctx ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\n\t\t\t\t\tvar colIdx = column.idx;\n\t\n\t\t\t\t\tcell\n\t\t\t\t\t\t.removeClass( classes.sSortAsc +\" \"+classes.sSortDesc )\n\t\t\t\t\t\t.addClass( columns[ colIdx ] == 'asc' ?\n\t\t\t\t\t\t\tclasses.sSortAsc : columns[ colIdx ] == 'desc' ?\n\t\t\t\t\t\t\t\tclasses.sSortDesc :\n\t\t\t\t\t\t\t\tcolumn.sSortingClass\n\t\t\t\t\t\t);\n\t\n\t\t\t\t\tcell\n\t\t\t\t\t\t.find( 'span.'+classes.sSortIcon )\n\t\t\t\t\t\t.removeClass(\n\t\t\t\t\t\t\tclasses.sSortJUIAsc +\" \"+\n\t\t\t\t\t\t\tclasses.sSortJUIDesc +\" \"+\n\t\t\t\t\t\t\tclasses.sSortJUI +\" \"+\n\t\t\t\t\t\t\tclasses.sSortJUIAscAllowed +\" \"+\n\t\t\t\t\t\t\tclasses.sSortJUIDescAllowed\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.addClass( columns[ colIdx ] == 'asc' ?\n\t\t\t\t\t\t\tclasses.sSortJUIAsc : columns[ colIdx ] == 'desc' ?\n\t\t\t\t\t\t\t\tclasses.sSortJUIDesc :\n\t\t\t\t\t\t\t\tcolumn.sSortingClassJUI\n\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\t/*\n\t * Public helper functions. These aren't used internally by DataTables, or\n\t * called by any of the options passed into DataTables, but they can be used\n\t * externally by developers working with DataTables. They are helper functions\n\t * to make working with DataTables a little bit easier.\n\t */\n\t\n\tvar __htmlEscapeEntities = function ( d ) {\n\t\treturn typeof d === 'string' ?\n\t\t\td.replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;') :\n\t\t\td;\n\t};\n\t\n\t/**\n\t * Helpers for `columns.render`.\n\t *\n\t * The options defined here can be used with the `columns.render` initialisation\n\t * option to provide a display renderer. The following functions are defined:\n\t *\n\t * * `number` - Will format numeric data (defined by `columns.data`) for\n\t *   display, retaining the original unformatted data for sorting and filtering.\n\t *   It takes 5 parameters:\n\t *   * `string` - Thousands grouping separator\n\t *   * `string` - Decimal point indicator\n\t *   * `integer` - Number of decimal points to show\n\t *   * `string` (optional) - Prefix.\n\t *   * `string` (optional) - Postfix (/suffix).\n\t * * `text` - Escape HTML to help prevent XSS attacks. It has no optional\n\t *   parameters.\n\t *\n\t * @example\n\t *   // Column definition using the number renderer\n\t *   {\n\t *     data: \"salary\",\n\t *     render: $.fn.dataTable.render.number( '\\'', '.', 0, '$' )\n\t *   }\n\t *\n\t * @namespace\n\t */\n\tDataTable.render = {\n\t\tnumber: function ( thousands, decimal, precision, prefix, postfix ) {\n\t\t\treturn {\n\t\t\t\tdisplay: function ( d ) {\n\t\t\t\t\tif ( typeof d !== 'number' && typeof d !== 'string' ) {\n\t\t\t\t\t\treturn d;\n\t\t\t\t\t}\n\t\n\t\t\t\t\tvar negative = d < 0 ? '-' : '';\n\t\t\t\t\tvar flo = parseFloat( d );\n\t\n\t\t\t\t\t// If NaN then there isn't much formatting that we can do - just\n\t\t\t\t\t// return immediately, escaping any HTML (this was supposed to\n\t\t\t\t\t// be a number after all)\n\t\t\t\t\tif ( isNaN( flo ) ) {\n\t\t\t\t\t\treturn __htmlEscapeEntities( d );\n\t\t\t\t\t}\n\t\n\t\t\t\t\tflo = flo.toFixed( precision );\n\t\t\t\t\td = Math.abs( flo );\n\t\n\t\t\t\t\tvar intPart = parseInt( d, 10 );\n\t\t\t\t\tvar floatPart = precision ?\n\t\t\t\t\t\tdecimal+(d - intPart).toFixed( precision ).substring( 2 ):\n\t\t\t\t\t\t'';\n\t\n\t\t\t\t\treturn negative + (prefix||'') +\n\t\t\t\t\t\tintPart.toString().replace(\n\t\t\t\t\t\t\t/\\B(?=(\\d{3})+(?!\\d))/g, thousands\n\t\t\t\t\t\t) +\n\t\t\t\t\t\tfloatPart +\n\t\t\t\t\t\t(postfix||'');\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t\n\t\ttext: function () {\n\t\t\treturn {\n\t\t\t\tdisplay: __htmlEscapeEntities\n\t\t\t};\n\t\t}\n\t};\n\t\n\t\n\t/*\n\t * This is really a good bit rubbish this method of exposing the internal methods\n\t * publicly... - To be fixed in 2.0 using methods on the prototype\n\t */\n\t\n\t\n\t/**\n\t * Create a wrapper function for exporting an internal functions to an external API.\n\t *  @param {string} fn API function name\n\t *  @returns {function} wrapped function\n\t *  @memberof DataTable#internal\n\t */\n\tfunction _fnExternApiFunc (fn)\n\t{\n\t\treturn function() {\n\t\t\tvar args = [_fnSettingsFromNode( this[DataTable.ext.iApiIndex] )].concat(\n\t\t\t\tArray.prototype.slice.call(arguments)\n\t\t\t);\n\t\t\treturn DataTable.ext.internal[fn].apply( this, args );\n\t\t};\n\t}\n\t\n\t\n\t/**\n\t * Reference to internal functions for use by plug-in developers. Note that\n\t * these methods are references to internal functions and are considered to be\n\t * private. If you use these methods, be aware that they are liable to change\n\t * between versions.\n\t *  @namespace\n\t */\n\t$.extend( DataTable.ext.internal, {\n\t\t_fnExternApiFunc: _fnExternApiFunc,\n\t\t_fnBuildAjax: _fnBuildAjax,\n\t\t_fnAjaxUpdate: _fnAjaxUpdate,\n\t\t_fnAjaxParameters: _fnAjaxParameters,\n\t\t_fnAjaxUpdateDraw: _fnAjaxUpdateDraw,\n\t\t_fnAjaxDataSrc: _fnAjaxDataSrc,\n\t\t_fnAddColumn: _fnAddColumn,\n\t\t_fnColumnOptions: _fnColumnOptions,\n\t\t_fnAdjustColumnSizing: _fnAdjustColumnSizing,\n\t\t_fnVisibleToColumnIndex: _fnVisibleToColumnIndex,\n\t\t_fnColumnIndexToVisible: _fnColumnIndexToVisible,\n\t\t_fnVisbleColumns: _fnVisbleColumns,\n\t\t_fnGetColumns: _fnGetColumns,\n\t\t_fnColumnTypes: _fnColumnTypes,\n\t\t_fnApplyColumnDefs: _fnApplyColumnDefs,\n\t\t_fnHungarianMap: _fnHungarianMap,\n\t\t_fnCamelToHungarian: _fnCamelToHungarian,\n\t\t_fnLanguageCompat: _fnLanguageCompat,\n\t\t_fnBrowserDetect: _fnBrowserDetect,\n\t\t_fnAddData: _fnAddData,\n\t\t_fnAddTr: _fnAddTr,\n\t\t_fnNodeToDataIndex: _fnNodeToDataIndex,\n\t\t_fnNodeToColumnIndex: _fnNodeToColumnIndex,\n\t\t_fnGetCellData: _fnGetCellData,\n\t\t_fnSetCellData: _fnSetCellData,\n\t\t_fnSplitObjNotation: _fnSplitObjNotation,\n\t\t_fnGetObjectDataFn: _fnGetObjectDataFn,\n\t\t_fnSetObjectDataFn: _fnSetObjectDataFn,\n\t\t_fnGetDataMaster: _fnGetDataMaster,\n\t\t_fnClearTable: _fnClearTable,\n\t\t_fnDeleteIndex: _fnDeleteIndex,\n\t\t_fnInvalidate: _fnInvalidate,\n\t\t_fnGetRowElements: _fnGetRowElements,\n\t\t_fnCreateTr: _fnCreateTr,\n\t\t_fnBuildHead: _fnBuildHead,\n\t\t_fnDrawHead: _fnDrawHead,\n\t\t_fnDraw: _fnDraw,\n\t\t_fnReDraw: _fnReDraw,\n\t\t_fnAddOptionsHtml: _fnAddOptionsHtml,\n\t\t_fnDetectHeader: _fnDetectHeader,\n\t\t_fnGetUniqueThs: _fnGetUniqueThs,\n\t\t_fnFeatureHtmlFilter: _fnFeatureHtmlFilter,\n\t\t_fnFilterComplete: _fnFilterComplete,\n\t\t_fnFilterCustom: _fnFilterCustom,\n\t\t_fnFilterColumn: _fnFilterColumn,\n\t\t_fnFilter: _fnFilter,\n\t\t_fnFilterCreateSearch: _fnFilterCreateSearch,\n\t\t_fnEscapeRegex: _fnEscapeRegex,\n\t\t_fnFilterData: _fnFilterData,\n\t\t_fnFeatureHtmlInfo: _fnFeatureHtmlInfo,\n\t\t_fnUpdateInfo: _fnUpdateInfo,\n\t\t_fnInfoMacros: _fnInfoMacros,\n\t\t_fnInitialise: _fnInitialise,\n\t\t_fnInitComplete: _fnInitComplete,\n\t\t_fnLengthChange: _fnLengthChange,\n\t\t_fnFeatureHtmlLength: _fnFeatureHtmlLength,\n\t\t_fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate,\n\t\t_fnPageChange: _fnPageChange,\n\t\t_fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing,\n\t\t_fnProcessingDisplay: _fnProcessingDisplay,\n\t\t_fnFeatureHtmlTable: _fnFeatureHtmlTable,\n\t\t_fnScrollDraw: _fnScrollDraw,\n\t\t_fnApplyToChildren: _fnApplyToChildren,\n\t\t_fnCalculateColumnWidths: _fnCalculateColumnWidths,\n\t\t_fnThrottle: _fnThrottle,\n\t\t_fnConvertToWidth: _fnConvertToWidth,\n\t\t_fnGetWidestNode: _fnGetWidestNode,\n\t\t_fnGetMaxLenString: _fnGetMaxLenString,\n\t\t_fnStringToCss: _fnStringToCss,\n\t\t_fnSortFlatten: _fnSortFlatten,\n\t\t_fnSort: _fnSort,\n\t\t_fnSortAria: _fnSortAria,\n\t\t_fnSortListener: _fnSortListener,\n\t\t_fnSortAttachListener: _fnSortAttachListener,\n\t\t_fnSortingClasses: _fnSortingClasses,\n\t\t_fnSortData: _fnSortData,\n\t\t_fnSaveState: _fnSaveState,\n\t\t_fnLoadState: _fnLoadState,\n\t\t_fnSettingsFromNode: _fnSettingsFromNode,\n\t\t_fnLog: _fnLog,\n\t\t_fnMap: _fnMap,\n\t\t_fnBindAction: _fnBindAction,\n\t\t_fnCallbackReg: _fnCallbackReg,\n\t\t_fnCallbackFire: _fnCallbackFire,\n\t\t_fnLengthOverflow: _fnLengthOverflow,\n\t\t_fnRenderer: _fnRenderer,\n\t\t_fnDataSource: _fnDataSource,\n\t\t_fnRowAttributes: _fnRowAttributes,\n\t\t_fnCalculateEnd: function () {} // Used by a lot of plug-ins, but redundant\n\t\t                                // in 1.10, so this dead-end function is\n\t\t                                // added to prevent errors\n\t} );\n\t\n\n\t// jQuery access\n\t$.fn.dataTable = DataTable;\n\n\t// Provide access to the host jQuery object (circular reference)\n\tDataTable.$ = $;\n\n\t// Legacy aliases\n\t$.fn.dataTableSettings = DataTable.settings;\n\t$.fn.dataTableExt = DataTable.ext;\n\n\t// With a capital `D` we return a DataTables API instance rather than a\n\t// jQuery object\n\t$.fn.DataTable = function ( opts ) {\n\t\treturn $(this).dataTable( opts ).api();\n\t};\n\n\t// All properties that are available to $.fn.dataTable should also be\n\t// available on $.fn.DataTable\n\t$.each( DataTable, function ( prop, val ) {\n\t\t$.fn.DataTable[ prop ] = val;\n\t} );\n\n\n\t// Information about events fired by DataTables - for documentation.\n\t/**\n\t * Draw event, fired whenever the table is redrawn on the page, at the same\n\t * point as fnDrawCallback. This may be useful for binding events or\n\t * performing calculations when the table is altered at all.\n\t *  @name DataTable#draw.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * Search event, fired when the searching applied to the table (using the\n\t * built-in global search, or column filters) is altered.\n\t *  @name DataTable#search.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * Page change event, fired when the paging of the table is altered.\n\t *  @name DataTable#page.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * Order event, fired when the ordering applied to the table is altered.\n\t *  @name DataTable#order.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * DataTables initialisation complete event, fired when the table is fully\n\t * drawn, including Ajax data loaded, if Ajax data is required.\n\t *  @name DataTable#init.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} oSettings DataTables settings object\n\t *  @param {object} json The JSON object request from the server - only\n\t *    present if client-side Ajax sourced data is used</li></ol>\n\t */\n\n\t/**\n\t * State save event, fired when the table has changed state a new state save\n\t * is required. This event allows modification of the state saving object\n\t * prior to actually doing the save, including addition or other state\n\t * properties (for plug-ins) or modification of a DataTables core property.\n\t *  @name DataTable#stateSaveParams.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} oSettings DataTables settings object\n\t *  @param {object} json The state information to be saved\n\t */\n\n\t/**\n\t * State load event, fired when the table is loading state from the stored\n\t * data, but prior to the settings object being modified by the saved state\n\t * - allowing modification of the saved state is required or loading of\n\t * state for a plug-in.\n\t *  @name DataTable#stateLoadParams.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} oSettings DataTables settings object\n\t *  @param {object} json The saved state information\n\t */\n\n\t/**\n\t * State loaded event, fired when state has been loaded from stored data and\n\t * the settings object has been modified by the loaded data.\n\t *  @name DataTable#stateLoaded.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} oSettings DataTables settings object\n\t *  @param {object} json The saved state information\n\t */\n\n\t/**\n\t * Processing event, fired when DataTables is doing some kind of processing\n\t * (be it, order, searcg or anything else). It can be used to indicate to\n\t * the end user that there is something happening, or that something has\n\t * finished.\n\t *  @name DataTable#processing.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} oSettings DataTables settings object\n\t *  @param {boolean} bShow Flag for if DataTables is doing processing or not\n\t */\n\n\t/**\n\t * Ajax (XHR) event, fired whenever an Ajax request is completed from a\n\t * request to made to the server for new data. This event is called before\n\t * DataTables processed the returned data, so it can also be used to pre-\n\t * process the data returned from the server, if needed.\n\t *\n\t * Note that this trigger is called in `fnServerData`, if you override\n\t * `fnServerData` and which to use this event, you need to trigger it in you\n\t * success function.\n\t *  @name DataTable#xhr.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t *  @param {object} json JSON returned from the server\n\t *\n\t *  @example\n\t *     // Use a custom property returned from the server in another DOM element\n\t *     $('#table').dataTable().on('xhr.dt', function (e, settings, json) {\n\t *       $('#status').html( json.status );\n\t *     } );\n\t *\n\t *  @example\n\t *     // Pre-process the data returned from the server\n\t *     $('#table').dataTable().on('xhr.dt', function (e, settings, json) {\n\t *       for ( var i=0, ien=json.aaData.length ; i<ien ; i++ ) {\n\t *         json.aaData[i].sum = json.aaData[i].one + json.aaData[i].two;\n\t *       }\n\t *       // Note no return - manipulate the data directly in the JSON object.\n\t *     } );\n\t */\n\n\t/**\n\t * Destroy event, fired when the DataTable is destroyed by calling fnDestroy\n\t * or passing the bDestroy:true parameter in the initialisation object. This\n\t * can be used to remove bound events, added DOM nodes, etc.\n\t *  @name DataTable#destroy.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * Page length change event, fired when number of records to show on each\n\t * page (the length) is changed.\n\t *  @name DataTable#length.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t *  @param {integer} len New length\n\t */\n\n\t/**\n\t * Column sizing has changed.\n\t *  @name DataTable#column-sizing.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * Column visibility has changed.\n\t *  @name DataTable#column-visibility.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t *  @param {int} column Column index\n\t *  @param {bool} vis `false` if column now hidden, or `true` if visible\n\t */\n\n\treturn $.fn.dataTable;\n}));\n\n},{\"jquery\":undefined}],17:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n  this._events = this._events || {};\n  this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n  if (!isNumber(n) || n < 0 || isNaN(n))\n    throw TypeError('n must be a positive number');\n  this._maxListeners = n;\n  return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n  var er, handler, len, args, i, listeners;\n\n  if (!this._events)\n    this._events = {};\n\n  // If there is no 'error' event listener then throw.\n  if (type === 'error') {\n    if (!this._events.error ||\n        (isObject(this._events.error) && !this._events.error.length)) {\n      er = arguments[1];\n      if (er instanceof Error) {\n        throw er; // Unhandled 'error' event\n      } else {\n        // At least give some kind of context to the user\n        var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n        err.context = er;\n        throw err;\n      }\n    }\n  }\n\n  handler = this._events[type];\n\n  if (isUndefined(handler))\n    return false;\n\n  if (isFunction(handler)) {\n    switch (arguments.length) {\n      // fast cases\n      case 1:\n        handler.call(this);\n        break;\n      case 2:\n        handler.call(this, arguments[1]);\n        break;\n      case 3:\n        handler.call(this, arguments[1], arguments[2]);\n        break;\n      // slower\n      default:\n        args = Array.prototype.slice.call(arguments, 1);\n        handler.apply(this, args);\n    }\n  } else if (isObject(handler)) {\n    args = Array.prototype.slice.call(arguments, 1);\n    listeners = handler.slice();\n    len = listeners.length;\n    for (i = 0; i < len; i++)\n      listeners[i].apply(this, args);\n  }\n\n  return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n  var m;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events)\n    this._events = {};\n\n  // To avoid recursion in the case that type === \"newListener\"! Before\n  // adding it to the listeners, first emit \"newListener\".\n  if (this._events.newListener)\n    this.emit('newListener', type,\n              isFunction(listener.listener) ?\n              listener.listener : listener);\n\n  if (!this._events[type])\n    // Optimize the case of one listener. Don't need the extra array object.\n    this._events[type] = listener;\n  else if (isObject(this._events[type]))\n    // If we've already got an array, just append.\n    this._events[type].push(listener);\n  else\n    // Adding the second element, need to change to array.\n    this._events[type] = [this._events[type], listener];\n\n  // Check for listener leak\n  if (isObject(this._events[type]) && !this._events[type].warned) {\n    if (!isUndefined(this._maxListeners)) {\n      m = this._maxListeners;\n    } else {\n      m = EventEmitter.defaultMaxListeners;\n    }\n\n    if (m && m > 0 && this._events[type].length > m) {\n      this._events[type].warned = true;\n      console.error('(node) warning: possible EventEmitter memory ' +\n                    'leak detected. %d listeners added. ' +\n                    'Use emitter.setMaxListeners() to increase limit.',\n                    this._events[type].length);\n      if (typeof console.trace === 'function') {\n        // not supported in IE 10\n        console.trace();\n      }\n    }\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  var fired = false;\n\n  function g() {\n    this.removeListener(type, g);\n\n    if (!fired) {\n      fired = true;\n      listener.apply(this, arguments);\n    }\n  }\n\n  g.listener = listener;\n  this.on(type, g);\n\n  return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n  var list, position, length, i;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events || !this._events[type])\n    return this;\n\n  list = this._events[type];\n  length = list.length;\n  position = -1;\n\n  if (list === listener ||\n      (isFunction(list.listener) && list.listener === listener)) {\n    delete this._events[type];\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n\n  } else if (isObject(list)) {\n    for (i = length; i-- > 0;) {\n      if (list[i] === listener ||\n          (list[i].listener && list[i].listener === listener)) {\n        position = i;\n        break;\n      }\n    }\n\n    if (position < 0)\n      return this;\n\n    if (list.length === 1) {\n      list.length = 0;\n      delete this._events[type];\n    } else {\n      list.splice(position, 1);\n    }\n\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n  var key, listeners;\n\n  if (!this._events)\n    return this;\n\n  // not listening for removeListener, no need to emit\n  if (!this._events.removeListener) {\n    if (arguments.length === 0)\n      this._events = {};\n    else if (this._events[type])\n      delete this._events[type];\n    return this;\n  }\n\n  // emit removeListener for all listeners on all events\n  if (arguments.length === 0) {\n    for (key in this._events) {\n      if (key === 'removeListener') continue;\n      this.removeAllListeners(key);\n    }\n    this.removeAllListeners('removeListener');\n    this._events = {};\n    return this;\n  }\n\n  listeners = this._events[type];\n\n  if (isFunction(listeners)) {\n    this.removeListener(type, listeners);\n  } else if (listeners) {\n    // LIFO order\n    while (listeners.length)\n      this.removeListener(type, listeners[listeners.length - 1]);\n  }\n  delete this._events[type];\n\n  return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n  var ret;\n  if (!this._events || !this._events[type])\n    ret = [];\n  else if (isFunction(this._events[type]))\n    ret = [this._events[type]];\n  else\n    ret = this._events[type].slice();\n  return ret;\n};\n\nEventEmitter.prototype.listenerCount = function(type) {\n  if (this._events) {\n    var evlistener = this._events[type];\n\n    if (isFunction(evlistener))\n      return 1;\n    else if (evlistener)\n      return evlistener.length;\n  }\n  return 0;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  return emitter.listenerCount(type);\n};\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\n\n},{}],18:[function(require,module,exports){\n/*\n Leaflet 1.0.3, a JS library for interactive maps. http://leafletjs.com\n (c) 2010-2016 Vladimir Agafonkin, (c) 2010-2011 CloudMade\n*/\n(function (window, document, undefined) {\r\nvar L = {\r\n\tversion: \"1.0.3\"\r\n};\r\n\r\nfunction expose() {\r\n\tvar oldL = window.L;\r\n\r\n\tL.noConflict = function () {\r\n\t\twindow.L = oldL;\r\n\t\treturn this;\r\n\t};\r\n\r\n\twindow.L = L;\r\n}\r\n\r\n// define Leaflet for Node module pattern loaders, including Browserify\r\nif (typeof module === 'object' && typeof module.exports === 'object') {\r\n\tmodule.exports = L;\r\n\r\n// define Leaflet as an AMD module\r\n} else if (typeof define === 'function' && define.amd) {\r\n\tdefine(L);\r\n}\r\n\r\n// define Leaflet as a global L variable, saving the original L to restore later if needed\r\nif (typeof window !== 'undefined') {\r\n\texpose();\r\n}\r\n\n\n\n/*\r\n * @namespace Util\r\n *\r\n * Various utility functions, used by Leaflet internally.\r\n */\r\n\r\nL.Util = {\r\n\r\n\t// @function extend(dest: Object, src?: Object): Object\r\n\t// Merges the properties of the `src` object (or multiple objects) into `dest` object and returns the latter. Has an `L.extend` shortcut.\r\n\textend: function (dest) {\r\n\t\tvar i, j, len, src;\r\n\r\n\t\tfor (j = 1, len = arguments.length; j < len; j++) {\r\n\t\t\tsrc = arguments[j];\r\n\t\t\tfor (i in src) {\r\n\t\t\t\tdest[i] = src[i];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn dest;\r\n\t},\r\n\r\n\t// @function create(proto: Object, properties?: Object): Object\r\n\t// Compatibility polyfill for [Object.create](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/create)\r\n\tcreate: Object.create || (function () {\r\n\t\tfunction F() {}\r\n\t\treturn function (proto) {\r\n\t\t\tF.prototype = proto;\r\n\t\t\treturn new F();\r\n\t\t};\r\n\t})(),\r\n\r\n\t// @function bind(fn: Function, …): Function\r\n\t// Returns a new function bound to the arguments passed, like [Function.prototype.bind](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).\r\n\t// Has a `L.bind()` shortcut.\r\n\tbind: function (fn, obj) {\r\n\t\tvar slice = Array.prototype.slice;\r\n\r\n\t\tif (fn.bind) {\r\n\t\t\treturn fn.bind.apply(fn, slice.call(arguments, 1));\r\n\t\t}\r\n\r\n\t\tvar args = slice.call(arguments, 2);\r\n\r\n\t\treturn function () {\r\n\t\t\treturn fn.apply(obj, args.length ? args.concat(slice.call(arguments)) : arguments);\r\n\t\t};\r\n\t},\r\n\r\n\t// @function stamp(obj: Object): Number\r\n\t// Returns the unique ID of an object, assiging it one if it doesn't have it.\r\n\tstamp: function (obj) {\r\n\t\t/*eslint-disable */\r\n\t\tobj._leaflet_id = obj._leaflet_id || ++L.Util.lastId;\r\n\t\treturn obj._leaflet_id;\r\n\t\t/*eslint-enable */\r\n\t},\r\n\r\n\t// @property lastId: Number\r\n\t// Last unique ID used by [`stamp()`](#util-stamp)\r\n\tlastId: 0,\r\n\r\n\t// @function throttle(fn: Function, time: Number, context: Object): Function\r\n\t// Returns a function which executes function `fn` with the given scope `context`\r\n\t// (so that the `this` keyword refers to `context` inside `fn`'s code). The function\r\n\t// `fn` will be called no more than one time per given amount of `time`. The arguments\r\n\t// received by the bound function will be any arguments passed when binding the\r\n\t// function, followed by any arguments passed when invoking the bound function.\r\n\t// Has an `L.bind` shortcut.\r\n\tthrottle: function (fn, time, context) {\r\n\t\tvar lock, args, wrapperFn, later;\r\n\r\n\t\tlater = function () {\r\n\t\t\t// reset lock and call if queued\r\n\t\t\tlock = false;\r\n\t\t\tif (args) {\r\n\t\t\t\twrapperFn.apply(context, args);\r\n\t\t\t\targs = false;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\twrapperFn = function () {\r\n\t\t\tif (lock) {\r\n\t\t\t\t// called too soon, queue to call later\r\n\t\t\t\targs = arguments;\r\n\r\n\t\t\t} else {\r\n\t\t\t\t// call and lock until later\r\n\t\t\t\tfn.apply(context, arguments);\r\n\t\t\t\tsetTimeout(later, time);\r\n\t\t\t\tlock = true;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn wrapperFn;\r\n\t},\r\n\r\n\t// @function wrapNum(num: Number, range: Number[], includeMax?: Boolean): Number\r\n\t// Returns the number `num` modulo `range` in such a way so it lies within\r\n\t// `range[0]` and `range[1]`. The returned value will be always smaller than\r\n\t// `range[1]` unless `includeMax` is set to `true`.\r\n\twrapNum: function (x, range, includeMax) {\r\n\t\tvar max = range[1],\r\n\t\t    min = range[0],\r\n\t\t    d = max - min;\r\n\t\treturn x === max && includeMax ? x : ((x - min) % d + d) % d + min;\r\n\t},\r\n\r\n\t// @function falseFn(): Function\r\n\t// Returns a function which always returns `false`.\r\n\tfalseFn: function () { return false; },\r\n\r\n\t// @function formatNum(num: Number, digits?: Number): Number\r\n\t// Returns the number `num` rounded to `digits` decimals, or to 5 decimals by default.\r\n\tformatNum: function (num, digits) {\r\n\t\tvar pow = Math.pow(10, digits || 5);\r\n\t\treturn Math.round(num * pow) / pow;\r\n\t},\r\n\r\n\t// @function trim(str: String): String\r\n\t// Compatibility polyfill for [String.prototype.trim](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/Trim)\r\n\ttrim: function (str) {\r\n\t\treturn str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g, '');\r\n\t},\r\n\r\n\t// @function splitWords(str: String): String[]\r\n\t// Trims and splits the string on whitespace and returns the array of parts.\r\n\tsplitWords: function (str) {\r\n\t\treturn L.Util.trim(str).split(/\\s+/);\r\n\t},\r\n\r\n\t// @function setOptions(obj: Object, options: Object): Object\r\n\t// Merges the given properties to the `options` of the `obj` object, returning the resulting options. See `Class options`. Has an `L.setOptions` shortcut.\r\n\tsetOptions: function (obj, options) {\r\n\t\tif (!obj.hasOwnProperty('options')) {\r\n\t\t\tobj.options = obj.options ? L.Util.create(obj.options) : {};\r\n\t\t}\r\n\t\tfor (var i in options) {\r\n\t\t\tobj.options[i] = options[i];\r\n\t\t}\r\n\t\treturn obj.options;\r\n\t},\r\n\r\n\t// @function getParamString(obj: Object, existingUrl?: String, uppercase?: Boolean): String\r\n\t// Converts an object into a parameter URL string, e.g. `{a: \"foo\", b: \"bar\"}`\r\n\t// translates to `'?a=foo&b=bar'`. If `existingUrl` is set, the parameters will\r\n\t// be appended at the end. If `uppercase` is `true`, the parameter names will\r\n\t// be uppercased (e.g. `'?A=foo&B=bar'`)\r\n\tgetParamString: function (obj, existingUrl, uppercase) {\r\n\t\tvar params = [];\r\n\t\tfor (var i in obj) {\r\n\t\t\tparams.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i]));\r\n\t\t}\r\n\t\treturn ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&');\r\n\t},\r\n\r\n\t// @function template(str: String, data: Object): String\r\n\t// Simple templating facility, accepts a template string of the form `'Hello {a}, {b}'`\r\n\t// and a data object like `{a: 'foo', b: 'bar'}`, returns evaluated string\r\n\t// `('Hello foo, bar')`. You can also specify functions instead of strings for\r\n\t// data values — they will be evaluated passing `data` as an argument.\r\n\ttemplate: function (str, data) {\r\n\t\treturn str.replace(L.Util.templateRe, function (str, key) {\r\n\t\t\tvar value = data[key];\r\n\r\n\t\t\tif (value === undefined) {\r\n\t\t\t\tthrow new Error('No value provided for variable ' + str);\r\n\r\n\t\t\t} else if (typeof value === 'function') {\r\n\t\t\t\tvalue = value(data);\r\n\t\t\t}\r\n\t\t\treturn value;\r\n\t\t});\r\n\t},\r\n\r\n\ttemplateRe: /\\{ *([\\w_\\-]+) *\\}/g,\r\n\r\n\t// @function isArray(obj): Boolean\r\n\t// Compatibility polyfill for [Array.isArray](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray)\r\n\tisArray: Array.isArray || function (obj) {\r\n\t\treturn (Object.prototype.toString.call(obj) === '[object Array]');\r\n\t},\r\n\r\n\t// @function indexOf(array: Array, el: Object): Number\r\n\t// Compatibility polyfill for [Array.prototype.indexOf](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)\r\n\tindexOf: function (array, el) {\r\n\t\tfor (var i = 0; i < array.length; i++) {\r\n\t\t\tif (array[i] === el) { return i; }\r\n\t\t}\r\n\t\treturn -1;\r\n\t},\r\n\r\n\t// @property emptyImageUrl: String\r\n\t// Data URI string containing a base64-encoded empty GIF image.\r\n\t// Used as a hack to free memory from unused images on WebKit-powered\r\n\t// mobile devices (by setting image `src` to this string).\r\n\temptyImageUrl: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='\r\n};\r\n\r\n(function () {\r\n\t// inspired by http://paulirish.com/2011/requestanimationframe-for-smart-animating/\r\n\r\n\tfunction getPrefixed(name) {\r\n\t\treturn window['webkit' + name] || window['moz' + name] || window['ms' + name];\r\n\t}\r\n\r\n\tvar lastTime = 0;\r\n\r\n\t// fallback for IE 7-8\r\n\tfunction timeoutDefer(fn) {\r\n\t\tvar time = +new Date(),\r\n\t\t    timeToCall = Math.max(0, 16 - (time - lastTime));\r\n\r\n\t\tlastTime = time + timeToCall;\r\n\t\treturn window.setTimeout(fn, timeToCall);\r\n\t}\r\n\r\n\tvar requestFn = window.requestAnimationFrame || getPrefixed('RequestAnimationFrame') || timeoutDefer,\r\n\t    cancelFn = window.cancelAnimationFrame || getPrefixed('CancelAnimationFrame') ||\r\n\t               getPrefixed('CancelRequestAnimationFrame') || function (id) { window.clearTimeout(id); };\r\n\r\n\r\n\t// @function requestAnimFrame(fn: Function, context?: Object, immediate?: Boolean): Number\r\n\t// Schedules `fn` to be executed when the browser repaints. `fn` is bound to\r\n\t// `context` if given. When `immediate` is set, `fn` is called immediately if\r\n\t// the browser doesn't have native support for\r\n\t// [`window.requestAnimationFrame`](https://developer.mozilla.org/docs/Web/API/window/requestAnimationFrame),\r\n\t// otherwise it's delayed. Returns a request ID that can be used to cancel the request.\r\n\tL.Util.requestAnimFrame = function (fn, context, immediate) {\r\n\t\tif (immediate && requestFn === timeoutDefer) {\r\n\t\t\tfn.call(context);\r\n\t\t} else {\r\n\t\t\treturn requestFn.call(window, L.bind(fn, context));\r\n\t\t}\r\n\t};\r\n\r\n\t// @function cancelAnimFrame(id: Number): undefined\r\n\t// Cancels a previous `requestAnimFrame`. See also [window.cancelAnimationFrame](https://developer.mozilla.org/docs/Web/API/window/cancelAnimationFrame).\r\n\tL.Util.cancelAnimFrame = function (id) {\r\n\t\tif (id) {\r\n\t\t\tcancelFn.call(window, id);\r\n\t\t}\r\n\t};\r\n})();\r\n\r\n// shortcuts for most used utility functions\r\nL.extend = L.Util.extend;\r\nL.bind = L.Util.bind;\r\nL.stamp = L.Util.stamp;\r\nL.setOptions = L.Util.setOptions;\r\n\n\n\n\r\n// @class Class\r\n// @aka L.Class\r\n\r\n// @section\r\n// @uninheritable\r\n\r\n// Thanks to John Resig and Dean Edwards for inspiration!\r\n\r\nL.Class = function () {};\r\n\r\nL.Class.extend = function (props) {\r\n\r\n\t// @function extend(props: Object): Function\r\n\t// [Extends the current class](#class-inheritance) given the properties to be included.\r\n\t// Returns a Javascript function that is a class constructor (to be called with `new`).\r\n\tvar NewClass = function () {\r\n\r\n\t\t// call the constructor\r\n\t\tif (this.initialize) {\r\n\t\t\tthis.initialize.apply(this, arguments);\r\n\t\t}\r\n\r\n\t\t// call all constructor hooks\r\n\t\tthis.callInitHooks();\r\n\t};\r\n\r\n\tvar parentProto = NewClass.__super__ = this.prototype;\r\n\r\n\tvar proto = L.Util.create(parentProto);\r\n\tproto.constructor = NewClass;\r\n\r\n\tNewClass.prototype = proto;\r\n\r\n\t// inherit parent's statics\r\n\tfor (var i in this) {\r\n\t\tif (this.hasOwnProperty(i) && i !== 'prototype') {\r\n\t\t\tNewClass[i] = this[i];\r\n\t\t}\r\n\t}\r\n\r\n\t// mix static properties into the class\r\n\tif (props.statics) {\r\n\t\tL.extend(NewClass, props.statics);\r\n\t\tdelete props.statics;\r\n\t}\r\n\r\n\t// mix includes into the prototype\r\n\tif (props.includes) {\r\n\t\tL.Util.extend.apply(null, [proto].concat(props.includes));\r\n\t\tdelete props.includes;\r\n\t}\r\n\r\n\t// merge options\r\n\tif (proto.options) {\r\n\t\tprops.options = L.Util.extend(L.Util.create(proto.options), props.options);\r\n\t}\r\n\r\n\t// mix given properties into the prototype\r\n\tL.extend(proto, props);\r\n\r\n\tproto._initHooks = [];\r\n\r\n\t// add method for calling all hooks\r\n\tproto.callInitHooks = function () {\r\n\r\n\t\tif (this._initHooksCalled) { return; }\r\n\r\n\t\tif (parentProto.callInitHooks) {\r\n\t\t\tparentProto.callInitHooks.call(this);\r\n\t\t}\r\n\r\n\t\tthis._initHooksCalled = true;\r\n\r\n\t\tfor (var i = 0, len = proto._initHooks.length; i < len; i++) {\r\n\t\t\tproto._initHooks[i].call(this);\r\n\t\t}\r\n\t};\r\n\r\n\treturn NewClass;\r\n};\r\n\r\n\r\n// @function include(properties: Object): this\r\n// [Includes a mixin](#class-includes) into the current class.\r\nL.Class.include = function (props) {\r\n\tL.extend(this.prototype, props);\r\n\treturn this;\r\n};\r\n\r\n// @function mergeOptions(options: Object): this\r\n// [Merges `options`](#class-options) into the defaults of the class.\r\nL.Class.mergeOptions = function (options) {\r\n\tL.extend(this.prototype.options, options);\r\n\treturn this;\r\n};\r\n\r\n// @function addInitHook(fn: Function): this\r\n// Adds a [constructor hook](#class-constructor-hooks) to the class.\r\nL.Class.addInitHook = function (fn) { // (Function) || (String, args...)\r\n\tvar args = Array.prototype.slice.call(arguments, 1);\r\n\r\n\tvar init = typeof fn === 'function' ? fn : function () {\r\n\t\tthis[fn].apply(this, args);\r\n\t};\r\n\r\n\tthis.prototype._initHooks = this.prototype._initHooks || [];\r\n\tthis.prototype._initHooks.push(init);\r\n\treturn this;\r\n};\r\n\n\n\n/*\r\n * @class Evented\r\n * @aka L.Evented\r\n * @inherits Class\r\n *\r\n * A set of methods shared between event-powered classes (like `Map` and `Marker`). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire `'click'` event).\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * map.on('click', function(e) {\r\n * \talert(e.latlng);\r\n * } );\r\n * ```\r\n *\r\n * Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function:\r\n *\r\n * ```js\r\n * function onClick(e) { ... }\r\n *\r\n * map.on('click', onClick);\r\n * map.off('click', onClick);\r\n * ```\r\n */\r\n\r\n\r\nL.Evented = L.Class.extend({\r\n\r\n\t/* @method on(type: String, fn: Function, context?: Object): this\r\n\t * Adds a listener function (`fn`) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. `'click dblclick'`).\r\n\t *\r\n\t * @alternative\r\n\t * @method on(eventMap: Object): this\r\n\t * Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`\r\n\t */\r\n\ton: function (types, fn, context) {\r\n\r\n\t\t// types can be a map of types/handlers\r\n\t\tif (typeof types === 'object') {\r\n\t\t\tfor (var type in types) {\r\n\t\t\t\t// we don't process space-separated events here for performance;\r\n\t\t\t\t// it's a hot path since Layer uses the on(obj) syntax\r\n\t\t\t\tthis._on(type, types[type], fn);\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\t// types can be a string of space-separated words\r\n\t\t\ttypes = L.Util.splitWords(types);\r\n\r\n\t\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n\t\t\t\tthis._on(types[i], fn, context);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/* @method off(type: String, fn?: Function, context?: Object): this\r\n\t * Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to `on`, you must pass the same context to `off` in order to remove the listener.\r\n\t *\r\n\t * @alternative\r\n\t * @method off(eventMap: Object): this\r\n\t * Removes a set of type/listener pairs.\r\n\t *\r\n\t * @alternative\r\n\t * @method off: this\r\n\t * Removes all listeners to all events on the object.\r\n\t */\r\n\toff: function (types, fn, context) {\r\n\r\n\t\tif (!types) {\r\n\t\t\t// clear all listeners if called without arguments\r\n\t\t\tdelete this._events;\r\n\r\n\t\t} else if (typeof types === 'object') {\r\n\t\t\tfor (var type in types) {\r\n\t\t\t\tthis._off(type, types[type], fn);\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\ttypes = L.Util.splitWords(types);\r\n\r\n\t\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n\t\t\t\tthis._off(types[i], fn, context);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// attach listener (without syntactic sugar now)\r\n\t_on: function (type, fn, context) {\r\n\t\tthis._events = this._events || {};\r\n\r\n\t\t/* get/init listeners for type */\r\n\t\tvar typeListeners = this._events[type];\r\n\t\tif (!typeListeners) {\r\n\t\t\ttypeListeners = [];\r\n\t\t\tthis._events[type] = typeListeners;\r\n\t\t}\r\n\r\n\t\tif (context === this) {\r\n\t\t\t// Less memory footprint.\r\n\t\t\tcontext = undefined;\r\n\t\t}\r\n\t\tvar newListener = {fn: fn, ctx: context},\r\n\t\t    listeners = typeListeners;\r\n\r\n\t\t// check if fn already there\r\n\t\tfor (var i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\tif (listeners[i].fn === fn && listeners[i].ctx === context) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlisteners.push(newListener);\r\n\t},\r\n\r\n\t_off: function (type, fn, context) {\r\n\t\tvar listeners,\r\n\t\t    i,\r\n\t\t    len;\r\n\r\n\t\tif (!this._events) { return; }\r\n\r\n\t\tlisteners = this._events[type];\r\n\r\n\t\tif (!listeners) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!fn) {\r\n\t\t\t// Set all removed listeners to noop so they are not called if remove happens in fire\r\n\t\t\tfor (i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\t\tlisteners[i].fn = L.Util.falseFn;\r\n\t\t\t}\r\n\t\t\t// clear all listeners for a type if function isn't specified\r\n\t\t\tdelete this._events[type];\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (context === this) {\r\n\t\t\tcontext = undefined;\r\n\t\t}\r\n\r\n\t\tif (listeners) {\r\n\r\n\t\t\t// find fn and remove it\r\n\t\t\tfor (i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\t\tvar l = listeners[i];\r\n\t\t\t\tif (l.ctx !== context) { continue; }\r\n\t\t\t\tif (l.fn === fn) {\r\n\r\n\t\t\t\t\t// set the removed listener to noop so that's not called if remove happens in fire\r\n\t\t\t\t\tl.fn = L.Util.falseFn;\r\n\r\n\t\t\t\t\tif (this._firingCount) {\r\n\t\t\t\t\t\t/* copy array in case events are being fired */\r\n\t\t\t\t\t\tthis._events[type] = listeners = listeners.slice();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlisteners.splice(i, 1);\r\n\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// @method fire(type: String, data?: Object, propagate?: Boolean): this\r\n\t// Fires an event of the specified type. You can optionally provide an data\r\n\t// object — the first argument of the listener function will contain its\r\n\t// properties. The event can optionally be propagated to event parents.\r\n\tfire: function (type, data, propagate) {\r\n\t\tif (!this.listens(type, propagate)) { return this; }\r\n\r\n\t\tvar event = L.Util.extend({}, data, {type: type, target: this});\r\n\r\n\t\tif (this._events) {\r\n\t\t\tvar listeners = this._events[type];\r\n\r\n\t\t\tif (listeners) {\r\n\t\t\t\tthis._firingCount = (this._firingCount + 1) || 1;\r\n\t\t\t\tfor (var i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\t\t\tvar l = listeners[i];\r\n\t\t\t\t\tl.fn.call(l.ctx || this, event);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis._firingCount--;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (propagate) {\r\n\t\t\t// propagate the event to parents (set with addEventParent)\r\n\t\t\tthis._propagateEvent(event);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method listens(type: String): Boolean\r\n\t// Returns `true` if a particular event type has any listeners attached to it.\r\n\tlistens: function (type, propagate) {\r\n\t\tvar listeners = this._events && this._events[type];\r\n\t\tif (listeners && listeners.length) { return true; }\r\n\r\n\t\tif (propagate) {\r\n\t\t\t// also check parents for listeners if event propagates\r\n\t\t\tfor (var id in this._eventParents) {\r\n\t\t\t\tif (this._eventParents[id].listens(type, propagate)) { return true; }\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\t// @method once(…): this\r\n\t// Behaves as [`on(…)`](#evented-on), except the listener will only get fired once and then removed.\r\n\tonce: function (types, fn, context) {\r\n\r\n\t\tif (typeof types === 'object') {\r\n\t\t\tfor (var type in types) {\r\n\t\t\t\tthis.once(type, types[type], fn);\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar handler = L.bind(function () {\r\n\t\t\tthis\r\n\t\t\t    .off(types, fn, context)\r\n\t\t\t    .off(types, handler, context);\r\n\t\t}, this);\r\n\r\n\t\t// add a listener that's executed once and removed after that\r\n\t\treturn this\r\n\t\t    .on(types, fn, context)\r\n\t\t    .on(types, handler, context);\r\n\t},\r\n\r\n\t// @method addEventParent(obj: Evented): this\r\n\t// Adds an event parent - an `Evented` that will receive propagated events\r\n\taddEventParent: function (obj) {\r\n\t\tthis._eventParents = this._eventParents || {};\r\n\t\tthis._eventParents[L.stamp(obj)] = obj;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method removeEventParent(obj: Evented): this\r\n\t// Removes an event parent, so it will stop receiving propagated events\r\n\tremoveEventParent: function (obj) {\r\n\t\tif (this._eventParents) {\r\n\t\t\tdelete this._eventParents[L.stamp(obj)];\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_propagateEvent: function (e) {\r\n\t\tfor (var id in this._eventParents) {\r\n\t\t\tthis._eventParents[id].fire(e.type, L.extend({layer: e.target}, e), true);\r\n\t\t}\r\n\t}\r\n});\r\n\r\nvar proto = L.Evented.prototype;\r\n\r\n// aliases; we should ditch those eventually\r\n\r\n// @method addEventListener(…): this\r\n// Alias to [`on(…)`](#evented-on)\r\nproto.addEventListener = proto.on;\r\n\r\n// @method removeEventListener(…): this\r\n// Alias to [`off(…)`](#evented-off)\r\n\r\n// @method clearAllEventListeners(…): this\r\n// Alias to [`off()`](#evented-off)\r\nproto.removeEventListener = proto.clearAllEventListeners = proto.off;\r\n\r\n// @method addOneTimeEventListener(…): this\r\n// Alias to [`once(…)`](#evented-once)\r\nproto.addOneTimeEventListener = proto.once;\r\n\r\n// @method fireEvent(…): this\r\n// Alias to [`fire(…)`](#evented-fire)\r\nproto.fireEvent = proto.fire;\r\n\r\n// @method hasEventListeners(…): Boolean\r\n// Alias to [`listens(…)`](#evented-listens)\r\nproto.hasEventListeners = proto.listens;\r\n\r\nL.Mixin = {Events: proto};\r\n\n\n\n/*\r\n * @namespace Browser\r\n * @aka L.Browser\r\n *\r\n * A namespace with static properties for browser/feature detection used by Leaflet internally.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * if (L.Browser.ielt9) {\r\n *   alert('Upgrade your browser, dude!');\r\n * }\r\n * ```\r\n */\r\n\r\n(function () {\r\n\r\n\tvar ua = navigator.userAgent.toLowerCase(),\r\n\t    doc = document.documentElement,\r\n\r\n\t    ie = 'ActiveXObject' in window,\r\n\r\n\t    webkit    = ua.indexOf('webkit') !== -1,\r\n\t    phantomjs = ua.indexOf('phantom') !== -1,\r\n\t    android23 = ua.search('android [23]') !== -1,\r\n\t    chrome    = ua.indexOf('chrome') !== -1,\r\n\t    gecko     = ua.indexOf('gecko') !== -1  && !webkit && !window.opera && !ie,\r\n\r\n\t    win = navigator.platform.indexOf('Win') === 0,\r\n\r\n\t    mobile = typeof orientation !== 'undefined' || ua.indexOf('mobile') !== -1,\r\n\t    msPointer = !window.PointerEvent && window.MSPointerEvent,\r\n\t    pointer = window.PointerEvent || msPointer,\r\n\r\n\t    ie3d = ie && ('transition' in doc.style),\r\n\t    webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23,\r\n\t    gecko3d = 'MozPerspective' in doc.style,\r\n\t    opera12 = 'OTransition' in doc.style;\r\n\r\n\r\n\tvar touch = !window.L_NO_TOUCH && (pointer || 'ontouchstart' in window ||\r\n\t\t\t(window.DocumentTouch && document instanceof window.DocumentTouch));\r\n\r\n\tL.Browser = {\r\n\r\n\t\t// @property ie: Boolean\r\n\t\t// `true` for all Internet Explorer versions (not Edge).\r\n\t\tie: ie,\r\n\r\n\t\t// @property ielt9: Boolean\r\n\t\t// `true` for Internet Explorer versions less than 9.\r\n\t\tielt9: ie && !document.addEventListener,\r\n\r\n\t\t// @property edge: Boolean\r\n\t\t// `true` for the Edge web browser.\r\n\t\tedge: 'msLaunchUri' in navigator && !('documentMode' in document),\r\n\r\n\t\t// @property webkit: Boolean\r\n\t\t// `true` for webkit-based browsers like Chrome and Safari (including mobile versions).\r\n\t\twebkit: webkit,\r\n\r\n\t\t// @property gecko: Boolean\r\n\t\t// `true` for gecko-based browsers like Firefox.\r\n\t\tgecko: gecko,\r\n\r\n\t\t// @property android: Boolean\r\n\t\t// `true` for any browser running on an Android platform.\r\n\t\tandroid: ua.indexOf('android') !== -1,\r\n\r\n\t\t// @property android23: Boolean\r\n\t\t// `true` for browsers running on Android 2 or Android 3.\r\n\t\tandroid23: android23,\r\n\r\n\t\t// @property chrome: Boolean\r\n\t\t// `true` for the Chrome browser.\r\n\t\tchrome: chrome,\r\n\r\n\t\t// @property safari: Boolean\r\n\t\t// `true` for the Safari browser.\r\n\t\tsafari: !chrome && ua.indexOf('safari') !== -1,\r\n\r\n\r\n\t\t// @property win: Boolean\r\n\t\t// `true` when the browser is running in a Windows platform\r\n\t\twin: win,\r\n\r\n\r\n\t\t// @property ie3d: Boolean\r\n\t\t// `true` for all Internet Explorer versions supporting CSS transforms.\r\n\t\tie3d: ie3d,\r\n\r\n\t\t// @property webkit3d: Boolean\r\n\t\t// `true` for webkit-based browsers supporting CSS transforms.\r\n\t\twebkit3d: webkit3d,\r\n\r\n\t\t// @property gecko3d: Boolean\r\n\t\t// `true` for gecko-based browsers supporting CSS transforms.\r\n\t\tgecko3d: gecko3d,\r\n\r\n\t\t// @property opera12: Boolean\r\n\t\t// `true` for the Opera browser supporting CSS transforms (version 12 or later).\r\n\t\topera12: opera12,\r\n\r\n\t\t// @property any3d: Boolean\r\n\t\t// `true` for all browsers supporting CSS transforms.\r\n\t\tany3d: !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d) && !opera12 && !phantomjs,\r\n\r\n\r\n\t\t// @property mobile: Boolean\r\n\t\t// `true` for all browsers running in a mobile device.\r\n\t\tmobile: mobile,\r\n\r\n\t\t// @property mobileWebkit: Boolean\r\n\t\t// `true` for all webkit-based browsers in a mobile device.\r\n\t\tmobileWebkit: mobile && webkit,\r\n\r\n\t\t// @property mobileWebkit3d: Boolean\r\n\t\t// `true` for all webkit-based browsers in a mobile device supporting CSS transforms.\r\n\t\tmobileWebkit3d: mobile && webkit3d,\r\n\r\n\t\t// @property mobileOpera: Boolean\r\n\t\t// `true` for the Opera browser in a mobile device.\r\n\t\tmobileOpera: mobile && window.opera,\r\n\r\n\t\t// @property mobileGecko: Boolean\r\n\t\t// `true` for gecko-based browsers running in a mobile device.\r\n\t\tmobileGecko: mobile && gecko,\r\n\r\n\r\n\t\t// @property touch: Boolean\r\n\t\t// `true` for all browsers supporting [touch events](https://developer.mozilla.org/docs/Web/API/Touch_events).\r\n\t\t// This does not necessarily mean that the browser is running in a computer with\r\n\t\t// a touchscreen, it only means that the browser is capable of understanding\r\n\t\t// touch events.\r\n\t\ttouch: !!touch,\r\n\r\n\t\t// @property msPointer: Boolean\r\n\t\t// `true` for browsers implementing the Microsoft touch events model (notably IE10).\r\n\t\tmsPointer: !!msPointer,\r\n\r\n\t\t// @property pointer: Boolean\r\n\t\t// `true` for all browsers supporting [pointer events](https://msdn.microsoft.com/en-us/library/dn433244%28v=vs.85%29.aspx).\r\n\t\tpointer: !!pointer,\r\n\r\n\r\n\t\t// @property retina: Boolean\r\n\t\t// `true` for browsers on a high-resolution \"retina\" screen.\r\n\t\tretina: (window.devicePixelRatio || (window.screen.deviceXDPI / window.screen.logicalXDPI)) > 1\r\n\t};\r\n\r\n}());\r\n\n\n\n/*\r\n * @class Point\r\n * @aka L.Point\r\n *\r\n * Represents a point with `x` and `y` coordinates in pixels.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var point = L.point(200, 300);\r\n * ```\r\n *\r\n * All Leaflet methods and options that accept `Point` objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:\r\n *\r\n * ```js\r\n * map.panBy([200, 300]);\r\n * map.panBy(L.point(200, 300));\r\n * ```\r\n */\r\n\r\nL.Point = function (x, y, round) {\r\n\t// @property x: Number; The `x` coordinate of the point\r\n\tthis.x = (round ? Math.round(x) : x);\r\n\t// @property y: Number; The `y` coordinate of the point\r\n\tthis.y = (round ? Math.round(y) : y);\r\n};\r\n\r\nL.Point.prototype = {\r\n\r\n\t// @method clone(): Point\r\n\t// Returns a copy of the current point.\r\n\tclone: function () {\r\n\t\treturn new L.Point(this.x, this.y);\r\n\t},\r\n\r\n\t// @method add(otherPoint: Point): Point\r\n\t// Returns the result of addition of the current and the given points.\r\n\tadd: function (point) {\r\n\t\t// non-destructive, returns a new point\r\n\t\treturn this.clone()._add(L.point(point));\r\n\t},\r\n\r\n\t_add: function (point) {\r\n\t\t// destructive, used directly for performance in situations where it's safe to modify existing point\r\n\t\tthis.x += point.x;\r\n\t\tthis.y += point.y;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method subtract(otherPoint: Point): Point\r\n\t// Returns the result of subtraction of the given point from the current.\r\n\tsubtract: function (point) {\r\n\t\treturn this.clone()._subtract(L.point(point));\r\n\t},\r\n\r\n\t_subtract: function (point) {\r\n\t\tthis.x -= point.x;\r\n\t\tthis.y -= point.y;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method divideBy(num: Number): Point\r\n\t// Returns the result of division of the current point by the given number.\r\n\tdivideBy: function (num) {\r\n\t\treturn this.clone()._divideBy(num);\r\n\t},\r\n\r\n\t_divideBy: function (num) {\r\n\t\tthis.x /= num;\r\n\t\tthis.y /= num;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method multiplyBy(num: Number): Point\r\n\t// Returns the result of multiplication of the current point by the given number.\r\n\tmultiplyBy: function (num) {\r\n\t\treturn this.clone()._multiplyBy(num);\r\n\t},\r\n\r\n\t_multiplyBy: function (num) {\r\n\t\tthis.x *= num;\r\n\t\tthis.y *= num;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method scaleBy(scale: Point): Point\r\n\t// Multiply each coordinate of the current point by each coordinate of\r\n\t// `scale`. In linear algebra terms, multiply the point by the\r\n\t// [scaling matrix](https://en.wikipedia.org/wiki/Scaling_%28geometry%29#Matrix_representation)\r\n\t// defined by `scale`.\r\n\tscaleBy: function (point) {\r\n\t\treturn new L.Point(this.x * point.x, this.y * point.y);\r\n\t},\r\n\r\n\t// @method unscaleBy(scale: Point): Point\r\n\t// Inverse of `scaleBy`. Divide each coordinate of the current point by\r\n\t// each coordinate of `scale`.\r\n\tunscaleBy: function (point) {\r\n\t\treturn new L.Point(this.x / point.x, this.y / point.y);\r\n\t},\r\n\r\n\t// @method round(): Point\r\n\t// Returns a copy of the current point with rounded coordinates.\r\n\tround: function () {\r\n\t\treturn this.clone()._round();\r\n\t},\r\n\r\n\t_round: function () {\r\n\t\tthis.x = Math.round(this.x);\r\n\t\tthis.y = Math.round(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method floor(): Point\r\n\t// Returns a copy of the current point with floored coordinates (rounded down).\r\n\tfloor: function () {\r\n\t\treturn this.clone()._floor();\r\n\t},\r\n\r\n\t_floor: function () {\r\n\t\tthis.x = Math.floor(this.x);\r\n\t\tthis.y = Math.floor(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method ceil(): Point\r\n\t// Returns a copy of the current point with ceiled coordinates (rounded up).\r\n\tceil: function () {\r\n\t\treturn this.clone()._ceil();\r\n\t},\r\n\r\n\t_ceil: function () {\r\n\t\tthis.x = Math.ceil(this.x);\r\n\t\tthis.y = Math.ceil(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method distanceTo(otherPoint: Point): Number\r\n\t// Returns the cartesian distance between the current and the given points.\r\n\tdistanceTo: function (point) {\r\n\t\tpoint = L.point(point);\r\n\r\n\t\tvar x = point.x - this.x,\r\n\t\t    y = point.y - this.y;\r\n\r\n\t\treturn Math.sqrt(x * x + y * y);\r\n\t},\r\n\r\n\t// @method equals(otherPoint: Point): Boolean\r\n\t// Returns `true` if the given point has the same coordinates.\r\n\tequals: function (point) {\r\n\t\tpoint = L.point(point);\r\n\r\n\t\treturn point.x === this.x &&\r\n\t\t       point.y === this.y;\r\n\t},\r\n\r\n\t// @method contains(otherPoint: Point): Boolean\r\n\t// Returns `true` if both coordinates of the given point are less than the corresponding current point coordinates (in absolute values).\r\n\tcontains: function (point) {\r\n\t\tpoint = L.point(point);\r\n\r\n\t\treturn Math.abs(point.x) <= Math.abs(this.x) &&\r\n\t\t       Math.abs(point.y) <= Math.abs(this.y);\r\n\t},\r\n\r\n\t// @method toString(): String\r\n\t// Returns a string representation of the point for debugging purposes.\r\n\ttoString: function () {\r\n\t\treturn 'Point(' +\r\n\t\t        L.Util.formatNum(this.x) + ', ' +\r\n\t\t        L.Util.formatNum(this.y) + ')';\r\n\t}\r\n};\r\n\r\n// @factory L.point(x: Number, y: Number, round?: Boolean)\r\n// Creates a Point object with the given `x` and `y` coordinates. If optional `round` is set to true, rounds the `x` and `y` values.\r\n\r\n// @alternative\r\n// @factory L.point(coords: Number[])\r\n// Expects an array of the form `[x, y]` instead.\r\n\r\n// @alternative\r\n// @factory L.point(coords: Object)\r\n// Expects a plain object of the form `{x: Number, y: Number}` instead.\r\nL.point = function (x, y, round) {\r\n\tif (x instanceof L.Point) {\r\n\t\treturn x;\r\n\t}\r\n\tif (L.Util.isArray(x)) {\r\n\t\treturn new L.Point(x[0], x[1]);\r\n\t}\r\n\tif (x === undefined || x === null) {\r\n\t\treturn x;\r\n\t}\r\n\tif (typeof x === 'object' && 'x' in x && 'y' in x) {\r\n\t\treturn new L.Point(x.x, x.y);\r\n\t}\r\n\treturn new L.Point(x, y, round);\r\n};\r\n\n\n\n/*\r\n * @class Bounds\r\n * @aka L.Bounds\r\n *\r\n * Represents a rectangular area in pixel coordinates.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var p1 = L.point(10, 10),\r\n * p2 = L.point(40, 60),\r\n * bounds = L.bounds(p1, p2);\r\n * ```\r\n *\r\n * All Leaflet methods that accept `Bounds` objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:\r\n *\r\n * ```js\r\n * otherBounds.intersects([[10, 10], [40, 60]]);\r\n * ```\r\n */\r\n\r\nL.Bounds = function (a, b) {\r\n\tif (!a) { return; }\r\n\r\n\tvar points = b ? [a, b] : a;\r\n\r\n\tfor (var i = 0, len = points.length; i < len; i++) {\r\n\t\tthis.extend(points[i]);\r\n\t}\r\n};\r\n\r\nL.Bounds.prototype = {\r\n\t// @method extend(point: Point): this\r\n\t// Extends the bounds to contain the given point.\r\n\textend: function (point) { // (Point)\r\n\t\tpoint = L.point(point);\r\n\r\n\t\t// @property min: Point\r\n\t\t// The top left corner of the rectangle.\r\n\t\t// @property max: Point\r\n\t\t// The bottom right corner of the rectangle.\r\n\t\tif (!this.min && !this.max) {\r\n\t\t\tthis.min = point.clone();\r\n\t\t\tthis.max = point.clone();\r\n\t\t} else {\r\n\t\t\tthis.min.x = Math.min(point.x, this.min.x);\r\n\t\t\tthis.max.x = Math.max(point.x, this.max.x);\r\n\t\t\tthis.min.y = Math.min(point.y, this.min.y);\r\n\t\t\tthis.max.y = Math.max(point.y, this.max.y);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getCenter(round?: Boolean): Point\r\n\t// Returns the center point of the bounds.\r\n\tgetCenter: function (round) {\r\n\t\treturn new L.Point(\r\n\t\t        (this.min.x + this.max.x) / 2,\r\n\t\t        (this.min.y + this.max.y) / 2, round);\r\n\t},\r\n\r\n\t// @method getBottomLeft(): Point\r\n\t// Returns the bottom-left point of the bounds.\r\n\tgetBottomLeft: function () {\r\n\t\treturn new L.Point(this.min.x, this.max.y);\r\n\t},\r\n\r\n\t// @method getTopRight(): Point\r\n\t// Returns the top-right point of the bounds.\r\n\tgetTopRight: function () { // -> Point\r\n\t\treturn new L.Point(this.max.x, this.min.y);\r\n\t},\r\n\r\n\t// @method getSize(): Point\r\n\t// Returns the size of the given bounds\r\n\tgetSize: function () {\r\n\t\treturn this.max.subtract(this.min);\r\n\t},\r\n\r\n\t// @method contains(otherBounds: Bounds): Boolean\r\n\t// Returns `true` if the rectangle contains the given one.\r\n\t// @alternative\r\n\t// @method contains(point: Point): Boolean\r\n\t// Returns `true` if the rectangle contains the given point.\r\n\tcontains: function (obj) {\r\n\t\tvar min, max;\r\n\r\n\t\tif (typeof obj[0] === 'number' || obj instanceof L.Point) {\r\n\t\t\tobj = L.point(obj);\r\n\t\t} else {\r\n\t\t\tobj = L.bounds(obj);\r\n\t\t}\r\n\r\n\t\tif (obj instanceof L.Bounds) {\r\n\t\t\tmin = obj.min;\r\n\t\t\tmax = obj.max;\r\n\t\t} else {\r\n\t\t\tmin = max = obj;\r\n\t\t}\r\n\r\n\t\treturn (min.x >= this.min.x) &&\r\n\t\t       (max.x <= this.max.x) &&\r\n\t\t       (min.y >= this.min.y) &&\r\n\t\t       (max.y <= this.max.y);\r\n\t},\r\n\r\n\t// @method intersects(otherBounds: Bounds): Boolean\r\n\t// Returns `true` if the rectangle intersects the given bounds. Two bounds\r\n\t// intersect if they have at least one point in common.\r\n\tintersects: function (bounds) { // (Bounds) -> Boolean\r\n\t\tbounds = L.bounds(bounds);\r\n\r\n\t\tvar min = this.min,\r\n\t\t    max = this.max,\r\n\t\t    min2 = bounds.min,\r\n\t\t    max2 = bounds.max,\r\n\t\t    xIntersects = (max2.x >= min.x) && (min2.x <= max.x),\r\n\t\t    yIntersects = (max2.y >= min.y) && (min2.y <= max.y);\r\n\r\n\t\treturn xIntersects && yIntersects;\r\n\t},\r\n\r\n\t// @method overlaps(otherBounds: Bounds): Boolean\r\n\t// Returns `true` if the rectangle overlaps the given bounds. Two bounds\r\n\t// overlap if their intersection is an area.\r\n\toverlaps: function (bounds) { // (Bounds) -> Boolean\r\n\t\tbounds = L.bounds(bounds);\r\n\r\n\t\tvar min = this.min,\r\n\t\t    max = this.max,\r\n\t\t    min2 = bounds.min,\r\n\t\t    max2 = bounds.max,\r\n\t\t    xOverlaps = (max2.x > min.x) && (min2.x < max.x),\r\n\t\t    yOverlaps = (max2.y > min.y) && (min2.y < max.y);\r\n\r\n\t\treturn xOverlaps && yOverlaps;\r\n\t},\r\n\r\n\tisValid: function () {\r\n\t\treturn !!(this.min && this.max);\r\n\t}\r\n};\r\n\r\n\r\n// @factory L.bounds(topLeft: Point, bottomRight: Point)\r\n// Creates a Bounds object from two coordinates (usually top-left and bottom-right corners).\r\n// @alternative\r\n// @factory L.bounds(points: Point[])\r\n// Creates a Bounds object from the points it contains\r\nL.bounds = function (a, b) {\r\n\tif (!a || a instanceof L.Bounds) {\r\n\t\treturn a;\r\n\t}\r\n\treturn new L.Bounds(a, b);\r\n};\r\n\n\n\n/*\r\n * @class Transformation\r\n * @aka L.Transformation\r\n *\r\n * Represents an affine transformation: a set of coefficients `a`, `b`, `c`, `d`\r\n * for transforming a point of a form `(x, y)` into `(a*x + b, c*y + d)` and doing\r\n * the reverse. Used by Leaflet in its projections code.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var transformation = new L.Transformation(2, 5, -1, 10),\r\n * \tp = L.point(1, 2),\r\n * \tp2 = transformation.transform(p), //  L.point(7, 8)\r\n * \tp3 = transformation.untransform(p2); //  L.point(1, 2)\r\n * ```\r\n */\r\n\r\n\r\n// factory new L.Transformation(a: Number, b: Number, c: Number, d: Number)\r\n// Creates a `Transformation` object with the given coefficients.\r\nL.Transformation = function (a, b, c, d) {\r\n\tthis._a = a;\r\n\tthis._b = b;\r\n\tthis._c = c;\r\n\tthis._d = d;\r\n};\r\n\r\nL.Transformation.prototype = {\r\n\t// @method transform(point: Point, scale?: Number): Point\r\n\t// Returns a transformed point, optionally multiplied by the given scale.\r\n\t// Only accepts actual `L.Point` instances, not arrays.\r\n\ttransform: function (point, scale) { // (Point, Number) -> Point\r\n\t\treturn this._transform(point.clone(), scale);\r\n\t},\r\n\r\n\t// destructive transform (faster)\r\n\t_transform: function (point, scale) {\r\n\t\tscale = scale || 1;\r\n\t\tpoint.x = scale * (this._a * point.x + this._b);\r\n\t\tpoint.y = scale * (this._c * point.y + this._d);\r\n\t\treturn point;\r\n\t},\r\n\r\n\t// @method untransform(point: Point, scale?: Number): Point\r\n\t// Returns the reverse transformation of the given point, optionally divided\r\n\t// by the given scale. Only accepts actual `L.Point` instances, not arrays.\r\n\tuntransform: function (point, scale) {\r\n\t\tscale = scale || 1;\r\n\t\treturn new L.Point(\r\n\t\t        (point.x / scale - this._b) / this._a,\r\n\t\t        (point.y / scale - this._d) / this._c);\r\n\t}\r\n};\r\n\n\n\n/*\r\n * @namespace DomUtil\r\n *\r\n * Utility functions to work with the [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model)\r\n * tree, used by Leaflet internally.\r\n *\r\n * Most functions expecting or returning a `HTMLElement` also work for\r\n * SVG elements. The only difference is that classes refer to CSS classes\r\n * in HTML and SVG classes in SVG.\r\n */\r\n\r\nL.DomUtil = {\r\n\r\n\t// @function get(id: String|HTMLElement): HTMLElement\r\n\t// Returns an element given its DOM id, or returns the element itself\r\n\t// if it was passed directly.\r\n\tget: function (id) {\r\n\t\treturn typeof id === 'string' ? document.getElementById(id) : id;\r\n\t},\r\n\r\n\t// @function getStyle(el: HTMLElement, styleAttrib: String): String\r\n\t// Returns the value for a certain style attribute on an element,\r\n\t// including computed values or values set through CSS.\r\n\tgetStyle: function (el, style) {\r\n\r\n\t\tvar value = el.style[style] || (el.currentStyle && el.currentStyle[style]);\r\n\r\n\t\tif ((!value || value === 'auto') && document.defaultView) {\r\n\t\t\tvar css = document.defaultView.getComputedStyle(el, null);\r\n\t\t\tvalue = css ? css[style] : null;\r\n\t\t}\r\n\r\n\t\treturn value === 'auto' ? null : value;\r\n\t},\r\n\r\n\t// @function create(tagName: String, className?: String, container?: HTMLElement): HTMLElement\r\n\t// Creates an HTML element with `tagName`, sets its class to `className`, and optionally appends it to `container` element.\r\n\tcreate: function (tagName, className, container) {\r\n\r\n\t\tvar el = document.createElement(tagName);\r\n\t\tel.className = className || '';\r\n\r\n\t\tif (container) {\r\n\t\t\tcontainer.appendChild(el);\r\n\t\t}\r\n\r\n\t\treturn el;\r\n\t},\r\n\r\n\t// @function remove(el: HTMLElement)\r\n\t// Removes `el` from its parent element\r\n\tremove: function (el) {\r\n\t\tvar parent = el.parentNode;\r\n\t\tif (parent) {\r\n\t\t\tparent.removeChild(el);\r\n\t\t}\r\n\t},\r\n\r\n\t// @function empty(el: HTMLElement)\r\n\t// Removes all of `el`'s children elements from `el`\r\n\tempty: function (el) {\r\n\t\twhile (el.firstChild) {\r\n\t\t\tel.removeChild(el.firstChild);\r\n\t\t}\r\n\t},\r\n\r\n\t// @function toFront(el: HTMLElement)\r\n\t// Makes `el` the last children of its parent, so it renders in front of the other children.\r\n\ttoFront: function (el) {\r\n\t\tel.parentNode.appendChild(el);\r\n\t},\r\n\r\n\t// @function toBack(el: HTMLElement)\r\n\t// Makes `el` the first children of its parent, so it renders back from the other children.\r\n\ttoBack: function (el) {\r\n\t\tvar parent = el.parentNode;\r\n\t\tparent.insertBefore(el, parent.firstChild);\r\n\t},\r\n\r\n\t// @function hasClass(el: HTMLElement, name: String): Boolean\r\n\t// Returns `true` if the element's class attribute contains `name`.\r\n\thasClass: function (el, name) {\r\n\t\tif (el.classList !== undefined) {\r\n\t\t\treturn el.classList.contains(name);\r\n\t\t}\r\n\t\tvar className = L.DomUtil.getClass(el);\r\n\t\treturn className.length > 0 && new RegExp('(^|\\\\s)' + name + '(\\\\s|$)').test(className);\r\n\t},\r\n\r\n\t// @function addClass(el: HTMLElement, name: String)\r\n\t// Adds `name` to the element's class attribute.\r\n\taddClass: function (el, name) {\r\n\t\tif (el.classList !== undefined) {\r\n\t\t\tvar classes = L.Util.splitWords(name);\r\n\t\t\tfor (var i = 0, len = classes.length; i < len; i++) {\r\n\t\t\t\tel.classList.add(classes[i]);\r\n\t\t\t}\r\n\t\t} else if (!L.DomUtil.hasClass(el, name)) {\r\n\t\t\tvar className = L.DomUtil.getClass(el);\r\n\t\t\tL.DomUtil.setClass(el, (className ? className + ' ' : '') + name);\r\n\t\t}\r\n\t},\r\n\r\n\t// @function removeClass(el: HTMLElement, name: String)\r\n\t// Removes `name` from the element's class attribute.\r\n\tremoveClass: function (el, name) {\r\n\t\tif (el.classList !== undefined) {\r\n\t\t\tel.classList.remove(name);\r\n\t\t} else {\r\n\t\t\tL.DomUtil.setClass(el, L.Util.trim((' ' + L.DomUtil.getClass(el) + ' ').replace(' ' + name + ' ', ' ')));\r\n\t\t}\r\n\t},\r\n\r\n\t// @function setClass(el: HTMLElement, name: String)\r\n\t// Sets the element's class.\r\n\tsetClass: function (el, name) {\r\n\t\tif (el.className.baseVal === undefined) {\r\n\t\t\tel.className = name;\r\n\t\t} else {\r\n\t\t\t// in case of SVG element\r\n\t\t\tel.className.baseVal = name;\r\n\t\t}\r\n\t},\r\n\r\n\t// @function getClass(el: HTMLElement): String\r\n\t// Returns the element's class.\r\n\tgetClass: function (el) {\r\n\t\treturn el.className.baseVal === undefined ? el.className : el.className.baseVal;\r\n\t},\r\n\r\n\t// @function setOpacity(el: HTMLElement, opacity: Number)\r\n\t// Set the opacity of an element (including old IE support).\r\n\t// `opacity` must be a number from `0` to `1`.\r\n\tsetOpacity: function (el, value) {\r\n\r\n\t\tif ('opacity' in el.style) {\r\n\t\t\tel.style.opacity = value;\r\n\r\n\t\t} else if ('filter' in el.style) {\r\n\t\t\tL.DomUtil._setOpacityIE(el, value);\r\n\t\t}\r\n\t},\r\n\r\n\t_setOpacityIE: function (el, value) {\r\n\t\tvar filter = false,\r\n\t\t    filterName = 'DXImageTransform.Microsoft.Alpha';\r\n\r\n\t\t// filters collection throws an error if we try to retrieve a filter that doesn't exist\r\n\t\ttry {\r\n\t\t\tfilter = el.filters.item(filterName);\r\n\t\t} catch (e) {\r\n\t\t\t// don't set opacity to 1 if we haven't already set an opacity,\r\n\t\t\t// it isn't needed and breaks transparent pngs.\r\n\t\t\tif (value === 1) { return; }\r\n\t\t}\r\n\r\n\t\tvalue = Math.round(value * 100);\r\n\r\n\t\tif (filter) {\r\n\t\t\tfilter.Enabled = (value !== 100);\r\n\t\t\tfilter.Opacity = value;\r\n\t\t} else {\r\n\t\t\tel.style.filter += ' progid:' + filterName + '(opacity=' + value + ')';\r\n\t\t}\r\n\t},\r\n\r\n\t// @function testProp(props: String[]): String|false\r\n\t// Goes through the array of style names and returns the first name\r\n\t// that is a valid style name for an element. If no such name is found,\r\n\t// it returns false. Useful for vendor-prefixed styles like `transform`.\r\n\ttestProp: function (props) {\r\n\r\n\t\tvar style = document.documentElement.style;\r\n\r\n\t\tfor (var i = 0; i < props.length; i++) {\r\n\t\t\tif (props[i] in style) {\r\n\t\t\t\treturn props[i];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\t// @function setTransform(el: HTMLElement, offset: Point, scale?: Number)\r\n\t// Resets the 3D CSS transform of `el` so it is translated by `offset` pixels\r\n\t// and optionally scaled by `scale`. Does not have an effect if the\r\n\t// browser doesn't support 3D CSS transforms.\r\n\tsetTransform: function (el, offset, scale) {\r\n\t\tvar pos = offset || new L.Point(0, 0);\r\n\r\n\t\tel.style[L.DomUtil.TRANSFORM] =\r\n\t\t\t(L.Browser.ie3d ?\r\n\t\t\t\t'translate(' + pos.x + 'px,' + pos.y + 'px)' :\r\n\t\t\t\t'translate3d(' + pos.x + 'px,' + pos.y + 'px,0)') +\r\n\t\t\t(scale ? ' scale(' + scale + ')' : '');\r\n\t},\r\n\r\n\t// @function setPosition(el: HTMLElement, position: Point)\r\n\t// Sets the position of `el` to coordinates specified by `position`,\r\n\t// using CSS translate or top/left positioning depending on the browser\r\n\t// (used by Leaflet internally to position its layers).\r\n\tsetPosition: function (el, point) { // (HTMLElement, Point[, Boolean])\r\n\r\n\t\t/*eslint-disable */\r\n\t\tel._leaflet_pos = point;\r\n\t\t/*eslint-enable */\r\n\r\n\t\tif (L.Browser.any3d) {\r\n\t\t\tL.DomUtil.setTransform(el, point);\r\n\t\t} else {\r\n\t\t\tel.style.left = point.x + 'px';\r\n\t\t\tel.style.top = point.y + 'px';\r\n\t\t}\r\n\t},\r\n\r\n\t// @function getPosition(el: HTMLElement): Point\r\n\t// Returns the coordinates of an element previously positioned with setPosition.\r\n\tgetPosition: function (el) {\r\n\t\t// this method is only used for elements previously positioned using setPosition,\r\n\t\t// so it's safe to cache the position for performance\r\n\r\n\t\treturn el._leaflet_pos || new L.Point(0, 0);\r\n\t}\r\n};\r\n\r\n\r\n(function () {\r\n\t// prefix style property names\r\n\r\n\t// @property TRANSFORM: String\r\n\t// Vendor-prefixed fransform style name (e.g. `'webkitTransform'` for WebKit).\r\n\tL.DomUtil.TRANSFORM = L.DomUtil.testProp(\r\n\t\t\t['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform']);\r\n\r\n\r\n\t// webkitTransition comes first because some browser versions that drop vendor prefix don't do\r\n\t// the same for the transitionend event, in particular the Android 4.1 stock browser\r\n\r\n\t// @property TRANSITION: String\r\n\t// Vendor-prefixed transform style name.\r\n\tvar transition = L.DomUtil.TRANSITION = L.DomUtil.testProp(\r\n\t\t\t['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']);\r\n\r\n\tL.DomUtil.TRANSITION_END =\r\n\t\t\ttransition === 'webkitTransition' || transition === 'OTransition' ? transition + 'End' : 'transitionend';\r\n\r\n\t// @function disableTextSelection()\r\n\t// Prevents the user from generating `selectstart` DOM events, usually generated\r\n\t// when the user drags the mouse through a page with text. Used internally\r\n\t// by Leaflet to override the behaviour of any click-and-drag interaction on\r\n\t// the map. Affects drag interactions on the whole document.\r\n\r\n\t// @function enableTextSelection()\r\n\t// Cancels the effects of a previous [`L.DomUtil.disableTextSelection`](#domutil-disabletextselection).\r\n\tif ('onselectstart' in document) {\r\n\t\tL.DomUtil.disableTextSelection = function () {\r\n\t\t\tL.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault);\r\n\t\t};\r\n\t\tL.DomUtil.enableTextSelection = function () {\r\n\t\t\tL.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault);\r\n\t\t};\r\n\r\n\t} else {\r\n\t\tvar userSelectProperty = L.DomUtil.testProp(\r\n\t\t\t['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']);\r\n\r\n\t\tL.DomUtil.disableTextSelection = function () {\r\n\t\t\tif (userSelectProperty) {\r\n\t\t\t\tvar style = document.documentElement.style;\r\n\t\t\t\tthis._userSelect = style[userSelectProperty];\r\n\t\t\t\tstyle[userSelectProperty] = 'none';\r\n\t\t\t}\r\n\t\t};\r\n\t\tL.DomUtil.enableTextSelection = function () {\r\n\t\t\tif (userSelectProperty) {\r\n\t\t\t\tdocument.documentElement.style[userSelectProperty] = this._userSelect;\r\n\t\t\t\tdelete this._userSelect;\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\r\n\t// @function disableImageDrag()\r\n\t// As [`L.DomUtil.disableTextSelection`](#domutil-disabletextselection), but\r\n\t// for `dragstart` DOM events, usually generated when the user drags an image.\r\n\tL.DomUtil.disableImageDrag = function () {\r\n\t\tL.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault);\r\n\t};\r\n\r\n\t// @function enableImageDrag()\r\n\t// Cancels the effects of a previous [`L.DomUtil.disableImageDrag`](#domutil-disabletextselection).\r\n\tL.DomUtil.enableImageDrag = function () {\r\n\t\tL.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault);\r\n\t};\r\n\r\n\t// @function preventOutline(el: HTMLElement)\r\n\t// Makes the [outline](https://developer.mozilla.org/docs/Web/CSS/outline)\r\n\t// of the element `el` invisible. Used internally by Leaflet to prevent\r\n\t// focusable elements from displaying an outline when the user performs a\r\n\t// drag interaction on them.\r\n\tL.DomUtil.preventOutline = function (element) {\r\n\t\twhile (element.tabIndex === -1) {\r\n\t\t\telement = element.parentNode;\r\n\t\t}\r\n\t\tif (!element || !element.style) { return; }\r\n\t\tL.DomUtil.restoreOutline();\r\n\t\tthis._outlineElement = element;\r\n\t\tthis._outlineStyle = element.style.outline;\r\n\t\telement.style.outline = 'none';\r\n\t\tL.DomEvent.on(window, 'keydown', L.DomUtil.restoreOutline, this);\r\n\t};\r\n\r\n\t// @function restoreOutline()\r\n\t// Cancels the effects of a previous [`L.DomUtil.preventOutline`]().\r\n\tL.DomUtil.restoreOutline = function () {\r\n\t\tif (!this._outlineElement) { return; }\r\n\t\tthis._outlineElement.style.outline = this._outlineStyle;\r\n\t\tdelete this._outlineElement;\r\n\t\tdelete this._outlineStyle;\r\n\t\tL.DomEvent.off(window, 'keydown', L.DomUtil.restoreOutline, this);\r\n\t};\r\n})();\r\n\n\n\n/* @class LatLng\r\n * @aka L.LatLng\r\n *\r\n * Represents a geographical point with a certain latitude and longitude.\r\n *\r\n * @example\r\n *\r\n * ```\r\n * var latlng = L.latLng(50.5, 30.5);\r\n * ```\r\n *\r\n * All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent:\r\n *\r\n * ```\r\n * map.panTo([50, 30]);\r\n * map.panTo({lon: 30, lat: 50});\r\n * map.panTo({lat: 50, lng: 30});\r\n * map.panTo(L.latLng(50, 30));\r\n * ```\r\n */\r\n\r\nL.LatLng = function (lat, lng, alt) {\r\n\tif (isNaN(lat) || isNaN(lng)) {\r\n\t\tthrow new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')');\r\n\t}\r\n\r\n\t// @property lat: Number\r\n\t// Latitude in degrees\r\n\tthis.lat = +lat;\r\n\r\n\t// @property lng: Number\r\n\t// Longitude in degrees\r\n\tthis.lng = +lng;\r\n\r\n\t// @property alt: Number\r\n\t// Altitude in meters (optional)\r\n\tif (alt !== undefined) {\r\n\t\tthis.alt = +alt;\r\n\t}\r\n};\r\n\r\nL.LatLng.prototype = {\r\n\t// @method equals(otherLatLng: LatLng, maxMargin?: Number): Boolean\r\n\t// Returns `true` if the given `LatLng` point is at the same position (within a small margin of error). The margin of error can be overriden by setting `maxMargin` to a small number.\r\n\tequals: function (obj, maxMargin) {\r\n\t\tif (!obj) { return false; }\r\n\r\n\t\tobj = L.latLng(obj);\r\n\r\n\t\tvar margin = Math.max(\r\n\t\t        Math.abs(this.lat - obj.lat),\r\n\t\t        Math.abs(this.lng - obj.lng));\r\n\r\n\t\treturn margin <= (maxMargin === undefined ? 1.0E-9 : maxMargin);\r\n\t},\r\n\r\n\t// @method toString(): String\r\n\t// Returns a string representation of the point (for debugging purposes).\r\n\ttoString: function (precision) {\r\n\t\treturn 'LatLng(' +\r\n\t\t        L.Util.formatNum(this.lat, precision) + ', ' +\r\n\t\t        L.Util.formatNum(this.lng, precision) + ')';\r\n\t},\r\n\r\n\t// @method distanceTo(otherLatLng: LatLng): Number\r\n\t// Returns the distance (in meters) to the given `LatLng` calculated using the [Haversine formula](http://en.wikipedia.org/wiki/Haversine_formula).\r\n\tdistanceTo: function (other) {\r\n\t\treturn L.CRS.Earth.distance(this, L.latLng(other));\r\n\t},\r\n\r\n\t// @method wrap(): LatLng\r\n\t// Returns a new `LatLng` object with the longitude wrapped so it's always between -180 and +180 degrees.\r\n\twrap: function () {\r\n\t\treturn L.CRS.Earth.wrapLatLng(this);\r\n\t},\r\n\r\n\t// @method toBounds(sizeInMeters: Number): LatLngBounds\r\n\t// Returns a new `LatLngBounds` object in which each boundary is `sizeInMeters/2` meters apart from the `LatLng`.\r\n\ttoBounds: function (sizeInMeters) {\r\n\t\tvar latAccuracy = 180 * sizeInMeters / 40075017,\r\n\t\t    lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat);\r\n\r\n\t\treturn L.latLngBounds(\r\n\t\t        [this.lat - latAccuracy, this.lng - lngAccuracy],\r\n\t\t        [this.lat + latAccuracy, this.lng + lngAccuracy]);\r\n\t},\r\n\r\n\tclone: function () {\r\n\t\treturn new L.LatLng(this.lat, this.lng, this.alt);\r\n\t}\r\n};\r\n\r\n\r\n\r\n// @factory L.latLng(latitude: Number, longitude: Number, altitude?: Number): LatLng\r\n// Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude).\r\n\r\n// @alternative\r\n// @factory L.latLng(coords: Array): LatLng\r\n// Expects an array of the form `[Number, Number]` or `[Number, Number, Number]` instead.\r\n\r\n// @alternative\r\n// @factory L.latLng(coords: Object): LatLng\r\n// Expects an plain object of the form `{lat: Number, lng: Number}` or `{lat: Number, lng: Number, alt: Number}` instead.\r\n\r\nL.latLng = function (a, b, c) {\r\n\tif (a instanceof L.LatLng) {\r\n\t\treturn a;\r\n\t}\r\n\tif (L.Util.isArray(a) && typeof a[0] !== 'object') {\r\n\t\tif (a.length === 3) {\r\n\t\t\treturn new L.LatLng(a[0], a[1], a[2]);\r\n\t\t}\r\n\t\tif (a.length === 2) {\r\n\t\t\treturn new L.LatLng(a[0], a[1]);\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\tif (a === undefined || a === null) {\r\n\t\treturn a;\r\n\t}\r\n\tif (typeof a === 'object' && 'lat' in a) {\r\n\t\treturn new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon, a.alt);\r\n\t}\r\n\tif (b === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\treturn new L.LatLng(a, b, c);\r\n};\r\n\n\n\n/*\r\n * @class LatLngBounds\r\n * @aka L.LatLngBounds\r\n *\r\n * Represents a rectangular geographical area on a map.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var corner1 = L.latLng(40.712, -74.227),\r\n * corner2 = L.latLng(40.774, -74.125),\r\n * bounds = L.latLngBounds(corner1, corner2);\r\n * ```\r\n *\r\n * All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:\r\n *\r\n * ```js\r\n * map.fitBounds([\r\n * \t[40.712, -74.227],\r\n * \t[40.774, -74.125]\r\n * ]);\r\n * ```\r\n *\r\n * Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners _outside_ the [-180, 180] degrees longitude range.\r\n */\r\n\r\nL.LatLngBounds = function (corner1, corner2) { // (LatLng, LatLng) or (LatLng[])\r\n\tif (!corner1) { return; }\r\n\r\n\tvar latlngs = corner2 ? [corner1, corner2] : corner1;\r\n\r\n\tfor (var i = 0, len = latlngs.length; i < len; i++) {\r\n\t\tthis.extend(latlngs[i]);\r\n\t}\r\n};\r\n\r\nL.LatLngBounds.prototype = {\r\n\r\n\t// @method extend(latlng: LatLng): this\r\n\t// Extend the bounds to contain the given point\r\n\r\n\t// @alternative\r\n\t// @method extend(otherBounds: LatLngBounds): this\r\n\t// Extend the bounds to contain the given bounds\r\n\textend: function (obj) {\r\n\t\tvar sw = this._southWest,\r\n\t\t    ne = this._northEast,\r\n\t\t    sw2, ne2;\r\n\r\n\t\tif (obj instanceof L.LatLng) {\r\n\t\t\tsw2 = obj;\r\n\t\t\tne2 = obj;\r\n\r\n\t\t} else if (obj instanceof L.LatLngBounds) {\r\n\t\t\tsw2 = obj._southWest;\r\n\t\t\tne2 = obj._northEast;\r\n\r\n\t\t\tif (!sw2 || !ne2) { return this; }\r\n\r\n\t\t} else {\r\n\t\t\treturn obj ? this.extend(L.latLng(obj) || L.latLngBounds(obj)) : this;\r\n\t\t}\r\n\r\n\t\tif (!sw && !ne) {\r\n\t\t\tthis._southWest = new L.LatLng(sw2.lat, sw2.lng);\r\n\t\t\tthis._northEast = new L.LatLng(ne2.lat, ne2.lng);\r\n\t\t} else {\r\n\t\t\tsw.lat = Math.min(sw2.lat, sw.lat);\r\n\t\t\tsw.lng = Math.min(sw2.lng, sw.lng);\r\n\t\t\tne.lat = Math.max(ne2.lat, ne.lat);\r\n\t\t\tne.lng = Math.max(ne2.lng, ne.lng);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method pad(bufferRatio: Number): LatLngBounds\r\n\t// Returns bigger bounds created by extending the current bounds by a given percentage in each direction.\r\n\tpad: function (bufferRatio) {\r\n\t\tvar sw = this._southWest,\r\n\t\t    ne = this._northEast,\r\n\t\t    heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio,\r\n\t\t    widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio;\r\n\r\n\t\treturn new L.LatLngBounds(\r\n\t\t        new L.LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer),\r\n\t\t        new L.LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer));\r\n\t},\r\n\r\n\t// @method getCenter(): LatLng\r\n\t// Returns the center point of the bounds.\r\n\tgetCenter: function () {\r\n\t\treturn new L.LatLng(\r\n\t\t        (this._southWest.lat + this._northEast.lat) / 2,\r\n\t\t        (this._southWest.lng + this._northEast.lng) / 2);\r\n\t},\r\n\r\n\t// @method getSouthWest(): LatLng\r\n\t// Returns the south-west point of the bounds.\r\n\tgetSouthWest: function () {\r\n\t\treturn this._southWest;\r\n\t},\r\n\r\n\t// @method getNorthEast(): LatLng\r\n\t// Returns the north-east point of the bounds.\r\n\tgetNorthEast: function () {\r\n\t\treturn this._northEast;\r\n\t},\r\n\r\n\t// @method getNorthWest(): LatLng\r\n\t// Returns the north-west point of the bounds.\r\n\tgetNorthWest: function () {\r\n\t\treturn new L.LatLng(this.getNorth(), this.getWest());\r\n\t},\r\n\r\n\t// @method getSouthEast(): LatLng\r\n\t// Returns the south-east point of the bounds.\r\n\tgetSouthEast: function () {\r\n\t\treturn new L.LatLng(this.getSouth(), this.getEast());\r\n\t},\r\n\r\n\t// @method getWest(): Number\r\n\t// Returns the west longitude of the bounds\r\n\tgetWest: function () {\r\n\t\treturn this._southWest.lng;\r\n\t},\r\n\r\n\t// @method getSouth(): Number\r\n\t// Returns the south latitude of the bounds\r\n\tgetSouth: function () {\r\n\t\treturn this._southWest.lat;\r\n\t},\r\n\r\n\t// @method getEast(): Number\r\n\t// Returns the east longitude of the bounds\r\n\tgetEast: function () {\r\n\t\treturn this._northEast.lng;\r\n\t},\r\n\r\n\t// @method getNorth(): Number\r\n\t// Returns the north latitude of the bounds\r\n\tgetNorth: function () {\r\n\t\treturn this._northEast.lat;\r\n\t},\r\n\r\n\t// @method contains(otherBounds: LatLngBounds): Boolean\r\n\t// Returns `true` if the rectangle contains the given one.\r\n\r\n\t// @alternative\r\n\t// @method contains (latlng: LatLng): Boolean\r\n\t// Returns `true` if the rectangle contains the given point.\r\n\tcontains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean\r\n\t\tif (typeof obj[0] === 'number' || obj instanceof L.LatLng || 'lat' in obj) {\r\n\t\t\tobj = L.latLng(obj);\r\n\t\t} else {\r\n\t\t\tobj = L.latLngBounds(obj);\r\n\t\t}\r\n\r\n\t\tvar sw = this._southWest,\r\n\t\t    ne = this._northEast,\r\n\t\t    sw2, ne2;\r\n\r\n\t\tif (obj instanceof L.LatLngBounds) {\r\n\t\t\tsw2 = obj.getSouthWest();\r\n\t\t\tne2 = obj.getNorthEast();\r\n\t\t} else {\r\n\t\t\tsw2 = ne2 = obj;\r\n\t\t}\r\n\r\n\t\treturn (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) &&\r\n\t\t       (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng);\r\n\t},\r\n\r\n\t// @method intersects(otherBounds: LatLngBounds): Boolean\r\n\t// Returns `true` if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common.\r\n\tintersects: function (bounds) {\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\tvar sw = this._southWest,\r\n\t\t    ne = this._northEast,\r\n\t\t    sw2 = bounds.getSouthWest(),\r\n\t\t    ne2 = bounds.getNorthEast(),\r\n\r\n\t\t    latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat),\r\n\t\t    lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng);\r\n\r\n\t\treturn latIntersects && lngIntersects;\r\n\t},\r\n\r\n\t// @method overlaps(otherBounds: Bounds): Boolean\r\n\t// Returns `true` if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area.\r\n\toverlaps: function (bounds) {\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\tvar sw = this._southWest,\r\n\t\t    ne = this._northEast,\r\n\t\t    sw2 = bounds.getSouthWest(),\r\n\t\t    ne2 = bounds.getNorthEast(),\r\n\r\n\t\t    latOverlaps = (ne2.lat > sw.lat) && (sw2.lat < ne.lat),\r\n\t\t    lngOverlaps = (ne2.lng > sw.lng) && (sw2.lng < ne.lng);\r\n\r\n\t\treturn latOverlaps && lngOverlaps;\r\n\t},\r\n\r\n\t// @method toBBoxString(): String\r\n\t// Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data.\r\n\ttoBBoxString: function () {\r\n\t\treturn [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(',');\r\n\t},\r\n\r\n\t// @method equals(otherBounds: LatLngBounds): Boolean\r\n\t// Returns `true` if the rectangle is equivalent (within a small margin of error) to the given bounds.\r\n\tequals: function (bounds) {\r\n\t\tif (!bounds) { return false; }\r\n\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\treturn this._southWest.equals(bounds.getSouthWest()) &&\r\n\t\t       this._northEast.equals(bounds.getNorthEast());\r\n\t},\r\n\r\n\t// @method isValid(): Boolean\r\n\t// Returns `true` if the bounds are properly initialized.\r\n\tisValid: function () {\r\n\t\treturn !!(this._southWest && this._northEast);\r\n\t}\r\n};\r\n\r\n// TODO International date line?\r\n\r\n// @factory L.latLngBounds(corner1: LatLng, corner2: LatLng)\r\n// Creates a `LatLngBounds` object by defining two diagonally opposite corners of the rectangle.\r\n\r\n// @alternative\r\n// @factory L.latLngBounds(latlngs: LatLng[])\r\n// Creates a `LatLngBounds` object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with [`fitBounds`](#map-fitbounds).\r\nL.latLngBounds = function (a, b) {\r\n\tif (a instanceof L.LatLngBounds) {\r\n\t\treturn a;\r\n\t}\r\n\treturn new L.LatLngBounds(a, b);\r\n};\r\n\n\n\n/*\r\n * @namespace Projection\r\n * @section\r\n * Leaflet comes with a set of already defined Projections out of the box:\r\n *\r\n * @projection L.Projection.LonLat\r\n *\r\n * Equirectangular, or Plate Carree projection — the most simple projection,\r\n * mostly used by GIS enthusiasts. Directly maps `x` as longitude, and `y` as\r\n * latitude. Also suitable for flat worlds, e.g. game maps. Used by the\r\n * `EPSG:3395` and `Simple` CRS.\r\n */\r\n\r\nL.Projection = {};\r\n\r\nL.Projection.LonLat = {\r\n\tproject: function (latlng) {\r\n\t\treturn new L.Point(latlng.lng, latlng.lat);\r\n\t},\r\n\r\n\tunproject: function (point) {\r\n\t\treturn new L.LatLng(point.y, point.x);\r\n\t},\r\n\r\n\tbounds: L.bounds([-180, -90], [180, 90])\r\n};\r\n\n\n\n/*\r\n * @namespace Projection\r\n * @projection L.Projection.SphericalMercator\r\n *\r\n * Spherical Mercator projection — the most common projection for online maps,\r\n * used by almost all free and commercial tile providers. Assumes that Earth is\r\n * a sphere. Used by the `EPSG:3857` CRS.\r\n */\r\n\r\nL.Projection.SphericalMercator = {\r\n\r\n\tR: 6378137,\r\n\tMAX_LATITUDE: 85.0511287798,\r\n\r\n\tproject: function (latlng) {\r\n\t\tvar d = Math.PI / 180,\r\n\t\t    max = this.MAX_LATITUDE,\r\n\t\t    lat = Math.max(Math.min(max, latlng.lat), -max),\r\n\t\t    sin = Math.sin(lat * d);\r\n\r\n\t\treturn new L.Point(\r\n\t\t\t\tthis.R * latlng.lng * d,\r\n\t\t\t\tthis.R * Math.log((1 + sin) / (1 - sin)) / 2);\r\n\t},\r\n\r\n\tunproject: function (point) {\r\n\t\tvar d = 180 / Math.PI;\r\n\r\n\t\treturn new L.LatLng(\r\n\t\t\t(2 * Math.atan(Math.exp(point.y / this.R)) - (Math.PI / 2)) * d,\r\n\t\t\tpoint.x * d / this.R);\r\n\t},\r\n\r\n\tbounds: (function () {\r\n\t\tvar d = 6378137 * Math.PI;\r\n\t\treturn L.bounds([-d, -d], [d, d]);\r\n\t})()\r\n};\r\n\n\n\n/*\r\n * @class CRS\r\n * @aka L.CRS\r\n * Abstract class that defines coordinate reference systems for projecting\r\n * geographical points into pixel (screen) coordinates and back (and to\r\n * coordinates in other units for [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services). See\r\n * [spatial reference system](http://en.wikipedia.org/wiki/Coordinate_reference_system).\r\n *\r\n * Leaflet defines the most usual CRSs by default. If you want to use a\r\n * CRS not defined by default, take a look at the\r\n * [Proj4Leaflet](https://github.com/kartena/Proj4Leaflet) plugin.\r\n */\r\n\r\nL.CRS = {\r\n\t// @method latLngToPoint(latlng: LatLng, zoom: Number): Point\r\n\t// Projects geographical coordinates into pixel coordinates for a given zoom.\r\n\tlatLngToPoint: function (latlng, zoom) {\r\n\t\tvar projectedPoint = this.projection.project(latlng),\r\n\t\t    scale = this.scale(zoom);\r\n\r\n\t\treturn this.transformation._transform(projectedPoint, scale);\r\n\t},\r\n\r\n\t// @method pointToLatLng(point: Point, zoom: Number): LatLng\r\n\t// The inverse of `latLngToPoint`. Projects pixel coordinates on a given\r\n\t// zoom into geographical coordinates.\r\n\tpointToLatLng: function (point, zoom) {\r\n\t\tvar scale = this.scale(zoom),\r\n\t\t    untransformedPoint = this.transformation.untransform(point, scale);\r\n\r\n\t\treturn this.projection.unproject(untransformedPoint);\r\n\t},\r\n\r\n\t// @method project(latlng: LatLng): Point\r\n\t// Projects geographical coordinates into coordinates in units accepted for\r\n\t// this CRS (e.g. meters for EPSG:3857, for passing it to WMS services).\r\n\tproject: function (latlng) {\r\n\t\treturn this.projection.project(latlng);\r\n\t},\r\n\r\n\t// @method unproject(point: Point): LatLng\r\n\t// Given a projected coordinate returns the corresponding LatLng.\r\n\t// The inverse of `project`.\r\n\tunproject: function (point) {\r\n\t\treturn this.projection.unproject(point);\r\n\t},\r\n\r\n\t// @method scale(zoom: Number): Number\r\n\t// Returns the scale used when transforming projected coordinates into\r\n\t// pixel coordinates for a particular zoom. For example, it returns\r\n\t// `256 * 2^zoom` for Mercator-based CRS.\r\n\tscale: function (zoom) {\r\n\t\treturn 256 * Math.pow(2, zoom);\r\n\t},\r\n\r\n\t// @method zoom(scale: Number): Number\r\n\t// Inverse of `scale()`, returns the zoom level corresponding to a scale\r\n\t// factor of `scale`.\r\n\tzoom: function (scale) {\r\n\t\treturn Math.log(scale / 256) / Math.LN2;\r\n\t},\r\n\r\n\t// @method getProjectedBounds(zoom: Number): Bounds\r\n\t// Returns the projection's bounds scaled and transformed for the provided `zoom`.\r\n\tgetProjectedBounds: function (zoom) {\r\n\t\tif (this.infinite) { return null; }\r\n\r\n\t\tvar b = this.projection.bounds,\r\n\t\t    s = this.scale(zoom),\r\n\t\t    min = this.transformation.transform(b.min, s),\r\n\t\t    max = this.transformation.transform(b.max, s);\r\n\r\n\t\treturn L.bounds(min, max);\r\n\t},\r\n\r\n\t// @method distance(latlng1: LatLng, latlng2: LatLng): Number\r\n\t// Returns the distance between two geographical coordinates.\r\n\r\n\t// @property code: String\r\n\t// Standard code name of the CRS passed into WMS services (e.g. `'EPSG:3857'`)\r\n\t//\r\n\t// @property wrapLng: Number[]\r\n\t// An array of two numbers defining whether the longitude (horizontal) coordinate\r\n\t// axis wraps around a given range and how. Defaults to `[-180, 180]` in most\r\n\t// geographical CRSs. If `undefined`, the longitude axis does not wrap around.\r\n\t//\r\n\t// @property wrapLat: Number[]\r\n\t// Like `wrapLng`, but for the latitude (vertical) axis.\r\n\r\n\t// wrapLng: [min, max],\r\n\t// wrapLat: [min, max],\r\n\r\n\t// @property infinite: Boolean\r\n\t// If true, the coordinate space will be unbounded (infinite in both axes)\r\n\tinfinite: false,\r\n\r\n\t// @method wrapLatLng(latlng: LatLng): LatLng\r\n\t// Returns a `LatLng` where lat and lng has been wrapped according to the\r\n\t// CRS's `wrapLat` and `wrapLng` properties, if they are outside the CRS's bounds.\r\n\t// Only accepts actual `L.LatLng` instances, not arrays.\r\n\twrapLatLng: function (latlng) {\r\n\t\tvar lng = this.wrapLng ? L.Util.wrapNum(latlng.lng, this.wrapLng, true) : latlng.lng,\r\n\t\t    lat = this.wrapLat ? L.Util.wrapNum(latlng.lat, this.wrapLat, true) : latlng.lat,\r\n\t\t    alt = latlng.alt;\r\n\r\n\t\treturn L.latLng(lat, lng, alt);\r\n\t},\r\n\r\n\t// @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds\r\n\t// Returns a `LatLngBounds` with the same size as the given one, ensuring\r\n\t// that its center is within the CRS's bounds.\r\n\t// Only accepts actual `L.LatLngBounds` instances, not arrays.\r\n\twrapLatLngBounds: function (bounds) {\r\n\t\tvar center = bounds.getCenter(),\r\n\t\t    newCenter = this.wrapLatLng(center),\r\n\t\t    latShift = center.lat - newCenter.lat,\r\n\t\t    lngShift = center.lng - newCenter.lng;\r\n\r\n\t\tif (latShift === 0 && lngShift === 0) {\r\n\t\t\treturn bounds;\r\n\t\t}\r\n\r\n\t\tvar sw = bounds.getSouthWest(),\r\n\t\t    ne = bounds.getNorthEast(),\r\n\t\t    newSw = L.latLng({lat: sw.lat - latShift, lng: sw.lng - lngShift}),\r\n\t\t    newNe = L.latLng({lat: ne.lat - latShift, lng: ne.lng - lngShift});\r\n\r\n\t\treturn new L.LatLngBounds(newSw, newNe);\r\n\t}\r\n};\r\n\n\n\n/*\n * @namespace CRS\n * @crs L.CRS.Simple\n *\n * A simple CRS that maps longitude and latitude into `x` and `y` directly.\n * May be used for maps of flat surfaces (e.g. game maps). Note that the `y`\n * axis should still be inverted (going from bottom to top). `distance()` returns\n * simple euclidean distance.\n */\n\nL.CRS.Simple = L.extend({}, L.CRS, {\n\tprojection: L.Projection.LonLat,\n\ttransformation: new L.Transformation(1, 0, -1, 0),\n\n\tscale: function (zoom) {\n\t\treturn Math.pow(2, zoom);\n\t},\n\n\tzoom: function (scale) {\n\t\treturn Math.log(scale) / Math.LN2;\n\t},\n\n\tdistance: function (latlng1, latlng2) {\n\t\tvar dx = latlng2.lng - latlng1.lng,\n\t\t    dy = latlng2.lat - latlng1.lat;\n\n\t\treturn Math.sqrt(dx * dx + dy * dy);\n\t},\n\n\tinfinite: true\n});\n\n\n\n/*\n * @namespace CRS\n * @crs L.CRS.Earth\n *\n * Serves as the base for CRS that are global such that they cover the earth.\n * Can only be used as the base for other CRS and cannot be used directly,\n * since it does not have a `code`, `projection` or `transformation`. `distance()` returns\n * meters.\n */\n\nL.CRS.Earth = L.extend({}, L.CRS, {\n\twrapLng: [-180, 180],\n\n\t// Mean Earth Radius, as recommended for use by\n\t// the International Union of Geodesy and Geophysics,\n\t// see http://rosettacode.org/wiki/Haversine_formula\n\tR: 6371000,\n\n\t// distance between two geographical points using spherical law of cosines approximation\n\tdistance: function (latlng1, latlng2) {\n\t\tvar rad = Math.PI / 180,\n\t\t    lat1 = latlng1.lat * rad,\n\t\t    lat2 = latlng2.lat * rad,\n\t\t    a = Math.sin(lat1) * Math.sin(lat2) +\n\t\t        Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlng2.lng - latlng1.lng) * rad);\n\n\t\treturn this.R * Math.acos(Math.min(a, 1));\n\t}\n});\n\n\n\n/*\r\n * @namespace CRS\r\n * @crs L.CRS.EPSG3857\r\n *\r\n * The most common CRS for online maps, used by almost all free and commercial\r\n * tile providers. Uses Spherical Mercator projection. Set in by default in\r\n * Map's `crs` option.\r\n */\r\n\r\nL.CRS.EPSG3857 = L.extend({}, L.CRS.Earth, {\r\n\tcode: 'EPSG:3857',\r\n\tprojection: L.Projection.SphericalMercator,\r\n\r\n\ttransformation: (function () {\r\n\t\tvar scale = 0.5 / (Math.PI * L.Projection.SphericalMercator.R);\r\n\t\treturn new L.Transformation(scale, 0.5, -scale, 0.5);\r\n\t}())\r\n});\r\n\r\nL.CRS.EPSG900913 = L.extend({}, L.CRS.EPSG3857, {\r\n\tcode: 'EPSG:900913'\r\n});\r\n\n\n\n/*\r\n * @namespace CRS\r\n * @crs L.CRS.EPSG4326\r\n *\r\n * A common CRS among GIS enthusiasts. Uses simple Equirectangular projection.\r\n *\r\n * Leaflet 1.0.x complies with the [TMS coordinate scheme for EPSG:4326](https://wiki.osgeo.org/wiki/Tile_Map_Service_Specification#global-geodetic),\r\n * which is a breaking change from 0.7.x behaviour.  If you are using a `TileLayer`\r\n * with this CRS, ensure that there are two 256x256 pixel tiles covering the\r\n * whole earth at zoom level zero, and that the tile coordinate origin is (-180,+90),\r\n * or (-180,-90) for `TileLayer`s with [the `tms` option](#tilelayer-tms) set.\r\n */\r\n\r\nL.CRS.EPSG4326 = L.extend({}, L.CRS.Earth, {\r\n\tcode: 'EPSG:4326',\r\n\tprojection: L.Projection.LonLat,\r\n\ttransformation: new L.Transformation(1 / 180, 1, -1 / 180, 0.5)\r\n});\r\n\n\n\n/*\r\n * @class Map\r\n * @aka L.Map\r\n * @inherits Evented\r\n *\r\n * The central class of the API — it is used to create a map on a page and manipulate it.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * // initialize the map on the \"map\" div with a given center and zoom\r\n * var map = L.map('map', {\r\n * \tcenter: [51.505, -0.09],\r\n * \tzoom: 13\r\n * });\r\n * ```\r\n *\r\n */\r\n\r\nL.Map = L.Evented.extend({\r\n\r\n\toptions: {\r\n\t\t// @section Map State Options\r\n\t\t// @option crs: CRS = L.CRS.EPSG3857\r\n\t\t// The [Coordinate Reference System](#crs) to use. Don't change this if you're not\r\n\t\t// sure what it means.\r\n\t\tcrs: L.CRS.EPSG3857,\r\n\r\n\t\t// @option center: LatLng = undefined\r\n\t\t// Initial geographic center of the map\r\n\t\tcenter: undefined,\r\n\r\n\t\t// @option zoom: Number = undefined\r\n\t\t// Initial map zoom level\r\n\t\tzoom: undefined,\r\n\r\n\t\t// @option minZoom: Number = undefined\r\n\t\t// Minimum zoom level of the map. Overrides any `minZoom` option set on map layers.\r\n\t\tminZoom: undefined,\r\n\r\n\t\t// @option maxZoom: Number = undefined\r\n\t\t// Maximum zoom level of the map. Overrides any `maxZoom` option set on map layers.\r\n\t\tmaxZoom: undefined,\r\n\r\n\t\t// @option layers: Layer[] = []\r\n\t\t// Array of layers that will be added to the map initially\r\n\t\tlayers: [],\r\n\r\n\t\t// @option maxBounds: LatLngBounds = null\r\n\t\t// When this option is set, the map restricts the view to the given\r\n\t\t// geographical bounds, bouncing the user back if the user tries to pan\r\n\t\t// outside the view. To set the restriction dynamically, use\r\n\t\t// [`setMaxBounds`](#map-setmaxbounds) method.\r\n\t\tmaxBounds: undefined,\r\n\r\n\t\t// @option renderer: Renderer = *\r\n\t\t// The default method for drawing vector layers on the map. `L.SVG`\r\n\t\t// or `L.Canvas` by default depending on browser support.\r\n\t\trenderer: undefined,\r\n\r\n\r\n\t\t// @section Animation Options\r\n\t\t// @option zoomAnimation: Boolean = true\r\n\t\t// Whether the map zoom animation is enabled. By default it's enabled\r\n\t\t// in all browsers that support CSS3 Transitions except Android.\r\n\t\tzoomAnimation: true,\r\n\r\n\t\t// @option zoomAnimationThreshold: Number = 4\r\n\t\t// Won't animate zoom if the zoom difference exceeds this value.\r\n\t\tzoomAnimationThreshold: 4,\r\n\r\n\t\t// @option fadeAnimation: Boolean = true\r\n\t\t// Whether the tile fade animation is enabled. By default it's enabled\r\n\t\t// in all browsers that support CSS3 Transitions except Android.\r\n\t\tfadeAnimation: true,\r\n\r\n\t\t// @option markerZoomAnimation: Boolean = true\r\n\t\t// Whether markers animate their zoom with the zoom animation, if disabled\r\n\t\t// they will disappear for the length of the animation. By default it's\r\n\t\t// enabled in all browsers that support CSS3 Transitions except Android.\r\n\t\tmarkerZoomAnimation: true,\r\n\r\n\t\t// @option transform3DLimit: Number = 2^23\r\n\t\t// Defines the maximum size of a CSS translation transform. The default\r\n\t\t// value should not be changed unless a web browser positions layers in\r\n\t\t// the wrong place after doing a large `panBy`.\r\n\t\ttransform3DLimit: 8388608, // Precision limit of a 32-bit float\r\n\r\n\t\t// @section Interaction Options\r\n\t\t// @option zoomSnap: Number = 1\r\n\t\t// Forces the map's zoom level to always be a multiple of this, particularly\r\n\t\t// right after a [`fitBounds()`](#map-fitbounds) or a pinch-zoom.\r\n\t\t// By default, the zoom level snaps to the nearest integer; lower values\r\n\t\t// (e.g. `0.5` or `0.1`) allow for greater granularity. A value of `0`\r\n\t\t// means the zoom level will not be snapped after `fitBounds` or a pinch-zoom.\r\n\t\tzoomSnap: 1,\r\n\r\n\t\t// @option zoomDelta: Number = 1\r\n\t\t// Controls how much the map's zoom level will change after a\r\n\t\t// [`zoomIn()`](#map-zoomin), [`zoomOut()`](#map-zoomout), pressing `+`\r\n\t\t// or `-` on the keyboard, or using the [zoom controls](#control-zoom).\r\n\t\t// Values smaller than `1` (e.g. `0.5`) allow for greater granularity.\r\n\t\tzoomDelta: 1,\r\n\r\n\t\t// @option trackResize: Boolean = true\r\n\t\t// Whether the map automatically handles browser window resize to update itself.\r\n\t\ttrackResize: true\r\n\t},\r\n\r\n\tinitialize: function (id, options) { // (HTMLElement or String, Object)\r\n\t\toptions = L.setOptions(this, options);\r\n\r\n\t\tthis._initContainer(id);\r\n\t\tthis._initLayout();\r\n\r\n\t\t// hack for https://github.com/Leaflet/Leaflet/issues/1980\r\n\t\tthis._onResize = L.bind(this._onResize, this);\r\n\r\n\t\tthis._initEvents();\r\n\r\n\t\tif (options.maxBounds) {\r\n\t\t\tthis.setMaxBounds(options.maxBounds);\r\n\t\t}\r\n\r\n\t\tif (options.zoom !== undefined) {\r\n\t\t\tthis._zoom = this._limitZoom(options.zoom);\r\n\t\t}\r\n\r\n\t\tif (options.center && options.zoom !== undefined) {\r\n\t\t\tthis.setView(L.latLng(options.center), options.zoom, {reset: true});\r\n\t\t}\r\n\r\n\t\tthis._handlers = [];\r\n\t\tthis._layers = {};\r\n\t\tthis._zoomBoundLayers = {};\r\n\t\tthis._sizeChanged = true;\r\n\r\n\t\tthis.callInitHooks();\r\n\r\n\t\t// don't animate on browsers without hardware-accelerated transitions or old Android/Opera\r\n\t\tthis._zoomAnimated = L.DomUtil.TRANSITION && L.Browser.any3d && !L.Browser.mobileOpera &&\r\n\t\t\t\tthis.options.zoomAnimation;\r\n\r\n\t\t// zoom transitions run with the same duration for all layers, so if one of transitionend events\r\n\t\t// happens after starting zoom animation (propagating to the map pane), we know that it ended globally\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tthis._createAnimProxy();\r\n\t\t\tL.DomEvent.on(this._proxy, L.DomUtil.TRANSITION_END, this._catchTransitionEnd, this);\r\n\t\t}\r\n\r\n\t\tthis._addLayers(this.options.layers);\r\n\t},\r\n\r\n\r\n\t// @section Methods for modifying map state\r\n\r\n\t// @method setView(center: LatLng, zoom: Number, options?: Zoom/pan options): this\r\n\t// Sets the view of the map (geographical center and zoom) with the given\r\n\t// animation options.\r\n\tsetView: function (center, zoom, options) {\r\n\r\n\t\tzoom = zoom === undefined ? this._zoom : this._limitZoom(zoom);\r\n\t\tcenter = this._limitCenter(L.latLng(center), zoom, this.options.maxBounds);\r\n\t\toptions = options || {};\r\n\r\n\t\tthis._stop();\r\n\r\n\t\tif (this._loaded && !options.reset && options !== true) {\r\n\r\n\t\t\tif (options.animate !== undefined) {\r\n\t\t\t\toptions.zoom = L.extend({animate: options.animate}, options.zoom);\r\n\t\t\t\toptions.pan = L.extend({animate: options.animate, duration: options.duration}, options.pan);\r\n\t\t\t}\r\n\r\n\t\t\t// try animating pan or zoom\r\n\t\t\tvar moved = (this._zoom !== zoom) ?\r\n\t\t\t\tthis._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) :\r\n\t\t\t\tthis._tryAnimatedPan(center, options.pan);\r\n\r\n\t\t\tif (moved) {\r\n\t\t\t\t// prevent resize handler call, the view will refresh after animation anyway\r\n\t\t\t\tclearTimeout(this._sizeTimer);\r\n\t\t\t\treturn this;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// animation didn't start, just reset the map view\r\n\t\tthis._resetView(center, zoom);\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method setZoom(zoom: Number, options: Zoom/pan options): this\r\n\t// Sets the zoom of the map.\r\n\tsetZoom: function (zoom, options) {\r\n\t\tif (!this._loaded) {\r\n\t\t\tthis._zoom = zoom;\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\treturn this.setView(this.getCenter(), zoom, {zoom: options});\r\n\t},\r\n\r\n\t// @method zoomIn(delta?: Number, options?: Zoom options): this\r\n\t// Increases the zoom of the map by `delta` ([`zoomDelta`](#map-zoomdelta) by default).\r\n\tzoomIn: function (delta, options) {\r\n\t\tdelta = delta || (L.Browser.any3d ? this.options.zoomDelta : 1);\r\n\t\treturn this.setZoom(this._zoom + delta, options);\r\n\t},\r\n\r\n\t// @method zoomOut(delta?: Number, options?: Zoom options): this\r\n\t// Decreases the zoom of the map by `delta` ([`zoomDelta`](#map-zoomdelta) by default).\r\n\tzoomOut: function (delta, options) {\r\n\t\tdelta = delta || (L.Browser.any3d ? this.options.zoomDelta : 1);\r\n\t\treturn this.setZoom(this._zoom - delta, options);\r\n\t},\r\n\r\n\t// @method setZoomAround(latlng: LatLng, zoom: Number, options: Zoom options): this\r\n\t// Zooms the map while keeping a specified geographical point on the map\r\n\t// stationary (e.g. used internally for scroll zoom and double-click zoom).\r\n\t// @alternative\r\n\t// @method setZoomAround(offset: Point, zoom: Number, options: Zoom options): this\r\n\t// Zooms the map while keeping a specified pixel on the map (relative to the top-left corner) stationary.\r\n\tsetZoomAround: function (latlng, zoom, options) {\r\n\t\tvar scale = this.getZoomScale(zoom),\r\n\t\t    viewHalf = this.getSize().divideBy(2),\r\n\t\t    containerPoint = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng),\r\n\r\n\t\t    centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale),\r\n\t\t    newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset));\r\n\r\n\t\treturn this.setView(newCenter, zoom, {zoom: options});\r\n\t},\r\n\r\n\t_getBoundsCenterZoom: function (bounds, options) {\r\n\r\n\t\toptions = options || {};\r\n\t\tbounds = bounds.getBounds ? bounds.getBounds() : L.latLngBounds(bounds);\r\n\r\n\t\tvar paddingTL = L.point(options.paddingTopLeft || options.padding || [0, 0]),\r\n\t\t    paddingBR = L.point(options.paddingBottomRight || options.padding || [0, 0]),\r\n\r\n\t\t    zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR));\r\n\r\n\t\tzoom = (typeof options.maxZoom === 'number') ? Math.min(options.maxZoom, zoom) : zoom;\r\n\r\n\t\tvar paddingOffset = paddingBR.subtract(paddingTL).divideBy(2),\r\n\r\n\t\t    swPoint = this.project(bounds.getSouthWest(), zoom),\r\n\t\t    nePoint = this.project(bounds.getNorthEast(), zoom),\r\n\t\t    center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom);\r\n\r\n\t\treturn {\r\n\t\t\tcenter: center,\r\n\t\t\tzoom: zoom\r\n\t\t};\r\n\t},\r\n\r\n\t// @method fitBounds(bounds: LatLngBounds, options?: fitBounds options): this\r\n\t// Sets a map view that contains the given geographical bounds with the\r\n\t// maximum zoom level possible.\r\n\tfitBounds: function (bounds, options) {\r\n\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\tif (!bounds.isValid()) {\r\n\t\t\tthrow new Error('Bounds are not valid.');\r\n\t\t}\r\n\r\n\t\tvar target = this._getBoundsCenterZoom(bounds, options);\r\n\t\treturn this.setView(target.center, target.zoom, options);\r\n\t},\r\n\r\n\t// @method fitWorld(options?: fitBounds options): this\r\n\t// Sets a map view that mostly contains the whole world with the maximum\r\n\t// zoom level possible.\r\n\tfitWorld: function (options) {\r\n\t\treturn this.fitBounds([[-90, -180], [90, 180]], options);\r\n\t},\r\n\r\n\t// @method panTo(latlng: LatLng, options?: Pan options): this\r\n\t// Pans the map to a given center.\r\n\tpanTo: function (center, options) { // (LatLng)\r\n\t\treturn this.setView(center, this._zoom, {pan: options});\r\n\t},\r\n\r\n\t// @method panBy(offset: Point): this\r\n\t// Pans the map by a given number of pixels (animated).\r\n\tpanBy: function (offset, options) {\r\n\t\toffset = L.point(offset).round();\r\n\t\toptions = options || {};\r\n\r\n\t\tif (!offset.x && !offset.y) {\r\n\t\t\treturn this.fire('moveend');\r\n\t\t}\r\n\t\t// If we pan too far, Chrome gets issues with tiles\r\n\t\t// and makes them disappear or appear in the wrong place (slightly offset) #2602\r\n\t\tif (options.animate !== true && !this.getSize().contains(offset)) {\r\n\t\t\tthis._resetView(this.unproject(this.project(this.getCenter()).add(offset)), this.getZoom());\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif (!this._panAnim) {\r\n\t\t\tthis._panAnim = new L.PosAnimation();\r\n\r\n\t\t\tthis._panAnim.on({\r\n\t\t\t\t'step': this._onPanTransitionStep,\r\n\t\t\t\t'end': this._onPanTransitionEnd\r\n\t\t\t}, this);\r\n\t\t}\r\n\r\n\t\t// don't fire movestart if animating inertia\r\n\t\tif (!options.noMoveStart) {\r\n\t\t\tthis.fire('movestart');\r\n\t\t}\r\n\r\n\t\t// animate pan unless animate: false specified\r\n\t\tif (options.animate !== false) {\r\n\t\t\tL.DomUtil.addClass(this._mapPane, 'leaflet-pan-anim');\r\n\r\n\t\t\tvar newPos = this._getMapPanePos().subtract(offset).round();\r\n\t\t\tthis._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity);\r\n\t\t} else {\r\n\t\t\tthis._rawPanBy(offset);\r\n\t\t\tthis.fire('move').fire('moveend');\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method flyTo(latlng: LatLng, zoom?: Number, options?: Zoom/pan options): this\r\n\t// Sets the view of the map (geographical center and zoom) performing a smooth\r\n\t// pan-zoom animation.\r\n\tflyTo: function (targetCenter, targetZoom, options) {\r\n\r\n\t\toptions = options || {};\r\n\t\tif (options.animate === false || !L.Browser.any3d) {\r\n\t\t\treturn this.setView(targetCenter, targetZoom, options);\r\n\t\t}\r\n\r\n\t\tthis._stop();\r\n\r\n\t\tvar from = this.project(this.getCenter()),\r\n\t\t    to = this.project(targetCenter),\r\n\t\t    size = this.getSize(),\r\n\t\t    startZoom = this._zoom;\r\n\r\n\t\ttargetCenter = L.latLng(targetCenter);\r\n\t\ttargetZoom = targetZoom === undefined ? startZoom : targetZoom;\r\n\r\n\t\tvar w0 = Math.max(size.x, size.y),\r\n\t\t    w1 = w0 * this.getZoomScale(startZoom, targetZoom),\r\n\t\t    u1 = (to.distanceTo(from)) || 1,\r\n\t\t    rho = 1.42,\r\n\t\t    rho2 = rho * rho;\r\n\r\n\t\tfunction r(i) {\r\n\t\t\tvar s1 = i ? -1 : 1,\r\n\t\t\t    s2 = i ? w1 : w0,\r\n\t\t\t    t1 = w1 * w1 - w0 * w0 + s1 * rho2 * rho2 * u1 * u1,\r\n\t\t\t    b1 = 2 * s2 * rho2 * u1,\r\n\t\t\t    b = t1 / b1,\r\n\t\t\t    sq = Math.sqrt(b * b + 1) - b;\r\n\r\n\t\t\t    // workaround for floating point precision bug when sq = 0, log = -Infinite,\r\n\t\t\t    // thus triggering an infinite loop in flyTo\r\n\t\t\t    var log = sq < 0.000000001 ? -18 : Math.log(sq);\r\n\r\n\t\t\treturn log;\r\n\t\t}\r\n\r\n\t\tfunction sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; }\r\n\t\tfunction cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; }\r\n\t\tfunction tanh(n) { return sinh(n) / cosh(n); }\r\n\r\n\t\tvar r0 = r(0);\r\n\r\n\t\tfunction w(s) { return w0 * (cosh(r0) / cosh(r0 + rho * s)); }\r\n\t\tfunction u(s) { return w0 * (cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2; }\r\n\r\n\t\tfunction easeOut(t) { return 1 - Math.pow(1 - t, 1.5); }\r\n\r\n\t\tvar start = Date.now(),\r\n\t\t    S = (r(1) - r0) / rho,\r\n\t\t    duration = options.duration ? 1000 * options.duration : 1000 * S * 0.8;\r\n\r\n\t\tfunction frame() {\r\n\t\t\tvar t = (Date.now() - start) / duration,\r\n\t\t\t    s = easeOut(t) * S;\r\n\r\n\t\t\tif (t <= 1) {\r\n\t\t\t\tthis._flyToFrame = L.Util.requestAnimFrame(frame, this);\r\n\r\n\t\t\t\tthis._move(\r\n\t\t\t\t\tthis.unproject(from.add(to.subtract(from).multiplyBy(u(s) / u1)), startZoom),\r\n\t\t\t\t\tthis.getScaleZoom(w0 / w(s), startZoom),\r\n\t\t\t\t\t{flyTo: true});\r\n\r\n\t\t\t} else {\r\n\t\t\t\tthis\r\n\t\t\t\t\t._move(targetCenter, targetZoom)\r\n\t\t\t\t\t._moveEnd(true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._moveStart(true);\r\n\r\n\t\tframe.call(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method flyToBounds(bounds: LatLngBounds, options?: fitBounds options): this\r\n\t// Sets the view of the map with a smooth animation like [`flyTo`](#map-flyto),\r\n\t// but takes a bounds parameter like [`fitBounds`](#map-fitbounds).\r\n\tflyToBounds: function (bounds, options) {\r\n\t\tvar target = this._getBoundsCenterZoom(bounds, options);\r\n\t\treturn this.flyTo(target.center, target.zoom, options);\r\n\t},\r\n\r\n\t// @method setMaxBounds(bounds: Bounds): this\r\n\t// Restricts the map view to the given bounds (see the [maxBounds](#map-maxbounds) option).\r\n\tsetMaxBounds: function (bounds) {\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\tif (!bounds.isValid()) {\r\n\t\t\tthis.options.maxBounds = null;\r\n\t\t\treturn this.off('moveend', this._panInsideMaxBounds);\r\n\t\t} else if (this.options.maxBounds) {\r\n\t\t\tthis.off('moveend', this._panInsideMaxBounds);\r\n\t\t}\r\n\r\n\t\tthis.options.maxBounds = bounds;\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\tthis._panInsideMaxBounds();\r\n\t\t}\r\n\r\n\t\treturn this.on('moveend', this._panInsideMaxBounds);\r\n\t},\r\n\r\n\t// @method setMinZoom(zoom: Number): this\r\n\t// Sets the lower limit for the available zoom levels (see the [minZoom](#map-minzoom) option).\r\n\tsetMinZoom: function (zoom) {\r\n\t\tthis.options.minZoom = zoom;\r\n\r\n\t\tif (this._loaded && this.getZoom() < this.options.minZoom) {\r\n\t\t\treturn this.setZoom(zoom);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method setMaxZoom(zoom: Number): this\r\n\t// Sets the upper limit for the available zoom levels (see the [maxZoom](#map-maxzoom) option).\r\n\tsetMaxZoom: function (zoom) {\r\n\t\tthis.options.maxZoom = zoom;\r\n\r\n\t\tif (this._loaded && (this.getZoom() > this.options.maxZoom)) {\r\n\t\t\treturn this.setZoom(zoom);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method panInsideBounds(bounds: LatLngBounds, options?: Pan options): this\r\n\t// Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any.\r\n\tpanInsideBounds: function (bounds, options) {\r\n\t\tthis._enforcingBounds = true;\r\n\t\tvar center = this.getCenter(),\r\n\t\t    newCenter = this._limitCenter(center, this._zoom, L.latLngBounds(bounds));\r\n\r\n\t\tif (!center.equals(newCenter)) {\r\n\t\t\tthis.panTo(newCenter, options);\r\n\t\t}\r\n\r\n\t\tthis._enforcingBounds = false;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method invalidateSize(options: Zoom/Pan options): this\r\n\t// Checks if the map container size changed and updates the map if so —\r\n\t// call it after you've changed the map size dynamically, also animating\r\n\t// pan by default. If `options.pan` is `false`, panning will not occur.\r\n\t// If `options.debounceMoveend` is `true`, it will delay `moveend` event so\r\n\t// that it doesn't happen often even if the method is called many\r\n\t// times in a row.\r\n\r\n\t// @alternative\r\n\t// @method invalidateSize(animate: Boolean): this\r\n\t// Checks if the map container size changed and updates the map if so —\r\n\t// call it after you've changed the map size dynamically, also animating\r\n\t// pan by default.\r\n\tinvalidateSize: function (options) {\r\n\t\tif (!this._loaded) { return this; }\r\n\r\n\t\toptions = L.extend({\r\n\t\t\tanimate: false,\r\n\t\t\tpan: true\r\n\t\t}, options === true ? {animate: true} : options);\r\n\r\n\t\tvar oldSize = this.getSize();\r\n\t\tthis._sizeChanged = true;\r\n\t\tthis._lastCenter = null;\r\n\r\n\t\tvar newSize = this.getSize(),\r\n\t\t    oldCenter = oldSize.divideBy(2).round(),\r\n\t\t    newCenter = newSize.divideBy(2).round(),\r\n\t\t    offset = oldCenter.subtract(newCenter);\r\n\r\n\t\tif (!offset.x && !offset.y) { return this; }\r\n\r\n\t\tif (options.animate && options.pan) {\r\n\t\t\tthis.panBy(offset);\r\n\r\n\t\t} else {\r\n\t\t\tif (options.pan) {\r\n\t\t\t\tthis._rawPanBy(offset);\r\n\t\t\t}\r\n\r\n\t\t\tthis.fire('move');\r\n\r\n\t\t\tif (options.debounceMoveend) {\r\n\t\t\t\tclearTimeout(this._sizeTimer);\r\n\t\t\t\tthis._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200);\r\n\t\t\t} else {\r\n\t\t\t\tthis.fire('moveend');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// @section Map state change events\r\n\t\t// @event resize: ResizeEvent\r\n\t\t// Fired when the map is resized.\r\n\t\treturn this.fire('resize', {\r\n\t\t\toldSize: oldSize,\r\n\t\t\tnewSize: newSize\r\n\t\t});\r\n\t},\r\n\r\n\t// @section Methods for modifying map state\r\n\t// @method stop(): this\r\n\t// Stops the currently running `panTo` or `flyTo` animation, if any.\r\n\tstop: function () {\r\n\t\tthis.setZoom(this._limitZoom(this._zoom));\r\n\t\tif (!this.options.zoomSnap) {\r\n\t\t\tthis.fire('viewreset');\r\n\t\t}\r\n\t\treturn this._stop();\r\n\t},\r\n\r\n\t// @section Geolocation methods\r\n\t// @method locate(options?: Locate options): this\r\n\t// Tries to locate the user using the Geolocation API, firing a [`locationfound`](#map-locationfound)\r\n\t// event with location data on success or a [`locationerror`](#map-locationerror) event on failure,\r\n\t// and optionally sets the map view to the user's location with respect to\r\n\t// detection accuracy (or to the world view if geolocation failed).\r\n\t// Note that, if your page doesn't use HTTPS, this method will fail in\r\n\t// modern browsers ([Chrome 50 and newer](https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins))\r\n\t// See `Locate options` for more details.\r\n\tlocate: function (options) {\r\n\r\n\t\toptions = this._locateOptions = L.extend({\r\n\t\t\ttimeout: 10000,\r\n\t\t\twatch: false\r\n\t\t\t// setView: false\r\n\t\t\t// maxZoom: <Number>\r\n\t\t\t// maximumAge: 0\r\n\t\t\t// enableHighAccuracy: false\r\n\t\t}, options);\r\n\r\n\t\tif (!('geolocation' in navigator)) {\r\n\t\t\tthis._handleGeolocationError({\r\n\t\t\t\tcode: 0,\r\n\t\t\t\tmessage: 'Geolocation not supported.'\r\n\t\t\t});\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar onResponse = L.bind(this._handleGeolocationResponse, this),\r\n\t\t    onError = L.bind(this._handleGeolocationError, this);\r\n\r\n\t\tif (options.watch) {\r\n\t\t\tthis._locationWatchId =\r\n\t\t\t        navigator.geolocation.watchPosition(onResponse, onError, options);\r\n\t\t} else {\r\n\t\t\tnavigator.geolocation.getCurrentPosition(onResponse, onError, options);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method stopLocate(): this\r\n\t// Stops watching location previously initiated by `map.locate({watch: true})`\r\n\t// and aborts resetting the map view if map.locate was called with\r\n\t// `{setView: true}`.\r\n\tstopLocate: function () {\r\n\t\tif (navigator.geolocation && navigator.geolocation.clearWatch) {\r\n\t\t\tnavigator.geolocation.clearWatch(this._locationWatchId);\r\n\t\t}\r\n\t\tif (this._locateOptions) {\r\n\t\t\tthis._locateOptions.setView = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_handleGeolocationError: function (error) {\r\n\t\tvar c = error.code,\r\n\t\t    message = error.message ||\r\n\t\t            (c === 1 ? 'permission denied' :\r\n\t\t            (c === 2 ? 'position unavailable' : 'timeout'));\r\n\r\n\t\tif (this._locateOptions.setView && !this._loaded) {\r\n\t\t\tthis.fitWorld();\r\n\t\t}\r\n\r\n\t\t// @section Location events\r\n\t\t// @event locationerror: ErrorEvent\r\n\t\t// Fired when geolocation (using the [`locate`](#map-locate) method) failed.\r\n\t\tthis.fire('locationerror', {\r\n\t\t\tcode: c,\r\n\t\t\tmessage: 'Geolocation error: ' + message + '.'\r\n\t\t});\r\n\t},\r\n\r\n\t_handleGeolocationResponse: function (pos) {\r\n\t\tvar lat = pos.coords.latitude,\r\n\t\t    lng = pos.coords.longitude,\r\n\t\t    latlng = new L.LatLng(lat, lng),\r\n\t\t    bounds = latlng.toBounds(pos.coords.accuracy),\r\n\t\t    options = this._locateOptions;\r\n\r\n\t\tif (options.setView) {\r\n\t\t\tvar zoom = this.getBoundsZoom(bounds);\r\n\t\t\tthis.setView(latlng, options.maxZoom ? Math.min(zoom, options.maxZoom) : zoom);\r\n\t\t}\r\n\r\n\t\tvar data = {\r\n\t\t\tlatlng: latlng,\r\n\t\t\tbounds: bounds,\r\n\t\t\ttimestamp: pos.timestamp\r\n\t\t};\r\n\r\n\t\tfor (var i in pos.coords) {\r\n\t\t\tif (typeof pos.coords[i] === 'number') {\r\n\t\t\t\tdata[i] = pos.coords[i];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// @event locationfound: LocationEvent\r\n\t\t// Fired when geolocation (using the [`locate`](#map-locate) method)\r\n\t\t// went successfully.\r\n\t\tthis.fire('locationfound', data);\r\n\t},\r\n\r\n\t// TODO handler.addTo\r\n\t// TODO Appropiate docs section?\r\n\t// @section Other Methods\r\n\t// @method addHandler(name: String, HandlerClass: Function): this\r\n\t// Adds a new `Handler` to the map, given its name and constructor function.\r\n\taddHandler: function (name, HandlerClass) {\r\n\t\tif (!HandlerClass) { return this; }\r\n\r\n\t\tvar handler = this[name] = new HandlerClass(this);\r\n\r\n\t\tthis._handlers.push(handler);\r\n\r\n\t\tif (this.options[name]) {\r\n\t\t\thandler.enable();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method remove(): this\r\n\t// Destroys the map and clears all related event listeners.\r\n\tremove: function () {\r\n\r\n\t\tthis._initEvents(true);\r\n\r\n\t\tif (this._containerId !== this._container._leaflet_id) {\r\n\t\t\tthrow new Error('Map container is being reused by another instance');\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\t// throws error in IE6-8\r\n\t\t\tdelete this._container._leaflet_id;\r\n\t\t\tdelete this._containerId;\r\n\t\t} catch (e) {\r\n\t\t\t/*eslint-disable */\r\n\t\t\tthis._container._leaflet_id = undefined;\r\n\t\t\t/*eslint-enable */\r\n\t\t\tthis._containerId = undefined;\r\n\t\t}\r\n\r\n\t\tL.DomUtil.remove(this._mapPane);\r\n\r\n\t\tif (this._clearControlPos) {\r\n\t\t\tthis._clearControlPos();\r\n\t\t}\r\n\r\n\t\tthis._clearHandlers();\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\t// @section Map state change events\r\n\t\t\t// @event unload: Event\r\n\t\t\t// Fired when the map is destroyed with [remove](#map-remove) method.\r\n\t\t\tthis.fire('unload');\r\n\t\t}\r\n\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tthis._layers[i].remove();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @section Other Methods\r\n\t// @method createPane(name: String, container?: HTMLElement): HTMLElement\r\n\t// Creates a new [map pane](#map-pane) with the given name if it doesn't exist already,\r\n\t// then returns it. The pane is created as a children of `container`, or\r\n\t// as a children of the main map pane if not set.\r\n\tcreatePane: function (name, container) {\r\n\t\tvar className = 'leaflet-pane' + (name ? ' leaflet-' + name.replace('Pane', '') + '-pane' : ''),\r\n\t\t    pane = L.DomUtil.create('div', className, container || this._mapPane);\r\n\r\n\t\tif (name) {\r\n\t\t\tthis._panes[name] = pane;\r\n\t\t}\r\n\t\treturn pane;\r\n\t},\r\n\r\n\t// @section Methods for Getting Map State\r\n\r\n\t// @method getCenter(): LatLng\r\n\t// Returns the geographical center of the map view\r\n\tgetCenter: function () {\r\n\t\tthis._checkIfLoaded();\r\n\r\n\t\tif (this._lastCenter && !this._moved()) {\r\n\t\t\treturn this._lastCenter;\r\n\t\t}\r\n\t\treturn this.layerPointToLatLng(this._getCenterLayerPoint());\r\n\t},\r\n\r\n\t// @method getZoom(): Number\r\n\t// Returns the current zoom level of the map view\r\n\tgetZoom: function () {\r\n\t\treturn this._zoom;\r\n\t},\r\n\r\n\t// @method getBounds(): LatLngBounds\r\n\t// Returns the geographical bounds visible in the current map view\r\n\tgetBounds: function () {\r\n\t\tvar bounds = this.getPixelBounds(),\r\n\t\t    sw = this.unproject(bounds.getBottomLeft()),\r\n\t\t    ne = this.unproject(bounds.getTopRight());\r\n\r\n\t\treturn new L.LatLngBounds(sw, ne);\r\n\t},\r\n\r\n\t// @method getMinZoom(): Number\r\n\t// Returns the minimum zoom level of the map (if set in the `minZoom` option of the map or of any layers), or `0` by default.\r\n\tgetMinZoom: function () {\r\n\t\treturn this.options.minZoom === undefined ? this._layersMinZoom || 0 : this.options.minZoom;\r\n\t},\r\n\r\n\t// @method getMaxZoom(): Number\r\n\t// Returns the maximum zoom level of the map (if set in the `maxZoom` option of the map or of any layers).\r\n\tgetMaxZoom: function () {\r\n\t\treturn this.options.maxZoom === undefined ?\r\n\t\t\t(this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) :\r\n\t\t\tthis.options.maxZoom;\r\n\t},\r\n\r\n\t// @method getBoundsZoom(bounds: LatLngBounds, inside?: Boolean): Number\r\n\t// Returns the maximum zoom level on which the given bounds fit to the map\r\n\t// view in its entirety. If `inside` (optional) is set to `true`, the method\r\n\t// instead returns the minimum zoom level on which the map view fits into\r\n\t// the given bounds in its entirety.\r\n\tgetBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\t\tpadding = L.point(padding || [0, 0]);\r\n\r\n\t\tvar zoom = this.getZoom() || 0,\r\n\t\t    min = this.getMinZoom(),\r\n\t\t    max = this.getMaxZoom(),\r\n\t\t    nw = bounds.getNorthWest(),\r\n\t\t    se = bounds.getSouthEast(),\r\n\t\t    size = this.getSize().subtract(padding),\r\n\t\t    boundsSize = L.bounds(this.project(se, zoom), this.project(nw, zoom)).getSize(),\r\n\t\t    snap = L.Browser.any3d ? this.options.zoomSnap : 1;\r\n\r\n\t\tvar scale = Math.min(size.x / boundsSize.x, size.y / boundsSize.y);\r\n\t\tzoom = this.getScaleZoom(scale, zoom);\r\n\r\n\t\tif (snap) {\r\n\t\t\tzoom = Math.round(zoom / (snap / 100)) * (snap / 100); // don't jump if within 1% of a snap level\r\n\t\t\tzoom = inside ? Math.ceil(zoom / snap) * snap : Math.floor(zoom / snap) * snap;\r\n\t\t}\r\n\r\n\t\treturn Math.max(min, Math.min(max, zoom));\r\n\t},\r\n\r\n\t// @method getSize(): Point\r\n\t// Returns the current size of the map container (in pixels).\r\n\tgetSize: function () {\r\n\t\tif (!this._size || this._sizeChanged) {\r\n\t\t\tthis._size = new L.Point(\r\n\t\t\t\tthis._container.clientWidth || 0,\r\n\t\t\t\tthis._container.clientHeight || 0);\r\n\r\n\t\t\tthis._sizeChanged = false;\r\n\t\t}\r\n\t\treturn this._size.clone();\r\n\t},\r\n\r\n\t// @method getPixelBounds(): Bounds\r\n\t// Returns the bounds of the current map view in projected pixel\r\n\t// coordinates (sometimes useful in layer and overlay implementations).\r\n\tgetPixelBounds: function (center, zoom) {\r\n\t\tvar topLeftPoint = this._getTopLeftPoint(center, zoom);\r\n\t\treturn new L.Bounds(topLeftPoint, topLeftPoint.add(this.getSize()));\r\n\t},\r\n\r\n\t// TODO: Check semantics - isn't the pixel origin the 0,0 coord relative to\r\n\t// the map pane? \"left point of the map layer\" can be confusing, specially\r\n\t// since there can be negative offsets.\r\n\t// @method getPixelOrigin(): Point\r\n\t// Returns the projected pixel coordinates of the top left point of\r\n\t// the map layer (useful in custom layer and overlay implementations).\r\n\tgetPixelOrigin: function () {\r\n\t\tthis._checkIfLoaded();\r\n\t\treturn this._pixelOrigin;\r\n\t},\r\n\r\n\t// @method getPixelWorldBounds(zoom?: Number): Bounds\r\n\t// Returns the world's bounds in pixel coordinates for zoom level `zoom`.\r\n\t// If `zoom` is omitted, the map's current zoom level is used.\r\n\tgetPixelWorldBounds: function (zoom) {\r\n\t\treturn this.options.crs.getProjectedBounds(zoom === undefined ? this.getZoom() : zoom);\r\n\t},\r\n\r\n\t// @section Other Methods\r\n\r\n\t// @method getPane(pane: String|HTMLElement): HTMLElement\r\n\t// Returns a [map pane](#map-pane), given its name or its HTML element (its identity).\r\n\tgetPane: function (pane) {\r\n\t\treturn typeof pane === 'string' ? this._panes[pane] : pane;\r\n\t},\r\n\r\n\t// @method getPanes(): Object\r\n\t// Returns a plain object containing the names of all [panes](#map-pane) as keys and\r\n\t// the panes as values.\r\n\tgetPanes: function () {\r\n\t\treturn this._panes;\r\n\t},\r\n\r\n\t// @method getContainer: HTMLElement\r\n\t// Returns the HTML element that contains the map.\r\n\tgetContainer: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\r\n\t// @section Conversion Methods\r\n\r\n\t// @method getZoomScale(toZoom: Number, fromZoom: Number): Number\r\n\t// Returns the scale factor to be applied to a map transition from zoom level\r\n\t// `fromZoom` to `toZoom`. Used internally to help with zoom animations.\r\n\tgetZoomScale: function (toZoom, fromZoom) {\r\n\t\t// TODO replace with universal implementation after refactoring projections\r\n\t\tvar crs = this.options.crs;\r\n\t\tfromZoom = fromZoom === undefined ? this._zoom : fromZoom;\r\n\t\treturn crs.scale(toZoom) / crs.scale(fromZoom);\r\n\t},\r\n\r\n\t// @method getScaleZoom(scale: Number, fromZoom: Number): Number\r\n\t// Returns the zoom level that the map would end up at, if it is at `fromZoom`\r\n\t// level and everything is scaled by a factor of `scale`. Inverse of\r\n\t// [`getZoomScale`](#map-getZoomScale).\r\n\tgetScaleZoom: function (scale, fromZoom) {\r\n\t\tvar crs = this.options.crs;\r\n\t\tfromZoom = fromZoom === undefined ? this._zoom : fromZoom;\r\n\t\tvar zoom = crs.zoom(scale * crs.scale(fromZoom));\r\n\t\treturn isNaN(zoom) ? Infinity : zoom;\r\n\t},\r\n\r\n\t// @method project(latlng: LatLng, zoom: Number): Point\r\n\t// Projects a geographical coordinate `LatLng` according to the projection\r\n\t// of the map's CRS, then scales it according to `zoom` and the CRS's\r\n\t// `Transformation`. The result is pixel coordinate relative to\r\n\t// the CRS origin.\r\n\tproject: function (latlng, zoom) {\r\n\t\tzoom = zoom === undefined ? this._zoom : zoom;\r\n\t\treturn this.options.crs.latLngToPoint(L.latLng(latlng), zoom);\r\n\t},\r\n\r\n\t// @method unproject(point: Point, zoom: Number): LatLng\r\n\t// Inverse of [`project`](#map-project).\r\n\tunproject: function (point, zoom) {\r\n\t\tzoom = zoom === undefined ? this._zoom : zoom;\r\n\t\treturn this.options.crs.pointToLatLng(L.point(point), zoom);\r\n\t},\r\n\r\n\t// @method layerPointToLatLng(point: Point): LatLng\r\n\t// Given a pixel coordinate relative to the [origin pixel](#map-getpixelorigin),\r\n\t// returns the corresponding geographical coordinate (for the current zoom level).\r\n\tlayerPointToLatLng: function (point) {\r\n\t\tvar projectedPoint = L.point(point).add(this.getPixelOrigin());\r\n\t\treturn this.unproject(projectedPoint);\r\n\t},\r\n\r\n\t// @method latLngToLayerPoint(latlng: LatLng): Point\r\n\t// Given a geographical coordinate, returns the corresponding pixel coordinate\r\n\t// relative to the [origin pixel](#map-getpixelorigin).\r\n\tlatLngToLayerPoint: function (latlng) {\r\n\t\tvar projectedPoint = this.project(L.latLng(latlng))._round();\r\n\t\treturn projectedPoint._subtract(this.getPixelOrigin());\r\n\t},\r\n\r\n\t// @method wrapLatLng(latlng: LatLng): LatLng\r\n\t// Returns a `LatLng` where `lat` and `lng` has been wrapped according to the\r\n\t// map's CRS's `wrapLat` and `wrapLng` properties, if they are outside the\r\n\t// CRS's bounds.\r\n\t// By default this means longitude is wrapped around the dateline so its\r\n\t// value is between -180 and +180 degrees.\r\n\twrapLatLng: function (latlng) {\r\n\t\treturn this.options.crs.wrapLatLng(L.latLng(latlng));\r\n\t},\r\n\r\n\t// @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds\r\n\t// Returns a `LatLngBounds` with the same size as the given one, ensuring that\r\n\t// its center is within the CRS's bounds.\r\n\t// By default this means the center longitude is wrapped around the dateline so its\r\n\t// value is between -180 and +180 degrees, and the majority of the bounds\r\n\t// overlaps the CRS's bounds.\r\n\twrapLatLngBounds: function (latlng) {\r\n\t\treturn this.options.crs.wrapLatLngBounds(L.latLngBounds(latlng));\r\n\t},\r\n\r\n\t// @method distance(latlng1: LatLng, latlng2: LatLng): Number\r\n\t// Returns the distance between two geographical coordinates according to\r\n\t// the map's CRS. By default this measures distance in meters.\r\n\tdistance: function (latlng1, latlng2) {\r\n\t\treturn this.options.crs.distance(L.latLng(latlng1), L.latLng(latlng2));\r\n\t},\r\n\r\n\t// @method containerPointToLayerPoint(point: Point): Point\r\n\t// Given a pixel coordinate relative to the map container, returns the corresponding\r\n\t// pixel coordinate relative to the [origin pixel](#map-getpixelorigin).\r\n\tcontainerPointToLayerPoint: function (point) { // (Point)\r\n\t\treturn L.point(point).subtract(this._getMapPanePos());\r\n\t},\r\n\r\n\t// @method layerPointToContainerPoint(point: Point): Point\r\n\t// Given a pixel coordinate relative to the [origin pixel](#map-getpixelorigin),\r\n\t// returns the corresponding pixel coordinate relative to the map container.\r\n\tlayerPointToContainerPoint: function (point) { // (Point)\r\n\t\treturn L.point(point).add(this._getMapPanePos());\r\n\t},\r\n\r\n\t// @method containerPointToLatLng(point: Point): LatLng\r\n\t// Given a pixel coordinate relative to the map container, returns\r\n\t// the corresponding geographical coordinate (for the current zoom level).\r\n\tcontainerPointToLatLng: function (point) {\r\n\t\tvar layerPoint = this.containerPointToLayerPoint(L.point(point));\r\n\t\treturn this.layerPointToLatLng(layerPoint);\r\n\t},\r\n\r\n\t// @method latLngToContainerPoint(latlng: LatLng): Point\r\n\t// Given a geographical coordinate, returns the corresponding pixel coordinate\r\n\t// relative to the map container.\r\n\tlatLngToContainerPoint: function (latlng) {\r\n\t\treturn this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng)));\r\n\t},\r\n\r\n\t// @method mouseEventToContainerPoint(ev: MouseEvent): Point\r\n\t// Given a MouseEvent object, returns the pixel coordinate relative to the\r\n\t// map container where the event took place.\r\n\tmouseEventToContainerPoint: function (e) {\r\n\t\treturn L.DomEvent.getMousePosition(e, this._container);\r\n\t},\r\n\r\n\t// @method mouseEventToLayerPoint(ev: MouseEvent): Point\r\n\t// Given a MouseEvent object, returns the pixel coordinate relative to\r\n\t// the [origin pixel](#map-getpixelorigin) where the event took place.\r\n\tmouseEventToLayerPoint: function (e) {\r\n\t\treturn this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e));\r\n\t},\r\n\r\n\t// @method mouseEventToLatLng(ev: MouseEvent): LatLng\r\n\t// Given a MouseEvent object, returns geographical coordinate where the\r\n\t// event took place.\r\n\tmouseEventToLatLng: function (e) { // (MouseEvent)\r\n\t\treturn this.layerPointToLatLng(this.mouseEventToLayerPoint(e));\r\n\t},\r\n\r\n\r\n\t// map initialization methods\r\n\r\n\t_initContainer: function (id) {\r\n\t\tvar container = this._container = L.DomUtil.get(id);\r\n\r\n\t\tif (!container) {\r\n\t\t\tthrow new Error('Map container not found.');\r\n\t\t} else if (container._leaflet_id) {\r\n\t\t\tthrow new Error('Map container is already initialized.');\r\n\t\t}\r\n\r\n\t\tL.DomEvent.addListener(container, 'scroll', this._onScroll, this);\r\n\t\tthis._containerId = L.Util.stamp(container);\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar container = this._container;\r\n\r\n\t\tthis._fadeAnimated = this.options.fadeAnimation && L.Browser.any3d;\r\n\r\n\t\tL.DomUtil.addClass(container, 'leaflet-container' +\r\n\t\t\t(L.Browser.touch ? ' leaflet-touch' : '') +\r\n\t\t\t(L.Browser.retina ? ' leaflet-retina' : '') +\r\n\t\t\t(L.Browser.ielt9 ? ' leaflet-oldie' : '') +\r\n\t\t\t(L.Browser.safari ? ' leaflet-safari' : '') +\r\n\t\t\t(this._fadeAnimated ? ' leaflet-fade-anim' : ''));\r\n\r\n\t\tvar position = L.DomUtil.getStyle(container, 'position');\r\n\r\n\t\tif (position !== 'absolute' && position !== 'relative' && position !== 'fixed') {\r\n\t\t\tcontainer.style.position = 'relative';\r\n\t\t}\r\n\r\n\t\tthis._initPanes();\r\n\r\n\t\tif (this._initControlPos) {\r\n\t\t\tthis._initControlPos();\r\n\t\t}\r\n\t},\r\n\r\n\t_initPanes: function () {\r\n\t\tvar panes = this._panes = {};\r\n\t\tthis._paneRenderers = {};\r\n\r\n\t\t// @section\r\n\t\t//\r\n\t\t// Panes are DOM elements used to control the ordering of layers on the map. You\r\n\t\t// can access panes with [`map.getPane`](#map-getpane) or\r\n\t\t// [`map.getPanes`](#map-getpanes) methods. New panes can be created with the\r\n\t\t// [`map.createPane`](#map-createpane) method.\r\n\t\t//\r\n\t\t// Every map has the following default panes that differ only in zIndex.\r\n\t\t//\r\n\t\t// @pane mapPane: HTMLElement = 'auto'\r\n\t\t// Pane that contains all other map panes\r\n\r\n\t\tthis._mapPane = this.createPane('mapPane', this._container);\r\n\t\tL.DomUtil.setPosition(this._mapPane, new L.Point(0, 0));\r\n\r\n\t\t// @pane tilePane: HTMLElement = 200\r\n\t\t// Pane for `GridLayer`s and `TileLayer`s\r\n\t\tthis.createPane('tilePane');\r\n\t\t// @pane overlayPane: HTMLElement = 400\r\n\t\t// Pane for vector overlays (`Path`s), like `Polyline`s and `Polygon`s\r\n\t\tthis.createPane('shadowPane');\r\n\t\t// @pane shadowPane: HTMLElement = 500\r\n\t\t// Pane for overlay shadows (e.g. `Marker` shadows)\r\n\t\tthis.createPane('overlayPane');\r\n\t\t// @pane markerPane: HTMLElement = 600\r\n\t\t// Pane for `Icon`s of `Marker`s\r\n\t\tthis.createPane('markerPane');\r\n\t\t// @pane tooltipPane: HTMLElement = 650\r\n\t\t// Pane for tooltip.\r\n\t\tthis.createPane('tooltipPane');\r\n\t\t// @pane popupPane: HTMLElement = 700\r\n\t\t// Pane for `Popup`s.\r\n\t\tthis.createPane('popupPane');\r\n\r\n\t\tif (!this.options.markerZoomAnimation) {\r\n\t\t\tL.DomUtil.addClass(panes.markerPane, 'leaflet-zoom-hide');\r\n\t\t\tL.DomUtil.addClass(panes.shadowPane, 'leaflet-zoom-hide');\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t// private methods that modify map state\r\n\r\n\t// @section Map state change events\r\n\t_resetView: function (center, zoom) {\r\n\t\tL.DomUtil.setPosition(this._mapPane, new L.Point(0, 0));\r\n\r\n\t\tvar loading = !this._loaded;\r\n\t\tthis._loaded = true;\r\n\t\tzoom = this._limitZoom(zoom);\r\n\r\n\t\tthis.fire('viewprereset');\r\n\r\n\t\tvar zoomChanged = this._zoom !== zoom;\r\n\t\tthis\r\n\t\t\t._moveStart(zoomChanged)\r\n\t\t\t._move(center, zoom)\r\n\t\t\t._moveEnd(zoomChanged);\r\n\r\n\t\t// @event viewreset: Event\r\n\t\t// Fired when the map needs to redraw its content (this usually happens\r\n\t\t// on map zoom or load). Very useful for creating custom overlays.\r\n\t\tthis.fire('viewreset');\r\n\r\n\t\t// @event load: Event\r\n\t\t// Fired when the map is initialized (when its center and zoom are set\r\n\t\t// for the first time).\r\n\t\tif (loading) {\r\n\t\t\tthis.fire('load');\r\n\t\t}\r\n\t},\r\n\r\n\t_moveStart: function (zoomChanged) {\r\n\t\t// @event zoomstart: Event\r\n\t\t// Fired when the map zoom is about to change (e.g. before zoom animation).\r\n\t\t// @event movestart: Event\r\n\t\t// Fired when the view of the map starts changing (e.g. user starts dragging the map).\r\n\t\tif (zoomChanged) {\r\n\t\t\tthis.fire('zoomstart');\r\n\t\t}\r\n\t\treturn this.fire('movestart');\r\n\t},\r\n\r\n\t_move: function (center, zoom, data) {\r\n\t\tif (zoom === undefined) {\r\n\t\t\tzoom = this._zoom;\r\n\t\t}\r\n\t\tvar zoomChanged = this._zoom !== zoom;\r\n\r\n\t\tthis._zoom = zoom;\r\n\t\tthis._lastCenter = center;\r\n\t\tthis._pixelOrigin = this._getNewPixelOrigin(center);\r\n\r\n\t\t// @event zoom: Event\r\n\t\t// Fired repeatedly during any change in zoom level, including zoom\r\n\t\t// and fly animations.\r\n\t\tif (zoomChanged || (data && data.pinch)) {\t// Always fire 'zoom' if pinching because #3530\r\n\t\t\tthis.fire('zoom', data);\r\n\t\t}\r\n\r\n\t\t// @event move: Event\r\n\t\t// Fired repeatedly during any movement of the map, including pan and\r\n\t\t// fly animations.\r\n\t\treturn this.fire('move', data);\r\n\t},\r\n\r\n\t_moveEnd: function (zoomChanged) {\r\n\t\t// @event zoomend: Event\r\n\t\t// Fired when the map has changed, after any animations.\r\n\t\tif (zoomChanged) {\r\n\t\t\tthis.fire('zoomend');\r\n\t\t}\r\n\r\n\t\t// @event moveend: Event\r\n\t\t// Fired when the center of the map stops changing (e.g. user stopped\r\n\t\t// dragging the map).\r\n\t\treturn this.fire('moveend');\r\n\t},\r\n\r\n\t_stop: function () {\r\n\t\tL.Util.cancelAnimFrame(this._flyToFrame);\r\n\t\tif (this._panAnim) {\r\n\t\t\tthis._panAnim.stop();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_rawPanBy: function (offset) {\r\n\t\tL.DomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset));\r\n\t},\r\n\r\n\t_getZoomSpan: function () {\r\n\t\treturn this.getMaxZoom() - this.getMinZoom();\r\n\t},\r\n\r\n\t_panInsideMaxBounds: function () {\r\n\t\tif (!this._enforcingBounds) {\r\n\t\t\tthis.panInsideBounds(this.options.maxBounds);\r\n\t\t}\r\n\t},\r\n\r\n\t_checkIfLoaded: function () {\r\n\t\tif (!this._loaded) {\r\n\t\t\tthrow new Error('Set map center and zoom first.');\r\n\t\t}\r\n\t},\r\n\r\n\t// DOM event handling\r\n\r\n\t// @section Interaction events\r\n\t_initEvents: function (remove) {\r\n\t\tif (!L.DomEvent) { return; }\r\n\r\n\t\tthis._targets = {};\r\n\t\tthis._targets[L.stamp(this._container)] = this;\r\n\r\n\t\tvar onOff = remove ? 'off' : 'on';\r\n\r\n\t\t// @event click: MouseEvent\r\n\t\t// Fired when the user clicks (or taps) the map.\r\n\t\t// @event dblclick: MouseEvent\r\n\t\t// Fired when the user double-clicks (or double-taps) the map.\r\n\t\t// @event mousedown: MouseEvent\r\n\t\t// Fired when the user pushes the mouse button on the map.\r\n\t\t// @event mouseup: MouseEvent\r\n\t\t// Fired when the user releases the mouse button on the map.\r\n\t\t// @event mouseover: MouseEvent\r\n\t\t// Fired when the mouse enters the map.\r\n\t\t// @event mouseout: MouseEvent\r\n\t\t// Fired when the mouse leaves the map.\r\n\t\t// @event mousemove: MouseEvent\r\n\t\t// Fired while the mouse moves over the map.\r\n\t\t// @event contextmenu: MouseEvent\r\n\t\t// Fired when the user pushes the right mouse button on the map, prevents\r\n\t\t// default browser context menu from showing if there are listeners on\r\n\t\t// this event. Also fired on mobile when the user holds a single touch\r\n\t\t// for a second (also called long press).\r\n\t\t// @event keypress: KeyboardEvent\r\n\t\t// Fired when the user presses a key from the keyboard while the map is focused.\r\n\t\tL.DomEvent[onOff](this._container, 'click dblclick mousedown mouseup ' +\r\n\t\t\t'mouseover mouseout mousemove contextmenu keypress', this._handleDOMEvent, this);\r\n\r\n\t\tif (this.options.trackResize) {\r\n\t\t\tL.DomEvent[onOff](window, 'resize', this._onResize, this);\r\n\t\t}\r\n\r\n\t\tif (L.Browser.any3d && this.options.transform3DLimit) {\r\n\t\t\tthis[onOff]('moveend', this._onMoveEnd);\r\n\t\t}\r\n\t},\r\n\r\n\t_onResize: function () {\r\n\t\tL.Util.cancelAnimFrame(this._resizeRequest);\r\n\t\tthis._resizeRequest = L.Util.requestAnimFrame(\r\n\t\t        function () { this.invalidateSize({debounceMoveend: true}); }, this);\r\n\t},\r\n\r\n\t_onScroll: function () {\r\n\t\tthis._container.scrollTop  = 0;\r\n\t\tthis._container.scrollLeft = 0;\r\n\t},\r\n\r\n\t_onMoveEnd: function () {\r\n\t\tvar pos = this._getMapPanePos();\r\n\t\tif (Math.max(Math.abs(pos.x), Math.abs(pos.y)) >= this.options.transform3DLimit) {\r\n\t\t\t// https://bugzilla.mozilla.org/show_bug.cgi?id=1203873 but Webkit also have\r\n\t\t\t// a pixel offset on very high values, see: http://jsfiddle.net/dg6r5hhb/\r\n\t\t\tthis._resetView(this.getCenter(), this.getZoom());\r\n\t\t}\r\n\t},\r\n\r\n\t_findEventTargets: function (e, type) {\r\n\t\tvar targets = [],\r\n\t\t    target,\r\n\t\t    isHover = type === 'mouseout' || type === 'mouseover',\r\n\t\t    src = e.target || e.srcElement,\r\n\t\t    dragging = false;\r\n\r\n\t\twhile (src) {\r\n\t\t\ttarget = this._targets[L.stamp(src)];\r\n\t\t\tif (target && (type === 'click' || type === 'preclick') && !e._simulated && this._draggableMoved(target)) {\r\n\t\t\t\t// Prevent firing click after you just dragged an object.\r\n\t\t\t\tdragging = true;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif (target && target.listens(type, true)) {\r\n\t\t\t\tif (isHover && !L.DomEvent._isExternalTarget(src, e)) { break; }\r\n\t\t\t\ttargets.push(target);\r\n\t\t\t\tif (isHover) { break; }\r\n\t\t\t}\r\n\t\t\tif (src === this._container) { break; }\r\n\t\t\tsrc = src.parentNode;\r\n\t\t}\r\n\t\tif (!targets.length && !dragging && !isHover && L.DomEvent._isExternalTarget(src, e)) {\r\n\t\t\ttargets = [this];\r\n\t\t}\r\n\t\treturn targets;\r\n\t},\r\n\r\n\t_handleDOMEvent: function (e) {\r\n\t\tif (!this._loaded || L.DomEvent._skipped(e)) { return; }\r\n\r\n\t\tvar type = e.type === 'keypress' && e.keyCode === 13 ? 'click' : e.type;\r\n\r\n\t\tif (type === 'mousedown') {\r\n\t\t\t// prevents outline when clicking on keyboard-focusable element\r\n\t\t\tL.DomUtil.preventOutline(e.target || e.srcElement);\r\n\t\t}\r\n\r\n\t\tthis._fireDOMEvent(e, type);\r\n\t},\r\n\r\n\t_fireDOMEvent: function (e, type, targets) {\r\n\r\n\t\tif (e.type === 'click') {\r\n\t\t\t// Fire a synthetic 'preclick' event which propagates up (mainly for closing popups).\r\n\t\t\t// @event preclick: MouseEvent\r\n\t\t\t// Fired before mouse click on the map (sometimes useful when you\r\n\t\t\t// want something to happen on click before any existing click\r\n\t\t\t// handlers start running).\r\n\t\t\tvar synth = L.Util.extend({}, e);\r\n\t\t\tsynth.type = 'preclick';\r\n\t\t\tthis._fireDOMEvent(synth, synth.type, targets);\r\n\t\t}\r\n\r\n\t\tif (e._stopped) { return; }\r\n\r\n\t\t// Find the layer the event is propagating from and its parents.\r\n\t\ttargets = (targets || []).concat(this._findEventTargets(e, type));\r\n\r\n\t\tif (!targets.length) { return; }\r\n\r\n\t\tvar target = targets[0];\r\n\t\tif (type === 'contextmenu' && target.listens(type, true)) {\r\n\t\t\tL.DomEvent.preventDefault(e);\r\n\t\t}\r\n\r\n\t\tvar data = {\r\n\t\t\toriginalEvent: e\r\n\t\t};\r\n\r\n\t\tif (e.type !== 'keypress') {\r\n\t\t\tvar isMarker = target instanceof L.Marker;\r\n\t\t\tdata.containerPoint = isMarker ?\r\n\t\t\t\t\tthis.latLngToContainerPoint(target.getLatLng()) : this.mouseEventToContainerPoint(e);\r\n\t\t\tdata.layerPoint = this.containerPointToLayerPoint(data.containerPoint);\r\n\t\t\tdata.latlng = isMarker ? target.getLatLng() : this.layerPointToLatLng(data.layerPoint);\r\n\t\t}\r\n\r\n\t\tfor (var i = 0; i < targets.length; i++) {\r\n\t\t\ttargets[i].fire(type, data, true);\r\n\t\t\tif (data.originalEvent._stopped ||\r\n\t\t\t\t(targets[i].options.nonBubblingEvents && L.Util.indexOf(targets[i].options.nonBubblingEvents, type) !== -1)) { return; }\r\n\t\t}\r\n\t},\r\n\r\n\t_draggableMoved: function (obj) {\r\n\t\tobj = obj.dragging && obj.dragging.enabled() ? obj : this;\r\n\t\treturn (obj.dragging && obj.dragging.moved()) || (this.boxZoom && this.boxZoom.moved());\r\n\t},\r\n\r\n\t_clearHandlers: function () {\r\n\t\tfor (var i = 0, len = this._handlers.length; i < len; i++) {\r\n\t\t\tthis._handlers[i].disable();\r\n\t\t}\r\n\t},\r\n\r\n\t// @section Other Methods\r\n\r\n\t// @method whenReady(fn: Function, context?: Object): this\r\n\t// Runs the given function `fn` when the map gets initialized with\r\n\t// a view (center and zoom) and at least one layer, or immediately\r\n\t// if it's already initialized, optionally passing a function context.\r\n\twhenReady: function (callback, context) {\r\n\t\tif (this._loaded) {\r\n\t\t\tcallback.call(context || this, {target: this});\r\n\t\t} else {\r\n\t\t\tthis.on('load', callback, context);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\r\n\t// private methods for getting map state\r\n\r\n\t_getMapPanePos: function () {\r\n\t\treturn L.DomUtil.getPosition(this._mapPane) || new L.Point(0, 0);\r\n\t},\r\n\r\n\t_moved: function () {\r\n\t\tvar pos = this._getMapPanePos();\r\n\t\treturn pos && !pos.equals([0, 0]);\r\n\t},\r\n\r\n\t_getTopLeftPoint: function (center, zoom) {\r\n\t\tvar pixelOrigin = center && zoom !== undefined ?\r\n\t\t\tthis._getNewPixelOrigin(center, zoom) :\r\n\t\t\tthis.getPixelOrigin();\r\n\t\treturn pixelOrigin.subtract(this._getMapPanePos());\r\n\t},\r\n\r\n\t_getNewPixelOrigin: function (center, zoom) {\r\n\t\tvar viewHalf = this.getSize()._divideBy(2);\r\n\t\treturn this.project(center, zoom)._subtract(viewHalf)._add(this._getMapPanePos())._round();\r\n\t},\r\n\r\n\t_latLngToNewLayerPoint: function (latlng, zoom, center) {\r\n\t\tvar topLeft = this._getNewPixelOrigin(center, zoom);\r\n\t\treturn this.project(latlng, zoom)._subtract(topLeft);\r\n\t},\r\n\r\n\t_latLngBoundsToNewLayerBounds: function (latLngBounds, zoom, center) {\r\n\t\tvar topLeft = this._getNewPixelOrigin(center, zoom);\r\n\t\treturn L.bounds([\r\n\t\t\tthis.project(latLngBounds.getSouthWest(), zoom)._subtract(topLeft),\r\n\t\t\tthis.project(latLngBounds.getNorthWest(), zoom)._subtract(topLeft),\r\n\t\t\tthis.project(latLngBounds.getSouthEast(), zoom)._subtract(topLeft),\r\n\t\t\tthis.project(latLngBounds.getNorthEast(), zoom)._subtract(topLeft)\r\n\t\t]);\r\n\t},\r\n\r\n\t// layer point of the current center\r\n\t_getCenterLayerPoint: function () {\r\n\t\treturn this.containerPointToLayerPoint(this.getSize()._divideBy(2));\r\n\t},\r\n\r\n\t// offset of the specified place to the current center in pixels\r\n\t_getCenterOffset: function (latlng) {\r\n\t\treturn this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint());\r\n\t},\r\n\r\n\t// adjust center for view to get inside bounds\r\n\t_limitCenter: function (center, zoom, bounds) {\r\n\r\n\t\tif (!bounds) { return center; }\r\n\r\n\t\tvar centerPoint = this.project(center, zoom),\r\n\t\t    viewHalf = this.getSize().divideBy(2),\r\n\t\t    viewBounds = new L.Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)),\r\n\t\t    offset = this._getBoundsOffset(viewBounds, bounds, zoom);\r\n\r\n\t\t// If offset is less than a pixel, ignore.\r\n\t\t// This prevents unstable projections from getting into\r\n\t\t// an infinite loop of tiny offsets.\r\n\t\tif (offset.round().equals([0, 0])) {\r\n\t\t\treturn center;\r\n\t\t}\r\n\r\n\t\treturn this.unproject(centerPoint.add(offset), zoom);\r\n\t},\r\n\r\n\t// adjust offset for view to get inside bounds\r\n\t_limitOffset: function (offset, bounds) {\r\n\t\tif (!bounds) { return offset; }\r\n\r\n\t\tvar viewBounds = this.getPixelBounds(),\r\n\t\t    newBounds = new L.Bounds(viewBounds.min.add(offset), viewBounds.max.add(offset));\r\n\r\n\t\treturn offset.add(this._getBoundsOffset(newBounds, bounds));\r\n\t},\r\n\r\n\t// returns offset needed for pxBounds to get inside maxBounds at a specified zoom\r\n\t_getBoundsOffset: function (pxBounds, maxBounds, zoom) {\r\n\t\tvar projectedMaxBounds = L.bounds(\r\n\t\t        this.project(maxBounds.getNorthEast(), zoom),\r\n\t\t        this.project(maxBounds.getSouthWest(), zoom)\r\n\t\t    ),\r\n\t\t    minOffset = projectedMaxBounds.min.subtract(pxBounds.min),\r\n\t\t    maxOffset = projectedMaxBounds.max.subtract(pxBounds.max),\r\n\r\n\t\t    dx = this._rebound(minOffset.x, -maxOffset.x),\r\n\t\t    dy = this._rebound(minOffset.y, -maxOffset.y);\r\n\r\n\t\treturn new L.Point(dx, dy);\r\n\t},\r\n\r\n\t_rebound: function (left, right) {\r\n\t\treturn left + right > 0 ?\r\n\t\t\tMath.round(left - right) / 2 :\r\n\t\t\tMath.max(0, Math.ceil(left)) - Math.max(0, Math.floor(right));\r\n\t},\r\n\r\n\t_limitZoom: function (zoom) {\r\n\t\tvar min = this.getMinZoom(),\r\n\t\t    max = this.getMaxZoom(),\r\n\t\t    snap = L.Browser.any3d ? this.options.zoomSnap : 1;\r\n\t\tif (snap) {\r\n\t\t\tzoom = Math.round(zoom / snap) * snap;\r\n\t\t}\r\n\t\treturn Math.max(min, Math.min(max, zoom));\r\n\t},\r\n\r\n\t_onPanTransitionStep: function () {\r\n\t\tthis.fire('move');\r\n\t},\r\n\r\n\t_onPanTransitionEnd: function () {\r\n\t\tL.DomUtil.removeClass(this._mapPane, 'leaflet-pan-anim');\r\n\t\tthis.fire('moveend');\r\n\t},\r\n\r\n\t_tryAnimatedPan: function (center, options) {\r\n\t\t// difference between the new and current centers in pixels\r\n\t\tvar offset = this._getCenterOffset(center)._floor();\r\n\r\n\t\t// don't animate too far unless animate: true specified in options\r\n\t\tif ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; }\r\n\r\n\t\tthis.panBy(offset, options);\r\n\r\n\t\treturn true;\r\n\t},\r\n\r\n\t_createAnimProxy: function () {\r\n\r\n\t\tvar proxy = this._proxy = L.DomUtil.create('div', 'leaflet-proxy leaflet-zoom-animated');\r\n\t\tthis._panes.mapPane.appendChild(proxy);\r\n\r\n\t\tthis.on('zoomanim', function (e) {\r\n\t\t\tvar prop = L.DomUtil.TRANSFORM,\r\n\t\t\t    transform = proxy.style[prop];\r\n\r\n\t\t\tL.DomUtil.setTransform(proxy, this.project(e.center, e.zoom), this.getZoomScale(e.zoom, 1));\r\n\r\n\t\t\t// workaround for case when transform is the same and so transitionend event is not fired\r\n\t\t\tif (transform === proxy.style[prop] && this._animatingZoom) {\r\n\t\t\t\tthis._onZoomTransitionEnd();\r\n\t\t\t}\r\n\t\t}, this);\r\n\r\n\t\tthis.on('load moveend', function () {\r\n\t\t\tvar c = this.getCenter(),\r\n\t\t\t    z = this.getZoom();\r\n\t\t\tL.DomUtil.setTransform(proxy, this.project(c, z), this.getZoomScale(z, 1));\r\n\t\t}, this);\r\n\t},\r\n\r\n\t_catchTransitionEnd: function (e) {\r\n\t\tif (this._animatingZoom && e.propertyName.indexOf('transform') >= 0) {\r\n\t\t\tthis._onZoomTransitionEnd();\r\n\t\t}\r\n\t},\r\n\r\n\t_nothingToAnimate: function () {\r\n\t\treturn !this._container.getElementsByClassName('leaflet-zoom-animated').length;\r\n\t},\r\n\r\n\t_tryAnimatedZoom: function (center, zoom, options) {\r\n\r\n\t\tif (this._animatingZoom) { return true; }\r\n\r\n\t\toptions = options || {};\r\n\r\n\t\t// don't animate if disabled, not supported or zoom difference is too large\r\n\t\tif (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() ||\r\n\t\t        Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; }\r\n\r\n\t\t// offset is the pixel coords of the zoom origin relative to the current center\r\n\t\tvar scale = this.getZoomScale(zoom),\r\n\t\t    offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale);\r\n\r\n\t\t// don't animate if the zoom origin isn't within one screen from the current center, unless forced\r\n\t\tif (options.animate !== true && !this.getSize().contains(offset)) { return false; }\r\n\r\n\t\tL.Util.requestAnimFrame(function () {\r\n\t\t\tthis\r\n\t\t\t    ._moveStart(true)\r\n\t\t\t    ._animateZoom(center, zoom, true);\r\n\t\t}, this);\r\n\r\n\t\treturn true;\r\n\t},\r\n\r\n\t_animateZoom: function (center, zoom, startAnim, noUpdate) {\r\n\t\tif (startAnim) {\r\n\t\t\tthis._animatingZoom = true;\r\n\r\n\t\t\t// remember what center/zoom to set after animation\r\n\t\t\tthis._animateToCenter = center;\r\n\t\t\tthis._animateToZoom = zoom;\r\n\r\n\t\t\tL.DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim');\r\n\t\t}\r\n\r\n\t\t// @event zoomanim: ZoomAnimEvent\r\n\t\t// Fired on every frame of a zoom animation\r\n\t\tthis.fire('zoomanim', {\r\n\t\t\tcenter: center,\r\n\t\t\tzoom: zoom,\r\n\t\t\tnoUpdate: noUpdate\r\n\t\t});\r\n\r\n\t\t// Work around webkit not firing 'transitionend', see https://github.com/Leaflet/Leaflet/issues/3689, 2693\r\n\t\tsetTimeout(L.bind(this._onZoomTransitionEnd, this), 250);\r\n\t},\r\n\r\n\t_onZoomTransitionEnd: function () {\r\n\t\tif (!this._animatingZoom) { return; }\r\n\r\n\t\tL.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim');\r\n\r\n\t\tthis._animatingZoom = false;\r\n\r\n\t\tthis._move(this._animateToCenter, this._animateToZoom);\r\n\r\n\t\t// This anim frame should prevent an obscure iOS webkit tile loading race condition.\r\n\t\tL.Util.requestAnimFrame(function () {\r\n\t\t\tthis._moveEnd(true);\r\n\t\t}, this);\r\n\t}\r\n});\r\n\r\n// @section\r\n\r\n// @factory L.map(id: String, options?: Map options)\r\n// Instantiates a map object given the DOM ID of a `<div>` element\r\n// and optionally an object literal with `Map options`.\r\n//\r\n// @alternative\r\n// @factory L.map(el: HTMLElement, options?: Map options)\r\n// Instantiates a map object given an instance of a `<div>` HTML element\r\n// and optionally an object literal with `Map options`.\r\nL.map = function (id, options) {\r\n\treturn new L.Map(id, options);\r\n};\r\n\n\n\n\n/*\n * @class Layer\n * @inherits Evented\n * @aka L.Layer\n * @aka ILayer\n *\n * A set of methods from the Layer base class that all Leaflet layers use.\n * Inherits all methods, options and events from `L.Evented`.\n *\n * @example\n *\n * ```js\n * var layer = L.Marker(latlng).addTo(map);\n * layer.addTo(map);\n * layer.remove();\n * ```\n *\n * @event add: Event\n * Fired after the layer is added to a map\n *\n * @event remove: Event\n * Fired after the layer is removed from a map\n */\n\n\nL.Layer = L.Evented.extend({\n\n\t// Classes extending `L.Layer` will inherit the following options:\n\toptions: {\n\t\t// @option pane: String = 'overlayPane'\n\t\t// By default the layer will be added to the map's [overlay pane](#map-overlaypane). Overriding this option will cause the layer to be placed on another pane by default.\n\t\tpane: 'overlayPane',\n\t\tnonBubblingEvents: [],  // Array of events that should not be bubbled to DOM parents (like the map),\n\n\t\t// @option attribution: String = null\n\t\t// String to be shown in the attribution control, describes the layer data, e.g. \"© Mapbox\".\n\t\tattribution: null\n\t},\n\n\t/* @section\n\t * Classes extending `L.Layer` will inherit the following methods:\n\t *\n\t * @method addTo(map: Map): this\n\t * Adds the layer to the given map\n\t */\n\taddTo: function (map) {\n\t\tmap.addLayer(this);\n\t\treturn this;\n\t},\n\n\t// @method remove: this\n\t// Removes the layer from the map it is currently active on.\n\tremove: function () {\n\t\treturn this.removeFrom(this._map || this._mapToAdd);\n\t},\n\n\t// @method removeFrom(map: Map): this\n\t// Removes the layer from the given map\n\tremoveFrom: function (obj) {\n\t\tif (obj) {\n\t\t\tobj.removeLayer(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method getPane(name? : String): HTMLElement\n\t// Returns the `HTMLElement` representing the named pane on the map. If `name` is omitted, returns the pane for this layer.\n\tgetPane: function (name) {\n\t\treturn this._map.getPane(name ? (this.options[name] || name) : this.options.pane);\n\t},\n\n\taddInteractiveTarget: function (targetEl) {\n\t\tthis._map._targets[L.stamp(targetEl)] = this;\n\t\treturn this;\n\t},\n\n\tremoveInteractiveTarget: function (targetEl) {\n\t\tdelete this._map._targets[L.stamp(targetEl)];\n\t\treturn this;\n\t},\n\n\t// @method getAttribution: String\n\t// Used by the `attribution control`, returns the [attribution option](#gridlayer-attribution).\n\tgetAttribution: function () {\n\t\treturn this.options.attribution;\n\t},\n\n\t_layerAdd: function (e) {\n\t\tvar map = e.target;\n\n\t\t// check in case layer gets added and then removed before the map is ready\n\t\tif (!map.hasLayer(this)) { return; }\n\n\t\tthis._map = map;\n\t\tthis._zoomAnimated = map._zoomAnimated;\n\n\t\tif (this.getEvents) {\n\t\t\tvar events = this.getEvents();\n\t\t\tmap.on(events, this);\n\t\t\tthis.once('remove', function () {\n\t\t\t\tmap.off(events, this);\n\t\t\t}, this);\n\t\t}\n\n\t\tthis.onAdd(map);\n\n\t\tif (this.getAttribution && map.attributionControl) {\n\t\t\tmap.attributionControl.addAttribution(this.getAttribution());\n\t\t}\n\n\t\tthis.fire('add');\n\t\tmap.fire('layeradd', {layer: this});\n\t}\n});\n\n/* @section Extension methods\n * @uninheritable\n *\n * Every layer should extend from `L.Layer` and (re-)implement the following methods.\n *\n * @method onAdd(map: Map): this\n * Should contain code that creates DOM elements for the layer, adds them to `map panes` where they should belong and puts listeners on relevant map events. Called on [`map.addLayer(layer)`](#map-addlayer).\n *\n * @method onRemove(map: Map): this\n * Should contain all clean up code that removes the layer's elements from the DOM and removes listeners previously added in [`onAdd`](#layer-onadd). Called on [`map.removeLayer(layer)`](#map-removelayer).\n *\n * @method getEvents(): Object\n * This optional method should return an object like `{ viewreset: this._reset }` for [`addEventListener`](#evented-addeventlistener). The event handlers in this object will be automatically added and removed from the map with your layer.\n *\n * @method getAttribution(): String\n * This optional method should return a string containing HTML to be shown on the `Attribution control` whenever the layer is visible.\n *\n * @method beforeAdd(map: Map): this\n * Optional method. Called on [`map.addLayer(layer)`](#map-addlayer), before the layer is added to the map, before events are initialized, without waiting until the map is in a usable state. Use for early initialization only.\n */\n\n\n/* @namespace Map\n * @section Layer events\n *\n * @event layeradd: LayerEvent\n * Fired when a new layer is added to the map.\n *\n * @event layerremove: LayerEvent\n * Fired when some layer is removed from the map\n *\n * @section Methods for Layers and Controls\n */\nL.Map.include({\n\t// @method addLayer(layer: Layer): this\n\t// Adds the given layer to the map\n\taddLayer: function (layer) {\n\t\tvar id = L.stamp(layer);\n\t\tif (this._layers[id]) { return this; }\n\t\tthis._layers[id] = layer;\n\n\t\tlayer._mapToAdd = this;\n\n\t\tif (layer.beforeAdd) {\n\t\t\tlayer.beforeAdd(this);\n\t\t}\n\n\t\tthis.whenReady(layer._layerAdd, layer);\n\n\t\treturn this;\n\t},\n\n\t// @method removeLayer(layer: Layer): this\n\t// Removes the given layer from the map.\n\tremoveLayer: function (layer) {\n\t\tvar id = L.stamp(layer);\n\n\t\tif (!this._layers[id]) { return this; }\n\n\t\tif (this._loaded) {\n\t\t\tlayer.onRemove(this);\n\t\t}\n\n\t\tif (layer.getAttribution && this.attributionControl) {\n\t\t\tthis.attributionControl.removeAttribution(layer.getAttribution());\n\t\t}\n\n\t\tdelete this._layers[id];\n\n\t\tif (this._loaded) {\n\t\t\tthis.fire('layerremove', {layer: layer});\n\t\t\tlayer.fire('remove');\n\t\t}\n\n\t\tlayer._map = layer._mapToAdd = null;\n\n\t\treturn this;\n\t},\n\n\t// @method hasLayer(layer: Layer): Boolean\n\t// Returns `true` if the given layer is currently added to the map\n\thasLayer: function (layer) {\n\t\treturn !!layer && (L.stamp(layer) in this._layers);\n\t},\n\n\t/* @method eachLayer(fn: Function, context?: Object): this\n\t * Iterates over the layers of the map, optionally specifying context of the iterator function.\n\t * ```\n\t * map.eachLayer(function(layer){\n\t *     layer.bindPopup('Hello');\n\t * });\n\t * ```\n\t */\n\teachLayer: function (method, context) {\n\t\tfor (var i in this._layers) {\n\t\t\tmethod.call(context, this._layers[i]);\n\t\t}\n\t\treturn this;\n\t},\n\n\t_addLayers: function (layers) {\n\t\tlayers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : [];\n\n\t\tfor (var i = 0, len = layers.length; i < len; i++) {\n\t\t\tthis.addLayer(layers[i]);\n\t\t}\n\t},\n\n\t_addZoomLimit: function (layer) {\n\t\tif (isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom)) {\n\t\t\tthis._zoomBoundLayers[L.stamp(layer)] = layer;\n\t\t\tthis._updateZoomLevels();\n\t\t}\n\t},\n\n\t_removeZoomLimit: function (layer) {\n\t\tvar id = L.stamp(layer);\n\n\t\tif (this._zoomBoundLayers[id]) {\n\t\t\tdelete this._zoomBoundLayers[id];\n\t\t\tthis._updateZoomLevels();\n\t\t}\n\t},\n\n\t_updateZoomLevels: function () {\n\t\tvar minZoom = Infinity,\n\t\t    maxZoom = -Infinity,\n\t\t    oldZoomSpan = this._getZoomSpan();\n\n\t\tfor (var i in this._zoomBoundLayers) {\n\t\t\tvar options = this._zoomBoundLayers[i].options;\n\n\t\t\tminZoom = options.minZoom === undefined ? minZoom : Math.min(minZoom, options.minZoom);\n\t\t\tmaxZoom = options.maxZoom === undefined ? maxZoom : Math.max(maxZoom, options.maxZoom);\n\t\t}\n\n\t\tthis._layersMaxZoom = maxZoom === -Infinity ? undefined : maxZoom;\n\t\tthis._layersMinZoom = minZoom === Infinity ? undefined : minZoom;\n\n\t\t// @section Map state change events\n\t\t// @event zoomlevelschange: Event\n\t\t// Fired when the number of zoomlevels on the map is changed due\n\t\t// to adding or removing a layer.\n\t\tif (oldZoomSpan !== this._getZoomSpan()) {\n\t\t\tthis.fire('zoomlevelschange');\n\t\t}\n\n\t\tif (this.options.maxZoom === undefined && this._layersMaxZoom && this.getZoom() > this._layersMaxZoom) {\n\t\t\tthis.setZoom(this._layersMaxZoom);\n\t\t}\n\t\tif (this.options.minZoom === undefined && this._layersMinZoom && this.getZoom() < this._layersMinZoom) {\n\t\t\tthis.setZoom(this._layersMinZoom);\n\t\t}\n\t}\n});\n\n\n\n/*\r\n * @namespace DomEvent\r\n * Utility functions to work with the [DOM events](https://developer.mozilla.org/docs/Web/API/Event), used by Leaflet internally.\r\n */\r\n\r\n// Inspired by John Resig, Dean Edwards and YUI addEvent implementations.\r\n\r\n\r\n\r\nvar eventsKey = '_leaflet_events';\r\n\r\nL.DomEvent = {\r\n\r\n\t// @function on(el: HTMLElement, types: String, fn: Function, context?: Object): this\r\n\t// Adds a listener function (`fn`) to a particular DOM event type of the\r\n\t// element `el`. You can optionally specify the context of the listener\r\n\t// (object the `this` keyword will point to). You can also pass several\r\n\t// space-separated types (e.g. `'click dblclick'`).\r\n\r\n\t// @alternative\r\n\t// @function on(el: HTMLElement, eventMap: Object, context?: Object): this\r\n\t// Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`\r\n\ton: function (obj, types, fn, context) {\r\n\r\n\t\tif (typeof types === 'object') {\r\n\t\t\tfor (var type in types) {\r\n\t\t\t\tthis._on(obj, type, types[type], fn);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\ttypes = L.Util.splitWords(types);\r\n\r\n\t\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n\t\t\t\tthis._on(obj, types[i], fn, context);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @function off(el: HTMLElement, types: String, fn: Function, context?: Object): this\r\n\t// Removes a previously added listener function. If no function is specified,\r\n\t// it will remove all the listeners of that particular DOM event from the element.\r\n\t// Note that if you passed a custom context to on, you must pass the same\r\n\t// context to `off` in order to remove the listener.\r\n\r\n\t// @alternative\r\n\t// @function off(el: HTMLElement, eventMap: Object, context?: Object): this\r\n\t// Removes a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`\r\n\toff: function (obj, types, fn, context) {\r\n\r\n\t\tif (typeof types === 'object') {\r\n\t\t\tfor (var type in types) {\r\n\t\t\t\tthis._off(obj, type, types[type], fn);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\ttypes = L.Util.splitWords(types);\r\n\r\n\t\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n\t\t\t\tthis._off(obj, types[i], fn, context);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_on: function (obj, type, fn, context) {\r\n\t\tvar id = type + L.stamp(fn) + (context ? '_' + L.stamp(context) : '');\r\n\r\n\t\tif (obj[eventsKey] && obj[eventsKey][id]) { return this; }\r\n\r\n\t\tvar handler = function (e) {\r\n\t\t\treturn fn.call(context || obj, e || window.event);\r\n\t\t};\r\n\r\n\t\tvar originalHandler = handler;\r\n\r\n\t\tif (L.Browser.pointer && type.indexOf('touch') === 0) {\r\n\t\t\tthis.addPointerListener(obj, type, handler, id);\r\n\r\n\t\t} else if (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener &&\r\n\t\t           !(L.Browser.pointer && L.Browser.chrome)) {\r\n\t\t\t// Chrome >55 does not need the synthetic dblclicks from addDoubleTapListener\r\n\t\t\t// See #5180\r\n\t\t\tthis.addDoubleTapListener(obj, handler, id);\r\n\r\n\t\t} else if ('addEventListener' in obj) {\r\n\r\n\t\t\tif (type === 'mousewheel') {\r\n\t\t\t\tobj.addEventListener('onwheel' in obj ? 'wheel' : 'mousewheel', handler, false);\r\n\r\n\t\t\t} else if ((type === 'mouseenter') || (type === 'mouseleave')) {\r\n\t\t\t\thandler = function (e) {\r\n\t\t\t\t\te = e || window.event;\r\n\t\t\t\t\tif (L.DomEvent._isExternalTarget(obj, e)) {\r\n\t\t\t\t\t\toriginalHandler(e);\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\tobj.addEventListener(type === 'mouseenter' ? 'mouseover' : 'mouseout', handler, false);\r\n\r\n\t\t\t} else {\r\n\t\t\t\tif (type === 'click' && L.Browser.android) {\r\n\t\t\t\t\thandler = function (e) {\r\n\t\t\t\t\t\treturn L.DomEvent._filterClick(e, originalHandler);\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t\tobj.addEventListener(type, handler, false);\r\n\t\t\t}\r\n\r\n\t\t} else if ('attachEvent' in obj) {\r\n\t\t\tobj.attachEvent('on' + type, handler);\r\n\t\t}\r\n\r\n\t\tobj[eventsKey] = obj[eventsKey] || {};\r\n\t\tobj[eventsKey][id] = handler;\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_off: function (obj, type, fn, context) {\r\n\r\n\t\tvar id = type + L.stamp(fn) + (context ? '_' + L.stamp(context) : ''),\r\n\t\t    handler = obj[eventsKey] && obj[eventsKey][id];\r\n\r\n\t\tif (!handler) { return this; }\r\n\r\n\t\tif (L.Browser.pointer && type.indexOf('touch') === 0) {\r\n\t\t\tthis.removePointerListener(obj, type, id);\r\n\r\n\t\t} else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) {\r\n\t\t\tthis.removeDoubleTapListener(obj, id);\r\n\r\n\t\t} else if ('removeEventListener' in obj) {\r\n\r\n\t\t\tif (type === 'mousewheel') {\r\n\t\t\t\tobj.removeEventListener('onwheel' in obj ? 'wheel' : 'mousewheel', handler, false);\r\n\r\n\t\t\t} else {\r\n\t\t\t\tobj.removeEventListener(\r\n\t\t\t\t\ttype === 'mouseenter' ? 'mouseover' :\r\n\t\t\t\t\ttype === 'mouseleave' ? 'mouseout' : type, handler, false);\r\n\t\t\t}\r\n\r\n\t\t} else if ('detachEvent' in obj) {\r\n\t\t\tobj.detachEvent('on' + type, handler);\r\n\t\t}\r\n\r\n\t\tobj[eventsKey][id] = null;\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @function stopPropagation(ev: DOMEvent): this\r\n\t// Stop the given event from propagation to parent elements. Used inside the listener functions:\r\n\t// ```js\r\n\t// L.DomEvent.on(div, 'click', function (ev) {\r\n\t// \tL.DomEvent.stopPropagation(ev);\r\n\t// });\r\n\t// ```\r\n\tstopPropagation: function (e) {\r\n\r\n\t\tif (e.stopPropagation) {\r\n\t\t\te.stopPropagation();\r\n\t\t} else if (e.originalEvent) {  // In case of Leaflet event.\r\n\t\t\te.originalEvent._stopped = true;\r\n\t\t} else {\r\n\t\t\te.cancelBubble = true;\r\n\t\t}\r\n\t\tL.DomEvent._skipped(e);\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @function disableScrollPropagation(el: HTMLElement): this\r\n\t// Adds `stopPropagation` to the element's `'mousewheel'` events (plus browser variants).\r\n\tdisableScrollPropagation: function (el) {\r\n\t\treturn L.DomEvent.on(el, 'mousewheel', L.DomEvent.stopPropagation);\r\n\t},\r\n\r\n\t// @function disableClickPropagation(el: HTMLElement): this\r\n\t// Adds `stopPropagation` to the element's `'click'`, `'doubleclick'`,\r\n\t// `'mousedown'` and `'touchstart'` events (plus browser variants).\r\n\tdisableClickPropagation: function (el) {\r\n\t\tvar stop = L.DomEvent.stopPropagation;\r\n\r\n\t\tL.DomEvent.on(el, L.Draggable.START.join(' '), stop);\r\n\r\n\t\treturn L.DomEvent.on(el, {\r\n\t\t\tclick: L.DomEvent._fakeStop,\r\n\t\t\tdblclick: stop\r\n\t\t});\r\n\t},\r\n\r\n\t// @function preventDefault(ev: DOMEvent): this\r\n\t// Prevents the default action of the DOM Event `ev` from happening (such as\r\n\t// following a link in the href of the a element, or doing a POST request\r\n\t// with page reload when a `<form>` is submitted).\r\n\t// Use it inside listener functions.\r\n\tpreventDefault: function (e) {\r\n\r\n\t\tif (e.preventDefault) {\r\n\t\t\te.preventDefault();\r\n\t\t} else {\r\n\t\t\te.returnValue = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @function stop(ev): this\r\n\t// Does `stopPropagation` and `preventDefault` at the same time.\r\n\tstop: function (e) {\r\n\t\treturn L.DomEvent\r\n\t\t\t.preventDefault(e)\r\n\t\t\t.stopPropagation(e);\r\n\t},\r\n\r\n\t// @function getMousePosition(ev: DOMEvent, container?: HTMLElement): Point\r\n\t// Gets normalized mouse position from a DOM event relative to the\r\n\t// `container` or to the whole page if not specified.\r\n\tgetMousePosition: function (e, container) {\r\n\t\tif (!container) {\r\n\t\t\treturn new L.Point(e.clientX, e.clientY);\r\n\t\t}\r\n\r\n\t\tvar rect = container.getBoundingClientRect();\r\n\r\n\t\treturn new L.Point(\r\n\t\t\te.clientX - rect.left - container.clientLeft,\r\n\t\t\te.clientY - rect.top - container.clientTop);\r\n\t},\r\n\r\n\t// Chrome on Win scrolls double the pixels as in other platforms (see #4538),\r\n\t// and Firefox scrolls device pixels, not CSS pixels\r\n\t_wheelPxFactor: (L.Browser.win && L.Browser.chrome) ? 2 :\r\n\t                L.Browser.gecko ? window.devicePixelRatio :\r\n\t                1,\r\n\r\n\t// @function getWheelDelta(ev: DOMEvent): Number\r\n\t// Gets normalized wheel delta from a mousewheel DOM event, in vertical\r\n\t// pixels scrolled (negative if scrolling down).\r\n\t// Events from pointing devices without precise scrolling are mapped to\r\n\t// a best guess of 60 pixels.\r\n\tgetWheelDelta: function (e) {\r\n\t\treturn (L.Browser.edge) ? e.wheelDeltaY / 2 : // Don't trust window-geometry-based delta\r\n\t\t       (e.deltaY && e.deltaMode === 0) ? -e.deltaY / L.DomEvent._wheelPxFactor : // Pixels\r\n\t\t       (e.deltaY && e.deltaMode === 1) ? -e.deltaY * 20 : // Lines\r\n\t\t       (e.deltaY && e.deltaMode === 2) ? -e.deltaY * 60 : // Pages\r\n\t\t       (e.deltaX || e.deltaZ) ? 0 :\t// Skip horizontal/depth wheel events\r\n\t\t       e.wheelDelta ? (e.wheelDeltaY || e.wheelDelta) / 2 : // Legacy IE pixels\r\n\t\t       (e.detail && Math.abs(e.detail) < 32765) ? -e.detail * 20 : // Legacy Moz lines\r\n\t\t       e.detail ? e.detail / -32765 * 60 : // Legacy Moz pages\r\n\t\t       0;\r\n\t},\r\n\r\n\t_skipEvents: {},\r\n\r\n\t_fakeStop: function (e) {\r\n\t\t// fakes stopPropagation by setting a special event flag, checked/reset with L.DomEvent._skipped(e)\r\n\t\tL.DomEvent._skipEvents[e.type] = true;\r\n\t},\r\n\r\n\t_skipped: function (e) {\r\n\t\tvar skipped = this._skipEvents[e.type];\r\n\t\t// reset when checking, as it's only used in map container and propagates outside of the map\r\n\t\tthis._skipEvents[e.type] = false;\r\n\t\treturn skipped;\r\n\t},\r\n\r\n\t// check if element really left/entered the event target (for mouseenter/mouseleave)\r\n\t_isExternalTarget: function (el, e) {\r\n\r\n\t\tvar related = e.relatedTarget;\r\n\r\n\t\tif (!related) { return true; }\r\n\r\n\t\ttry {\r\n\t\t\twhile (related && (related !== el)) {\r\n\t\t\t\trelated = related.parentNode;\r\n\t\t\t}\r\n\t\t} catch (err) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn (related !== el);\r\n\t},\r\n\r\n\t// this is a horrible workaround for a bug in Android where a single touch triggers two click events\r\n\t_filterClick: function (e, handler) {\r\n\t\tvar timeStamp = (e.timeStamp || (e.originalEvent && e.originalEvent.timeStamp)),\r\n\t\t    elapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick);\r\n\r\n\t\t// are they closer together than 500ms yet more than 100ms?\r\n\t\t// Android typically triggers them ~300ms apart while multiple listeners\r\n\t\t// on the same event should be triggered far faster;\r\n\t\t// or check if click is simulated on the element, and if it is, reject any non-simulated events\r\n\r\n\t\tif ((elapsed && elapsed > 100 && elapsed < 500) || (e.target._simulatedClick && !e._simulated)) {\r\n\t\t\tL.DomEvent.stop(e);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tL.DomEvent._lastClick = timeStamp;\r\n\r\n\t\thandler(e);\r\n\t}\r\n};\r\n\r\n// @function addListener(…): this\r\n// Alias to [`L.DomEvent.on`](#domevent-on)\r\nL.DomEvent.addListener = L.DomEvent.on;\r\n\r\n// @function removeListener(…): this\r\n// Alias to [`L.DomEvent.off`](#domevent-off)\r\nL.DomEvent.removeListener = L.DomEvent.off;\r\n\n\n\n/*\n * @class PosAnimation\n * @aka L.PosAnimation\n * @inherits Evented\n * Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9.\n *\n * @example\n * ```js\n * var fx = new L.PosAnimation();\n * fx.run(el, [300, 500], 0.5);\n * ```\n *\n * @constructor L.PosAnimation()\n * Creates a `PosAnimation` object.\n *\n */\n\nL.PosAnimation = L.Evented.extend({\n\n\t// @method run(el: HTMLElement, newPos: Point, duration?: Number, easeLinearity?: Number)\n\t// Run an animation of a given element to a new position, optionally setting\n\t// duration in seconds (`0.25` by default) and easing linearity factor (3rd\n\t// argument of the [cubic bezier curve](http://cubic-bezier.com/#0,0,.5,1),\n\t// `0.5` by default).\n\trun: function (el, newPos, duration, easeLinearity) {\n\t\tthis.stop();\n\n\t\tthis._el = el;\n\t\tthis._inProgress = true;\n\t\tthis._duration = duration || 0.25;\n\t\tthis._easeOutPower = 1 / Math.max(easeLinearity || 0.5, 0.2);\n\n\t\tthis._startPos = L.DomUtil.getPosition(el);\n\t\tthis._offset = newPos.subtract(this._startPos);\n\t\tthis._startTime = +new Date();\n\n\t\t// @event start: Event\n\t\t// Fired when the animation starts\n\t\tthis.fire('start');\n\n\t\tthis._animate();\n\t},\n\n\t// @method stop()\n\t// Stops the animation (if currently running).\n\tstop: function () {\n\t\tif (!this._inProgress) { return; }\n\n\t\tthis._step(true);\n\t\tthis._complete();\n\t},\n\n\t_animate: function () {\n\t\t// animation loop\n\t\tthis._animId = L.Util.requestAnimFrame(this._animate, this);\n\t\tthis._step();\n\t},\n\n\t_step: function (round) {\n\t\tvar elapsed = (+new Date()) - this._startTime,\n\t\t    duration = this._duration * 1000;\n\n\t\tif (elapsed < duration) {\n\t\t\tthis._runFrame(this._easeOut(elapsed / duration), round);\n\t\t} else {\n\t\t\tthis._runFrame(1);\n\t\t\tthis._complete();\n\t\t}\n\t},\n\n\t_runFrame: function (progress, round) {\n\t\tvar pos = this._startPos.add(this._offset.multiplyBy(progress));\n\t\tif (round) {\n\t\t\tpos._round();\n\t\t}\n\t\tL.DomUtil.setPosition(this._el, pos);\n\n\t\t// @event step: Event\n\t\t// Fired continuously during the animation.\n\t\tthis.fire('step');\n\t},\n\n\t_complete: function () {\n\t\tL.Util.cancelAnimFrame(this._animId);\n\n\t\tthis._inProgress = false;\n\t\t// @event end: Event\n\t\t// Fired when the animation ends.\n\t\tthis.fire('end');\n\t},\n\n\t_easeOut: function (t) {\n\t\treturn 1 - Math.pow(1 - t, this._easeOutPower);\n\t}\n});\n\n\n\n/*\r\n * @namespace Projection\r\n * @projection L.Projection.Mercator\r\n *\r\n * Elliptical Mercator projection — more complex than Spherical Mercator. Takes into account that Earth is a geoid, not a perfect sphere. Used by the EPSG:3395 CRS.\r\n */\r\n\r\nL.Projection.Mercator = {\r\n\tR: 6378137,\r\n\tR_MINOR: 6356752.314245179,\r\n\r\n\tbounds: L.bounds([-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]),\r\n\r\n\tproject: function (latlng) {\r\n\t\tvar d = Math.PI / 180,\r\n\t\t    r = this.R,\r\n\t\t    y = latlng.lat * d,\r\n\t\t    tmp = this.R_MINOR / r,\r\n\t\t    e = Math.sqrt(1 - tmp * tmp),\r\n\t\t    con = e * Math.sin(y);\r\n\r\n\t\tvar ts = Math.tan(Math.PI / 4 - y / 2) / Math.pow((1 - con) / (1 + con), e / 2);\r\n\t\ty = -r * Math.log(Math.max(ts, 1E-10));\r\n\r\n\t\treturn new L.Point(latlng.lng * d * r, y);\r\n\t},\r\n\r\n\tunproject: function (point) {\r\n\t\tvar d = 180 / Math.PI,\r\n\t\t    r = this.R,\r\n\t\t    tmp = this.R_MINOR / r,\r\n\t\t    e = Math.sqrt(1 - tmp * tmp),\r\n\t\t    ts = Math.exp(-point.y / r),\r\n\t\t    phi = Math.PI / 2 - 2 * Math.atan(ts);\r\n\r\n\t\tfor (var i = 0, dphi = 0.1, con; i < 15 && Math.abs(dphi) > 1e-7; i++) {\r\n\t\t\tcon = e * Math.sin(phi);\r\n\t\t\tcon = Math.pow((1 - con) / (1 + con), e / 2);\r\n\t\t\tdphi = Math.PI / 2 - 2 * Math.atan(ts * con) - phi;\r\n\t\t\tphi += dphi;\r\n\t\t}\r\n\r\n\t\treturn new L.LatLng(phi * d, point.x * d / r);\r\n\t}\r\n};\r\n\n\n\n/*\r\n * @namespace CRS\r\n * @crs L.CRS.EPSG3395\r\n *\r\n * Rarely used by some commercial tile providers. Uses Elliptical Mercator projection.\r\n */\r\n\r\nL.CRS.EPSG3395 = L.extend({}, L.CRS.Earth, {\r\n\tcode: 'EPSG:3395',\r\n\tprojection: L.Projection.Mercator,\r\n\r\n\ttransformation: (function () {\r\n\t\tvar scale = 0.5 / (Math.PI * L.Projection.Mercator.R);\r\n\t\treturn new L.Transformation(scale, 0.5, -scale, 0.5);\r\n\t}())\r\n});\r\n\n\n\n/*\n * @class GridLayer\n * @inherits Layer\n * @aka L.GridLayer\n *\n * Generic class for handling a tiled grid of HTML elements. This is the base class for all tile layers and replaces `TileLayer.Canvas`.\n * GridLayer can be extended to create a tiled grid of HTML elements like `<canvas>`, `<img>` or `<div>`. GridLayer will handle creating and animating these DOM elements for you.\n *\n *\n * @section Synchronous usage\n * @example\n *\n * To create a custom layer, extend GridLayer and implement the `createTile()` method, which will be passed a `Point` object with the `x`, `y`, and `z` (zoom level) coordinates to draw your tile.\n *\n * ```js\n * var CanvasLayer = L.GridLayer.extend({\n *     createTile: function(coords){\n *         // create a <canvas> element for drawing\n *         var tile = L.DomUtil.create('canvas', 'leaflet-tile');\n *\n *         // setup tile width and height according to the options\n *         var size = this.getTileSize();\n *         tile.width = size.x;\n *         tile.height = size.y;\n *\n *         // get a canvas context and draw something on it using coords.x, coords.y and coords.z\n *         var ctx = tile.getContext('2d');\n *\n *         // return the tile so it can be rendered on screen\n *         return tile;\n *     }\n * });\n * ```\n *\n * @section Asynchronous usage\n * @example\n *\n * Tile creation can also be asynchronous, this is useful when using a third-party drawing library. Once the tile is finished drawing it can be passed to the `done()` callback.\n *\n * ```js\n * var CanvasLayer = L.GridLayer.extend({\n *     createTile: function(coords, done){\n *         var error;\n *\n *         // create a <canvas> element for drawing\n *         var tile = L.DomUtil.create('canvas', 'leaflet-tile');\n *\n *         // setup tile width and height according to the options\n *         var size = this.getTileSize();\n *         tile.width = size.x;\n *         tile.height = size.y;\n *\n *         // draw something asynchronously and pass the tile to the done() callback\n *         setTimeout(function() {\n *             done(error, tile);\n *         }, 1000);\n *\n *         return tile;\n *     }\n * });\n * ```\n *\n * @section\n */\n\n\nL.GridLayer = L.Layer.extend({\n\n\t// @section\n\t// @aka GridLayer options\n\toptions: {\n\t\t// @option tileSize: Number|Point = 256\n\t\t// Width and height of tiles in the grid. Use a number if width and height are equal, or `L.point(width, height)` otherwise.\n\t\ttileSize: 256,\n\n\t\t// @option opacity: Number = 1.0\n\t\t// Opacity of the tiles. Can be used in the `createTile()` function.\n\t\topacity: 1,\n\n\t\t// @option updateWhenIdle: Boolean = depends\n\t\t// If `false`, new tiles are loaded during panning, otherwise only after it (for better performance). `true` by default on mobile browsers, otherwise `false`.\n\t\tupdateWhenIdle: L.Browser.mobile,\n\n\t\t// @option updateWhenZooming: Boolean = true\n\t\t// By default, a smooth zoom animation (during a [touch zoom](#map-touchzoom) or a [`flyTo()`](#map-flyto)) will update grid layers every integer zoom level. Setting this option to `false` will update the grid layer only when the smooth animation ends.\n\t\tupdateWhenZooming: true,\n\n\t\t// @option updateInterval: Number = 200\n\t\t// Tiles will not update more than once every `updateInterval` milliseconds when panning.\n\t\tupdateInterval: 200,\n\n\t\t// @option zIndex: Number = 1\n\t\t// The explicit zIndex of the tile layer.\n\t\tzIndex: 1,\n\n\t\t// @option bounds: LatLngBounds = undefined\n\t\t// If set, tiles will only be loaded inside the set `LatLngBounds`.\n\t\tbounds: null,\n\n\t\t// @option minZoom: Number = 0\n\t\t// The minimum zoom level that tiles will be loaded at. By default the entire map.\n\t\tminZoom: 0,\n\n\t\t// @option maxZoom: Number = undefined\n\t\t// The maximum zoom level that tiles will be loaded at.\n\t\tmaxZoom: undefined,\n\n\t\t// @option noWrap: Boolean = false\n\t\t// Whether the layer is wrapped around the antimeridian. If `true`, the\n\t\t// GridLayer will only be displayed once at low zoom levels. Has no\n\t\t// effect when the [map CRS](#map-crs) doesn't wrap around. Can be used\n\t\t// in combination with [`bounds`](#gridlayer-bounds) to prevent requesting\n\t\t// tiles outside the CRS limits.\n\t\tnoWrap: false,\n\n\t\t// @option pane: String = 'tilePane'\n\t\t// `Map pane` where the grid layer will be added.\n\t\tpane: 'tilePane',\n\n\t\t// @option className: String = ''\n\t\t// A custom class name to assign to the tile layer. Empty by default.\n\t\tclassName: '',\n\n\t\t// @option keepBuffer: Number = 2\n\t\t// When panning the map, keep this many rows and columns of tiles before unloading them.\n\t\tkeepBuffer: 2\n\t},\n\n\tinitialize: function (options) {\n\t\tL.setOptions(this, options);\n\t},\n\n\tonAdd: function () {\n\t\tthis._initContainer();\n\n\t\tthis._levels = {};\n\t\tthis._tiles = {};\n\n\t\tthis._resetView();\n\t\tthis._update();\n\t},\n\n\tbeforeAdd: function (map) {\n\t\tmap._addZoomLimit(this);\n\t},\n\n\tonRemove: function (map) {\n\t\tthis._removeAllTiles();\n\t\tL.DomUtil.remove(this._container);\n\t\tmap._removeZoomLimit(this);\n\t\tthis._container = null;\n\t\tthis._tileZoom = null;\n\t},\n\n\t// @method bringToFront: this\n\t// Brings the tile layer to the top of all tile layers.\n\tbringToFront: function () {\n\t\tif (this._map) {\n\t\t\tL.DomUtil.toFront(this._container);\n\t\t\tthis._setAutoZIndex(Math.max);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method bringToBack: this\n\t// Brings the tile layer to the bottom of all tile layers.\n\tbringToBack: function () {\n\t\tif (this._map) {\n\t\t\tL.DomUtil.toBack(this._container);\n\t\t\tthis._setAutoZIndex(Math.min);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method getContainer: HTMLElement\n\t// Returns the HTML element that contains the tiles for this layer.\n\tgetContainer: function () {\n\t\treturn this._container;\n\t},\n\n\t// @method setOpacity(opacity: Number): this\n\t// Changes the [opacity](#gridlayer-opacity) of the grid layer.\n\tsetOpacity: function (opacity) {\n\t\tthis.options.opacity = opacity;\n\t\tthis._updateOpacity();\n\t\treturn this;\n\t},\n\n\t// @method setZIndex(zIndex: Number): this\n\t// Changes the [zIndex](#gridlayer-zindex) of the grid layer.\n\tsetZIndex: function (zIndex) {\n\t\tthis.options.zIndex = zIndex;\n\t\tthis._updateZIndex();\n\n\t\treturn this;\n\t},\n\n\t// @method isLoading: Boolean\n\t// Returns `true` if any tile in the grid layer has not finished loading.\n\tisLoading: function () {\n\t\treturn this._loading;\n\t},\n\n\t// @method redraw: this\n\t// Causes the layer to clear all the tiles and request them again.\n\tredraw: function () {\n\t\tif (this._map) {\n\t\t\tthis._removeAllTiles();\n\t\t\tthis._update();\n\t\t}\n\t\treturn this;\n\t},\n\n\tgetEvents: function () {\n\t\tvar events = {\n\t\t\tviewprereset: this._invalidateAll,\n\t\t\tviewreset: this._resetView,\n\t\t\tzoom: this._resetView,\n\t\t\tmoveend: this._onMoveEnd\n\t\t};\n\n\t\tif (!this.options.updateWhenIdle) {\n\t\t\t// update tiles on move, but not more often than once per given interval\n\t\t\tif (!this._onMove) {\n\t\t\t\tthis._onMove = L.Util.throttle(this._onMoveEnd, this.options.updateInterval, this);\n\t\t\t}\n\n\t\t\tevents.move = this._onMove;\n\t\t}\n\n\t\tif (this._zoomAnimated) {\n\t\t\tevents.zoomanim = this._animateZoom;\n\t\t}\n\n\t\treturn events;\n\t},\n\n\t// @section Extension methods\n\t// Layers extending `GridLayer` shall reimplement the following method.\n\t// @method createTile(coords: Object, done?: Function): HTMLElement\n\t// Called only internally, must be overriden by classes extending `GridLayer`.\n\t// Returns the `HTMLElement` corresponding to the given `coords`. If the `done` callback\n\t// is specified, it must be called when the tile has finished loading and drawing.\n\tcreateTile: function () {\n\t\treturn document.createElement('div');\n\t},\n\n\t// @section\n\t// @method getTileSize: Point\n\t// Normalizes the [tileSize option](#gridlayer-tilesize) into a point. Used by the `createTile()` method.\n\tgetTileSize: function () {\n\t\tvar s = this.options.tileSize;\n\t\treturn s instanceof L.Point ? s : new L.Point(s, s);\n\t},\n\n\t_updateZIndex: function () {\n\t\tif (this._container && this.options.zIndex !== undefined && this.options.zIndex !== null) {\n\t\t\tthis._container.style.zIndex = this.options.zIndex;\n\t\t}\n\t},\n\n\t_setAutoZIndex: function (compare) {\n\t\t// go through all other layers of the same pane, set zIndex to max + 1 (front) or min - 1 (back)\n\n\t\tvar layers = this.getPane().children,\n\t\t    edgeZIndex = -compare(-Infinity, Infinity); // -Infinity for max, Infinity for min\n\n\t\tfor (var i = 0, len = layers.length, zIndex; i < len; i++) {\n\n\t\t\tzIndex = layers[i].style.zIndex;\n\n\t\t\tif (layers[i] !== this._container && zIndex) {\n\t\t\t\tedgeZIndex = compare(edgeZIndex, +zIndex);\n\t\t\t}\n\t\t}\n\n\t\tif (isFinite(edgeZIndex)) {\n\t\t\tthis.options.zIndex = edgeZIndex + compare(-1, 1);\n\t\t\tthis._updateZIndex();\n\t\t}\n\t},\n\n\t_updateOpacity: function () {\n\t\tif (!this._map) { return; }\n\n\t\t// IE doesn't inherit filter opacity properly, so we're forced to set it on tiles\n\t\tif (L.Browser.ielt9) { return; }\n\n\t\tL.DomUtil.setOpacity(this._container, this.options.opacity);\n\n\t\tvar now = +new Date(),\n\t\t    nextFrame = false,\n\t\t    willPrune = false;\n\n\t\tfor (var key in this._tiles) {\n\t\t\tvar tile = this._tiles[key];\n\t\t\tif (!tile.current || !tile.loaded) { continue; }\n\n\t\t\tvar fade = Math.min(1, (now - tile.loaded) / 200);\n\n\t\t\tL.DomUtil.setOpacity(tile.el, fade);\n\t\t\tif (fade < 1) {\n\t\t\t\tnextFrame = true;\n\t\t\t} else {\n\t\t\t\tif (tile.active) { willPrune = true; }\n\t\t\t\ttile.active = true;\n\t\t\t}\n\t\t}\n\n\t\tif (willPrune && !this._noPrune) { this._pruneTiles(); }\n\n\t\tif (nextFrame) {\n\t\t\tL.Util.cancelAnimFrame(this._fadeFrame);\n\t\t\tthis._fadeFrame = L.Util.requestAnimFrame(this._updateOpacity, this);\n\t\t}\n\t},\n\n\t_initContainer: function () {\n\t\tif (this._container) { return; }\n\n\t\tthis._container = L.DomUtil.create('div', 'leaflet-layer ' + (this.options.className || ''));\n\t\tthis._updateZIndex();\n\n\t\tif (this.options.opacity < 1) {\n\t\t\tthis._updateOpacity();\n\t\t}\n\n\t\tthis.getPane().appendChild(this._container);\n\t},\n\n\t_updateLevels: function () {\n\n\t\tvar zoom = this._tileZoom,\n\t\t    maxZoom = this.options.maxZoom;\n\n\t\tif (zoom === undefined) { return undefined; }\n\n\t\tfor (var z in this._levels) {\n\t\t\tif (this._levels[z].el.children.length || z === zoom) {\n\t\t\t\tthis._levels[z].el.style.zIndex = maxZoom - Math.abs(zoom - z);\n\t\t\t} else {\n\t\t\t\tL.DomUtil.remove(this._levels[z].el);\n\t\t\t\tthis._removeTilesAtZoom(z);\n\t\t\t\tdelete this._levels[z];\n\t\t\t}\n\t\t}\n\n\t\tvar level = this._levels[zoom],\n\t\t    map = this._map;\n\n\t\tif (!level) {\n\t\t\tlevel = this._levels[zoom] = {};\n\n\t\t\tlevel.el = L.DomUtil.create('div', 'leaflet-tile-container leaflet-zoom-animated', this._container);\n\t\t\tlevel.el.style.zIndex = maxZoom;\n\n\t\t\tlevel.origin = map.project(map.unproject(map.getPixelOrigin()), zoom).round();\n\t\t\tlevel.zoom = zoom;\n\n\t\t\tthis._setZoomTransform(level, map.getCenter(), map.getZoom());\n\n\t\t\t// force the browser to consider the newly added element for transition\n\t\t\tL.Util.falseFn(level.el.offsetWidth);\n\t\t}\n\n\t\tthis._level = level;\n\n\t\treturn level;\n\t},\n\n\t_pruneTiles: function () {\n\t\tif (!this._map) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar key, tile;\n\n\t\tvar zoom = this._map.getZoom();\n\t\tif (zoom > this.options.maxZoom ||\n\t\t\tzoom < this.options.minZoom) {\n\t\t\tthis._removeAllTiles();\n\t\t\treturn;\n\t\t}\n\n\t\tfor (key in this._tiles) {\n\t\t\ttile = this._tiles[key];\n\t\t\ttile.retain = tile.current;\n\t\t}\n\n\t\tfor (key in this._tiles) {\n\t\t\ttile = this._tiles[key];\n\t\t\tif (tile.current && !tile.active) {\n\t\t\t\tvar coords = tile.coords;\n\t\t\t\tif (!this._retainParent(coords.x, coords.y, coords.z, coords.z - 5)) {\n\t\t\t\t\tthis._retainChildren(coords.x, coords.y, coords.z, coords.z + 2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (key in this._tiles) {\n\t\t\tif (!this._tiles[key].retain) {\n\t\t\t\tthis._removeTile(key);\n\t\t\t}\n\t\t}\n\t},\n\n\t_removeTilesAtZoom: function (zoom) {\n\t\tfor (var key in this._tiles) {\n\t\t\tif (this._tiles[key].coords.z !== zoom) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis._removeTile(key);\n\t\t}\n\t},\n\n\t_removeAllTiles: function () {\n\t\tfor (var key in this._tiles) {\n\t\t\tthis._removeTile(key);\n\t\t}\n\t},\n\n\t_invalidateAll: function () {\n\t\tfor (var z in this._levels) {\n\t\t\tL.DomUtil.remove(this._levels[z].el);\n\t\t\tdelete this._levels[z];\n\t\t}\n\t\tthis._removeAllTiles();\n\n\t\tthis._tileZoom = null;\n\t},\n\n\t_retainParent: function (x, y, z, minZoom) {\n\t\tvar x2 = Math.floor(x / 2),\n\t\t    y2 = Math.floor(y / 2),\n\t\t    z2 = z - 1,\n\t\t    coords2 = new L.Point(+x2, +y2);\n\t\tcoords2.z = +z2;\n\n\t\tvar key = this._tileCoordsToKey(coords2),\n\t\t    tile = this._tiles[key];\n\n\t\tif (tile && tile.active) {\n\t\t\ttile.retain = true;\n\t\t\treturn true;\n\n\t\t} else if (tile && tile.loaded) {\n\t\t\ttile.retain = true;\n\t\t}\n\n\t\tif (z2 > minZoom) {\n\t\t\treturn this._retainParent(x2, y2, z2, minZoom);\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_retainChildren: function (x, y, z, maxZoom) {\n\n\t\tfor (var i = 2 * x; i < 2 * x + 2; i++) {\n\t\t\tfor (var j = 2 * y; j < 2 * y + 2; j++) {\n\n\t\t\t\tvar coords = new L.Point(i, j);\n\t\t\t\tcoords.z = z + 1;\n\n\t\t\t\tvar key = this._tileCoordsToKey(coords),\n\t\t\t\t    tile = this._tiles[key];\n\n\t\t\t\tif (tile && tile.active) {\n\t\t\t\t\ttile.retain = true;\n\t\t\t\t\tcontinue;\n\n\t\t\t\t} else if (tile && tile.loaded) {\n\t\t\t\t\ttile.retain = true;\n\t\t\t\t}\n\n\t\t\t\tif (z + 1 < maxZoom) {\n\t\t\t\t\tthis._retainChildren(i, j, z + 1, maxZoom);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t_resetView: function (e) {\n\t\tvar animating = e && (e.pinch || e.flyTo);\n\t\tthis._setView(this._map.getCenter(), this._map.getZoom(), animating, animating);\n\t},\n\n\t_animateZoom: function (e) {\n\t\tthis._setView(e.center, e.zoom, true, e.noUpdate);\n\t},\n\n\t_setView: function (center, zoom, noPrune, noUpdate) {\n\t\tvar tileZoom = Math.round(zoom);\n\t\tif ((this.options.maxZoom !== undefined && tileZoom > this.options.maxZoom) ||\n\t\t    (this.options.minZoom !== undefined && tileZoom < this.options.minZoom)) {\n\t\t\ttileZoom = undefined;\n\t\t}\n\n\t\tvar tileZoomChanged = this.options.updateWhenZooming && (tileZoom !== this._tileZoom);\n\n\t\tif (!noUpdate || tileZoomChanged) {\n\n\t\t\tthis._tileZoom = tileZoom;\n\n\t\t\tif (this._abortLoading) {\n\t\t\t\tthis._abortLoading();\n\t\t\t}\n\n\t\t\tthis._updateLevels();\n\t\t\tthis._resetGrid();\n\n\t\t\tif (tileZoom !== undefined) {\n\t\t\t\tthis._update(center);\n\t\t\t}\n\n\t\t\tif (!noPrune) {\n\t\t\t\tthis._pruneTiles();\n\t\t\t}\n\n\t\t\t// Flag to prevent _updateOpacity from pruning tiles during\n\t\t\t// a zoom anim or a pinch gesture\n\t\t\tthis._noPrune = !!noPrune;\n\t\t}\n\n\t\tthis._setZoomTransforms(center, zoom);\n\t},\n\n\t_setZoomTransforms: function (center, zoom) {\n\t\tfor (var i in this._levels) {\n\t\t\tthis._setZoomTransform(this._levels[i], center, zoom);\n\t\t}\n\t},\n\n\t_setZoomTransform: function (level, center, zoom) {\n\t\tvar scale = this._map.getZoomScale(zoom, level.zoom),\n\t\t    translate = level.origin.multiplyBy(scale)\n\t\t        .subtract(this._map._getNewPixelOrigin(center, zoom)).round();\n\n\t\tif (L.Browser.any3d) {\n\t\t\tL.DomUtil.setTransform(level.el, translate, scale);\n\t\t} else {\n\t\t\tL.DomUtil.setPosition(level.el, translate);\n\t\t}\n\t},\n\n\t_resetGrid: function () {\n\t\tvar map = this._map,\n\t\t    crs = map.options.crs,\n\t\t    tileSize = this._tileSize = this.getTileSize(),\n\t\t    tileZoom = this._tileZoom;\n\n\t\tvar bounds = this._map.getPixelWorldBounds(this._tileZoom);\n\t\tif (bounds) {\n\t\t\tthis._globalTileRange = this._pxBoundsToTileRange(bounds);\n\t\t}\n\n\t\tthis._wrapX = crs.wrapLng && !this.options.noWrap && [\n\t\t\tMath.floor(map.project([0, crs.wrapLng[0]], tileZoom).x / tileSize.x),\n\t\t\tMath.ceil(map.project([0, crs.wrapLng[1]], tileZoom).x / tileSize.y)\n\t\t];\n\t\tthis._wrapY = crs.wrapLat && !this.options.noWrap && [\n\t\t\tMath.floor(map.project([crs.wrapLat[0], 0], tileZoom).y / tileSize.x),\n\t\t\tMath.ceil(map.project([crs.wrapLat[1], 0], tileZoom).y / tileSize.y)\n\t\t];\n\t},\n\n\t_onMoveEnd: function () {\n\t\tif (!this._map || this._map._animatingZoom) { return; }\n\n\t\tthis._update();\n\t},\n\n\t_getTiledPixelBounds: function (center) {\n\t\tvar map = this._map,\n\t\t    mapZoom = map._animatingZoom ? Math.max(map._animateToZoom, map.getZoom()) : map.getZoom(),\n\t\t    scale = map.getZoomScale(mapZoom, this._tileZoom),\n\t\t    pixelCenter = map.project(center, this._tileZoom).floor(),\n\t\t    halfSize = map.getSize().divideBy(scale * 2);\n\n\t\treturn new L.Bounds(pixelCenter.subtract(halfSize), pixelCenter.add(halfSize));\n\t},\n\n\t// Private method to load tiles in the grid's active zoom level according to map bounds\n\t_update: function (center) {\n\t\tvar map = this._map;\n\t\tif (!map) { return; }\n\t\tvar zoom = map.getZoom();\n\n\t\tif (center === undefined) { center = map.getCenter(); }\n\t\tif (this._tileZoom === undefined) { return; }\t// if out of minzoom/maxzoom\n\n\t\tvar pixelBounds = this._getTiledPixelBounds(center),\n\t\t    tileRange = this._pxBoundsToTileRange(pixelBounds),\n\t\t    tileCenter = tileRange.getCenter(),\n\t\t    queue = [],\n\t\t    margin = this.options.keepBuffer,\n\t\t    noPruneRange = new L.Bounds(tileRange.getBottomLeft().subtract([margin, -margin]),\n\t\t                              tileRange.getTopRight().add([margin, -margin]));\n\n\t\tfor (var key in this._tiles) {\n\t\t\tvar c = this._tiles[key].coords;\n\t\t\tif (c.z !== this._tileZoom || !noPruneRange.contains(L.point(c.x, c.y))) {\n\t\t\t\tthis._tiles[key].current = false;\n\t\t\t}\n\t\t}\n\n\t\t// _update just loads more tiles. If the tile zoom level differs too much\n\t\t// from the map's, let _setView reset levels and prune old tiles.\n\t\tif (Math.abs(zoom - this._tileZoom) > 1) { this._setView(center, zoom); return; }\n\n\t\t// create a queue of coordinates to load tiles from\n\t\tfor (var j = tileRange.min.y; j <= tileRange.max.y; j++) {\n\t\t\tfor (var i = tileRange.min.x; i <= tileRange.max.x; i++) {\n\t\t\t\tvar coords = new L.Point(i, j);\n\t\t\t\tcoords.z = this._tileZoom;\n\n\t\t\t\tif (!this._isValidTile(coords)) { continue; }\n\n\t\t\t\tvar tile = this._tiles[this._tileCoordsToKey(coords)];\n\t\t\t\tif (tile) {\n\t\t\t\t\ttile.current = true;\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push(coords);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// sort tile queue to load tiles in order of their distance to center\n\t\tqueue.sort(function (a, b) {\n\t\t\treturn a.distanceTo(tileCenter) - b.distanceTo(tileCenter);\n\t\t});\n\n\t\tif (queue.length !== 0) {\n\t\t\t// if it's the first batch of tiles to load\n\t\t\tif (!this._loading) {\n\t\t\t\tthis._loading = true;\n\t\t\t\t// @event loading: Event\n\t\t\t\t// Fired when the grid layer starts loading tiles.\n\t\t\t\tthis.fire('loading');\n\t\t\t}\n\n\t\t\t// create DOM fragment to append tiles in one batch\n\t\t\tvar fragment = document.createDocumentFragment();\n\n\t\t\tfor (i = 0; i < queue.length; i++) {\n\t\t\t\tthis._addTile(queue[i], fragment);\n\t\t\t}\n\n\t\t\tthis._level.el.appendChild(fragment);\n\t\t}\n\t},\n\n\t_isValidTile: function (coords) {\n\t\tvar crs = this._map.options.crs;\n\n\t\tif (!crs.infinite) {\n\t\t\t// don't load tile if it's out of bounds and not wrapped\n\t\t\tvar bounds = this._globalTileRange;\n\t\t\tif ((!crs.wrapLng && (coords.x < bounds.min.x || coords.x > bounds.max.x)) ||\n\t\t\t    (!crs.wrapLat && (coords.y < bounds.min.y || coords.y > bounds.max.y))) { return false; }\n\t\t}\n\n\t\tif (!this.options.bounds) { return true; }\n\n\t\t// don't load tile if it doesn't intersect the bounds in options\n\t\tvar tileBounds = this._tileCoordsToBounds(coords);\n\t\treturn L.latLngBounds(this.options.bounds).overlaps(tileBounds);\n\t},\n\n\t_keyToBounds: function (key) {\n\t\treturn this._tileCoordsToBounds(this._keyToTileCoords(key));\n\t},\n\n\t// converts tile coordinates to its geographical bounds\n\t_tileCoordsToBounds: function (coords) {\n\n\t\tvar map = this._map,\n\t\t    tileSize = this.getTileSize(),\n\n\t\t    nwPoint = coords.scaleBy(tileSize),\n\t\t    sePoint = nwPoint.add(tileSize),\n\n\t\t    nw = map.unproject(nwPoint, coords.z),\n\t\t    se = map.unproject(sePoint, coords.z),\n\t\t    bounds = new L.LatLngBounds(nw, se);\n\n\t\tif (!this.options.noWrap) {\n\t\t\tmap.wrapLatLngBounds(bounds);\n\t\t}\n\n\t\treturn bounds;\n\t},\n\n\t// converts tile coordinates to key for the tile cache\n\t_tileCoordsToKey: function (coords) {\n\t\treturn coords.x + ':' + coords.y + ':' + coords.z;\n\t},\n\n\t// converts tile cache key to coordinates\n\t_keyToTileCoords: function (key) {\n\t\tvar k = key.split(':'),\n\t\t    coords = new L.Point(+k[0], +k[1]);\n\t\tcoords.z = +k[2];\n\t\treturn coords;\n\t},\n\n\t_removeTile: function (key) {\n\t\tvar tile = this._tiles[key];\n\t\tif (!tile) { return; }\n\n\t\tL.DomUtil.remove(tile.el);\n\n\t\tdelete this._tiles[key];\n\n\t\t// @event tileunload: TileEvent\n\t\t// Fired when a tile is removed (e.g. when a tile goes off the screen).\n\t\tthis.fire('tileunload', {\n\t\t\ttile: tile.el,\n\t\t\tcoords: this._keyToTileCoords(key)\n\t\t});\n\t},\n\n\t_initTile: function (tile) {\n\t\tL.DomUtil.addClass(tile, 'leaflet-tile');\n\n\t\tvar tileSize = this.getTileSize();\n\t\ttile.style.width = tileSize.x + 'px';\n\t\ttile.style.height = tileSize.y + 'px';\n\n\t\ttile.onselectstart = L.Util.falseFn;\n\t\ttile.onmousemove = L.Util.falseFn;\n\n\t\t// update opacity on tiles in IE7-8 because of filter inheritance problems\n\t\tif (L.Browser.ielt9 && this.options.opacity < 1) {\n\t\t\tL.DomUtil.setOpacity(tile, this.options.opacity);\n\t\t}\n\n\t\t// without this hack, tiles disappear after zoom on Chrome for Android\n\t\t// https://github.com/Leaflet/Leaflet/issues/2078\n\t\tif (L.Browser.android && !L.Browser.android23) {\n\t\t\ttile.style.WebkitBackfaceVisibility = 'hidden';\n\t\t}\n\t},\n\n\t_addTile: function (coords, container) {\n\t\tvar tilePos = this._getTilePos(coords),\n\t\t    key = this._tileCoordsToKey(coords);\n\n\t\tvar tile = this.createTile(this._wrapCoords(coords), L.bind(this._tileReady, this, coords));\n\n\t\tthis._initTile(tile);\n\n\t\t// if createTile is defined with a second argument (\"done\" callback),\n\t\t// we know that tile is async and will be ready later; otherwise\n\t\tif (this.createTile.length < 2) {\n\t\t\t// mark tile as ready, but delay one frame for opacity animation to happen\n\t\t\tL.Util.requestAnimFrame(L.bind(this._tileReady, this, coords, null, tile));\n\t\t}\n\n\t\tL.DomUtil.setPosition(tile, tilePos);\n\n\t\t// save tile in cache\n\t\tthis._tiles[key] = {\n\t\t\tel: tile,\n\t\t\tcoords: coords,\n\t\t\tcurrent: true\n\t\t};\n\n\t\tcontainer.appendChild(tile);\n\t\t// @event tileloadstart: TileEvent\n\t\t// Fired when a tile is requested and starts loading.\n\t\tthis.fire('tileloadstart', {\n\t\t\ttile: tile,\n\t\t\tcoords: coords\n\t\t});\n\t},\n\n\t_tileReady: function (coords, err, tile) {\n\t\tif (!this._map) { return; }\n\n\t\tif (err) {\n\t\t\t// @event tileerror: TileErrorEvent\n\t\t\t// Fired when there is an error loading a tile.\n\t\t\tthis.fire('tileerror', {\n\t\t\t\terror: err,\n\t\t\t\ttile: tile,\n\t\t\t\tcoords: coords\n\t\t\t});\n\t\t}\n\n\t\tvar key = this._tileCoordsToKey(coords);\n\n\t\ttile = this._tiles[key];\n\t\tif (!tile) { return; }\n\n\t\ttile.loaded = +new Date();\n\t\tif (this._map._fadeAnimated) {\n\t\t\tL.DomUtil.setOpacity(tile.el, 0);\n\t\t\tL.Util.cancelAnimFrame(this._fadeFrame);\n\t\t\tthis._fadeFrame = L.Util.requestAnimFrame(this._updateOpacity, this);\n\t\t} else {\n\t\t\ttile.active = true;\n\t\t\tthis._pruneTiles();\n\t\t}\n\n\t\tif (!err) {\n\t\t\tL.DomUtil.addClass(tile.el, 'leaflet-tile-loaded');\n\n\t\t\t// @event tileload: TileEvent\n\t\t\t// Fired when a tile loads.\n\t\t\tthis.fire('tileload', {\n\t\t\t\ttile: tile.el,\n\t\t\t\tcoords: coords\n\t\t\t});\n\t\t}\n\n\t\tif (this._noTilesToLoad()) {\n\t\t\tthis._loading = false;\n\t\t\t// @event load: Event\n\t\t\t// Fired when the grid layer loaded all visible tiles.\n\t\t\tthis.fire('load');\n\n\t\t\tif (L.Browser.ielt9 || !this._map._fadeAnimated) {\n\t\t\t\tL.Util.requestAnimFrame(this._pruneTiles, this);\n\t\t\t} else {\n\t\t\t\t// Wait a bit more than 0.2 secs (the duration of the tile fade-in)\n\t\t\t\t// to trigger a pruning.\n\t\t\t\tsetTimeout(L.bind(this._pruneTiles, this), 250);\n\t\t\t}\n\t\t}\n\t},\n\n\t_getTilePos: function (coords) {\n\t\treturn coords.scaleBy(this.getTileSize()).subtract(this._level.origin);\n\t},\n\n\t_wrapCoords: function (coords) {\n\t\tvar newCoords = new L.Point(\n\t\t\tthis._wrapX ? L.Util.wrapNum(coords.x, this._wrapX) : coords.x,\n\t\t\tthis._wrapY ? L.Util.wrapNum(coords.y, this._wrapY) : coords.y);\n\t\tnewCoords.z = coords.z;\n\t\treturn newCoords;\n\t},\n\n\t_pxBoundsToTileRange: function (bounds) {\n\t\tvar tileSize = this.getTileSize();\n\t\treturn new L.Bounds(\n\t\t\tbounds.min.unscaleBy(tileSize).floor(),\n\t\t\tbounds.max.unscaleBy(tileSize).ceil().subtract([1, 1]));\n\t},\n\n\t_noTilesToLoad: function () {\n\t\tfor (var key in this._tiles) {\n\t\t\tif (!this._tiles[key].loaded) { return false; }\n\t\t}\n\t\treturn true;\n\t}\n});\n\n// @factory L.gridLayer(options?: GridLayer options)\n// Creates a new instance of GridLayer with the supplied options.\nL.gridLayer = function (options) {\n\treturn new L.GridLayer(options);\n};\n\n\n\n/*\r\n * @class TileLayer\r\n * @inherits GridLayer\r\n * @aka L.TileLayer\r\n * Used to load and display tile layers on the map. Extends `GridLayer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png?{foo}', {foo: 'bar'}).addTo(map);\r\n * ```\r\n *\r\n * @section URL template\r\n * @example\r\n *\r\n * A string of the following form:\r\n *\r\n * ```\r\n * 'http://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png'\r\n * ```\r\n *\r\n * `{s}` means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; `a`, `b` or `c` by default, can be omitted), `{z}` — zoom level, `{x}` and `{y}` — tile coordinates. `{r}` can be used to add @2x to the URL to load retina tiles.\r\n *\r\n * You can use custom keys in the template, which will be [evaluated](#util-template) from TileLayer options, like this:\r\n *\r\n * ```\r\n * L.tileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'});\r\n * ```\r\n */\r\n\r\n\r\nL.TileLayer = L.GridLayer.extend({\r\n\r\n\t// @section\r\n\t// @aka TileLayer options\r\n\toptions: {\r\n\t\t// @option minZoom: Number = 0\r\n\t\t// Minimum zoom number.\r\n\t\tminZoom: 0,\r\n\r\n\t\t// @option maxZoom: Number = 18\r\n\t\t// Maximum zoom number.\r\n\t\tmaxZoom: 18,\r\n\r\n\t\t// @option maxNativeZoom: Number = null\r\n\t\t// Maximum zoom number the tile source has available. If it is specified,\r\n\t\t// the tiles on all zoom levels higher than `maxNativeZoom` will be loaded\r\n\t\t// from `maxNativeZoom` level and auto-scaled.\r\n\t\tmaxNativeZoom: null,\r\n\r\n\t\t// @option minNativeZoom: Number = null\r\n\t\t// Minimum zoom number the tile source has available. If it is specified,\r\n\t\t// the tiles on all zoom levels lower than `minNativeZoom` will be loaded\r\n\t\t// from `minNativeZoom` level and auto-scaled.\r\n\t\tminNativeZoom: null,\r\n\r\n\t\t// @option subdomains: String|String[] = 'abc'\r\n\t\t// Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.\r\n\t\tsubdomains: 'abc',\r\n\r\n\t\t// @option errorTileUrl: String = ''\r\n\t\t// URL to the tile image to show in place of the tile that failed to load.\r\n\t\terrorTileUrl: '',\r\n\r\n\t\t// @option zoomOffset: Number = 0\r\n\t\t// The zoom number used in tile URLs will be offset with this value.\r\n\t\tzoomOffset: 0,\r\n\r\n\t\t// @option tms: Boolean = false\r\n\t\t// If `true`, inverses Y axis numbering for tiles (turn this on for [TMS](https://en.wikipedia.org/wiki/Tile_Map_Service) services).\r\n\t\ttms: false,\r\n\r\n\t\t// @option zoomReverse: Boolean = false\r\n\t\t// If set to true, the zoom number used in tile URLs will be reversed (`maxZoom - zoom` instead of `zoom`)\r\n\t\tzoomReverse: false,\r\n\r\n\t\t// @option detectRetina: Boolean = false\r\n\t\t// If `true` and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.\r\n\t\tdetectRetina: false,\r\n\r\n\t\t// @option crossOrigin: Boolean = false\r\n\t\t// If true, all tiles will have their crossOrigin attribute set to ''. This is needed if you want to access tile pixel data.\r\n\t\tcrossOrigin: false\r\n\t},\r\n\r\n\tinitialize: function (url, options) {\r\n\r\n\t\tthis._url = url;\r\n\r\n\t\toptions = L.setOptions(this, options);\r\n\r\n\t\t// detecting retina displays, adjusting tileSize and zoom levels\r\n\t\tif (options.detectRetina && L.Browser.retina && options.maxZoom > 0) {\r\n\r\n\t\t\toptions.tileSize = Math.floor(options.tileSize / 2);\r\n\r\n\t\t\tif (!options.zoomReverse) {\r\n\t\t\t\toptions.zoomOffset++;\r\n\t\t\t\toptions.maxZoom--;\r\n\t\t\t} else {\r\n\t\t\t\toptions.zoomOffset--;\r\n\t\t\t\toptions.minZoom++;\r\n\t\t\t}\r\n\r\n\t\t\toptions.minZoom = Math.max(0, options.minZoom);\r\n\t\t}\r\n\r\n\t\tif (typeof options.subdomains === 'string') {\r\n\t\t\toptions.subdomains = options.subdomains.split('');\r\n\t\t}\r\n\r\n\t\t// for https://github.com/Leaflet/Leaflet/issues/137\r\n\t\tif (!L.Browser.android) {\r\n\t\t\tthis.on('tileunload', this._onTileRemove);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method setUrl(url: String, noRedraw?: Boolean): this\r\n\t// Updates the layer's URL template and redraws it (unless `noRedraw` is set to `true`).\r\n\tsetUrl: function (url, noRedraw) {\r\n\t\tthis._url = url;\r\n\r\n\t\tif (!noRedraw) {\r\n\t\t\tthis.redraw();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method createTile(coords: Object, done?: Function): HTMLElement\r\n\t// Called only internally, overrides GridLayer's [`createTile()`](#gridlayer-createtile)\r\n\t// to return an `<img>` HTML element with the appropiate image URL given `coords`. The `done`\r\n\t// callback is called when the tile has been loaded.\r\n\tcreateTile: function (coords, done) {\r\n\t\tvar tile = document.createElement('img');\r\n\r\n\t\tL.DomEvent.on(tile, 'load', L.bind(this._tileOnLoad, this, done, tile));\r\n\t\tL.DomEvent.on(tile, 'error', L.bind(this._tileOnError, this, done, tile));\r\n\r\n\t\tif (this.options.crossOrigin) {\r\n\t\t\ttile.crossOrigin = '';\r\n\t\t}\r\n\r\n\t\t/*\r\n\t\t Alt tag is set to empty string to keep screen readers from reading URL and for compliance reasons\r\n\t\t http://www.w3.org/TR/WCAG20-TECHS/H67\r\n\t\t*/\r\n\t\ttile.alt = '';\r\n\r\n\t\t/*\r\n\t\t Set role=\"presentation\" to force screen readers to ignore this\r\n\t\t https://www.w3.org/TR/wai-aria/roles#textalternativecomputation\r\n\t\t*/\r\n\t\ttile.setAttribute('role', 'presentation');\r\n\r\n\t\ttile.src = this.getTileUrl(coords);\r\n\r\n\t\treturn tile;\r\n\t},\r\n\r\n\t// @section Extension methods\r\n\t// @uninheritable\r\n\t// Layers extending `TileLayer` might reimplement the following method.\r\n\t// @method getTileUrl(coords: Object): String\r\n\t// Called only internally, returns the URL for a tile given its coordinates.\r\n\t// Classes extending `TileLayer` can override this function to provide custom tile URL naming schemes.\r\n\tgetTileUrl: function (coords) {\r\n\t\tvar data = {\r\n\t\t\tr: L.Browser.retina ? '@2x' : '',\r\n\t\t\ts: this._getSubdomain(coords),\r\n\t\t\tx: coords.x,\r\n\t\t\ty: coords.y,\r\n\t\t\tz: this._getZoomForUrl()\r\n\t\t};\r\n\t\tif (this._map && !this._map.options.crs.infinite) {\r\n\t\t\tvar invertedY = this._globalTileRange.max.y - coords.y;\r\n\t\t\tif (this.options.tms) {\r\n\t\t\t\tdata['y'] = invertedY;\r\n\t\t\t}\r\n\t\t\tdata['-y'] = invertedY;\r\n\t\t}\r\n\r\n\t\treturn L.Util.template(this._url, L.extend(data, this.options));\r\n\t},\r\n\r\n\t_tileOnLoad: function (done, tile) {\r\n\t\t// For https://github.com/Leaflet/Leaflet/issues/3332\r\n\t\tif (L.Browser.ielt9) {\r\n\t\t\tsetTimeout(L.bind(done, this, null, tile), 0);\r\n\t\t} else {\r\n\t\t\tdone(null, tile);\r\n\t\t}\r\n\t},\r\n\r\n\t_tileOnError: function (done, tile, e) {\r\n\t\tvar errorUrl = this.options.errorTileUrl;\r\n\t\tif (errorUrl && tile.src !== errorUrl) {\r\n\t\t\ttile.src = errorUrl;\r\n\t\t}\r\n\t\tdone(e, tile);\r\n\t},\r\n\r\n\tgetTileSize: function () {\r\n\t\tvar map = this._map,\r\n\t\ttileSize = L.GridLayer.prototype.getTileSize.call(this),\r\n\t\tzoom = this._tileZoom + this.options.zoomOffset,\r\n\t\tminNativeZoom = this.options.minNativeZoom,\r\n\t\tmaxNativeZoom = this.options.maxNativeZoom;\r\n\r\n\t\t// decrease tile size when scaling below minNativeZoom\r\n\t\tif (minNativeZoom !== null && zoom < minNativeZoom) {\r\n\t\t\treturn tileSize.divideBy(map.getZoomScale(minNativeZoom, zoom)).round();\r\n\t\t}\r\n\r\n\t\t// increase tile size when scaling above maxNativeZoom\r\n\t\tif (maxNativeZoom !== null && zoom > maxNativeZoom) {\r\n\t\t\treturn tileSize.divideBy(map.getZoomScale(maxNativeZoom, zoom)).round();\r\n\t\t}\r\n\r\n\t\treturn tileSize;\r\n\t},\r\n\r\n\t_onTileRemove: function (e) {\r\n\t\te.tile.onload = null;\r\n\t},\r\n\r\n\t_getZoomForUrl: function () {\r\n\t\tvar zoom = this._tileZoom,\r\n\t\tmaxZoom = this.options.maxZoom,\r\n\t\tzoomReverse = this.options.zoomReverse,\r\n\t\tzoomOffset = this.options.zoomOffset,\r\n\t\tminNativeZoom = this.options.minNativeZoom,\r\n\t\tmaxNativeZoom = this.options.maxNativeZoom;\r\n\r\n\t\tif (zoomReverse) {\r\n\t\t\tzoom = maxZoom - zoom;\r\n\t\t}\r\n\r\n\t\tzoom += zoomOffset;\r\n\r\n\t\tif (minNativeZoom !== null && zoom < minNativeZoom) {\r\n\t\t\treturn minNativeZoom;\r\n\t\t}\r\n\r\n\t\tif (maxNativeZoom !== null && zoom > maxNativeZoom) {\r\n\t\t\treturn maxNativeZoom;\r\n\t\t}\r\n\r\n\t\treturn zoom;\r\n\t},\r\n\r\n\t_getSubdomain: function (tilePoint) {\r\n\t\tvar index = Math.abs(tilePoint.x + tilePoint.y) % this.options.subdomains.length;\r\n\t\treturn this.options.subdomains[index];\r\n\t},\r\n\r\n\t// stops loading all tiles in the background layer\r\n\t_abortLoading: function () {\r\n\t\tvar i, tile;\r\n\t\tfor (i in this._tiles) {\r\n\t\t\tif (this._tiles[i].coords.z !== this._tileZoom) {\r\n\t\t\t\ttile = this._tiles[i].el;\r\n\r\n\t\t\t\ttile.onload = L.Util.falseFn;\r\n\t\t\t\ttile.onerror = L.Util.falseFn;\r\n\r\n\t\t\t\tif (!tile.complete) {\r\n\t\t\t\t\ttile.src = L.Util.emptyImageUrl;\r\n\t\t\t\t\tL.DomUtil.remove(tile);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n});\r\n\r\n\r\n// @factory L.tilelayer(urlTemplate: String, options?: TileLayer options)\r\n// Instantiates a tile layer object given a `URL template` and optionally an options object.\r\n\r\nL.tileLayer = function (url, options) {\r\n\treturn new L.TileLayer(url, options);\r\n};\r\n\n\n\n/*\r\n * @class TileLayer.WMS\r\n * @inherits TileLayer\r\n * @aka L.TileLayer.WMS\r\n * Used to display [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services as tile layers on the map. Extends `TileLayer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var nexrad = L.tileLayer.wms(\"http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi\", {\r\n * \tlayers: 'nexrad-n0r-900913',\r\n * \tformat: 'image/png',\r\n * \ttransparent: true,\r\n * \tattribution: \"Weather data © 2012 IEM Nexrad\"\r\n * });\r\n * ```\r\n */\r\n\r\nL.TileLayer.WMS = L.TileLayer.extend({\r\n\r\n\t// @section\r\n\t// @aka TileLayer.WMS options\r\n\t// If any custom options not documented here are used, they will be sent to the\r\n\t// WMS server as extra parameters in each request URL. This can be useful for\r\n\t// [non-standard vendor WMS parameters](http://docs.geoserver.org/stable/en/user/services/wms/vendor.html).\r\n\tdefaultWmsParams: {\r\n\t\tservice: 'WMS',\r\n\t\trequest: 'GetMap',\r\n\r\n\t\t// @option layers: String = ''\r\n\t\t// **(required)** Comma-separated list of WMS layers to show.\r\n\t\tlayers: '',\r\n\r\n\t\t// @option styles: String = ''\r\n\t\t// Comma-separated list of WMS styles.\r\n\t\tstyles: '',\r\n\r\n\t\t// @option format: String = 'image/jpeg'\r\n\t\t// WMS image format (use `'image/png'` for layers with transparency).\r\n\t\tformat: 'image/jpeg',\r\n\r\n\t\t// @option transparent: Boolean = false\r\n\t\t// If `true`, the WMS service will return images with transparency.\r\n\t\ttransparent: false,\r\n\r\n\t\t// @option version: String = '1.1.1'\r\n\t\t// Version of the WMS service to use\r\n\t\tversion: '1.1.1'\r\n\t},\r\n\r\n\toptions: {\r\n\t\t// @option crs: CRS = null\r\n\t\t// Coordinate Reference System to use for the WMS requests, defaults to\r\n\t\t// map CRS. Don't change this if you're not sure what it means.\r\n\t\tcrs: null,\r\n\r\n\t\t// @option uppercase: Boolean = false\r\n\t\t// If `true`, WMS request parameter keys will be uppercase.\r\n\t\tuppercase: false\r\n\t},\r\n\r\n\tinitialize: function (url, options) {\r\n\r\n\t\tthis._url = url;\r\n\r\n\t\tvar wmsParams = L.extend({}, this.defaultWmsParams);\r\n\r\n\t\t// all keys that are not TileLayer options go to WMS params\r\n\t\tfor (var i in options) {\r\n\t\t\tif (!(i in this.options)) {\r\n\t\t\t\twmsParams[i] = options[i];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\toptions = L.setOptions(this, options);\r\n\r\n\t\twmsParams.width = wmsParams.height = options.tileSize * (options.detectRetina && L.Browser.retina ? 2 : 1);\r\n\r\n\t\tthis.wmsParams = wmsParams;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\r\n\t\tthis._crs = this.options.crs || map.options.crs;\r\n\t\tthis._wmsVersion = parseFloat(this.wmsParams.version);\r\n\r\n\t\tvar projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs';\r\n\t\tthis.wmsParams[projectionKey] = this._crs.code;\r\n\r\n\t\tL.TileLayer.prototype.onAdd.call(this, map);\r\n\t},\r\n\r\n\tgetTileUrl: function (coords) {\r\n\r\n\t\tvar tileBounds = this._tileCoordsToBounds(coords),\r\n\t\t    nw = this._crs.project(tileBounds.getNorthWest()),\r\n\t\t    se = this._crs.project(tileBounds.getSouthEast()),\r\n\r\n\t\t    bbox = (this._wmsVersion >= 1.3 && this._crs === L.CRS.EPSG4326 ?\r\n\t\t\t    [se.y, nw.x, nw.y, se.x] :\r\n\t\t\t    [nw.x, se.y, se.x, nw.y]).join(','),\r\n\r\n\t\t    url = L.TileLayer.prototype.getTileUrl.call(this, coords);\r\n\r\n\t\treturn url +\r\n\t\t\tL.Util.getParamString(this.wmsParams, url, this.options.uppercase) +\r\n\t\t\t(this.options.uppercase ? '&BBOX=' : '&bbox=') + bbox;\r\n\t},\r\n\r\n\t// @method setParams(params: Object, noRedraw?: Boolean): this\r\n\t// Merges an object with the new parameters and re-requests tiles on the current screen (unless `noRedraw` was set to true).\r\n\tsetParams: function (params, noRedraw) {\r\n\r\n\t\tL.extend(this.wmsParams, params);\r\n\r\n\t\tif (!noRedraw) {\r\n\t\t\tthis.redraw();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n});\r\n\r\n\r\n// @factory L.tileLayer.wms(baseUrl: String, options: TileLayer.WMS options)\r\n// Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.\r\nL.tileLayer.wms = function (url, options) {\r\n\treturn new L.TileLayer.WMS(url, options);\r\n};\r\n\n\n\n/*\r\n * @class ImageOverlay\r\n * @aka L.ImageOverlay\r\n * @inherits Interactive layer\r\n *\r\n * Used to load and display a single image over specific bounds of the map. Extends `Layer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg',\r\n * \timageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]];\r\n * L.imageOverlay(imageUrl, imageBounds).addTo(map);\r\n * ```\r\n */\r\n\r\nL.ImageOverlay = L.Layer.extend({\r\n\r\n\t// @section\r\n\t// @aka ImageOverlay options\r\n\toptions: {\r\n\t\t// @option opacity: Number = 1.0\r\n\t\t// The opacity of the image overlay.\r\n\t\topacity: 1,\r\n\r\n\t\t// @option alt: String = ''\r\n\t\t// Text for the `alt` attribute of the image (useful for accessibility).\r\n\t\talt: '',\r\n\r\n\t\t// @option interactive: Boolean = false\r\n\t\t// If `true`, the image overlay will emit [mouse events](#interactive-layer) when clicked or hovered.\r\n\t\tinteractive: false,\r\n\r\n\t\t// @option crossOrigin: Boolean = false\r\n\t\t// If true, the image will have its crossOrigin attribute set to ''. This is needed if you want to access image pixel data.\r\n\t\tcrossOrigin: false\r\n\t},\r\n\r\n\tinitialize: function (url, bounds, options) { // (String, LatLngBounds, Object)\r\n\t\tthis._url = url;\r\n\t\tthis._bounds = L.latLngBounds(bounds);\r\n\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tonAdd: function () {\r\n\t\tif (!this._image) {\r\n\t\t\tthis._initImage();\r\n\r\n\t\t\tif (this.options.opacity < 1) {\r\n\t\t\t\tthis._updateOpacity();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (this.options.interactive) {\r\n\t\t\tL.DomUtil.addClass(this._image, 'leaflet-interactive');\r\n\t\t\tthis.addInteractiveTarget(this._image);\r\n\t\t}\r\n\r\n\t\tthis.getPane().appendChild(this._image);\r\n\t\tthis._reset();\r\n\t},\r\n\r\n\tonRemove: function () {\r\n\t\tL.DomUtil.remove(this._image);\r\n\t\tif (this.options.interactive) {\r\n\t\t\tthis.removeInteractiveTarget(this._image);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method setOpacity(opacity: Number): this\r\n\t// Sets the opacity of the overlay.\r\n\tsetOpacity: function (opacity) {\r\n\t\tthis.options.opacity = opacity;\r\n\r\n\t\tif (this._image) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetStyle: function (styleOpts) {\r\n\t\tif (styleOpts.opacity) {\r\n\t\t\tthis.setOpacity(styleOpts.opacity);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method bringToFront(): this\r\n\t// Brings the layer to the top of all overlays.\r\n\tbringToFront: function () {\r\n\t\tif (this._map) {\r\n\t\t\tL.DomUtil.toFront(this._image);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method bringToBack(): this\r\n\t// Brings the layer to the bottom of all overlays.\r\n\tbringToBack: function () {\r\n\t\tif (this._map) {\r\n\t\t\tL.DomUtil.toBack(this._image);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method setUrl(url: String): this\r\n\t// Changes the URL of the image.\r\n\tsetUrl: function (url) {\r\n\t\tthis._url = url;\r\n\r\n\t\tif (this._image) {\r\n\t\t\tthis._image.src = url;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method setBounds(bounds: LatLngBounds): this\r\n\t// Update the bounds that this ImageOverlay covers\r\n\tsetBounds: function (bounds) {\r\n\t\tthis._bounds = bounds;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._reset();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetEvents: function () {\r\n\t\tvar events = {\r\n\t\t\tzoom: this._reset,\r\n\t\t\tviewreset: this._reset\r\n\t\t};\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tevents.zoomanim = this._animateZoom;\r\n\t\t}\r\n\r\n\t\treturn events;\r\n\t},\r\n\r\n\t// @method getBounds(): LatLngBounds\r\n\t// Get the bounds that this ImageOverlay covers\r\n\tgetBounds: function () {\r\n\t\treturn this._bounds;\r\n\t},\r\n\r\n\t// @method getElement(): HTMLElement\r\n\t// Get the img element that represents the ImageOverlay on the map\r\n\tgetElement: function () {\r\n\t\treturn this._image;\r\n\t},\r\n\r\n\t_initImage: function () {\r\n\t\tvar img = this._image = L.DomUtil.create('img',\r\n\t\t\t\t'leaflet-image-layer ' + (this._zoomAnimated ? 'leaflet-zoom-animated' : ''));\r\n\r\n\t\timg.onselectstart = L.Util.falseFn;\r\n\t\timg.onmousemove = L.Util.falseFn;\r\n\r\n\t\timg.onload = L.bind(this.fire, this, 'load');\r\n\r\n\t\tif (this.options.crossOrigin) {\r\n\t\t\timg.crossOrigin = '';\r\n\t\t}\r\n\r\n\t\timg.src = this._url;\r\n\t\timg.alt = this.options.alt;\r\n\t},\r\n\r\n\t_animateZoom: function (e) {\r\n\t\tvar scale = this._map.getZoomScale(e.zoom),\r\n\t\t    offset = this._map._latLngBoundsToNewLayerBounds(this._bounds, e.zoom, e.center).min;\r\n\r\n\t\tL.DomUtil.setTransform(this._image, offset, scale);\r\n\t},\r\n\r\n\t_reset: function () {\r\n\t\tvar image = this._image,\r\n\t\t    bounds = new L.Bounds(\r\n\t\t        this._map.latLngToLayerPoint(this._bounds.getNorthWest()),\r\n\t\t        this._map.latLngToLayerPoint(this._bounds.getSouthEast())),\r\n\t\t    size = bounds.getSize();\r\n\r\n\t\tL.DomUtil.setPosition(image, bounds.min);\r\n\r\n\t\timage.style.width  = size.x + 'px';\r\n\t\timage.style.height = size.y + 'px';\r\n\t},\r\n\r\n\t_updateOpacity: function () {\r\n\t\tL.DomUtil.setOpacity(this._image, this.options.opacity);\r\n\t}\r\n});\r\n\r\n// @factory L.imageOverlay(imageUrl: String, bounds: LatLngBounds, options?: ImageOverlay options)\r\n// Instantiates an image overlay object given the URL of the image and the\r\n// geographical bounds it is tied to.\r\nL.imageOverlay = function (url, bounds, options) {\r\n\treturn new L.ImageOverlay(url, bounds, options);\r\n};\r\n\n\n\n/*\r\n * @class Icon\r\n * @aka L.Icon\r\n * @inherits Layer\r\n *\r\n * Represents an icon to provide when creating a marker.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var myIcon = L.icon({\r\n *     iconUrl: 'my-icon.png',\r\n *     iconRetinaUrl: 'my-icon@2x.png',\r\n *     iconSize: [38, 95],\r\n *     iconAnchor: [22, 94],\r\n *     popupAnchor: [-3, -76],\r\n *     shadowUrl: 'my-icon-shadow.png',\r\n *     shadowRetinaUrl: 'my-icon-shadow@2x.png',\r\n *     shadowSize: [68, 95],\r\n *     shadowAnchor: [22, 94]\r\n * });\r\n *\r\n * L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);\r\n * ```\r\n *\r\n * `L.Icon.Default` extends `L.Icon` and is the blue icon Leaflet uses for markers by default.\r\n *\r\n */\r\n\r\nL.Icon = L.Class.extend({\r\n\r\n\t/* @section\r\n\t * @aka Icon options\r\n\t *\r\n\t * @option iconUrl: String = null\r\n\t * **(required)** The URL to the icon image (absolute or relative to your script path).\r\n\t *\r\n\t * @option iconRetinaUrl: String = null\r\n\t * The URL to a retina sized version of the icon image (absolute or relative to your\r\n\t * script path). Used for Retina screen devices.\r\n\t *\r\n\t * @option iconSize: Point = null\r\n\t * Size of the icon image in pixels.\r\n\t *\r\n\t * @option iconAnchor: Point = null\r\n\t * The coordinates of the \"tip\" of the icon (relative to its top left corner). The icon\r\n\t * will be aligned so that this point is at the marker's geographical location. Centered\r\n\t * by default if size is specified, also can be set in CSS with negative margins.\r\n\t *\r\n\t * @option popupAnchor: Point = null\r\n\t * The coordinates of the point from which popups will \"open\", relative to the icon anchor.\r\n\t *\r\n\t * @option shadowUrl: String = null\r\n\t * The URL to the icon shadow image. If not specified, no shadow image will be created.\r\n\t *\r\n\t * @option shadowRetinaUrl: String = null\r\n\t *\r\n\t * @option shadowSize: Point = null\r\n\t * Size of the shadow image in pixels.\r\n\t *\r\n\t * @option shadowAnchor: Point = null\r\n\t * The coordinates of the \"tip\" of the shadow (relative to its top left corner) (the same\r\n\t * as iconAnchor if not specified).\r\n\t *\r\n\t * @option className: String = ''\r\n\t * A custom class name to assign to both icon and shadow images. Empty by default.\r\n\t */\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\t// @method createIcon(oldIcon?: HTMLElement): HTMLElement\r\n\t// Called internally when the icon has to be shown, returns a `<img>` HTML element\r\n\t// styled according to the options.\r\n\tcreateIcon: function (oldIcon) {\r\n\t\treturn this._createIcon('icon', oldIcon);\r\n\t},\r\n\r\n\t// @method createShadow(oldIcon?: HTMLElement): HTMLElement\r\n\t// As `createIcon`, but for the shadow beneath it.\r\n\tcreateShadow: function (oldIcon) {\r\n\t\treturn this._createIcon('shadow', oldIcon);\r\n\t},\r\n\r\n\t_createIcon: function (name, oldIcon) {\r\n\t\tvar src = this._getIconUrl(name);\r\n\r\n\t\tif (!src) {\r\n\t\t\tif (name === 'icon') {\r\n\t\t\t\tthrow new Error('iconUrl not set in Icon options (see the docs).');\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tvar img = this._createImg(src, oldIcon && oldIcon.tagName === 'IMG' ? oldIcon : null);\r\n\t\tthis._setIconStyles(img, name);\r\n\r\n\t\treturn img;\r\n\t},\r\n\r\n\t_setIconStyles: function (img, name) {\r\n\t\tvar options = this.options;\r\n\t\tvar sizeOption = options[name + 'Size'];\r\n\r\n\t\tif (typeof sizeOption === 'number') {\r\n\t\t\tsizeOption = [sizeOption, sizeOption];\r\n\t\t}\r\n\r\n\t\tvar size = L.point(sizeOption),\r\n\t\t    anchor = L.point(name === 'shadow' && options.shadowAnchor || options.iconAnchor ||\r\n\t\t            size && size.divideBy(2, true));\r\n\r\n\t\timg.className = 'leaflet-marker-' + name + ' ' + (options.className || '');\r\n\r\n\t\tif (anchor) {\r\n\t\t\timg.style.marginLeft = (-anchor.x) + 'px';\r\n\t\t\timg.style.marginTop  = (-anchor.y) + 'px';\r\n\t\t}\r\n\r\n\t\tif (size) {\r\n\t\t\timg.style.width  = size.x + 'px';\r\n\t\t\timg.style.height = size.y + 'px';\r\n\t\t}\r\n\t},\r\n\r\n\t_createImg: function (src, el) {\r\n\t\tel = el || document.createElement('img');\r\n\t\tel.src = src;\r\n\t\treturn el;\r\n\t},\r\n\r\n\t_getIconUrl: function (name) {\r\n\t\treturn L.Browser.retina && this.options[name + 'RetinaUrl'] || this.options[name + 'Url'];\r\n\t}\r\n});\r\n\r\n\r\n// @factory L.icon(options: Icon options)\r\n// Creates an icon instance with the given options.\r\nL.icon = function (options) {\r\n\treturn new L.Icon(options);\r\n};\r\n\n\n\n/*\n * @miniclass Icon.Default (Icon)\n * @aka L.Icon.Default\n * @section\n *\n * A trivial subclass of `Icon`, represents the icon to use in `Marker`s when\n * no icon is specified. Points to the blue marker image distributed with Leaflet\n * releases.\n *\n * In order to customize the default icon, just change the properties of `L.Icon.Default.prototype.options`\n * (which is a set of `Icon options`).\n *\n * If you want to _completely_ replace the default icon, override the\n * `L.Marker.prototype.options.icon` with your own icon instead.\n */\n\nL.Icon.Default = L.Icon.extend({\n\n\toptions: {\n\t\ticonUrl:       'marker-icon.png',\n\t\ticonRetinaUrl: 'marker-icon-2x.png',\n\t\tshadowUrl:     'marker-shadow.png',\n\t\ticonSize:    [25, 41],\n\t\ticonAnchor:  [12, 41],\n\t\tpopupAnchor: [1, -34],\n\t\ttooltipAnchor: [16, -28],\n\t\tshadowSize:  [41, 41]\n\t},\n\n\t_getIconUrl: function (name) {\n\t\tif (!L.Icon.Default.imagePath) {\t// Deprecated, backwards-compatibility only\n\t\t\tL.Icon.Default.imagePath = this._detectIconPath();\n\t\t}\n\n\t\t// @option imagePath: String\n\t\t// `L.Icon.Default` will try to auto-detect the absolute location of the\n\t\t// blue icon images. If you are placing these images in a non-standard\n\t\t// way, set this option to point to the right absolute path.\n\t\treturn (this.options.imagePath || L.Icon.Default.imagePath) + L.Icon.prototype._getIconUrl.call(this, name);\n\t},\n\n\t_detectIconPath: function () {\n\t\tvar el = L.DomUtil.create('div',  'leaflet-default-icon-path', document.body);\n\t\tvar path = L.DomUtil.getStyle(el, 'background-image') ||\n\t\t           L.DomUtil.getStyle(el, 'backgroundImage');\t// IE8\n\n\t\tdocument.body.removeChild(el);\n\n\t\treturn path.indexOf('url') === 0 ?\n\t\t\tpath.replace(/^url\\([\\\"\\']?/, '').replace(/marker-icon\\.png[\\\"\\']?\\)$/, '') : '';\n\t}\n});\n\n\n\n/*\r\n * @class Marker\r\n * @inherits Interactive layer\r\n * @aka L.Marker\r\n * L.Marker is used to display clickable/draggable icons on the map. Extends `Layer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.marker([50.5, 30.5]).addTo(map);\r\n * ```\r\n */\r\n\r\nL.Marker = L.Layer.extend({\r\n\r\n\t// @section\r\n\t// @aka Marker options\r\n\toptions: {\r\n\t\t// @option icon: Icon = *\r\n\t\t// Icon class to use for rendering the marker. See [Icon documentation](#L.Icon) for details on how to customize the marker icon. If not specified, a new `L.Icon.Default` is used.\r\n\t\ticon: new L.Icon.Default(),\r\n\r\n\t\t// Option inherited from \"Interactive layer\" abstract class\r\n\t\tinteractive: true,\r\n\r\n\t\t// @option draggable: Boolean = false\r\n\t\t// Whether the marker is draggable with mouse/touch or not.\r\n\t\tdraggable: false,\r\n\r\n\t\t// @option keyboard: Boolean = true\r\n\t\t// Whether the marker can be tabbed to with a keyboard and clicked by pressing enter.\r\n\t\tkeyboard: true,\r\n\r\n\t\t// @option title: String = ''\r\n\t\t// Text for the browser tooltip that appear on marker hover (no tooltip by default).\r\n\t\ttitle: '',\r\n\r\n\t\t// @option alt: String = ''\r\n\t\t// Text for the `alt` attribute of the icon image (useful for accessibility).\r\n\t\talt: '',\r\n\r\n\t\t// @option zIndexOffset: Number = 0\r\n\t\t// By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like `1000` (or high negative value, respectively).\r\n\t\tzIndexOffset: 0,\r\n\r\n\t\t// @option opacity: Number = 1.0\r\n\t\t// The opacity of the marker.\r\n\t\topacity: 1,\r\n\r\n\t\t// @option riseOnHover: Boolean = false\r\n\t\t// If `true`, the marker will get on top of others when you hover the mouse over it.\r\n\t\triseOnHover: false,\r\n\r\n\t\t// @option riseOffset: Number = 250\r\n\t\t// The z-index offset used for the `riseOnHover` feature.\r\n\t\triseOffset: 250,\r\n\r\n\t\t// @option pane: String = 'markerPane'\r\n\t\t// `Map pane` where the markers icon will be added.\r\n\t\tpane: 'markerPane',\r\n\r\n\t\t// FIXME: shadowPane is no longer a valid option\r\n\t\tnonBubblingEvents: ['click', 'dblclick', 'mouseover', 'mouseout', 'contextmenu']\r\n\t},\r\n\r\n\t/* @section\r\n\t *\r\n\t * In addition to [shared layer methods](#Layer) like `addTo()` and `remove()` and [popup methods](#Popup) like bindPopup() you can also use the following methods:\r\n\t */\r\n\r\n\tinitialize: function (latlng, options) {\r\n\t\tL.setOptions(this, options);\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._zoomAnimated = this._zoomAnimated && map.options.markerZoomAnimation;\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tmap.on('zoomanim', this._animateZoom, this);\r\n\t\t}\r\n\r\n\t\tthis._initIcon();\r\n\t\tthis.update();\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tif (this.dragging && this.dragging.enabled()) {\r\n\t\t\tthis.options.draggable = true;\r\n\t\t\tthis.dragging.removeHooks();\r\n\t\t}\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tmap.off('zoomanim', this._animateZoom, this);\r\n\t\t}\r\n\r\n\t\tthis._removeIcon();\r\n\t\tthis._removeShadow();\r\n\t},\r\n\r\n\tgetEvents: function () {\r\n\t\treturn {\r\n\t\t\tzoom: this.update,\r\n\t\t\tviewreset: this.update\r\n\t\t};\r\n\t},\r\n\r\n\t// @method getLatLng: LatLng\r\n\t// Returns the current geographical position of the marker.\r\n\tgetLatLng: function () {\r\n\t\treturn this._latlng;\r\n\t},\r\n\r\n\t// @method setLatLng(latlng: LatLng): this\r\n\t// Changes the marker position to the given point.\r\n\tsetLatLng: function (latlng) {\r\n\t\tvar oldLatLng = this._latlng;\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t\tthis.update();\r\n\r\n\t\t// @event move: Event\r\n\t\t// Fired when the marker is moved via [`setLatLng`](#marker-setlatlng) or by [dragging](#marker-dragging). Old and new coordinates are included in event arguments as `oldLatLng`, `latlng`.\r\n\t\treturn this.fire('move', {oldLatLng: oldLatLng, latlng: this._latlng});\r\n\t},\r\n\r\n\t// @method setZIndexOffset(offset: Number): this\r\n\t// Changes the [zIndex offset](#marker-zindexoffset) of the marker.\r\n\tsetZIndexOffset: function (offset) {\r\n\t\tthis.options.zIndexOffset = offset;\r\n\t\treturn this.update();\r\n\t},\r\n\r\n\t// @method setIcon(icon: Icon): this\r\n\t// Changes the marker icon.\r\n\tsetIcon: function (icon) {\r\n\r\n\t\tthis.options.icon = icon;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._initIcon();\r\n\t\t\tthis.update();\r\n\t\t}\r\n\r\n\t\tif (this._popup) {\r\n\t\t\tthis.bindPopup(this._popup, this._popup.options);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetElement: function () {\r\n\t\treturn this._icon;\r\n\t},\r\n\r\n\tupdate: function () {\r\n\r\n\t\tif (this._icon) {\r\n\t\t\tvar pos = this._map.latLngToLayerPoint(this._latlng).round();\r\n\t\t\tthis._setPos(pos);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initIcon: function () {\r\n\t\tvar options = this.options,\r\n\t\t    classToAdd = 'leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide');\r\n\r\n\t\tvar icon = options.icon.createIcon(this._icon),\r\n\t\t    addIcon = false;\r\n\r\n\t\t// if we're not reusing the icon, remove the old one and init new one\r\n\t\tif (icon !== this._icon) {\r\n\t\t\tif (this._icon) {\r\n\t\t\t\tthis._removeIcon();\r\n\t\t\t}\r\n\t\t\taddIcon = true;\r\n\r\n\t\t\tif (options.title) {\r\n\t\t\t\ticon.title = options.title;\r\n\t\t\t}\r\n\t\t\tif (options.alt) {\r\n\t\t\t\ticon.alt = options.alt;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tL.DomUtil.addClass(icon, classToAdd);\r\n\r\n\t\tif (options.keyboard) {\r\n\t\t\ticon.tabIndex = '0';\r\n\t\t}\r\n\r\n\t\tthis._icon = icon;\r\n\r\n\t\tif (options.riseOnHover) {\r\n\t\t\tthis.on({\r\n\t\t\t\tmouseover: this._bringToFront,\r\n\t\t\t\tmouseout: this._resetZIndex\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tvar newShadow = options.icon.createShadow(this._shadow),\r\n\t\t    addShadow = false;\r\n\r\n\t\tif (newShadow !== this._shadow) {\r\n\t\t\tthis._removeShadow();\r\n\t\t\taddShadow = true;\r\n\t\t}\r\n\r\n\t\tif (newShadow) {\r\n\t\t\tL.DomUtil.addClass(newShadow, classToAdd);\r\n\t\t\tnewShadow.alt = '';\r\n\t\t}\r\n\t\tthis._shadow = newShadow;\r\n\r\n\r\n\t\tif (options.opacity < 1) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\r\n\r\n\t\tif (addIcon) {\r\n\t\t\tthis.getPane().appendChild(this._icon);\r\n\t\t}\r\n\t\tthis._initInteraction();\r\n\t\tif (newShadow && addShadow) {\r\n\t\t\tthis.getPane('shadowPane').appendChild(this._shadow);\r\n\t\t}\r\n\t},\r\n\r\n\t_removeIcon: function () {\r\n\t\tif (this.options.riseOnHover) {\r\n\t\t\tthis.off({\r\n\t\t\t\tmouseover: this._bringToFront,\r\n\t\t\t\tmouseout: this._resetZIndex\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tL.DomUtil.remove(this._icon);\r\n\t\tthis.removeInteractiveTarget(this._icon);\r\n\r\n\t\tthis._icon = null;\r\n\t},\r\n\r\n\t_removeShadow: function () {\r\n\t\tif (this._shadow) {\r\n\t\t\tL.DomUtil.remove(this._shadow);\r\n\t\t}\r\n\t\tthis._shadow = null;\r\n\t},\r\n\r\n\t_setPos: function (pos) {\r\n\t\tL.DomUtil.setPosition(this._icon, pos);\r\n\r\n\t\tif (this._shadow) {\r\n\t\t\tL.DomUtil.setPosition(this._shadow, pos);\r\n\t\t}\r\n\r\n\t\tthis._zIndex = pos.y + this.options.zIndexOffset;\r\n\r\n\t\tthis._resetZIndex();\r\n\t},\r\n\r\n\t_updateZIndex: function (offset) {\r\n\t\tthis._icon.style.zIndex = this._zIndex + offset;\r\n\t},\r\n\r\n\t_animateZoom: function (opt) {\r\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round();\r\n\r\n\t\tthis._setPos(pos);\r\n\t},\r\n\r\n\t_initInteraction: function () {\r\n\r\n\t\tif (!this.options.interactive) { return; }\r\n\r\n\t\tL.DomUtil.addClass(this._icon, 'leaflet-interactive');\r\n\r\n\t\tthis.addInteractiveTarget(this._icon);\r\n\r\n\t\tif (L.Handler.MarkerDrag) {\r\n\t\t\tvar draggable = this.options.draggable;\r\n\t\t\tif (this.dragging) {\r\n\t\t\t\tdraggable = this.dragging.enabled();\r\n\t\t\t\tthis.dragging.disable();\r\n\t\t\t}\r\n\r\n\t\t\tthis.dragging = new L.Handler.MarkerDrag(this);\r\n\r\n\t\t\tif (draggable) {\r\n\t\t\t\tthis.dragging.enable();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// @method setOpacity(opacity: Number): this\r\n\t// Changes the opacity of the marker.\r\n\tsetOpacity: function (opacity) {\r\n\t\tthis.options.opacity = opacity;\r\n\t\tif (this._map) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_updateOpacity: function () {\r\n\t\tvar opacity = this.options.opacity;\r\n\r\n\t\tL.DomUtil.setOpacity(this._icon, opacity);\r\n\r\n\t\tif (this._shadow) {\r\n\t\t\tL.DomUtil.setOpacity(this._shadow, opacity);\r\n\t\t}\r\n\t},\r\n\r\n\t_bringToFront: function () {\r\n\t\tthis._updateZIndex(this.options.riseOffset);\r\n\t},\r\n\r\n\t_resetZIndex: function () {\r\n\t\tthis._updateZIndex(0);\r\n\t},\r\n\r\n\t_getPopupAnchor: function () {\r\n\t\treturn this.options.icon.options.popupAnchor || [0, 0];\r\n\t},\r\n\r\n\t_getTooltipAnchor: function () {\r\n\t\treturn this.options.icon.options.tooltipAnchor || [0, 0];\r\n\t}\r\n});\r\n\r\n\r\n// factory L.marker(latlng: LatLng, options? : Marker options)\r\n\r\n// @factory L.marker(latlng: LatLng, options? : Marker options)\r\n// Instantiates a Marker object given a geographical point and optionally an options object.\r\nL.marker = function (latlng, options) {\r\n\treturn new L.Marker(latlng, options);\r\n};\r\n\n\n\n/*\n * @class DivIcon\n * @aka L.DivIcon\n * @inherits Icon\n *\n * Represents a lightweight icon for markers that uses a simple `<div>`\n * element instead of an image. Inherits from `Icon` but ignores the `iconUrl` and shadow options.\n *\n * @example\n * ```js\n * var myIcon = L.divIcon({className: 'my-div-icon'});\n * // you can set .my-div-icon styles in CSS\n *\n * L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);\n * ```\n *\n * By default, it has a 'leaflet-div-icon' CSS class and is styled as a little white square with a shadow.\n */\n\nL.DivIcon = L.Icon.extend({\n\toptions: {\n\t\t// @section\n\t\t// @aka DivIcon options\n\t\ticonSize: [12, 12], // also can be set through CSS\n\n\t\t// iconAnchor: (Point),\n\t\t// popupAnchor: (Point),\n\n\t\t// @option html: String = ''\n\t\t// Custom HTML code to put inside the div element, empty by default.\n\t\thtml: false,\n\n\t\t// @option bgPos: Point = [0, 0]\n\t\t// Optional relative position of the background, in pixels\n\t\tbgPos: null,\n\n\t\tclassName: 'leaflet-div-icon'\n\t},\n\n\tcreateIcon: function (oldIcon) {\n\t\tvar div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'),\n\t\t    options = this.options;\n\n\t\tdiv.innerHTML = options.html !== false ? options.html : '';\n\n\t\tif (options.bgPos) {\n\t\t\tvar bgPos = L.point(options.bgPos);\n\t\t\tdiv.style.backgroundPosition = (-bgPos.x) + 'px ' + (-bgPos.y) + 'px';\n\t\t}\n\t\tthis._setIconStyles(div, 'icon');\n\n\t\treturn div;\n\t},\n\n\tcreateShadow: function () {\n\t\treturn null;\n\t}\n});\n\n// @factory L.divIcon(options: DivIcon options)\n// Creates a `DivIcon` instance with the given options.\nL.divIcon = function (options) {\n\treturn new L.DivIcon(options);\n};\n\n\n\n/*\r\n * @class DivOverlay\r\n * @inherits Layer\r\n * @aka L.DivOverlay\r\n * Base model for L.Popup and L.Tooltip. Inherit from it for custom popup like plugins.\r\n */\r\n\r\n// @namespace DivOverlay\r\nL.DivOverlay = L.Layer.extend({\r\n\r\n\t// @section\r\n\t// @aka DivOverlay options\r\n\toptions: {\r\n\t\t// @option offset: Point = Point(0, 7)\r\n\t\t// The offset of the popup position. Useful to control the anchor\r\n\t\t// of the popup when opening it on some overlays.\r\n\t\toffset: [0, 7],\r\n\r\n\t\t// @option className: String = ''\r\n\t\t// A custom CSS class name to assign to the popup.\r\n\t\tclassName: '',\r\n\r\n\t\t// @option pane: String = 'popupPane'\r\n\t\t// `Map pane` where the popup will be added.\r\n\t\tpane: 'popupPane'\r\n\t},\r\n\r\n\tinitialize: function (options, source) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._source = source;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._zoomAnimated = map._zoomAnimated;\r\n\r\n\t\tif (!this._container) {\r\n\t\t\tthis._initLayout();\r\n\t\t}\r\n\r\n\t\tif (map._fadeAnimated) {\r\n\t\t\tL.DomUtil.setOpacity(this._container, 0);\r\n\t\t}\r\n\r\n\t\tclearTimeout(this._removeTimeout);\r\n\t\tthis.getPane().appendChild(this._container);\r\n\t\tthis.update();\r\n\r\n\t\tif (map._fadeAnimated) {\r\n\t\t\tL.DomUtil.setOpacity(this._container, 1);\r\n\t\t}\r\n\r\n\t\tthis.bringToFront();\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tif (map._fadeAnimated) {\r\n\t\t\tL.DomUtil.setOpacity(this._container, 0);\r\n\t\t\tthis._removeTimeout = setTimeout(L.bind(L.DomUtil.remove, L.DomUtil, this._container), 200);\r\n\t\t} else {\r\n\t\t\tL.DomUtil.remove(this._container);\r\n\t\t}\r\n\t},\r\n\r\n\t// @namespace Popup\r\n\t// @method getLatLng: LatLng\r\n\t// Returns the geographical point of popup.\r\n\tgetLatLng: function () {\r\n\t\treturn this._latlng;\r\n\t},\r\n\r\n\t// @method setLatLng(latlng: LatLng): this\r\n\t// Sets the geographical point where the popup will open.\r\n\tsetLatLng: function (latlng) {\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t\tif (this._map) {\r\n\t\t\tthis._updatePosition();\r\n\t\t\tthis._adjustPan();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getContent: String|HTMLElement\r\n\t// Returns the content of the popup.\r\n\tgetContent: function () {\r\n\t\treturn this._content;\r\n\t},\r\n\r\n\t// @method setContent(htmlContent: String|HTMLElement|Function): this\r\n\t// Sets the HTML content of the popup. If a function is passed the source layer will be passed to the function. The function should return a `String` or `HTMLElement` to be used in the popup.\r\n\tsetContent: function (content) {\r\n\t\tthis._content = content;\r\n\t\tthis.update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getElement: String|HTMLElement\r\n\t// Alias for [getContent()](#popup-getcontent)\r\n\tgetElement: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\t// @method update: null\r\n\t// Updates the popup content, layout and position. Useful for updating the popup after something inside changed, e.g. image loaded.\r\n\tupdate: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tthis._container.style.visibility = 'hidden';\r\n\r\n\t\tthis._updateContent();\r\n\t\tthis._updateLayout();\r\n\t\tthis._updatePosition();\r\n\r\n\t\tthis._container.style.visibility = '';\r\n\r\n\t\tthis._adjustPan();\r\n\t},\r\n\r\n\tgetEvents: function () {\r\n\t\tvar events = {\r\n\t\t\tzoom: this._updatePosition,\r\n\t\t\tviewreset: this._updatePosition\r\n\t\t};\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tevents.zoomanim = this._animateZoom;\r\n\t\t}\r\n\t\treturn events;\r\n\t},\r\n\r\n\t// @method isOpen: Boolean\r\n\t// Returns `true` when the popup is visible on the map.\r\n\tisOpen: function () {\r\n\t\treturn !!this._map && this._map.hasLayer(this);\r\n\t},\r\n\r\n\t// @method bringToFront: this\r\n\t// Brings this popup in front of other popups (in the same map pane).\r\n\tbringToFront: function () {\r\n\t\tif (this._map) {\r\n\t\t\tL.DomUtil.toFront(this._container);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method bringToBack: this\r\n\t// Brings this popup to the back of other popups (in the same map pane).\r\n\tbringToBack: function () {\r\n\t\tif (this._map) {\r\n\t\t\tL.DomUtil.toBack(this._container);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_updateContent: function () {\r\n\t\tif (!this._content) { return; }\r\n\r\n\t\tvar node = this._contentNode;\r\n\t\tvar content = (typeof this._content === 'function') ? this._content(this._source || this) : this._content;\r\n\r\n\t\tif (typeof content === 'string') {\r\n\t\t\tnode.innerHTML = content;\r\n\t\t} else {\r\n\t\t\twhile (node.hasChildNodes()) {\r\n\t\t\t\tnode.removeChild(node.firstChild);\r\n\t\t\t}\r\n\t\t\tnode.appendChild(content);\r\n\t\t}\r\n\t\tthis.fire('contentupdate');\r\n\t},\r\n\r\n\t_updatePosition: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tvar pos = this._map.latLngToLayerPoint(this._latlng),\r\n\t\t    offset = L.point(this.options.offset),\r\n\t\t    anchor = this._getAnchor();\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tL.DomUtil.setPosition(this._container, pos.add(anchor));\r\n\t\t} else {\r\n\t\t\toffset = offset.add(pos).add(anchor);\r\n\t\t}\r\n\r\n\t\tvar bottom = this._containerBottom = -offset.y,\r\n\t\t    left = this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x;\r\n\r\n\t\t// bottom position the popup in case the height of the popup changes (images loading etc)\r\n\t\tthis._container.style.bottom = bottom + 'px';\r\n\t\tthis._container.style.left = left + 'px';\r\n\t},\r\n\r\n\t_getAnchor: function () {\r\n\t\treturn [0, 0];\r\n\t}\r\n\r\n});\r\n\n\n\n/*\r\n * @class Popup\r\n * @inherits DivOverlay\r\n * @aka L.Popup\r\n * Used to open popups in certain places of the map. Use [Map.openPopup](#map-openpopup) to\r\n * open popups while making sure that only one popup is open at one time\r\n * (recommended for usability), or use [Map.addLayer](#map-addlayer) to open as many as you want.\r\n *\r\n * @example\r\n *\r\n * If you want to just bind a popup to marker click and then open it, it's really easy:\r\n *\r\n * ```js\r\n * marker.bindPopup(popupContent).openPopup();\r\n * ```\r\n * Path overlays like polylines also have a `bindPopup` method.\r\n * Here's a more complicated way to open a popup on a map:\r\n *\r\n * ```js\r\n * var popup = L.popup()\r\n * \t.setLatLng(latlng)\r\n * \t.setContent('<p>Hello world!<br />This is a nice popup.</p>')\r\n * \t.openOn(map);\r\n * ```\r\n */\r\n\r\n\r\n// @namespace Popup\r\nL.Popup = L.DivOverlay.extend({\r\n\r\n\t// @section\r\n\t// @aka Popup options\r\n\toptions: {\r\n\t\t// @option maxWidth: Number = 300\r\n\t\t// Max width of the popup, in pixels.\r\n\t\tmaxWidth: 300,\r\n\r\n\t\t// @option minWidth: Number = 50\r\n\t\t// Min width of the popup, in pixels.\r\n\t\tminWidth: 50,\r\n\r\n\t\t// @option maxHeight: Number = null\r\n\t\t// If set, creates a scrollable container of the given height\r\n\t\t// inside a popup if its content exceeds it.\r\n\t\tmaxHeight: null,\r\n\r\n\t\t// @option autoPan: Boolean = true\r\n\t\t// Set it to `false` if you don't want the map to do panning animation\r\n\t\t// to fit the opened popup.\r\n\t\tautoPan: true,\r\n\r\n\t\t// @option autoPanPaddingTopLeft: Point = null\r\n\t\t// The margin between the popup and the top left corner of the map\r\n\t\t// view after autopanning was performed.\r\n\t\tautoPanPaddingTopLeft: null,\r\n\r\n\t\t// @option autoPanPaddingBottomRight: Point = null\r\n\t\t// The margin between the popup and the bottom right corner of the map\r\n\t\t// view after autopanning was performed.\r\n\t\tautoPanPaddingBottomRight: null,\r\n\r\n\t\t// @option autoPanPadding: Point = Point(5, 5)\r\n\t\t// Equivalent of setting both top left and bottom right autopan padding to the same value.\r\n\t\tautoPanPadding: [5, 5],\r\n\r\n\t\t// @option keepInView: Boolean = false\r\n\t\t// Set it to `true` if you want to prevent users from panning the popup\r\n\t\t// off of the screen while it is open.\r\n\t\tkeepInView: false,\r\n\r\n\t\t// @option closeButton: Boolean = true\r\n\t\t// Controls the presence of a close button in the popup.\r\n\t\tcloseButton: true,\r\n\r\n\t\t// @option autoClose: Boolean = true\r\n\t\t// Set it to `false` if you want to override the default behavior of\r\n\t\t// the popup closing when user clicks the map (set globally by\r\n\t\t// the Map's [closePopupOnClick](#map-closepopuponclick) option).\r\n\t\tautoClose: true,\r\n\r\n\t\t// @option className: String = ''\r\n\t\t// A custom CSS class name to assign to the popup.\r\n\t\tclassName: ''\r\n\t},\r\n\r\n\t// @namespace Popup\r\n\t// @method openOn(map: Map): this\r\n\t// Adds the popup to the map and closes the previous one. The same as `map.openPopup(popup)`.\r\n\topenOn: function (map) {\r\n\t\tmap.openPopup(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tL.DivOverlay.prototype.onAdd.call(this, map);\r\n\r\n\t\t// @namespace Map\r\n\t\t// @section Popup events\r\n\t\t// @event popupopen: PopupEvent\r\n\t\t// Fired when a popup is opened in the map\r\n\t\tmap.fire('popupopen', {popup: this});\r\n\r\n\t\tif (this._source) {\r\n\t\t\t// @namespace Layer\r\n\t\t\t// @section Popup events\r\n\t\t\t// @event popupopen: PopupEvent\r\n\t\t\t// Fired when a popup bound to this layer is opened\r\n\t\t\tthis._source.fire('popupopen', {popup: this}, true);\r\n\t\t\t// For non-path layers, we toggle the popup when clicking\r\n\t\t\t// again the layer, so prevent the map to reopen it.\r\n\t\t\tif (!(this._source instanceof L.Path)) {\r\n\t\t\t\tthis._source.on('preclick', L.DomEvent.stopPropagation);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tL.DivOverlay.prototype.onRemove.call(this, map);\r\n\r\n\t\t// @namespace Map\r\n\t\t// @section Popup events\r\n\t\t// @event popupclose: PopupEvent\r\n\t\t// Fired when a popup in the map is closed\r\n\t\tmap.fire('popupclose', {popup: this});\r\n\r\n\t\tif (this._source) {\r\n\t\t\t// @namespace Layer\r\n\t\t\t// @section Popup events\r\n\t\t\t// @event popupclose: PopupEvent\r\n\t\t\t// Fired when a popup bound to this layer is closed\r\n\t\t\tthis._source.fire('popupclose', {popup: this}, true);\r\n\t\t\tif (!(this._source instanceof L.Path)) {\r\n\t\t\t\tthis._source.off('preclick', L.DomEvent.stopPropagation);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tgetEvents: function () {\r\n\t\tvar events = L.DivOverlay.prototype.getEvents.call(this);\r\n\r\n\t\tif ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) {\r\n\t\t\tevents.preclick = this._close;\r\n\t\t}\r\n\r\n\t\tif (this.options.keepInView) {\r\n\t\t\tevents.moveend = this._adjustPan;\r\n\t\t}\r\n\r\n\t\treturn events;\r\n\t},\r\n\r\n\t_close: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis._map.closePopup(this);\r\n\t\t}\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar prefix = 'leaflet-popup',\r\n\t\t    container = this._container = L.DomUtil.create('div',\r\n\t\t\tprefix + ' ' + (this.options.className || '') +\r\n\t\t\t' leaflet-zoom-animated');\r\n\r\n\t\tif (this.options.closeButton) {\r\n\t\t\tvar closeButton = this._closeButton = L.DomUtil.create('a', prefix + '-close-button', container);\r\n\t\t\tcloseButton.href = '#close';\r\n\t\t\tcloseButton.innerHTML = '&#215;';\r\n\r\n\t\t\tL.DomEvent.on(closeButton, 'click', this._onCloseButtonClick, this);\r\n\t\t}\r\n\r\n\t\tvar wrapper = this._wrapper = L.DomUtil.create('div', prefix + '-content-wrapper', container);\r\n\t\tthis._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper);\r\n\r\n\t\tL.DomEvent\r\n\t\t\t.disableClickPropagation(wrapper)\r\n\t\t\t.disableScrollPropagation(this._contentNode)\r\n\t\t\t.on(wrapper, 'contextmenu', L.DomEvent.stopPropagation);\r\n\r\n\t\tthis._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container);\r\n\t\tthis._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer);\r\n\t},\r\n\r\n\t_updateLayout: function () {\r\n\t\tvar container = this._contentNode,\r\n\t\t    style = container.style;\r\n\r\n\t\tstyle.width = '';\r\n\t\tstyle.whiteSpace = 'nowrap';\r\n\r\n\t\tvar width = container.offsetWidth;\r\n\t\twidth = Math.min(width, this.options.maxWidth);\r\n\t\twidth = Math.max(width, this.options.minWidth);\r\n\r\n\t\tstyle.width = (width + 1) + 'px';\r\n\t\tstyle.whiteSpace = '';\r\n\r\n\t\tstyle.height = '';\r\n\r\n\t\tvar height = container.offsetHeight,\r\n\t\t    maxHeight = this.options.maxHeight,\r\n\t\t    scrolledClass = 'leaflet-popup-scrolled';\r\n\r\n\t\tif (maxHeight && height > maxHeight) {\r\n\t\t\tstyle.height = maxHeight + 'px';\r\n\t\t\tL.DomUtil.addClass(container, scrolledClass);\r\n\t\t} else {\r\n\t\t\tL.DomUtil.removeClass(container, scrolledClass);\r\n\t\t}\r\n\r\n\t\tthis._containerWidth = this._container.offsetWidth;\r\n\t},\r\n\r\n\t_animateZoom: function (e) {\r\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center),\r\n\t\t    anchor = this._getAnchor();\r\n\t\tL.DomUtil.setPosition(this._container, pos.add(anchor));\r\n\t},\r\n\r\n\t_adjustPan: function () {\r\n\t\tif (!this.options.autoPan || (this._map._panAnim && this._map._panAnim._inProgress)) { return; }\r\n\r\n\t\tvar map = this._map,\r\n\t\t    marginBottom = parseInt(L.DomUtil.getStyle(this._container, 'marginBottom'), 10) || 0,\r\n\t\t    containerHeight = this._container.offsetHeight + marginBottom,\r\n\t\t    containerWidth = this._containerWidth,\r\n\t\t    layerPos = new L.Point(this._containerLeft, -containerHeight - this._containerBottom);\r\n\r\n\t\tlayerPos._add(L.DomUtil.getPosition(this._container));\r\n\r\n\t\tvar containerPos = map.layerPointToContainerPoint(layerPos),\r\n\t\t    padding = L.point(this.options.autoPanPadding),\r\n\t\t    paddingTL = L.point(this.options.autoPanPaddingTopLeft || padding),\r\n\t\t    paddingBR = L.point(this.options.autoPanPaddingBottomRight || padding),\r\n\t\t    size = map.getSize(),\r\n\t\t    dx = 0,\r\n\t\t    dy = 0;\r\n\r\n\t\tif (containerPos.x + containerWidth + paddingBR.x > size.x) { // right\r\n\t\t\tdx = containerPos.x + containerWidth - size.x + paddingBR.x;\r\n\t\t}\r\n\t\tif (containerPos.x - dx - paddingTL.x < 0) { // left\r\n\t\t\tdx = containerPos.x - paddingTL.x;\r\n\t\t}\r\n\t\tif (containerPos.y + containerHeight + paddingBR.y > size.y) { // bottom\r\n\t\t\tdy = containerPos.y + containerHeight - size.y + paddingBR.y;\r\n\t\t}\r\n\t\tif (containerPos.y - dy - paddingTL.y < 0) { // top\r\n\t\t\tdy = containerPos.y - paddingTL.y;\r\n\t\t}\r\n\r\n\t\t// @namespace Map\r\n\t\t// @section Popup events\r\n\t\t// @event autopanstart: Event\r\n\t\t// Fired when the map starts autopanning when opening a popup.\r\n\t\tif (dx || dy) {\r\n\t\t\tmap\r\n\t\t\t    .fire('autopanstart')\r\n\t\t\t    .panBy([dx, dy]);\r\n\t\t}\r\n\t},\r\n\r\n\t_onCloseButtonClick: function (e) {\r\n\t\tthis._close();\r\n\t\tL.DomEvent.stop(e);\r\n\t},\r\n\r\n\t_getAnchor: function () {\r\n\t\t// Where should we anchor the popup on the source layer?\r\n\t\treturn L.point(this._source && this._source._getPopupAnchor ? this._source._getPopupAnchor() : [0, 0]);\r\n\t}\r\n\r\n});\r\n\r\n// @namespace Popup\r\n// @factory L.popup(options?: Popup options, source?: Layer)\r\n// Instantiates a `Popup` object given an optional `options` object that describes its appearance and location and an optional `source` object that is used to tag the popup with a reference to the Layer to which it refers.\r\nL.popup = function (options, source) {\r\n\treturn new L.Popup(options, source);\r\n};\r\n\r\n\r\n/* @namespace Map\r\n * @section Interaction Options\r\n * @option closePopupOnClick: Boolean = true\r\n * Set it to `false` if you don't want popups to close when user clicks the map.\r\n */\r\nL.Map.mergeOptions({\r\n\tclosePopupOnClick: true\r\n});\r\n\r\n\r\n// @namespace Map\r\n// @section Methods for Layers and Controls\r\nL.Map.include({\r\n\t// @method openPopup(popup: Popup): this\r\n\t// Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability).\r\n\t// @alternative\r\n\t// @method openPopup(content: String|HTMLElement, latlng: LatLng, options?: Popup options): this\r\n\t// Creates a popup with the specified content and options and opens it in the given point on a map.\r\n\topenPopup: function (popup, latlng, options) {\r\n\t\tif (!(popup instanceof L.Popup)) {\r\n\t\t\tpopup = new L.Popup(options).setContent(popup);\r\n\t\t}\r\n\r\n\t\tif (latlng) {\r\n\t\t\tpopup.setLatLng(latlng);\r\n\t\t}\r\n\r\n\t\tif (this.hasLayer(popup)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif (this._popup && this._popup.options.autoClose) {\r\n\t\t\tthis.closePopup();\r\n\t\t}\r\n\r\n\t\tthis._popup = popup;\r\n\t\treturn this.addLayer(popup);\r\n\t},\r\n\r\n\t// @method closePopup(popup?: Popup): this\r\n\t// Closes the popup previously opened with [openPopup](#map-openpopup) (or the given one).\r\n\tclosePopup: function (popup) {\r\n\t\tif (!popup || popup === this._popup) {\r\n\t\t\tpopup = this._popup;\r\n\t\t\tthis._popup = null;\r\n\t\t}\r\n\t\tif (popup) {\r\n\t\t\tthis.removeLayer(popup);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n});\r\n\r\n/*\r\n * @namespace Layer\r\n * @section Popup methods example\r\n *\r\n * All layers share a set of methods convenient for binding popups to it.\r\n *\r\n * ```js\r\n * var layer = L.Polygon(latlngs).bindPopup('Hi There!').addTo(map);\r\n * layer.openPopup();\r\n * layer.closePopup();\r\n * ```\r\n *\r\n * Popups will also be automatically opened when the layer is clicked on and closed when the layer is removed from the map or another popup is opened.\r\n */\r\n\r\n// @section Popup methods\r\nL.Layer.include({\r\n\r\n\t// @method bindPopup(content: String|HTMLElement|Function|Popup, options?: Popup options): this\r\n\t// Binds a popup to the layer with the passed `content` and sets up the\r\n\t// neccessary event listeners. If a `Function` is passed it will receive\r\n\t// the layer as the first argument and should return a `String` or `HTMLElement`.\r\n\tbindPopup: function (content, options) {\r\n\r\n\t\tif (content instanceof L.Popup) {\r\n\t\t\tL.setOptions(content, options);\r\n\t\t\tthis._popup = content;\r\n\t\t\tcontent._source = this;\r\n\t\t} else {\r\n\t\t\tif (!this._popup || options) {\r\n\t\t\t\tthis._popup = new L.Popup(options, this);\r\n\t\t\t}\r\n\t\t\tthis._popup.setContent(content);\r\n\t\t}\r\n\r\n\t\tif (!this._popupHandlersAdded) {\r\n\t\t\tthis.on({\r\n\t\t\t\tclick: this._openPopup,\r\n\t\t\t\tremove: this.closePopup,\r\n\t\t\t\tmove: this._movePopup\r\n\t\t\t});\r\n\t\t\tthis._popupHandlersAdded = true;\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method unbindPopup(): this\r\n\t// Removes the popup previously bound with `bindPopup`.\r\n\tunbindPopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis.off({\r\n\t\t\t\tclick: this._openPopup,\r\n\t\t\t\tremove: this.closePopup,\r\n\t\t\t\tmove: this._movePopup\r\n\t\t\t});\r\n\t\t\tthis._popupHandlersAdded = false;\r\n\t\t\tthis._popup = null;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method openPopup(latlng?: LatLng): this\r\n\t// Opens the bound popup at the specificed `latlng` or at the default popup anchor if no `latlng` is passed.\r\n\topenPopup: function (layer, latlng) {\r\n\t\tif (!(layer instanceof L.Layer)) {\r\n\t\t\tlatlng = layer;\r\n\t\t\tlayer = this;\r\n\t\t}\r\n\r\n\t\tif (layer instanceof L.FeatureGroup) {\r\n\t\t\tfor (var id in this._layers) {\r\n\t\t\t\tlayer = this._layers[id];\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!latlng) {\r\n\t\t\tlatlng = layer.getCenter ? layer.getCenter() : layer.getLatLng();\r\n\t\t}\r\n\r\n\t\tif (this._popup && this._map) {\r\n\t\t\t// set popup source to this layer\r\n\t\t\tthis._popup._source = layer;\r\n\r\n\t\t\t// update the popup (content, layout, ect...)\r\n\t\t\tthis._popup.update();\r\n\r\n\t\t\t// open the popup on the map\r\n\t\t\tthis._map.openPopup(this._popup, latlng);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method closePopup(): this\r\n\t// Closes the popup bound to this layer if it is open.\r\n\tclosePopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup._close();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method togglePopup(): this\r\n\t// Opens or closes the popup bound to this layer depending on its current state.\r\n\ttogglePopup: function (target) {\r\n\t\tif (this._popup) {\r\n\t\t\tif (this._popup._map) {\r\n\t\t\t\tthis.closePopup();\r\n\t\t\t} else {\r\n\t\t\t\tthis.openPopup(target);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method isPopupOpen(): boolean\r\n\t// Returns `true` if the popup bound to this layer is currently open.\r\n\tisPopupOpen: function () {\r\n\t\treturn (this._popup ? this._popup.isOpen() : false);\r\n\t},\r\n\r\n\t// @method setPopupContent(content: String|HTMLElement|Popup): this\r\n\t// Sets the content of the popup bound to this layer.\r\n\tsetPopupContent: function (content) {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup.setContent(content);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getPopup(): Popup\r\n\t// Returns the popup bound to this layer.\r\n\tgetPopup: function () {\r\n\t\treturn this._popup;\r\n\t},\r\n\r\n\t_openPopup: function (e) {\r\n\t\tvar layer = e.layer || e.target;\r\n\r\n\t\tif (!this._popup) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!this._map) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// prevent map click\r\n\t\tL.DomEvent.stop(e);\r\n\r\n\t\t// if this inherits from Path its a vector and we can just\r\n\t\t// open the popup at the new location\r\n\t\tif (layer instanceof L.Path) {\r\n\t\t\tthis.openPopup(e.layer || e.target, e.latlng);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// otherwise treat it like a marker and figure out\r\n\t\t// if we should toggle it open/closed\r\n\t\tif (this._map.hasLayer(this._popup) && this._popup._source === layer) {\r\n\t\t\tthis.closePopup();\r\n\t\t} else {\r\n\t\t\tthis.openPopup(layer, e.latlng);\r\n\t\t}\r\n\t},\r\n\r\n\t_movePopup: function (e) {\r\n\t\tthis._popup.setLatLng(e.latlng);\r\n\t}\r\n});\r\n\n\n\n/*\n * @class Tooltip\n * @inherits DivOverlay\n * @aka L.Tooltip\n * Used to display small texts on top of map layers.\n *\n * @example\n *\n * ```js\n * marker.bindTooltip(\"my tooltip text\").openTooltip();\n * ```\n * Note about tooltip offset. Leaflet takes two options in consideration\n * for computing tooltip offseting:\n * - the `offset` Tooltip option: it defaults to [0, 0], and it's specific to one tooltip.\n *   Add a positive x offset to move the tooltip to the right, and a positive y offset to\n *   move it to the bottom. Negatives will move to the left and top.\n * - the `tooltipAnchor` Icon option: this will only be considered for Marker. You\n *   should adapt this value if you use a custom icon.\n */\n\n\n// @namespace Tooltip\nL.Tooltip = L.DivOverlay.extend({\n\n\t// @section\n\t// @aka Tooltip options\n\toptions: {\n\t\t// @option pane: String = 'tooltipPane'\n\t\t// `Map pane` where the tooltip will be added.\n\t\tpane: 'tooltipPane',\n\n\t\t// @option offset: Point = Point(0, 0)\n\t\t// Optional offset of the tooltip position.\n\t\toffset: [0, 0],\n\n\t\t// @option direction: String = 'auto'\n\t\t// Direction where to open the tooltip. Possible values are: `right`, `left`,\n\t\t// `top`, `bottom`, `center`, `auto`.\n\t\t// `auto` will dynamicaly switch between `right` and `left` according to the tooltip\n\t\t// position on the map.\n\t\tdirection: 'auto',\n\n\t\t// @option permanent: Boolean = false\n\t\t// Whether to open the tooltip permanently or only on mouseover.\n\t\tpermanent: false,\n\n\t\t// @option sticky: Boolean = false\n\t\t// If true, the tooltip will follow the mouse instead of being fixed at the feature center.\n\t\tsticky: false,\n\n\t\t// @option interactive: Boolean = false\n\t\t// If true, the tooltip will listen to the feature events.\n\t\tinteractive: false,\n\n\t\t// @option opacity: Number = 0.9\n\t\t// Tooltip container opacity.\n\t\topacity: 0.9\n\t},\n\n\tonAdd: function (map) {\n\t\tL.DivOverlay.prototype.onAdd.call(this, map);\n\t\tthis.setOpacity(this.options.opacity);\n\n\t\t// @namespace Map\n\t\t// @section Tooltip events\n\t\t// @event tooltipopen: TooltipEvent\n\t\t// Fired when a tooltip is opened in the map.\n\t\tmap.fire('tooltipopen', {tooltip: this});\n\n\t\tif (this._source) {\n\t\t\t// @namespace Layer\n\t\t\t// @section Tooltip events\n\t\t\t// @event tooltipopen: TooltipEvent\n\t\t\t// Fired when a tooltip bound to this layer is opened.\n\t\t\tthis._source.fire('tooltipopen', {tooltip: this}, true);\n\t\t}\n\t},\n\n\tonRemove: function (map) {\n\t\tL.DivOverlay.prototype.onRemove.call(this, map);\n\n\t\t// @namespace Map\n\t\t// @section Tooltip events\n\t\t// @event tooltipclose: TooltipEvent\n\t\t// Fired when a tooltip in the map is closed.\n\t\tmap.fire('tooltipclose', {tooltip: this});\n\n\t\tif (this._source) {\n\t\t\t// @namespace Layer\n\t\t\t// @section Tooltip events\n\t\t\t// @event tooltipclose: TooltipEvent\n\t\t\t// Fired when a tooltip bound to this layer is closed.\n\t\t\tthis._source.fire('tooltipclose', {tooltip: this}, true);\n\t\t}\n\t},\n\n\tgetEvents: function () {\n\t\tvar events = L.DivOverlay.prototype.getEvents.call(this);\n\n\t\tif (L.Browser.touch && !this.options.permanent) {\n\t\t\tevents.preclick = this._close;\n\t\t}\n\n\t\treturn events;\n\t},\n\n\t_close: function () {\n\t\tif (this._map) {\n\t\t\tthis._map.closeTooltip(this);\n\t\t}\n\t},\n\n\t_initLayout: function () {\n\t\tvar prefix = 'leaflet-tooltip',\n\t\t    className = prefix + ' ' + (this.options.className || '') + ' leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide');\n\n\t\tthis._contentNode = this._container = L.DomUtil.create('div', className);\n\t},\n\n\t_updateLayout: function () {},\n\n\t_adjustPan: function () {},\n\n\t_setPosition: function (pos) {\n\t\tvar map = this._map,\n\t\t    container = this._container,\n\t\t    centerPoint = map.latLngToContainerPoint(map.getCenter()),\n\t\t    tooltipPoint = map.layerPointToContainerPoint(pos),\n\t\t    direction = this.options.direction,\n\t\t    tooltipWidth = container.offsetWidth,\n\t\t    tooltipHeight = container.offsetHeight,\n\t\t    offset = L.point(this.options.offset),\n\t\t    anchor = this._getAnchor();\n\n\t\tif (direction === 'top') {\n\t\t\tpos = pos.add(L.point(-tooltipWidth / 2 + offset.x, -tooltipHeight + offset.y + anchor.y, true));\n\t\t} else if (direction === 'bottom') {\n\t\t\tpos = pos.subtract(L.point(tooltipWidth / 2 - offset.x, -offset.y, true));\n\t\t} else if (direction === 'center') {\n\t\t\tpos = pos.subtract(L.point(tooltipWidth / 2 + offset.x, tooltipHeight / 2 - anchor.y + offset.y, true));\n\t\t} else if (direction === 'right' || direction === 'auto' && tooltipPoint.x < centerPoint.x) {\n\t\t\tdirection = 'right';\n\t\t\tpos = pos.add(L.point(offset.x + anchor.x, anchor.y - tooltipHeight / 2 + offset.y, true));\n\t\t} else {\n\t\t\tdirection = 'left';\n\t\t\tpos = pos.subtract(L.point(tooltipWidth + anchor.x - offset.x, tooltipHeight / 2 - anchor.y - offset.y, true));\n\t\t}\n\n\t\tL.DomUtil.removeClass(container, 'leaflet-tooltip-right');\n\t\tL.DomUtil.removeClass(container, 'leaflet-tooltip-left');\n\t\tL.DomUtil.removeClass(container, 'leaflet-tooltip-top');\n\t\tL.DomUtil.removeClass(container, 'leaflet-tooltip-bottom');\n\t\tL.DomUtil.addClass(container, 'leaflet-tooltip-' + direction);\n\t\tL.DomUtil.setPosition(container, pos);\n\t},\n\n\t_updatePosition: function () {\n\t\tvar pos = this._map.latLngToLayerPoint(this._latlng);\n\t\tthis._setPosition(pos);\n\t},\n\n\tsetOpacity: function (opacity) {\n\t\tthis.options.opacity = opacity;\n\n\t\tif (this._container) {\n\t\t\tL.DomUtil.setOpacity(this._container, opacity);\n\t\t}\n\t},\n\n\t_animateZoom: function (e) {\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center);\n\t\tthis._setPosition(pos);\n\t},\n\n\t_getAnchor: function () {\n\t\t// Where should we anchor the tooltip on the source layer?\n\t\treturn L.point(this._source && this._source._getTooltipAnchor && !this.options.sticky ? this._source._getTooltipAnchor() : [0, 0]);\n\t}\n\n});\n\n// @namespace Tooltip\n// @factory L.tooltip(options?: Tooltip options, source?: Layer)\n// Instantiates a Tooltip object given an optional `options` object that describes its appearance and location and an optional `source` object that is used to tag the tooltip with a reference to the Layer to which it refers.\nL.tooltip = function (options, source) {\n\treturn new L.Tooltip(options, source);\n};\n\n// @namespace Map\n// @section Methods for Layers and Controls\nL.Map.include({\n\n\t// @method openTooltip(tooltip: Tooltip): this\n\t// Opens the specified tooltip.\n\t// @alternative\n\t// @method openTooltip(content: String|HTMLElement, latlng: LatLng, options?: Tooltip options): this\n\t// Creates a tooltip with the specified content and options and open it.\n\topenTooltip: function (tooltip, latlng, options) {\n\t\tif (!(tooltip instanceof L.Tooltip)) {\n\t\t\ttooltip = new L.Tooltip(options).setContent(tooltip);\n\t\t}\n\n\t\tif (latlng) {\n\t\t\ttooltip.setLatLng(latlng);\n\t\t}\n\n\t\tif (this.hasLayer(tooltip)) {\n\t\t\treturn this;\n\t\t}\n\n\t\treturn this.addLayer(tooltip);\n\t},\n\n\t// @method closeTooltip(tooltip?: Tooltip): this\n\t// Closes the tooltip given as parameter.\n\tcloseTooltip: function (tooltip) {\n\t\tif (tooltip) {\n\t\t\tthis.removeLayer(tooltip);\n\t\t}\n\t\treturn this;\n\t}\n\n});\n\n/*\n * @namespace Layer\n * @section Tooltip methods example\n *\n * All layers share a set of methods convenient for binding tooltips to it.\n *\n * ```js\n * var layer = L.Polygon(latlngs).bindTooltip('Hi There!').addTo(map);\n * layer.openTooltip();\n * layer.closeTooltip();\n * ```\n */\n\n// @section Tooltip methods\nL.Layer.include({\n\n\t// @method bindTooltip(content: String|HTMLElement|Function|Tooltip, options?: Tooltip options): this\n\t// Binds a tooltip to the layer with the passed `content` and sets up the\n\t// neccessary event listeners. If a `Function` is passed it will receive\n\t// the layer as the first argument and should return a `String` or `HTMLElement`.\n\tbindTooltip: function (content, options) {\n\n\t\tif (content instanceof L.Tooltip) {\n\t\t\tL.setOptions(content, options);\n\t\t\tthis._tooltip = content;\n\t\t\tcontent._source = this;\n\t\t} else {\n\t\t\tif (!this._tooltip || options) {\n\t\t\t\tthis._tooltip = L.tooltip(options, this);\n\t\t\t}\n\t\t\tthis._tooltip.setContent(content);\n\n\t\t}\n\n\t\tthis._initTooltipInteractions();\n\n\t\tif (this._tooltip.options.permanent && this._map && this._map.hasLayer(this)) {\n\t\t\tthis.openTooltip();\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t// @method unbindTooltip(): this\n\t// Removes the tooltip previously bound with `bindTooltip`.\n\tunbindTooltip: function () {\n\t\tif (this._tooltip) {\n\t\t\tthis._initTooltipInteractions(true);\n\t\t\tthis.closeTooltip();\n\t\t\tthis._tooltip = null;\n\t\t}\n\t\treturn this;\n\t},\n\n\t_initTooltipInteractions: function (remove) {\n\t\tif (!remove && this._tooltipHandlersAdded) { return; }\n\t\tvar onOff = remove ? 'off' : 'on',\n\t\t    events = {\n\t\t\tremove: this.closeTooltip,\n\t\t\tmove: this._moveTooltip\n\t\t    };\n\t\tif (!this._tooltip.options.permanent) {\n\t\t\tevents.mouseover = this._openTooltip;\n\t\t\tevents.mouseout = this.closeTooltip;\n\t\t\tif (this._tooltip.options.sticky) {\n\t\t\t\tevents.mousemove = this._moveTooltip;\n\t\t\t}\n\t\t\tif (L.Browser.touch) {\n\t\t\t\tevents.click = this._openTooltip;\n\t\t\t}\n\t\t} else {\n\t\t\tevents.add = this._openTooltip;\n\t\t}\n\t\tthis[onOff](events);\n\t\tthis._tooltipHandlersAdded = !remove;\n\t},\n\n\t// @method openTooltip(latlng?: LatLng): this\n\t// Opens the bound tooltip at the specificed `latlng` or at the default tooltip anchor if no `latlng` is passed.\n\topenTooltip: function (layer, latlng) {\n\t\tif (!(layer instanceof L.Layer)) {\n\t\t\tlatlng = layer;\n\t\t\tlayer = this;\n\t\t}\n\n\t\tif (layer instanceof L.FeatureGroup) {\n\t\t\tfor (var id in this._layers) {\n\t\t\t\tlayer = this._layers[id];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!latlng) {\n\t\t\tlatlng = layer.getCenter ? layer.getCenter() : layer.getLatLng();\n\t\t}\n\n\t\tif (this._tooltip && this._map) {\n\n\t\t\t// set tooltip source to this layer\n\t\t\tthis._tooltip._source = layer;\n\n\t\t\t// update the tooltip (content, layout, ect...)\n\t\t\tthis._tooltip.update();\n\n\t\t\t// open the tooltip on the map\n\t\t\tthis._map.openTooltip(this._tooltip, latlng);\n\n\t\t\t// Tooltip container may not be defined if not permanent and never\n\t\t\t// opened.\n\t\t\tif (this._tooltip.options.interactive && this._tooltip._container) {\n\t\t\t\tL.DomUtil.addClass(this._tooltip._container, 'leaflet-clickable');\n\t\t\t\tthis.addInteractiveTarget(this._tooltip._container);\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t// @method closeTooltip(): this\n\t// Closes the tooltip bound to this layer if it is open.\n\tcloseTooltip: function () {\n\t\tif (this._tooltip) {\n\t\t\tthis._tooltip._close();\n\t\t\tif (this._tooltip.options.interactive && this._tooltip._container) {\n\t\t\t\tL.DomUtil.removeClass(this._tooltip._container, 'leaflet-clickable');\n\t\t\t\tthis.removeInteractiveTarget(this._tooltip._container);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method toggleTooltip(): this\n\t// Opens or closes the tooltip bound to this layer depending on its current state.\n\ttoggleTooltip: function (target) {\n\t\tif (this._tooltip) {\n\t\t\tif (this._tooltip._map) {\n\t\t\t\tthis.closeTooltip();\n\t\t\t} else {\n\t\t\t\tthis.openTooltip(target);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method isTooltipOpen(): boolean\n\t// Returns `true` if the tooltip bound to this layer is currently open.\n\tisTooltipOpen: function () {\n\t\treturn this._tooltip.isOpen();\n\t},\n\n\t// @method setTooltipContent(content: String|HTMLElement|Tooltip): this\n\t// Sets the content of the tooltip bound to this layer.\n\tsetTooltipContent: function (content) {\n\t\tif (this._tooltip) {\n\t\t\tthis._tooltip.setContent(content);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method getTooltip(): Tooltip\n\t// Returns the tooltip bound to this layer.\n\tgetTooltip: function () {\n\t\treturn this._tooltip;\n\t},\n\n\t_openTooltip: function (e) {\n\t\tvar layer = e.layer || e.target;\n\n\t\tif (!this._tooltip || !this._map) {\n\t\t\treturn;\n\t\t}\n\t\tthis.openTooltip(layer, this._tooltip.options.sticky ? e.latlng : undefined);\n\t},\n\n\t_moveTooltip: function (e) {\n\t\tvar latlng = e.latlng, containerPoint, layerPoint;\n\t\tif (this._tooltip.options.sticky && e.originalEvent) {\n\t\t\tcontainerPoint = this._map.mouseEventToContainerPoint(e.originalEvent);\n\t\t\tlayerPoint = this._map.containerPointToLayerPoint(containerPoint);\n\t\t\tlatlng = this._map.layerPointToLatLng(layerPoint);\n\t\t}\n\t\tthis._tooltip.setLatLng(latlng);\n\t}\n});\n\n\n\n/*\r\n * @class LayerGroup\r\n * @aka L.LayerGroup\r\n * @inherits Layer\r\n *\r\n * Used to group several layers and handle them as one. If you add it to the map,\r\n * any layers added or removed from the group will be added/removed on the map as\r\n * well. Extends `Layer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.layerGroup([marker1, marker2])\r\n * \t.addLayer(polyline)\r\n * \t.addTo(map);\r\n * ```\r\n */\r\n\r\nL.LayerGroup = L.Layer.extend({\r\n\r\n\tinitialize: function (layers) {\r\n\t\tthis._layers = {};\r\n\r\n\t\tvar i, len;\r\n\r\n\t\tif (layers) {\r\n\t\t\tfor (i = 0, len = layers.length; i < len; i++) {\r\n\t\t\t\tthis.addLayer(layers[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// @method addLayer(layer: Layer): this\r\n\t// Adds the given layer to the group.\r\n\taddLayer: function (layer) {\r\n\t\tvar id = this.getLayerId(layer);\r\n\r\n\t\tthis._layers[id] = layer;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._map.addLayer(layer);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method removeLayer(layer: Layer): this\r\n\t// Removes the given layer from the group.\r\n\t// @alternative\r\n\t// @method removeLayer(id: Number): this\r\n\t// Removes the layer with the given internal ID from the group.\r\n\tremoveLayer: function (layer) {\r\n\t\tvar id = layer in this._layers ? layer : this.getLayerId(layer);\r\n\r\n\t\tif (this._map && this._layers[id]) {\r\n\t\t\tthis._map.removeLayer(this._layers[id]);\r\n\t\t}\r\n\r\n\t\tdelete this._layers[id];\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method hasLayer(layer: Layer): Boolean\r\n\t// Returns `true` if the given layer is currently added to the group.\r\n\thasLayer: function (layer) {\r\n\t\treturn !!layer && (layer in this._layers || this.getLayerId(layer) in this._layers);\r\n\t},\r\n\r\n\t// @method clearLayers(): this\r\n\t// Removes all the layers from the group.\r\n\tclearLayers: function () {\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tthis.removeLayer(this._layers[i]);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method invoke(methodName: String, …): this\r\n\t// Calls `methodName` on every layer contained in this group, passing any\r\n\t// additional parameters. Has no effect if the layers contained do not\r\n\t// implement `methodName`.\r\n\tinvoke: function (methodName) {\r\n\t\tvar args = Array.prototype.slice.call(arguments, 1),\r\n\t\t    i, layer;\r\n\r\n\t\tfor (i in this._layers) {\r\n\t\t\tlayer = this._layers[i];\r\n\r\n\t\t\tif (layer[methodName]) {\r\n\t\t\t\tlayer[methodName].apply(layer, args);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tmap.addLayer(this._layers[i]);\r\n\t\t}\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tmap.removeLayer(this._layers[i]);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method eachLayer(fn: Function, context?: Object): this\r\n\t// Iterates over the layers of the group, optionally specifying context of the iterator function.\r\n\t// ```js\r\n\t// group.eachLayer(function (layer) {\r\n\t// \tlayer.bindPopup('Hello');\r\n\t// });\r\n\t// ```\r\n\teachLayer: function (method, context) {\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tmethod.call(context, this._layers[i]);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getLayer(id: Number): Layer\r\n\t// Returns the layer with the given internal ID.\r\n\tgetLayer: function (id) {\r\n\t\treturn this._layers[id];\r\n\t},\r\n\r\n\t// @method getLayers(): Layer[]\r\n\t// Returns an array of all the layers added to the group.\r\n\tgetLayers: function () {\r\n\t\tvar layers = [];\r\n\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tlayers.push(this._layers[i]);\r\n\t\t}\r\n\t\treturn layers;\r\n\t},\r\n\r\n\t// @method setZIndex(zIndex: Number): this\r\n\t// Calls `setZIndex` on every layer contained in this group, passing the z-index.\r\n\tsetZIndex: function (zIndex) {\r\n\t\treturn this.invoke('setZIndex', zIndex);\r\n\t},\r\n\r\n\t// @method getLayerId(layer: Layer): Number\r\n\t// Returns the internal ID for a layer\r\n\tgetLayerId: function (layer) {\r\n\t\treturn L.stamp(layer);\r\n\t}\r\n});\r\n\r\n\r\n// @factory L.layerGroup(layers: Layer[])\r\n// Create a layer group, optionally given an initial set of layers.\r\nL.layerGroup = function (layers) {\r\n\treturn new L.LayerGroup(layers);\r\n};\r\n\n\n\n/*\r\n * @class FeatureGroup\r\n * @aka L.FeatureGroup\r\n * @inherits LayerGroup\r\n *\r\n * Extended `LayerGroup` that makes it easier to do the same thing to all its member layers:\r\n *  * [`bindPopup`](#layer-bindpopup) binds a popup to all of the layers at once (likewise with [`bindTooltip`](#layer-bindtooltip))\r\n *  * Events are propagated to the `FeatureGroup`, so if the group has an event\r\n * handler, it will handle events from any of the layers. This includes mouse events\r\n * and custom events.\r\n *  * Has `layeradd` and `layerremove` events\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.featureGroup([marker1, marker2, polyline])\r\n * \t.bindPopup('Hello world!')\r\n * \t.on('click', function() { alert('Clicked on a member of the group!'); })\r\n * \t.addTo(map);\r\n * ```\r\n */\r\n\r\nL.FeatureGroup = L.LayerGroup.extend({\r\n\r\n\taddLayer: function (layer) {\r\n\t\tif (this.hasLayer(layer)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tlayer.addEventParent(this);\r\n\r\n\t\tL.LayerGroup.prototype.addLayer.call(this, layer);\r\n\r\n\t\t// @event layeradd: LayerEvent\r\n\t\t// Fired when a layer is added to this `FeatureGroup`\r\n\t\treturn this.fire('layeradd', {layer: layer});\r\n\t},\r\n\r\n\tremoveLayer: function (layer) {\r\n\t\tif (!this.hasLayer(layer)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\tif (layer in this._layers) {\r\n\t\t\tlayer = this._layers[layer];\r\n\t\t}\r\n\r\n\t\tlayer.removeEventParent(this);\r\n\r\n\t\tL.LayerGroup.prototype.removeLayer.call(this, layer);\r\n\r\n\t\t// @event layerremove: LayerEvent\r\n\t\t// Fired when a layer is removed from this `FeatureGroup`\r\n\t\treturn this.fire('layerremove', {layer: layer});\r\n\t},\r\n\r\n\t// @method setStyle(style: Path options): this\r\n\t// Sets the given path options to each layer of the group that has a `setStyle` method.\r\n\tsetStyle: function (style) {\r\n\t\treturn this.invoke('setStyle', style);\r\n\t},\r\n\r\n\t// @method bringToFront(): this\r\n\t// Brings the layer group to the top of all other layers\r\n\tbringToFront: function () {\r\n\t\treturn this.invoke('bringToFront');\r\n\t},\r\n\r\n\t// @method bringToBack(): this\r\n\t// Brings the layer group to the top of all other layers\r\n\tbringToBack: function () {\r\n\t\treturn this.invoke('bringToBack');\r\n\t},\r\n\r\n\t// @method getBounds(): LatLngBounds\r\n\t// Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).\r\n\tgetBounds: function () {\r\n\t\tvar bounds = new L.LatLngBounds();\r\n\r\n\t\tfor (var id in this._layers) {\r\n\t\t\tvar layer = this._layers[id];\r\n\t\t\tbounds.extend(layer.getBounds ? layer.getBounds() : layer.getLatLng());\r\n\t\t}\r\n\t\treturn bounds;\r\n\t}\r\n});\r\n\r\n// @factory L.featureGroup(layers: Layer[])\r\n// Create a feature group, optionally given an initial set of layers.\r\nL.featureGroup = function (layers) {\r\n\treturn new L.FeatureGroup(layers);\r\n};\r\n\n\n\n/*\n * @class Renderer\n * @inherits Layer\n * @aka L.Renderer\n *\n * Base class for vector renderer implementations (`SVG`, `Canvas`). Handles the\n * DOM container of the renderer, its bounds, and its zoom animation.\n *\n * A `Renderer` works as an implicit layer group for all `Path`s - the renderer\n * itself can be added or removed to the map. All paths use a renderer, which can\n * be implicit (the map will decide the type of renderer and use it automatically)\n * or explicit (using the [`renderer`](#path-renderer) option of the path).\n *\n * Do not use this class directly, use `SVG` and `Canvas` instead.\n *\n * @event update: Event\n * Fired when the renderer updates its bounds, center and zoom, for example when\n * its map has moved\n */\n\nL.Renderer = L.Layer.extend({\n\n\t// @section\n\t// @aka Renderer options\n\toptions: {\n\t\t// @option padding: Number = 0.1\n\t\t// How much to extend the clip area around the map view (relative to its size)\n\t\t// e.g. 0.1 would be 10% of map view in each direction\n\t\tpadding: 0.1\n\t},\n\n\tinitialize: function (options) {\n\t\tL.setOptions(this, options);\n\t\tL.stamp(this);\n\t\tthis._layers = this._layers || {};\n\t},\n\n\tonAdd: function () {\n\t\tif (!this._container) {\n\t\t\tthis._initContainer(); // defined by renderer implementations\n\n\t\t\tif (this._zoomAnimated) {\n\t\t\t\tL.DomUtil.addClass(this._container, 'leaflet-zoom-animated');\n\t\t\t}\n\t\t}\n\n\t\tthis.getPane().appendChild(this._container);\n\t\tthis._update();\n\t\tthis.on('update', this._updatePaths, this);\n\t},\n\n\tonRemove: function () {\n\t\tL.DomUtil.remove(this._container);\n\t\tthis.off('update', this._updatePaths, this);\n\t},\n\n\tgetEvents: function () {\n\t\tvar events = {\n\t\t\tviewreset: this._reset,\n\t\t\tzoom: this._onZoom,\n\t\t\tmoveend: this._update,\n\t\t\tzoomend: this._onZoomEnd\n\t\t};\n\t\tif (this._zoomAnimated) {\n\t\t\tevents.zoomanim = this._onAnimZoom;\n\t\t}\n\t\treturn events;\n\t},\n\n\t_onAnimZoom: function (ev) {\n\t\tthis._updateTransform(ev.center, ev.zoom);\n\t},\n\n\t_onZoom: function () {\n\t\tthis._updateTransform(this._map.getCenter(), this._map.getZoom());\n\t},\n\n\t_updateTransform: function (center, zoom) {\n\t\tvar scale = this._map.getZoomScale(zoom, this._zoom),\n\t\t    position = L.DomUtil.getPosition(this._container),\n\t\t    viewHalf = this._map.getSize().multiplyBy(0.5 + this.options.padding),\n\t\t    currentCenterPoint = this._map.project(this._center, zoom),\n\t\t    destCenterPoint = this._map.project(center, zoom),\n\t\t    centerOffset = destCenterPoint.subtract(currentCenterPoint),\n\n\t\t    topLeftOffset = viewHalf.multiplyBy(-scale).add(position).add(viewHalf).subtract(centerOffset);\n\n\t\tif (L.Browser.any3d) {\n\t\t\tL.DomUtil.setTransform(this._container, topLeftOffset, scale);\n\t\t} else {\n\t\t\tL.DomUtil.setPosition(this._container, topLeftOffset);\n\t\t}\n\t},\n\n\t_reset: function () {\n\t\tthis._update();\n\t\tthis._updateTransform(this._center, this._zoom);\n\n\t\tfor (var id in this._layers) {\n\t\t\tthis._layers[id]._reset();\n\t\t}\n\t},\n\n\t_onZoomEnd: function () {\n\t\tfor (var id in this._layers) {\n\t\t\tthis._layers[id]._project();\n\t\t}\n\t},\n\n\t_updatePaths: function () {\n\t\tfor (var id in this._layers) {\n\t\t\tthis._layers[id]._update();\n\t\t}\n\t},\n\n\t_update: function () {\n\t\t// Update pixel bounds of renderer container (for positioning/sizing/clipping later)\n\t\t// Subclasses are responsible of firing the 'update' event.\n\t\tvar p = this.options.padding,\n\t\t    size = this._map.getSize(),\n\t\t    min = this._map.containerPointToLayerPoint(size.multiplyBy(-p)).round();\n\n\t\tthis._bounds = new L.Bounds(min, min.add(size.multiplyBy(1 + p * 2)).round());\n\n\t\tthis._center = this._map.getCenter();\n\t\tthis._zoom = this._map.getZoom();\n\t}\n});\n\n\nL.Map.include({\n\t// @namespace Map; @method getRenderer(layer: Path): Renderer\n\t// Returns the instance of `Renderer` that should be used to render the given\n\t// `Path`. It will ensure that the `renderer` options of the map and paths\n\t// are respected, and that the renderers do exist on the map.\n\tgetRenderer: function (layer) {\n\t\t// @namespace Path; @option renderer: Renderer\n\t\t// Use this specific instance of `Renderer` for this path. Takes\n\t\t// precedence over the map's [default renderer](#map-renderer).\n\t\tvar renderer = layer.options.renderer || this._getPaneRenderer(layer.options.pane) || this.options.renderer || this._renderer;\n\n\t\tif (!renderer) {\n\t\t\t// @namespace Map; @option preferCanvas: Boolean = false\n\t\t\t// Whether `Path`s should be rendered on a `Canvas` renderer.\n\t\t\t// By default, all `Path`s are rendered in a `SVG` renderer.\n\t\t\trenderer = this._renderer = (this.options.preferCanvas && L.canvas()) || L.svg();\n\t\t}\n\n\t\tif (!this.hasLayer(renderer)) {\n\t\t\tthis.addLayer(renderer);\n\t\t}\n\t\treturn renderer;\n\t},\n\n\t_getPaneRenderer: function (name) {\n\t\tif (name === 'overlayPane' || name === undefined) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar renderer = this._paneRenderers[name];\n\t\tif (renderer === undefined) {\n\t\t\trenderer = (L.SVG && L.svg({pane: name})) || (L.Canvas && L.canvas({pane: name}));\n\t\t\tthis._paneRenderers[name] = renderer;\n\t\t}\n\t\treturn renderer;\n\t}\n});\n\n\n\n/*\n * @class Path\n * @aka L.Path\n * @inherits Interactive layer\n *\n * An abstract class that contains options and constants shared between vector\n * overlays (Polygon, Polyline, Circle). Do not use it directly. Extends `Layer`.\n */\n\nL.Path = L.Layer.extend({\n\n\t// @section\n\t// @aka Path options\n\toptions: {\n\t\t// @option stroke: Boolean = true\n\t\t// Whether to draw stroke along the path. Set it to `false` to disable borders on polygons or circles.\n\t\tstroke: true,\n\n\t\t// @option color: String = '#3388ff'\n\t\t// Stroke color\n\t\tcolor: '#3388ff',\n\n\t\t// @option weight: Number = 3\n\t\t// Stroke width in pixels\n\t\tweight: 3,\n\n\t\t// @option opacity: Number = 1.0\n\t\t// Stroke opacity\n\t\topacity: 1,\n\n\t\t// @option lineCap: String= 'round'\n\t\t// A string that defines [shape to be used at the end](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-linecap) of the stroke.\n\t\tlineCap: 'round',\n\n\t\t// @option lineJoin: String = 'round'\n\t\t// A string that defines [shape to be used at the corners](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-linejoin) of the stroke.\n\t\tlineJoin: 'round',\n\n\t\t// @option dashArray: String = null\n\t\t// A string that defines the stroke [dash pattern](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dasharray). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility).\n\t\tdashArray: null,\n\n\t\t// @option dashOffset: String = null\n\t\t// A string that defines the [distance into the dash pattern to start the dash](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dashoffset). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility).\n\t\tdashOffset: null,\n\n\t\t// @option fill: Boolean = depends\n\t\t// Whether to fill the path with color. Set it to `false` to disable filling on polygons or circles.\n\t\tfill: false,\n\n\t\t// @option fillColor: String = *\n\t\t// Fill color. Defaults to the value of the [`color`](#path-color) option\n\t\tfillColor: null,\n\n\t\t// @option fillOpacity: Number = 0.2\n\t\t// Fill opacity.\n\t\tfillOpacity: 0.2,\n\n\t\t// @option fillRule: String = 'evenodd'\n\t\t// A string that defines [how the inside of a shape](https://developer.mozilla.org/docs/Web/SVG/Attribute/fill-rule) is determined.\n\t\tfillRule: 'evenodd',\n\n\t\t// className: '',\n\n\t\t// Option inherited from \"Interactive layer\" abstract class\n\t\tinteractive: true\n\t},\n\n\tbeforeAdd: function (map) {\n\t\t// Renderer is set here because we need to call renderer.getEvents\n\t\t// before this.getEvents.\n\t\tthis._renderer = map.getRenderer(this);\n\t},\n\n\tonAdd: function () {\n\t\tthis._renderer._initPath(this);\n\t\tthis._reset();\n\t\tthis._renderer._addPath(this);\n\t},\n\n\tonRemove: function () {\n\t\tthis._renderer._removePath(this);\n\t},\n\n\t// @method redraw(): this\n\t// Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.\n\tredraw: function () {\n\t\tif (this._map) {\n\t\t\tthis._renderer._updatePath(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method setStyle(style: Path options): this\n\t// Changes the appearance of a Path based on the options in the `Path options` object.\n\tsetStyle: function (style) {\n\t\tL.setOptions(this, style);\n\t\tif (this._renderer) {\n\t\t\tthis._renderer._updateStyle(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method bringToFront(): this\n\t// Brings the layer to the top of all path layers.\n\tbringToFront: function () {\n\t\tif (this._renderer) {\n\t\t\tthis._renderer._bringToFront(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method bringToBack(): this\n\t// Brings the layer to the bottom of all path layers.\n\tbringToBack: function () {\n\t\tif (this._renderer) {\n\t\t\tthis._renderer._bringToBack(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\tgetElement: function () {\n\t\treturn this._path;\n\t},\n\n\t_reset: function () {\n\t\t// defined in children classes\n\t\tthis._project();\n\t\tthis._update();\n\t},\n\n\t_clickTolerance: function () {\n\t\t// used when doing hit detection for Canvas layers\n\t\treturn (this.options.stroke ? this.options.weight / 2 : 0) + (L.Browser.touch ? 10 : 0);\n\t}\n});\n\n\n\n/*\r\n * @namespace LineUtil\r\n *\r\n * Various utility functions for polyine points processing, used by Leaflet internally to make polylines lightning-fast.\r\n */\r\n\r\nL.LineUtil = {\r\n\r\n\t// Simplify polyline with vertex reduction and Douglas-Peucker simplification.\r\n\t// Improves rendering performance dramatically by lessening the number of points to draw.\r\n\r\n\t// @function simplify(points: Point[], tolerance: Number): Point[]\r\n\t// Dramatically reduces the number of points in a polyline while retaining\r\n\t// its shape and returns a new array of simplified points, using the\r\n\t// [Douglas-Peucker algorithm](http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm).\r\n\t// Used for a huge performance boost when processing/displaying Leaflet polylines for\r\n\t// each zoom level and also reducing visual noise. tolerance affects the amount of\r\n\t// simplification (lesser value means higher quality but slower and with more points).\r\n\t// Also released as a separated micro-library [Simplify.js](http://mourner.github.com/simplify-js/).\r\n\tsimplify: function (points, tolerance) {\r\n\t\tif (!tolerance || !points.length) {\r\n\t\t\treturn points.slice();\r\n\t\t}\r\n\r\n\t\tvar sqTolerance = tolerance * tolerance;\r\n\r\n\t\t// stage 1: vertex reduction\r\n\t\tpoints = this._reducePoints(points, sqTolerance);\r\n\r\n\t\t// stage 2: Douglas-Peucker simplification\r\n\t\tpoints = this._simplifyDP(points, sqTolerance);\r\n\r\n\t\treturn points;\r\n\t},\r\n\r\n\t// @function pointToSegmentDistance(p: Point, p1: Point, p2: Point): Number\r\n\t// Returns the distance between point `p` and segment `p1` to `p2`.\r\n\tpointToSegmentDistance:  function (p, p1, p2) {\r\n\t\treturn Math.sqrt(this._sqClosestPointOnSegment(p, p1, p2, true));\r\n\t},\r\n\r\n\t// @function closestPointOnSegment(p: Point, p1: Point, p2: Point): Number\r\n\t// Returns the closest point from a point `p` on a segment `p1` to `p2`.\r\n\tclosestPointOnSegment: function (p, p1, p2) {\r\n\t\treturn this._sqClosestPointOnSegment(p, p1, p2);\r\n\t},\r\n\r\n\t// Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm\r\n\t_simplifyDP: function (points, sqTolerance) {\r\n\r\n\t\tvar len = points.length,\r\n\t\t    ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array,\r\n\t\t    markers = new ArrayConstructor(len);\r\n\r\n\t\tmarkers[0] = markers[len - 1] = 1;\r\n\r\n\t\tthis._simplifyDPStep(points, markers, sqTolerance, 0, len - 1);\r\n\r\n\t\tvar i,\r\n\t\t    newPoints = [];\r\n\r\n\t\tfor (i = 0; i < len; i++) {\r\n\t\t\tif (markers[i]) {\r\n\t\t\t\tnewPoints.push(points[i]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn newPoints;\r\n\t},\r\n\r\n\t_simplifyDPStep: function (points, markers, sqTolerance, first, last) {\r\n\r\n\t\tvar maxSqDist = 0,\r\n\t\t    index, i, sqDist;\r\n\r\n\t\tfor (i = first + 1; i <= last - 1; i++) {\r\n\t\t\tsqDist = this._sqClosestPointOnSegment(points[i], points[first], points[last], true);\r\n\r\n\t\t\tif (sqDist > maxSqDist) {\r\n\t\t\t\tindex = i;\r\n\t\t\t\tmaxSqDist = sqDist;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (maxSqDist > sqTolerance) {\r\n\t\t\tmarkers[index] = 1;\r\n\r\n\t\t\tthis._simplifyDPStep(points, markers, sqTolerance, first, index);\r\n\t\t\tthis._simplifyDPStep(points, markers, sqTolerance, index, last);\r\n\t\t}\r\n\t},\r\n\r\n\t// reduce points that are too close to each other to a single point\r\n\t_reducePoints: function (points, sqTolerance) {\r\n\t\tvar reducedPoints = [points[0]];\r\n\r\n\t\tfor (var i = 1, prev = 0, len = points.length; i < len; i++) {\r\n\t\t\tif (this._sqDist(points[i], points[prev]) > sqTolerance) {\r\n\t\t\t\treducedPoints.push(points[i]);\r\n\t\t\t\tprev = i;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (prev < len - 1) {\r\n\t\t\treducedPoints.push(points[len - 1]);\r\n\t\t}\r\n\t\treturn reducedPoints;\r\n\t},\r\n\r\n\r\n\t// @function clipSegment(a: Point, b: Point, bounds: Bounds, useLastCode?: Boolean, round?: Boolean): Point[]|Boolean\r\n\t// Clips the segment a to b by rectangular bounds with the\r\n\t// [Cohen-Sutherland algorithm](https://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm)\r\n\t// (modifying the segment points directly!). Used by Leaflet to only show polyline\r\n\t// points that are on the screen or near, increasing performance.\r\n\tclipSegment: function (a, b, bounds, useLastCode, round) {\r\n\t\tvar codeA = useLastCode ? this._lastCode : this._getBitCode(a, bounds),\r\n\t\t    codeB = this._getBitCode(b, bounds),\r\n\r\n\t\t    codeOut, p, newCode;\r\n\r\n\t\t// save 2nd code to avoid calculating it on the next segment\r\n\t\tthis._lastCode = codeB;\r\n\r\n\t\twhile (true) {\r\n\t\t\t// if a,b is inside the clip window (trivial accept)\r\n\t\t\tif (!(codeA | codeB)) {\r\n\t\t\t\treturn [a, b];\r\n\t\t\t}\r\n\r\n\t\t\t// if a,b is outside the clip window (trivial reject)\r\n\t\t\tif (codeA & codeB) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// other cases\r\n\t\t\tcodeOut = codeA || codeB;\r\n\t\t\tp = this._getEdgeIntersection(a, b, codeOut, bounds, round);\r\n\t\t\tnewCode = this._getBitCode(p, bounds);\r\n\r\n\t\t\tif (codeOut === codeA) {\r\n\t\t\t\ta = p;\r\n\t\t\t\tcodeA = newCode;\r\n\t\t\t} else {\r\n\t\t\t\tb = p;\r\n\t\t\t\tcodeB = newCode;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_getEdgeIntersection: function (a, b, code, bounds, round) {\r\n\t\tvar dx = b.x - a.x,\r\n\t\t    dy = b.y - a.y,\r\n\t\t    min = bounds.min,\r\n\t\t    max = bounds.max,\r\n\t\t    x, y;\r\n\r\n\t\tif (code & 8) { // top\r\n\t\t\tx = a.x + dx * (max.y - a.y) / dy;\r\n\t\t\ty = max.y;\r\n\r\n\t\t} else if (code & 4) { // bottom\r\n\t\t\tx = a.x + dx * (min.y - a.y) / dy;\r\n\t\t\ty = min.y;\r\n\r\n\t\t} else if (code & 2) { // right\r\n\t\t\tx = max.x;\r\n\t\t\ty = a.y + dy * (max.x - a.x) / dx;\r\n\r\n\t\t} else if (code & 1) { // left\r\n\t\t\tx = min.x;\r\n\t\t\ty = a.y + dy * (min.x - a.x) / dx;\r\n\t\t}\r\n\r\n\t\treturn new L.Point(x, y, round);\r\n\t},\r\n\r\n\t_getBitCode: function (p, bounds) {\r\n\t\tvar code = 0;\r\n\r\n\t\tif (p.x < bounds.min.x) { // left\r\n\t\t\tcode |= 1;\r\n\t\t} else if (p.x > bounds.max.x) { // right\r\n\t\t\tcode |= 2;\r\n\t\t}\r\n\r\n\t\tif (p.y < bounds.min.y) { // bottom\r\n\t\t\tcode |= 4;\r\n\t\t} else if (p.y > bounds.max.y) { // top\r\n\t\t\tcode |= 8;\r\n\t\t}\r\n\r\n\t\treturn code;\r\n\t},\r\n\r\n\t// square distance (to avoid unnecessary Math.sqrt calls)\r\n\t_sqDist: function (p1, p2) {\r\n\t\tvar dx = p2.x - p1.x,\r\n\t\t    dy = p2.y - p1.y;\r\n\t\treturn dx * dx + dy * dy;\r\n\t},\r\n\r\n\t// return closest point on segment or distance to that point\r\n\t_sqClosestPointOnSegment: function (p, p1, p2, sqDist) {\r\n\t\tvar x = p1.x,\r\n\t\t    y = p1.y,\r\n\t\t    dx = p2.x - x,\r\n\t\t    dy = p2.y - y,\r\n\t\t    dot = dx * dx + dy * dy,\r\n\t\t    t;\r\n\r\n\t\tif (dot > 0) {\r\n\t\t\tt = ((p.x - x) * dx + (p.y - y) * dy) / dot;\r\n\r\n\t\t\tif (t > 1) {\r\n\t\t\t\tx = p2.x;\r\n\t\t\t\ty = p2.y;\r\n\t\t\t} else if (t > 0) {\r\n\t\t\t\tx += dx * t;\r\n\t\t\t\ty += dy * t;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tdx = p.x - x;\r\n\t\tdy = p.y - y;\r\n\r\n\t\treturn sqDist ? dx * dx + dy * dy : new L.Point(x, y);\r\n\t}\r\n};\r\n\n\n\n/*\n * @class Polyline\n * @aka L.Polyline\n * @inherits Path\n *\n * A class for drawing polyline overlays on a map. Extends `Path`.\n *\n * @example\n *\n * ```js\n * // create a red polyline from an array of LatLng points\n * var latlngs = [\n * \t[45.51, -122.68],\n * \t[37.77, -122.43],\n * \t[34.04, -118.2]\n * ];\n *\n * var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);\n *\n * // zoom the map to the polyline\n * map.fitBounds(polyline.getBounds());\n * ```\n *\n * You can also pass a multi-dimensional array to represent a `MultiPolyline` shape:\n *\n * ```js\n * // create a red polyline from an array of arrays of LatLng points\n * var latlngs = [\n * \t[[45.51, -122.68],\n * \t [37.77, -122.43],\n * \t [34.04, -118.2]],\n * \t[[40.78, -73.91],\n * \t [41.83, -87.62],\n * \t [32.76, -96.72]]\n * ];\n * ```\n */\n\nL.Polyline = L.Path.extend({\n\n\t// @section\n\t// @aka Polyline options\n\toptions: {\n\t\t// @option smoothFactor: Number = 1.0\n\t\t// How much to simplify the polyline on each zoom level. More means\n\t\t// better performance and smoother look, and less means more accurate representation.\n\t\tsmoothFactor: 1.0,\n\n\t\t// @option noClip: Boolean = false\n\t\t// Disable polyline clipping.\n\t\tnoClip: false\n\t},\n\n\tinitialize: function (latlngs, options) {\n\t\tL.setOptions(this, options);\n\t\tthis._setLatLngs(latlngs);\n\t},\n\n\t// @method getLatLngs(): LatLng[]\n\t// Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.\n\tgetLatLngs: function () {\n\t\treturn this._latlngs;\n\t},\n\n\t// @method setLatLngs(latlngs: LatLng[]): this\n\t// Replaces all the points in the polyline with the given array of geographical points.\n\tsetLatLngs: function (latlngs) {\n\t\tthis._setLatLngs(latlngs);\n\t\treturn this.redraw();\n\t},\n\n\t// @method isEmpty(): Boolean\n\t// Returns `true` if the Polyline has no LatLngs.\n\tisEmpty: function () {\n\t\treturn !this._latlngs.length;\n\t},\n\n\tclosestLayerPoint: function (p) {\n\t\tvar minDistance = Infinity,\n\t\t    minPoint = null,\n\t\t    closest = L.LineUtil._sqClosestPointOnSegment,\n\t\t    p1, p2;\n\n\t\tfor (var j = 0, jLen = this._parts.length; j < jLen; j++) {\n\t\t\tvar points = this._parts[j];\n\n\t\t\tfor (var i = 1, len = points.length; i < len; i++) {\n\t\t\t\tp1 = points[i - 1];\n\t\t\t\tp2 = points[i];\n\n\t\t\t\tvar sqDist = closest(p, p1, p2, true);\n\n\t\t\t\tif (sqDist < minDistance) {\n\t\t\t\t\tminDistance = sqDist;\n\t\t\t\t\tminPoint = closest(p, p1, p2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (minPoint) {\n\t\t\tminPoint.distance = Math.sqrt(minDistance);\n\t\t}\n\t\treturn minPoint;\n\t},\n\n\t// @method getCenter(): LatLng\n\t// Returns the center ([centroid](http://en.wikipedia.org/wiki/Centroid)) of the polyline.\n\tgetCenter: function () {\n\t\t// throws error when not yet added to map as this center calculation requires projected coordinates\n\t\tif (!this._map) {\n\t\t\tthrow new Error('Must add layer to map before using getCenter()');\n\t\t}\n\n\t\tvar i, halfDist, segDist, dist, p1, p2, ratio,\n\t\t    points = this._rings[0],\n\t\t    len = points.length;\n\n\t\tif (!len) { return null; }\n\n\t\t// polyline centroid algorithm; only uses the first ring if there are multiple\n\n\t\tfor (i = 0, halfDist = 0; i < len - 1; i++) {\n\t\t\thalfDist += points[i].distanceTo(points[i + 1]) / 2;\n\t\t}\n\n\t\t// The line is so small in the current view that all points are on the same pixel.\n\t\tif (halfDist === 0) {\n\t\t\treturn this._map.layerPointToLatLng(points[0]);\n\t\t}\n\n\t\tfor (i = 0, dist = 0; i < len - 1; i++) {\n\t\t\tp1 = points[i];\n\t\t\tp2 = points[i + 1];\n\t\t\tsegDist = p1.distanceTo(p2);\n\t\t\tdist += segDist;\n\n\t\t\tif (dist > halfDist) {\n\t\t\t\tratio = (dist - halfDist) / segDist;\n\t\t\t\treturn this._map.layerPointToLatLng([\n\t\t\t\t\tp2.x - ratio * (p2.x - p1.x),\n\t\t\t\t\tp2.y - ratio * (p2.y - p1.y)\n\t\t\t\t]);\n\t\t\t}\n\t\t}\n\t},\n\n\t// @method getBounds(): LatLngBounds\n\t// Returns the `LatLngBounds` of the path.\n\tgetBounds: function () {\n\t\treturn this._bounds;\n\t},\n\n\t// @method addLatLng(latlng: LatLng, latlngs? LatLng[]): this\n\t// Adds a given point to the polyline. By default, adds to the first ring of\n\t// the polyline in case of a multi-polyline, but can be overridden by passing\n\t// a specific ring as a LatLng array (that you can earlier access with [`getLatLngs`](#polyline-getlatlngs)).\n\taddLatLng: function (latlng, latlngs) {\n\t\tlatlngs = latlngs || this._defaultShape();\n\t\tlatlng = L.latLng(latlng);\n\t\tlatlngs.push(latlng);\n\t\tthis._bounds.extend(latlng);\n\t\treturn this.redraw();\n\t},\n\n\t_setLatLngs: function (latlngs) {\n\t\tthis._bounds = new L.LatLngBounds();\n\t\tthis._latlngs = this._convertLatLngs(latlngs);\n\t},\n\n\t_defaultShape: function () {\n\t\treturn L.Polyline._flat(this._latlngs) ? this._latlngs : this._latlngs[0];\n\t},\n\n\t// recursively convert latlngs input into actual LatLng instances; calculate bounds along the way\n\t_convertLatLngs: function (latlngs) {\n\t\tvar result = [],\n\t\t    flat = L.Polyline._flat(latlngs);\n\n\t\tfor (var i = 0, len = latlngs.length; i < len; i++) {\n\t\t\tif (flat) {\n\t\t\t\tresult[i] = L.latLng(latlngs[i]);\n\t\t\t\tthis._bounds.extend(result[i]);\n\t\t\t} else {\n\t\t\t\tresult[i] = this._convertLatLngs(latlngs[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t},\n\n\t_project: function () {\n\t\tvar pxBounds = new L.Bounds();\n\t\tthis._rings = [];\n\t\tthis._projectLatlngs(this._latlngs, this._rings, pxBounds);\n\n\t\tvar w = this._clickTolerance(),\n\t\t    p = new L.Point(w, w);\n\n\t\tif (this._bounds.isValid() && pxBounds.isValid()) {\n\t\t\tpxBounds.min._subtract(p);\n\t\t\tpxBounds.max._add(p);\n\t\t\tthis._pxBounds = pxBounds;\n\t\t}\n\t},\n\n\t// recursively turns latlngs into a set of rings with projected coordinates\n\t_projectLatlngs: function (latlngs, result, projectedBounds) {\n\t\tvar flat = latlngs[0] instanceof L.LatLng,\n\t\t    len = latlngs.length,\n\t\t    i, ring;\n\n\t\tif (flat) {\n\t\t\tring = [];\n\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\tring[i] = this._map.latLngToLayerPoint(latlngs[i]);\n\t\t\t\tprojectedBounds.extend(ring[i]);\n\t\t\t}\n\t\t\tresult.push(ring);\n\t\t} else {\n\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\tthis._projectLatlngs(latlngs[i], result, projectedBounds);\n\t\t\t}\n\t\t}\n\t},\n\n\t// clip polyline by renderer bounds so that we have less to render for performance\n\t_clipPoints: function () {\n\t\tvar bounds = this._renderer._bounds;\n\n\t\tthis._parts = [];\n\t\tif (!this._pxBounds || !this._pxBounds.intersects(bounds)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.options.noClip) {\n\t\t\tthis._parts = this._rings;\n\t\t\treturn;\n\t\t}\n\n\t\tvar parts = this._parts,\n\t\t    i, j, k, len, len2, segment, points;\n\n\t\tfor (i = 0, k = 0, len = this._rings.length; i < len; i++) {\n\t\t\tpoints = this._rings[i];\n\n\t\t\tfor (j = 0, len2 = points.length; j < len2 - 1; j++) {\n\t\t\t\tsegment = L.LineUtil.clipSegment(points[j], points[j + 1], bounds, j, true);\n\n\t\t\t\tif (!segment) { continue; }\n\n\t\t\t\tparts[k] = parts[k] || [];\n\t\t\t\tparts[k].push(segment[0]);\n\n\t\t\t\t// if segment goes out of screen, or it's the last one, it's the end of the line part\n\t\t\t\tif ((segment[1] !== points[j + 1]) || (j === len2 - 2)) {\n\t\t\t\t\tparts[k].push(segment[1]);\n\t\t\t\t\tk++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// simplify each clipped part of the polyline for performance\n\t_simplifyPoints: function () {\n\t\tvar parts = this._parts,\n\t\t    tolerance = this.options.smoothFactor;\n\n\t\tfor (var i = 0, len = parts.length; i < len; i++) {\n\t\t\tparts[i] = L.LineUtil.simplify(parts[i], tolerance);\n\t\t}\n\t},\n\n\t_update: function () {\n\t\tif (!this._map) { return; }\n\n\t\tthis._clipPoints();\n\t\tthis._simplifyPoints();\n\t\tthis._updatePath();\n\t},\n\n\t_updatePath: function () {\n\t\tthis._renderer._updatePoly(this);\n\t}\n});\n\n// @factory L.polyline(latlngs: LatLng[], options?: Polyline options)\n// Instantiates a polyline object given an array of geographical points and\n// optionally an options object. You can create a `Polyline` object with\n// multiple separate lines (`MultiPolyline`) by passing an array of arrays\n// of geographic points.\nL.polyline = function (latlngs, options) {\n\treturn new L.Polyline(latlngs, options);\n};\n\nL.Polyline._flat = function (latlngs) {\n\t// true if it's a flat array of latlngs; false if nested\n\treturn !L.Util.isArray(latlngs[0]) || (typeof latlngs[0][0] !== 'object' && typeof latlngs[0][0] !== 'undefined');\n};\n\n\n\n/*\r\n * @namespace PolyUtil\r\n * Various utility functions for polygon geometries.\r\n */\r\n\r\nL.PolyUtil = {};\r\n\r\n/* @function clipPolygon(points: Point[], bounds: Bounds, round?: Boolean): Point[]\r\n * Clips the polygon geometry defined by the given `points` by the given bounds (using the [Sutherland-Hodgeman algorithm](https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm)).\r\n * Used by Leaflet to only show polygon points that are on the screen or near, increasing\r\n * performance. Note that polygon points needs different algorithm for clipping\r\n * than polyline, so there's a seperate method for it.\r\n */\r\nL.PolyUtil.clipPolygon = function (points, bounds, round) {\r\n\tvar clippedPoints,\r\n\t    edges = [1, 4, 2, 8],\r\n\t    i, j, k,\r\n\t    a, b,\r\n\t    len, edge, p,\r\n\t    lu = L.LineUtil;\r\n\r\n\tfor (i = 0, len = points.length; i < len; i++) {\r\n\t\tpoints[i]._code = lu._getBitCode(points[i], bounds);\r\n\t}\r\n\r\n\t// for each edge (left, bottom, right, top)\r\n\tfor (k = 0; k < 4; k++) {\r\n\t\tedge = edges[k];\r\n\t\tclippedPoints = [];\r\n\r\n\t\tfor (i = 0, len = points.length, j = len - 1; i < len; j = i++) {\r\n\t\t\ta = points[i];\r\n\t\t\tb = points[j];\r\n\r\n\t\t\t// if a is inside the clip window\r\n\t\t\tif (!(a._code & edge)) {\r\n\t\t\t\t// if b is outside the clip window (a->b goes out of screen)\r\n\t\t\t\tif (b._code & edge) {\r\n\t\t\t\t\tp = lu._getEdgeIntersection(b, a, edge, bounds, round);\r\n\t\t\t\t\tp._code = lu._getBitCode(p, bounds);\r\n\t\t\t\t\tclippedPoints.push(p);\r\n\t\t\t\t}\r\n\t\t\t\tclippedPoints.push(a);\r\n\r\n\t\t\t// else if b is inside the clip window (a->b enters the screen)\r\n\t\t\t} else if (!(b._code & edge)) {\r\n\t\t\t\tp = lu._getEdgeIntersection(b, a, edge, bounds, round);\r\n\t\t\t\tp._code = lu._getBitCode(p, bounds);\r\n\t\t\t\tclippedPoints.push(p);\r\n\t\t\t}\r\n\t\t}\r\n\t\tpoints = clippedPoints;\r\n\t}\r\n\r\n\treturn points;\r\n};\r\n\n\n\n/*\n * @class Polygon\n * @aka L.Polygon\n * @inherits Polyline\n *\n * A class for drawing polygon overlays on a map. Extends `Polyline`.\n *\n * Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.\n *\n *\n * @example\n *\n * ```js\n * // create a red polygon from an array of LatLng points\n * var latlngs = [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]];\n *\n * var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);\n *\n * // zoom the map to the polygon\n * map.fitBounds(polygon.getBounds());\n * ```\n *\n * You can also pass an array of arrays of latlngs, with the first array representing the outer shape and the other arrays representing holes in the outer shape:\n *\n * ```js\n * var latlngs = [\n *   [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring\n *   [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole\n * ];\n * ```\n *\n * Additionally, you can pass a multi-dimensional array to represent a MultiPolygon shape.\n *\n * ```js\n * var latlngs = [\n *   [ // first polygon\n *     [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring\n *     [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole\n *   ],\n *   [ // second polygon\n *     [[41, -111.03],[45, -111.04],[45, -104.05],[41, -104.05]]\n *   ]\n * ];\n * ```\n */\n\nL.Polygon = L.Polyline.extend({\n\n\toptions: {\n\t\tfill: true\n\t},\n\n\tisEmpty: function () {\n\t\treturn !this._latlngs.length || !this._latlngs[0].length;\n\t},\n\n\tgetCenter: function () {\n\t\t// throws error when not yet added to map as this center calculation requires projected coordinates\n\t\tif (!this._map) {\n\t\t\tthrow new Error('Must add layer to map before using getCenter()');\n\t\t}\n\n\t\tvar i, j, p1, p2, f, area, x, y, center,\n\t\t    points = this._rings[0],\n\t\t    len = points.length;\n\n\t\tif (!len) { return null; }\n\n\t\t// polygon centroid algorithm; only uses the first ring if there are multiple\n\n\t\tarea = x = y = 0;\n\n\t\tfor (i = 0, j = len - 1; i < len; j = i++) {\n\t\t\tp1 = points[i];\n\t\t\tp2 = points[j];\n\n\t\t\tf = p1.y * p2.x - p2.y * p1.x;\n\t\t\tx += (p1.x + p2.x) * f;\n\t\t\ty += (p1.y + p2.y) * f;\n\t\t\tarea += f * 3;\n\t\t}\n\n\t\tif (area === 0) {\n\t\t\t// Polygon is so small that all points are on same pixel.\n\t\t\tcenter = points[0];\n\t\t} else {\n\t\t\tcenter = [x / area, y / area];\n\t\t}\n\t\treturn this._map.layerPointToLatLng(center);\n\t},\n\n\t_convertLatLngs: function (latlngs) {\n\t\tvar result = L.Polyline.prototype._convertLatLngs.call(this, latlngs),\n\t\t    len = result.length;\n\n\t\t// remove last point if it equals first one\n\t\tif (len >= 2 && result[0] instanceof L.LatLng && result[0].equals(result[len - 1])) {\n\t\t\tresult.pop();\n\t\t}\n\t\treturn result;\n\t},\n\n\t_setLatLngs: function (latlngs) {\n\t\tL.Polyline.prototype._setLatLngs.call(this, latlngs);\n\t\tif (L.Polyline._flat(this._latlngs)) {\n\t\t\tthis._latlngs = [this._latlngs];\n\t\t}\n\t},\n\n\t_defaultShape: function () {\n\t\treturn L.Polyline._flat(this._latlngs[0]) ? this._latlngs[0] : this._latlngs[0][0];\n\t},\n\n\t_clipPoints: function () {\n\t\t// polygons need a different clipping algorithm so we redefine that\n\n\t\tvar bounds = this._renderer._bounds,\n\t\t    w = this.options.weight,\n\t\t    p = new L.Point(w, w);\n\n\t\t// increase clip padding by stroke width to avoid stroke on clip edges\n\t\tbounds = new L.Bounds(bounds.min.subtract(p), bounds.max.add(p));\n\n\t\tthis._parts = [];\n\t\tif (!this._pxBounds || !this._pxBounds.intersects(bounds)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.options.noClip) {\n\t\t\tthis._parts = this._rings;\n\t\t\treturn;\n\t\t}\n\n\t\tfor (var i = 0, len = this._rings.length, clipped; i < len; i++) {\n\t\t\tclipped = L.PolyUtil.clipPolygon(this._rings[i], bounds, true);\n\t\t\tif (clipped.length) {\n\t\t\t\tthis._parts.push(clipped);\n\t\t\t}\n\t\t}\n\t},\n\n\t_updatePath: function () {\n\t\tthis._renderer._updatePoly(this, true);\n\t}\n});\n\n\n// @factory L.polygon(latlngs: LatLng[], options?: Polyline options)\nL.polygon = function (latlngs, options) {\n\treturn new L.Polygon(latlngs, options);\n};\n\n\n\n/*\n * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object.\n */\n\n/*\n * @class Rectangle\n * @aka L.Retangle\n * @inherits Polygon\n *\n * A class for drawing rectangle overlays on a map. Extends `Polygon`.\n *\n * @example\n *\n * ```js\n * // define rectangle geographical bounds\n * var bounds = [[54.559322, -5.767822], [56.1210604, -3.021240]];\n *\n * // create an orange rectangle\n * L.rectangle(bounds, {color: \"#ff7800\", weight: 1}).addTo(map);\n *\n * // zoom the map to the rectangle bounds\n * map.fitBounds(bounds);\n * ```\n *\n */\n\n\nL.Rectangle = L.Polygon.extend({\n\tinitialize: function (latLngBounds, options) {\n\t\tL.Polygon.prototype.initialize.call(this, this._boundsToLatLngs(latLngBounds), options);\n\t},\n\n\t// @method setBounds(latLngBounds: LatLngBounds): this\n\t// Redraws the rectangle with the passed bounds.\n\tsetBounds: function (latLngBounds) {\n\t\treturn this.setLatLngs(this._boundsToLatLngs(latLngBounds));\n\t},\n\n\t_boundsToLatLngs: function (latLngBounds) {\n\t\tlatLngBounds = L.latLngBounds(latLngBounds);\n\t\treturn [\n\t\t\tlatLngBounds.getSouthWest(),\n\t\t\tlatLngBounds.getNorthWest(),\n\t\t\tlatLngBounds.getNorthEast(),\n\t\t\tlatLngBounds.getSouthEast()\n\t\t];\n\t}\n});\n\n\n// @factory L.rectangle(latLngBounds: LatLngBounds, options?: Polyline options)\nL.rectangle = function (latLngBounds, options) {\n\treturn new L.Rectangle(latLngBounds, options);\n};\n\n\n\n/*\n * @class CircleMarker\n * @aka L.CircleMarker\n * @inherits Path\n *\n * A circle of a fixed size with radius specified in pixels. Extends `Path`.\n */\n\nL.CircleMarker = L.Path.extend({\n\n\t// @section\n\t// @aka CircleMarker options\n\toptions: {\n\t\tfill: true,\n\n\t\t// @option radius: Number = 10\n\t\t// Radius of the circle marker, in pixels\n\t\tradius: 10\n\t},\n\n\tinitialize: function (latlng, options) {\n\t\tL.setOptions(this, options);\n\t\tthis._latlng = L.latLng(latlng);\n\t\tthis._radius = this.options.radius;\n\t},\n\n\t// @method setLatLng(latLng: LatLng): this\n\t// Sets the position of a circle marker to a new location.\n\tsetLatLng: function (latlng) {\n\t\tthis._latlng = L.latLng(latlng);\n\t\tthis.redraw();\n\t\treturn this.fire('move', {latlng: this._latlng});\n\t},\n\n\t// @method getLatLng(): LatLng\n\t// Returns the current geographical position of the circle marker\n\tgetLatLng: function () {\n\t\treturn this._latlng;\n\t},\n\n\t// @method setRadius(radius: Number): this\n\t// Sets the radius of a circle marker. Units are in pixels.\n\tsetRadius: function (radius) {\n\t\tthis.options.radius = this._radius = radius;\n\t\treturn this.redraw();\n\t},\n\n\t// @method getRadius(): Number\n\t// Returns the current radius of the circle\n\tgetRadius: function () {\n\t\treturn this._radius;\n\t},\n\n\tsetStyle : function (options) {\n\t\tvar radius = options && options.radius || this._radius;\n\t\tL.Path.prototype.setStyle.call(this, options);\n\t\tthis.setRadius(radius);\n\t\treturn this;\n\t},\n\n\t_project: function () {\n\t\tthis._point = this._map.latLngToLayerPoint(this._latlng);\n\t\tthis._updateBounds();\n\t},\n\n\t_updateBounds: function () {\n\t\tvar r = this._radius,\n\t\t    r2 = this._radiusY || r,\n\t\t    w = this._clickTolerance(),\n\t\t    p = [r + w, r2 + w];\n\t\tthis._pxBounds = new L.Bounds(this._point.subtract(p), this._point.add(p));\n\t},\n\n\t_update: function () {\n\t\tif (this._map) {\n\t\t\tthis._updatePath();\n\t\t}\n\t},\n\n\t_updatePath: function () {\n\t\tthis._renderer._updateCircle(this);\n\t},\n\n\t_empty: function () {\n\t\treturn this._radius && !this._renderer._bounds.intersects(this._pxBounds);\n\t}\n});\n\n\n// @factory L.circleMarker(latlng: LatLng, options?: CircleMarker options)\n// Instantiates a circle marker object given a geographical point, and an optional options object.\nL.circleMarker = function (latlng, options) {\n\treturn new L.CircleMarker(latlng, options);\n};\n\n\n\n/*\n * @class Circle\n * @aka L.Circle\n * @inherits CircleMarker\n *\n * A class for drawing circle overlays on a map. Extends `CircleMarker`.\n *\n * It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion).\n *\n * @example\n *\n * ```js\n * L.circle([50.5, 30.5], {radius: 200}).addTo(map);\n * ```\n */\n\nL.Circle = L.CircleMarker.extend({\n\n\tinitialize: function (latlng, options, legacyOptions) {\n\t\tif (typeof options === 'number') {\n\t\t\t// Backwards compatibility with 0.7.x factory (latlng, radius, options?)\n\t\t\toptions = L.extend({}, legacyOptions, {radius: options});\n\t\t}\n\t\tL.setOptions(this, options);\n\t\tthis._latlng = L.latLng(latlng);\n\n\t\tif (isNaN(this.options.radius)) { throw new Error('Circle radius cannot be NaN'); }\n\n\t\t// @section\n\t\t// @aka Circle options\n\t\t// @option radius: Number; Radius of the circle, in meters.\n\t\tthis._mRadius = this.options.radius;\n\t},\n\n\t// @method setRadius(radius: Number): this\n\t// Sets the radius of a circle. Units are in meters.\n\tsetRadius: function (radius) {\n\t\tthis._mRadius = radius;\n\t\treturn this.redraw();\n\t},\n\n\t// @method getRadius(): Number\n\t// Returns the current radius of a circle. Units are in meters.\n\tgetRadius: function () {\n\t\treturn this._mRadius;\n\t},\n\n\t// @method getBounds(): LatLngBounds\n\t// Returns the `LatLngBounds` of the path.\n\tgetBounds: function () {\n\t\tvar half = [this._radius, this._radiusY || this._radius];\n\n\t\treturn new L.LatLngBounds(\n\t\t\tthis._map.layerPointToLatLng(this._point.subtract(half)),\n\t\t\tthis._map.layerPointToLatLng(this._point.add(half)));\n\t},\n\n\tsetStyle: L.Path.prototype.setStyle,\n\n\t_project: function () {\n\n\t\tvar lng = this._latlng.lng,\n\t\t    lat = this._latlng.lat,\n\t\t    map = this._map,\n\t\t    crs = map.options.crs;\n\n\t\tif (crs.distance === L.CRS.Earth.distance) {\n\t\t\tvar d = Math.PI / 180,\n\t\t\t    latR = (this._mRadius / L.CRS.Earth.R) / d,\n\t\t\t    top = map.project([lat + latR, lng]),\n\t\t\t    bottom = map.project([lat - latR, lng]),\n\t\t\t    p = top.add(bottom).divideBy(2),\n\t\t\t    lat2 = map.unproject(p).lat,\n\t\t\t    lngR = Math.acos((Math.cos(latR * d) - Math.sin(lat * d) * Math.sin(lat2 * d)) /\n\t\t\t            (Math.cos(lat * d) * Math.cos(lat2 * d))) / d;\n\n\t\t\tif (isNaN(lngR) || lngR === 0) {\n\t\t\t\tlngR = latR / Math.cos(Math.PI / 180 * lat); // Fallback for edge case, #2425\n\t\t\t}\n\n\t\t\tthis._point = p.subtract(map.getPixelOrigin());\n\t\t\tthis._radius = isNaN(lngR) ? 0 : Math.max(Math.round(p.x - map.project([lat2, lng - lngR]).x), 1);\n\t\t\tthis._radiusY = Math.max(Math.round(p.y - top.y), 1);\n\n\t\t} else {\n\t\t\tvar latlng2 = crs.unproject(crs.project(this._latlng).subtract([this._mRadius, 0]));\n\n\t\t\tthis._point = map.latLngToLayerPoint(this._latlng);\n\t\t\tthis._radius = this._point.x - map.latLngToLayerPoint(latlng2).x;\n\t\t}\n\n\t\tthis._updateBounds();\n\t}\n});\n\n// @factory L.circle(latlng: LatLng, options?: Circle options)\n// Instantiates a circle object given a geographical point, and an options object\n// which contains the circle radius.\n// @alternative\n// @factory L.circle(latlng: LatLng, radius: Number, options?: Circle options)\n// Obsolete way of instantiating a circle, for compatibility with 0.7.x code.\n// Do not use in new applications or plugins.\nL.circle = function (latlng, options, legacyOptions) {\n\treturn new L.Circle(latlng, options, legacyOptions);\n};\n\n\n\n/*\n * @class SVG\n * @inherits Renderer\n * @aka L.SVG\n *\n * Allows vector layers to be displayed with [SVG](https://developer.mozilla.org/docs/Web/SVG).\n * Inherits `Renderer`.\n *\n * Due to [technical limitations](http://caniuse.com/#search=svg), SVG is not\n * available in all web browsers, notably Android 2.x and 3.x.\n *\n * Although SVG is not available on IE7 and IE8, these browsers support\n * [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language)\n * (a now deprecated technology), and the SVG renderer will fall back to VML in\n * this case.\n *\n * @example\n *\n * Use SVG by default for all paths in the map:\n *\n * ```js\n * var map = L.map('map', {\n * \trenderer: L.svg()\n * });\n * ```\n *\n * Use a SVG renderer with extra padding for specific vector geometries:\n *\n * ```js\n * var map = L.map('map');\n * var myRenderer = L.svg({ padding: 0.5 });\n * var line = L.polyline( coordinates, { renderer: myRenderer } );\n * var circle = L.circle( center, { renderer: myRenderer } );\n * ```\n */\n\nL.SVG = L.Renderer.extend({\n\n\tgetEvents: function () {\n\t\tvar events = L.Renderer.prototype.getEvents.call(this);\n\t\tevents.zoomstart = this._onZoomStart;\n\t\treturn events;\n\t},\n\n\t_initContainer: function () {\n\t\tthis._container = L.SVG.create('svg');\n\n\t\t// makes it possible to click through svg root; we'll reset it back in individual paths\n\t\tthis._container.setAttribute('pointer-events', 'none');\n\n\t\tthis._rootGroup = L.SVG.create('g');\n\t\tthis._container.appendChild(this._rootGroup);\n\t},\n\n\t_onZoomStart: function () {\n\t\t// Drag-then-pinch interactions might mess up the center and zoom.\n\t\t// In this case, the easiest way to prevent this is re-do the renderer\n\t\t//   bounds and padding when the zooming starts.\n\t\tthis._update();\n\t},\n\n\t_update: function () {\n\t\tif (this._map._animatingZoom && this._bounds) { return; }\n\n\t\tL.Renderer.prototype._update.call(this);\n\n\t\tvar b = this._bounds,\n\t\t    size = b.getSize(),\n\t\t    container = this._container;\n\n\t\t// set size of svg-container if changed\n\t\tif (!this._svgSize || !this._svgSize.equals(size)) {\n\t\t\tthis._svgSize = size;\n\t\t\tcontainer.setAttribute('width', size.x);\n\t\t\tcontainer.setAttribute('height', size.y);\n\t\t}\n\n\t\t// movement: update container viewBox so that we don't have to change coordinates of individual layers\n\t\tL.DomUtil.setPosition(container, b.min);\n\t\tcontainer.setAttribute('viewBox', [b.min.x, b.min.y, size.x, size.y].join(' '));\n\n\t\tthis.fire('update');\n\t},\n\n\t// methods below are called by vector layers implementations\n\n\t_initPath: function (layer) {\n\t\tvar path = layer._path = L.SVG.create('path');\n\n\t\t// @namespace Path\n\t\t// @option className: String = null\n\t\t// Custom class name set on an element. Only for SVG renderer.\n\t\tif (layer.options.className) {\n\t\t\tL.DomUtil.addClass(path, layer.options.className);\n\t\t}\n\n\t\tif (layer.options.interactive) {\n\t\t\tL.DomUtil.addClass(path, 'leaflet-interactive');\n\t\t}\n\n\t\tthis._updateStyle(layer);\n\t\tthis._layers[L.stamp(layer)] = layer;\n\t},\n\n\t_addPath: function (layer) {\n\t\tthis._rootGroup.appendChild(layer._path);\n\t\tlayer.addInteractiveTarget(layer._path);\n\t},\n\n\t_removePath: function (layer) {\n\t\tL.DomUtil.remove(layer._path);\n\t\tlayer.removeInteractiveTarget(layer._path);\n\t\tdelete this._layers[L.stamp(layer)];\n\t},\n\n\t_updatePath: function (layer) {\n\t\tlayer._project();\n\t\tlayer._update();\n\t},\n\n\t_updateStyle: function (layer) {\n\t\tvar path = layer._path,\n\t\t    options = layer.options;\n\n\t\tif (!path) { return; }\n\n\t\tif (options.stroke) {\n\t\t\tpath.setAttribute('stroke', options.color);\n\t\t\tpath.setAttribute('stroke-opacity', options.opacity);\n\t\t\tpath.setAttribute('stroke-width', options.weight);\n\t\t\tpath.setAttribute('stroke-linecap', options.lineCap);\n\t\t\tpath.setAttribute('stroke-linejoin', options.lineJoin);\n\n\t\t\tif (options.dashArray) {\n\t\t\t\tpath.setAttribute('stroke-dasharray', options.dashArray);\n\t\t\t} else {\n\t\t\t\tpath.removeAttribute('stroke-dasharray');\n\t\t\t}\n\n\t\t\tif (options.dashOffset) {\n\t\t\t\tpath.setAttribute('stroke-dashoffset', options.dashOffset);\n\t\t\t} else {\n\t\t\t\tpath.removeAttribute('stroke-dashoffset');\n\t\t\t}\n\t\t} else {\n\t\t\tpath.setAttribute('stroke', 'none');\n\t\t}\n\n\t\tif (options.fill) {\n\t\t\tpath.setAttribute('fill', options.fillColor || options.color);\n\t\t\tpath.setAttribute('fill-opacity', options.fillOpacity);\n\t\t\tpath.setAttribute('fill-rule', options.fillRule || 'evenodd');\n\t\t} else {\n\t\t\tpath.setAttribute('fill', 'none');\n\t\t}\n\t},\n\n\t_updatePoly: function (layer, closed) {\n\t\tthis._setPath(layer, L.SVG.pointsToPath(layer._parts, closed));\n\t},\n\n\t_updateCircle: function (layer) {\n\t\tvar p = layer._point,\n\t\t    r = layer._radius,\n\t\t    r2 = layer._radiusY || r,\n\t\t    arc = 'a' + r + ',' + r2 + ' 0 1,0 ';\n\n\t\t// drawing a circle with two half-arcs\n\t\tvar d = layer._empty() ? 'M0 0' :\n\t\t\t\t'M' + (p.x - r) + ',' + p.y +\n\t\t\t\tarc + (r * 2) + ',0 ' +\n\t\t\t\tarc + (-r * 2) + ',0 ';\n\n\t\tthis._setPath(layer, d);\n\t},\n\n\t_setPath: function (layer, path) {\n\t\tlayer._path.setAttribute('d', path);\n\t},\n\n\t// SVG does not have the concept of zIndex so we resort to changing the DOM order of elements\n\t_bringToFront: function (layer) {\n\t\tL.DomUtil.toFront(layer._path);\n\t},\n\n\t_bringToBack: function (layer) {\n\t\tL.DomUtil.toBack(layer._path);\n\t}\n});\n\n\n// @namespace SVG; @section\n// There are several static functions which can be called without instantiating L.SVG:\nL.extend(L.SVG, {\n\t// @function create(name: String): SVGElement\n\t// Returns a instance of [SVGElement](https://developer.mozilla.org/docs/Web/API/SVGElement),\n\t// corresponding to the class name passed. For example, using 'line' will return\n\t// an instance of [SVGLineElement](https://developer.mozilla.org/docs/Web/API/SVGLineElement).\n\tcreate: function (name) {\n\t\treturn document.createElementNS('http://www.w3.org/2000/svg', name);\n\t},\n\n\t// @function pointsToPath(rings: Point[], closed: Boolean): String\n\t// Generates a SVG path string for multiple rings, with each ring turning\n\t// into \"M..L..L..\" instructions\n\tpointsToPath: function (rings, closed) {\n\t\tvar str = '',\n\t\t    i, j, len, len2, points, p;\n\n\t\tfor (i = 0, len = rings.length; i < len; i++) {\n\t\t\tpoints = rings[i];\n\n\t\t\tfor (j = 0, len2 = points.length; j < len2; j++) {\n\t\t\t\tp = points[j];\n\t\t\t\tstr += (j ? 'L' : 'M') + p.x + ' ' + p.y;\n\t\t\t}\n\n\t\t\t// closes the ring for polygons; \"x\" is VML syntax\n\t\t\tstr += closed ? (L.Browser.svg ? 'z' : 'x') : '';\n\t\t}\n\n\t\t// SVG complains about empty path strings\n\t\treturn str || 'M0 0';\n\t}\n});\n\n// @namespace Browser; @property svg: Boolean\n// `true` when the browser supports [SVG](https://developer.mozilla.org/docs/Web/SVG).\nL.Browser.svg = !!(document.createElementNS && L.SVG.create('svg').createSVGRect);\n\n\n// @namespace SVG\n// @factory L.svg(options?: Renderer options)\n// Creates a SVG renderer with the given options.\nL.svg = function (options) {\n\treturn L.Browser.svg || L.Browser.vml ? new L.SVG(options) : null;\n};\n\n\n\n/*\n * Thanks to Dmitry Baranovsky and his Raphael library for inspiration!\n */\n\n/*\n * @class SVG\n *\n * Although SVG is not available on IE7 and IE8, these browsers support [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language), and the SVG renderer will fall back to VML in this case.\n *\n * VML was deprecated in 2012, which means VML functionality exists only for backwards compatibility\n * with old versions of Internet Explorer.\n */\n\n// @namespace Browser; @property vml: Boolean\n// `true` if the browser supports [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language).\nL.Browser.vml = !L.Browser.svg && (function () {\n\ttry {\n\t\tvar div = document.createElement('div');\n\t\tdiv.innerHTML = '<v:shape adj=\"1\"/>';\n\n\t\tvar shape = div.firstChild;\n\t\tshape.style.behavior = 'url(#default#VML)';\n\n\t\treturn shape && (typeof shape.adj === 'object');\n\n\t} catch (e) {\n\t\treturn false;\n\t}\n}());\n\n// redefine some SVG methods to handle VML syntax which is similar but with some differences\nL.SVG.include(!L.Browser.vml ? {} : {\n\n\t_initContainer: function () {\n\t\tthis._container = L.DomUtil.create('div', 'leaflet-vml-container');\n\t},\n\n\t_update: function () {\n\t\tif (this._map._animatingZoom) { return; }\n\t\tL.Renderer.prototype._update.call(this);\n\t\tthis.fire('update');\n\t},\n\n\t_initPath: function (layer) {\n\t\tvar container = layer._container = L.SVG.create('shape');\n\n\t\tL.DomUtil.addClass(container, 'leaflet-vml-shape ' + (this.options.className || ''));\n\n\t\tcontainer.coordsize = '1 1';\n\n\t\tlayer._path = L.SVG.create('path');\n\t\tcontainer.appendChild(layer._path);\n\n\t\tthis._updateStyle(layer);\n\t\tthis._layers[L.stamp(layer)] = layer;\n\t},\n\n\t_addPath: function (layer) {\n\t\tvar container = layer._container;\n\t\tthis._container.appendChild(container);\n\n\t\tif (layer.options.interactive) {\n\t\t\tlayer.addInteractiveTarget(container);\n\t\t}\n\t},\n\n\t_removePath: function (layer) {\n\t\tvar container = layer._container;\n\t\tL.DomUtil.remove(container);\n\t\tlayer.removeInteractiveTarget(container);\n\t\tdelete this._layers[L.stamp(layer)];\n\t},\n\n\t_updateStyle: function (layer) {\n\t\tvar stroke = layer._stroke,\n\t\t    fill = layer._fill,\n\t\t    options = layer.options,\n\t\t    container = layer._container;\n\n\t\tcontainer.stroked = !!options.stroke;\n\t\tcontainer.filled = !!options.fill;\n\n\t\tif (options.stroke) {\n\t\t\tif (!stroke) {\n\t\t\t\tstroke = layer._stroke = L.SVG.create('stroke');\n\t\t\t}\n\t\t\tcontainer.appendChild(stroke);\n\t\t\tstroke.weight = options.weight + 'px';\n\t\t\tstroke.color = options.color;\n\t\t\tstroke.opacity = options.opacity;\n\n\t\t\tif (options.dashArray) {\n\t\t\t\tstroke.dashStyle = L.Util.isArray(options.dashArray) ?\n\t\t\t\t    options.dashArray.join(' ') :\n\t\t\t\t    options.dashArray.replace(/( *, *)/g, ' ');\n\t\t\t} else {\n\t\t\t\tstroke.dashStyle = '';\n\t\t\t}\n\t\t\tstroke.endcap = options.lineCap.replace('butt', 'flat');\n\t\t\tstroke.joinstyle = options.lineJoin;\n\n\t\t} else if (stroke) {\n\t\t\tcontainer.removeChild(stroke);\n\t\t\tlayer._stroke = null;\n\t\t}\n\n\t\tif (options.fill) {\n\t\t\tif (!fill) {\n\t\t\t\tfill = layer._fill = L.SVG.create('fill');\n\t\t\t}\n\t\t\tcontainer.appendChild(fill);\n\t\t\tfill.color = options.fillColor || options.color;\n\t\t\tfill.opacity = options.fillOpacity;\n\n\t\t} else if (fill) {\n\t\t\tcontainer.removeChild(fill);\n\t\t\tlayer._fill = null;\n\t\t}\n\t},\n\n\t_updateCircle: function (layer) {\n\t\tvar p = layer._point.round(),\n\t\t    r = Math.round(layer._radius),\n\t\t    r2 = Math.round(layer._radiusY || r);\n\n\t\tthis._setPath(layer, layer._empty() ? 'M0 0' :\n\t\t\t\t'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r2 + ' 0,' + (65535 * 360));\n\t},\n\n\t_setPath: function (layer, path) {\n\t\tlayer._path.v = path;\n\t},\n\n\t_bringToFront: function (layer) {\n\t\tL.DomUtil.toFront(layer._container);\n\t},\n\n\t_bringToBack: function (layer) {\n\t\tL.DomUtil.toBack(layer._container);\n\t}\n});\n\nif (L.Browser.vml) {\n\tL.SVG.create = (function () {\n\t\ttry {\n\t\t\tdocument.namespaces.add('lvml', 'urn:schemas-microsoft-com:vml');\n\t\t\treturn function (name) {\n\t\t\t\treturn document.createElement('<lvml:' + name + ' class=\"lvml\">');\n\t\t\t};\n\t\t} catch (e) {\n\t\t\treturn function (name) {\n\t\t\t\treturn document.createElement('<' + name + ' xmlns=\"urn:schemas-microsoft.com:vml\" class=\"lvml\">');\n\t\t\t};\n\t\t}\n\t})();\n}\n\n\n\n/*\n * @class Canvas\n * @inherits Renderer\n * @aka L.Canvas\n *\n * Allows vector layers to be displayed with [`<canvas>`](https://developer.mozilla.org/docs/Web/API/Canvas_API).\n * Inherits `Renderer`.\n *\n * Due to [technical limitations](http://caniuse.com/#search=canvas), Canvas is not\n * available in all web browsers, notably IE8, and overlapping geometries might\n * not display properly in some edge cases.\n *\n * @example\n *\n * Use Canvas by default for all paths in the map:\n *\n * ```js\n * var map = L.map('map', {\n * \trenderer: L.canvas()\n * });\n * ```\n *\n * Use a Canvas renderer with extra padding for specific vector geometries:\n *\n * ```js\n * var map = L.map('map');\n * var myRenderer = L.canvas({ padding: 0.5 });\n * var line = L.polyline( coordinates, { renderer: myRenderer } );\n * var circle = L.circle( center, { renderer: myRenderer } );\n * ```\n */\n\nL.Canvas = L.Renderer.extend({\n\tgetEvents: function () {\n\t\tvar events = L.Renderer.prototype.getEvents.call(this);\n\t\tevents.viewprereset = this._onViewPreReset;\n\t\treturn events;\n\t},\n\n\t_onViewPreReset: function () {\n\t\t// Set a flag so that a viewprereset+moveend+viewreset only updates&redraws once\n\t\tthis._postponeUpdatePaths = true;\n\t},\n\n\tonAdd: function () {\n\t\tL.Renderer.prototype.onAdd.call(this);\n\n\t\t// Redraw vectors since canvas is cleared upon removal,\n\t\t// in case of removing the renderer itself from the map.\n\t\tthis._draw();\n\t},\n\n\t_initContainer: function () {\n\t\tvar container = this._container = document.createElement('canvas');\n\n\t\tL.DomEvent\n\t\t\t.on(container, 'mousemove', L.Util.throttle(this._onMouseMove, 32, this), this)\n\t\t\t.on(container, 'click dblclick mousedown mouseup contextmenu', this._onClick, this)\n\t\t\t.on(container, 'mouseout', this._handleMouseOut, this);\n\n\t\tthis._ctx = container.getContext('2d');\n\t},\n\n\t_updatePaths: function () {\n\t\tif (this._postponeUpdatePaths) { return; }\n\n\t\tvar layer;\n\t\tthis._redrawBounds = null;\n\t\tfor (var id in this._layers) {\n\t\t\tlayer = this._layers[id];\n\t\t\tlayer._update();\n\t\t}\n\t\tthis._redraw();\n\t},\n\n\t_update: function () {\n\t\tif (this._map._animatingZoom && this._bounds) { return; }\n\n\t\tthis._drawnLayers = {};\n\n\t\tL.Renderer.prototype._update.call(this);\n\n\t\tvar b = this._bounds,\n\t\t    container = this._container,\n\t\t    size = b.getSize(),\n\t\t    m = L.Browser.retina ? 2 : 1;\n\n\t\tL.DomUtil.setPosition(container, b.min);\n\n\t\t// set canvas size (also clearing it); use double size on retina\n\t\tcontainer.width = m * size.x;\n\t\tcontainer.height = m * size.y;\n\t\tcontainer.style.width = size.x + 'px';\n\t\tcontainer.style.height = size.y + 'px';\n\n\t\tif (L.Browser.retina) {\n\t\t\tthis._ctx.scale(2, 2);\n\t\t}\n\n\t\t// translate so we use the same path coordinates after canvas element moves\n\t\tthis._ctx.translate(-b.min.x, -b.min.y);\n\n\t\t// Tell paths to redraw themselves\n\t\tthis.fire('update');\n\t},\n\n\t_reset: function () {\n\t\tL.Renderer.prototype._reset.call(this);\n\n\t\tif (this._postponeUpdatePaths) {\n\t\t\tthis._postponeUpdatePaths = false;\n\t\t\tthis._updatePaths();\n\t\t}\n\t},\n\n\t_initPath: function (layer) {\n\t\tthis._updateDashArray(layer);\n\t\tthis._layers[L.stamp(layer)] = layer;\n\n\t\tvar order = layer._order = {\n\t\t\tlayer: layer,\n\t\t\tprev: this._drawLast,\n\t\t\tnext: null\n\t\t};\n\t\tif (this._drawLast) { this._drawLast.next = order; }\n\t\tthis._drawLast = order;\n\t\tthis._drawFirst = this._drawFirst || this._drawLast;\n\t},\n\n\t_addPath: function (layer) {\n\t\tthis._requestRedraw(layer);\n\t},\n\n\t_removePath: function (layer) {\n\t\tvar order = layer._order;\n\t\tvar next = order.next;\n\t\tvar prev = order.prev;\n\n\t\tif (next) {\n\t\t\tnext.prev = prev;\n\t\t} else {\n\t\t\tthis._drawLast = prev;\n\t\t}\n\t\tif (prev) {\n\t\t\tprev.next = next;\n\t\t} else {\n\t\t\tthis._drawFirst = next;\n\t\t}\n\n\t\tdelete layer._order;\n\n\t\tdelete this._layers[L.stamp(layer)];\n\n\t\tthis._requestRedraw(layer);\n\t},\n\n\t_updatePath: function (layer) {\n\t\t// Redraw the union of the layer's old pixel\n\t\t// bounds and the new pixel bounds.\n\t\tthis._extendRedrawBounds(layer);\n\t\tlayer._project();\n\t\tlayer._update();\n\t\t// The redraw will extend the redraw bounds\n\t\t// with the new pixel bounds.\n\t\tthis._requestRedraw(layer);\n\t},\n\n\t_updateStyle: function (layer) {\n\t\tthis._updateDashArray(layer);\n\t\tthis._requestRedraw(layer);\n\t},\n\n\t_updateDashArray: function (layer) {\n\t\tif (layer.options.dashArray) {\n\t\t\tvar parts = layer.options.dashArray.split(','),\n\t\t\t    dashArray = [],\n\t\t\t    i;\n\t\t\tfor (i = 0; i < parts.length; i++) {\n\t\t\t\tdashArray.push(Number(parts[i]));\n\t\t\t}\n\t\t\tlayer.options._dashArray = dashArray;\n\t\t}\n\t},\n\n\t_requestRedraw: function (layer) {\n\t\tif (!this._map) { return; }\n\n\t\tthis._extendRedrawBounds(layer);\n\t\tthis._redrawRequest = this._redrawRequest || L.Util.requestAnimFrame(this._redraw, this);\n\t},\n\n\t_extendRedrawBounds: function (layer) {\n\t\tvar padding = (layer.options.weight || 0) + 1;\n\t\tthis._redrawBounds = this._redrawBounds || new L.Bounds();\n\t\tthis._redrawBounds.extend(layer._pxBounds.min.subtract([padding, padding]));\n\t\tthis._redrawBounds.extend(layer._pxBounds.max.add([padding, padding]));\n\t},\n\n\t_redraw: function () {\n\t\tthis._redrawRequest = null;\n\n\t\tif (this._redrawBounds) {\n\t\t\tthis._redrawBounds.min._floor();\n\t\t\tthis._redrawBounds.max._ceil();\n\t\t}\n\n\t\tthis._clear(); // clear layers in redraw bounds\n\t\tthis._draw(); // draw layers\n\n\t\tthis._redrawBounds = null;\n\t},\n\n\t_clear: function () {\n\t\tvar bounds = this._redrawBounds;\n\t\tif (bounds) {\n\t\t\tvar size = bounds.getSize();\n\t\t\tthis._ctx.clearRect(bounds.min.x, bounds.min.y, size.x, size.y);\n\t\t} else {\n\t\t\tthis._ctx.clearRect(0, 0, this._container.width, this._container.height);\n\t\t}\n\t},\n\n\t_draw: function () {\n\t\tvar layer, bounds = this._redrawBounds;\n\t\tthis._ctx.save();\n\t\tif (bounds) {\n\t\t\tvar size = bounds.getSize();\n\t\t\tthis._ctx.beginPath();\n\t\t\tthis._ctx.rect(bounds.min.x, bounds.min.y, size.x, size.y);\n\t\t\tthis._ctx.clip();\n\t\t}\n\n\t\tthis._drawing = true;\n\n\t\tfor (var order = this._drawFirst; order; order = order.next) {\n\t\t\tlayer = order.layer;\n\t\t\tif (!bounds || (layer._pxBounds && layer._pxBounds.intersects(bounds))) {\n\t\t\t\tlayer._updatePath();\n\t\t\t}\n\t\t}\n\n\t\tthis._drawing = false;\n\n\t\tthis._ctx.restore();  // Restore state before clipping.\n\t},\n\n\t_updatePoly: function (layer, closed) {\n\t\tif (!this._drawing) { return; }\n\n\t\tvar i, j, len2, p,\n\t\t    parts = layer._parts,\n\t\t    len = parts.length,\n\t\t    ctx = this._ctx;\n\n\t\tif (!len) { return; }\n\n\t\tthis._drawnLayers[layer._leaflet_id] = layer;\n\n\t\tctx.beginPath();\n\n\t\tif (ctx.setLineDash) {\n\t\t\tctx.setLineDash(layer.options && layer.options._dashArray || []);\n\t\t}\n\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tfor (j = 0, len2 = parts[i].length; j < len2; j++) {\n\t\t\t\tp = parts[i][j];\n\t\t\t\tctx[j ? 'lineTo' : 'moveTo'](p.x, p.y);\n\t\t\t}\n\t\t\tif (closed) {\n\t\t\t\tctx.closePath();\n\t\t\t}\n\t\t}\n\n\t\tthis._fillStroke(ctx, layer);\n\n\t\t// TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature\n\t},\n\n\t_updateCircle: function (layer) {\n\n\t\tif (!this._drawing || layer._empty()) { return; }\n\n\t\tvar p = layer._point,\n\t\t    ctx = this._ctx,\n\t\t    r = layer._radius,\n\t\t    s = (layer._radiusY || r) / r;\n\n\t\tthis._drawnLayers[layer._leaflet_id] = layer;\n\n\t\tif (s !== 1) {\n\t\t\tctx.save();\n\t\t\tctx.scale(1, s);\n\t\t}\n\n\t\tctx.beginPath();\n\t\tctx.arc(p.x, p.y / s, r, 0, Math.PI * 2, false);\n\n\t\tif (s !== 1) {\n\t\t\tctx.restore();\n\t\t}\n\n\t\tthis._fillStroke(ctx, layer);\n\t},\n\n\t_fillStroke: function (ctx, layer) {\n\t\tvar options = layer.options;\n\n\t\tif (options.fill) {\n\t\t\tctx.globalAlpha = options.fillOpacity;\n\t\t\tctx.fillStyle = options.fillColor || options.color;\n\t\t\tctx.fill(options.fillRule || 'evenodd');\n\t\t}\n\n\t\tif (options.stroke && options.weight !== 0) {\n\t\t\tctx.globalAlpha = options.opacity;\n\t\t\tctx.lineWidth = options.weight;\n\t\t\tctx.strokeStyle = options.color;\n\t\t\tctx.lineCap = options.lineCap;\n\t\t\tctx.lineJoin = options.lineJoin;\n\t\t\tctx.stroke();\n\t\t}\n\t},\n\n\t// Canvas obviously doesn't have mouse events for individual drawn objects,\n\t// so we emulate that by calculating what's under the mouse on mousemove/click manually\n\n\t_onClick: function (e) {\n\t\tvar point = this._map.mouseEventToLayerPoint(e), layer, clickedLayer;\n\n\t\tfor (var order = this._drawFirst; order; order = order.next) {\n\t\t\tlayer = order.layer;\n\t\t\tif (layer.options.interactive && layer._containsPoint(point) && !this._map._draggableMoved(layer)) {\n\t\t\t\tclickedLayer = layer;\n\t\t\t}\n\t\t}\n\t\tif (clickedLayer)  {\n\t\t\tL.DomEvent._fakeStop(e);\n\t\t\tthis._fireEvent([clickedLayer], e);\n\t\t}\n\t},\n\n\t_onMouseMove: function (e) {\n\t\tif (!this._map || this._map.dragging.moving() || this._map._animatingZoom) { return; }\n\n\t\tvar point = this._map.mouseEventToLayerPoint(e);\n\t\tthis._handleMouseHover(e, point);\n\t},\n\n\n\t_handleMouseOut: function (e) {\n\t\tvar layer = this._hoveredLayer;\n\t\tif (layer) {\n\t\t\t// if we're leaving the layer, fire mouseout\n\t\t\tL.DomUtil.removeClass(this._container, 'leaflet-interactive');\n\t\t\tthis._fireEvent([layer], e, 'mouseout');\n\t\t\tthis._hoveredLayer = null;\n\t\t}\n\t},\n\n\t_handleMouseHover: function (e, point) {\n\t\tvar layer, candidateHoveredLayer;\n\n\t\tfor (var order = this._drawFirst; order; order = order.next) {\n\t\t\tlayer = order.layer;\n\t\t\tif (layer.options.interactive && layer._containsPoint(point)) {\n\t\t\t\tcandidateHoveredLayer = layer;\n\t\t\t}\n\t\t}\n\n\t\tif (candidateHoveredLayer !== this._hoveredLayer) {\n\t\t\tthis._handleMouseOut(e);\n\n\t\t\tif (candidateHoveredLayer) {\n\t\t\t\tL.DomUtil.addClass(this._container, 'leaflet-interactive'); // change cursor\n\t\t\t\tthis._fireEvent([candidateHoveredLayer], e, 'mouseover');\n\t\t\t\tthis._hoveredLayer = candidateHoveredLayer;\n\t\t\t}\n\t\t}\n\n\t\tif (this._hoveredLayer) {\n\t\t\tthis._fireEvent([this._hoveredLayer], e);\n\t\t}\n\t},\n\n\t_fireEvent: function (layers, e, type) {\n\t\tthis._map._fireDOMEvent(e, type || e.type, layers);\n\t},\n\n\t_bringToFront: function (layer) {\n\t\tvar order = layer._order;\n\t\tvar next = order.next;\n\t\tvar prev = order.prev;\n\n\t\tif (next) {\n\t\t\tnext.prev = prev;\n\t\t} else {\n\t\t\t// Already last\n\t\t\treturn;\n\t\t}\n\t\tif (prev) {\n\t\t\tprev.next = next;\n\t\t} else if (next) {\n\t\t\t// Update first entry unless this is the\n\t\t\t// signle entry\n\t\t\tthis._drawFirst = next;\n\t\t}\n\n\t\torder.prev = this._drawLast;\n\t\tthis._drawLast.next = order;\n\n\t\torder.next = null;\n\t\tthis._drawLast = order;\n\n\t\tthis._requestRedraw(layer);\n\t},\n\n\t_bringToBack: function (layer) {\n\t\tvar order = layer._order;\n\t\tvar next = order.next;\n\t\tvar prev = order.prev;\n\n\t\tif (prev) {\n\t\t\tprev.next = next;\n\t\t} else {\n\t\t\t// Already first\n\t\t\treturn;\n\t\t}\n\t\tif (next) {\n\t\t\tnext.prev = prev;\n\t\t} else if (prev) {\n\t\t\t// Update last entry unless this is the\n\t\t\t// signle entry\n\t\t\tthis._drawLast = prev;\n\t\t}\n\n\t\torder.prev = null;\n\n\t\torder.next = this._drawFirst;\n\t\tthis._drawFirst.prev = order;\n\t\tthis._drawFirst = order;\n\n\t\tthis._requestRedraw(layer);\n\t}\n});\n\n// @namespace Browser; @property canvas: Boolean\n// `true` when the browser supports [`<canvas>`](https://developer.mozilla.org/docs/Web/API/Canvas_API).\nL.Browser.canvas = (function () {\n\treturn !!document.createElement('canvas').getContext;\n}());\n\n// @namespace Canvas\n// @factory L.canvas(options?: Renderer options)\n// Creates a Canvas renderer with the given options.\nL.canvas = function (options) {\n\treturn L.Browser.canvas ? new L.Canvas(options) : null;\n};\n\nL.Polyline.prototype._containsPoint = function (p, closed) {\n\tvar i, j, k, len, len2, part,\n\t    w = this._clickTolerance();\n\n\tif (!this._pxBounds.contains(p)) { return false; }\n\n\t// hit detection for polylines\n\tfor (i = 0, len = this._parts.length; i < len; i++) {\n\t\tpart = this._parts[i];\n\n\t\tfor (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {\n\t\t\tif (!closed && (j === 0)) { continue; }\n\n\t\t\tif (L.LineUtil.pointToSegmentDistance(p, part[k], part[j]) <= w) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\nL.Polygon.prototype._containsPoint = function (p) {\n\tvar inside = false,\n\t    part, p1, p2, i, j, k, len, len2;\n\n\tif (!this._pxBounds.contains(p)) { return false; }\n\n\t// ray casting algorithm for detecting if point is in polygon\n\tfor (i = 0, len = this._parts.length; i < len; i++) {\n\t\tpart = this._parts[i];\n\n\t\tfor (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {\n\t\t\tp1 = part[j];\n\t\t\tp2 = part[k];\n\n\t\t\tif (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {\n\t\t\t\tinside = !inside;\n\t\t\t}\n\t\t}\n\t}\n\n\t// also check if it's on polygon stroke\n\treturn inside || L.Polyline.prototype._containsPoint.call(this, p, true);\n};\n\nL.CircleMarker.prototype._containsPoint = function (p) {\n\treturn p.distanceTo(this._point) <= this._radius + this._clickTolerance();\n};\n\n\n\n/*\r\n * @class GeoJSON\r\n * @aka L.GeoJSON\r\n * @inherits FeatureGroup\r\n *\r\n * Represents a GeoJSON object or an array of GeoJSON objects. Allows you to parse\r\n * GeoJSON data and display it on the map. Extends `FeatureGroup`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.geoJSON(data, {\r\n * \tstyle: function (feature) {\r\n * \t\treturn {color: feature.properties.color};\r\n * \t}\r\n * }).bindPopup(function (layer) {\r\n * \treturn layer.feature.properties.description;\r\n * }).addTo(map);\r\n * ```\r\n */\r\n\r\nL.GeoJSON = L.FeatureGroup.extend({\r\n\r\n\t/* @section\r\n\t * @aka GeoJSON options\r\n\t *\r\n\t * @option pointToLayer: Function = *\r\n\t * A `Function` defining how GeoJSON points spawn Leaflet layers. It is internally\r\n\t * called when data is added, passing the GeoJSON point feature and its `LatLng`.\r\n\t * The default is to spawn a default `Marker`:\r\n\t * ```js\r\n\t * function(geoJsonPoint, latlng) {\r\n\t * \treturn L.marker(latlng);\r\n\t * }\r\n\t * ```\r\n\t *\r\n\t * @option style: Function = *\r\n\t * A `Function` defining the `Path options` for styling GeoJSON lines and polygons,\r\n\t * called internally when data is added.\r\n\t * The default value is to not override any defaults:\r\n\t * ```js\r\n\t * function (geoJsonFeature) {\r\n\t * \treturn {}\r\n\t * }\r\n\t * ```\r\n\t *\r\n\t * @option onEachFeature: Function = *\r\n\t * A `Function` that will be called once for each created `Feature`, after it has\r\n\t * been created and styled. Useful for attaching events and popups to features.\r\n\t * The default is to do nothing with the newly created layers:\r\n\t * ```js\r\n\t * function (feature, layer) {}\r\n\t * ```\r\n\t *\r\n\t * @option filter: Function = *\r\n\t * A `Function` that will be used to decide whether to include a feature or not.\r\n\t * The default is to include all features:\r\n\t * ```js\r\n\t * function (geoJsonFeature) {\r\n\t * \treturn true;\r\n\t * }\r\n\t * ```\r\n\t * Note: dynamically changing the `filter` option will have effect only on newly\r\n\t * added data. It will _not_ re-evaluate already included features.\r\n\t *\r\n\t * @option coordsToLatLng: Function = *\r\n\t * A `Function` that will be used for converting GeoJSON coordinates to `LatLng`s.\r\n\t * The default is the `coordsToLatLng` static method.\r\n\t */\r\n\r\n\tinitialize: function (geojson, options) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._layers = {};\r\n\r\n\t\tif (geojson) {\r\n\t\t\tthis.addData(geojson);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method addData( <GeoJSON> data ): this\r\n\t// Adds a GeoJSON object to the layer.\r\n\taddData: function (geojson) {\r\n\t\tvar features = L.Util.isArray(geojson) ? geojson : geojson.features,\r\n\t\t    i, len, feature;\r\n\r\n\t\tif (features) {\r\n\t\t\tfor (i = 0, len = features.length; i < len; i++) {\r\n\t\t\t\t// only add this if geometry or geometries are set and not null\r\n\t\t\t\tfeature = features[i];\r\n\t\t\t\tif (feature.geometries || feature.geometry || feature.features || feature.coordinates) {\r\n\t\t\t\t\tthis.addData(feature);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar options = this.options;\r\n\r\n\t\tif (options.filter && !options.filter(geojson)) { return this; }\r\n\r\n\t\tvar layer = L.GeoJSON.geometryToLayer(geojson, options);\r\n\t\tif (!layer) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\tlayer.feature = L.GeoJSON.asFeature(geojson);\r\n\r\n\t\tlayer.defaultOptions = layer.options;\r\n\t\tthis.resetStyle(layer);\r\n\r\n\t\tif (options.onEachFeature) {\r\n\t\t\toptions.onEachFeature(geojson, layer);\r\n\t\t}\r\n\r\n\t\treturn this.addLayer(layer);\r\n\t},\r\n\r\n\t// @method resetStyle( <Path> layer ): this\r\n\t// Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events.\r\n\tresetStyle: function (layer) {\r\n\t\t// reset any custom styles\r\n\t\tlayer.options = L.Util.extend({}, layer.defaultOptions);\r\n\t\tthis._setLayerStyle(layer, this.options.style);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method setStyle( <Function> style ): this\r\n\t// Changes styles of GeoJSON vector layers with the given style function.\r\n\tsetStyle: function (style) {\r\n\t\treturn this.eachLayer(function (layer) {\r\n\t\t\tthis._setLayerStyle(layer, style);\r\n\t\t}, this);\r\n\t},\r\n\r\n\t_setLayerStyle: function (layer, style) {\r\n\t\tif (typeof style === 'function') {\r\n\t\t\tstyle = style(layer.feature);\r\n\t\t}\r\n\t\tif (layer.setStyle) {\r\n\t\t\tlayer.setStyle(style);\r\n\t\t}\r\n\t}\r\n});\r\n\r\n// @section\r\n// There are several static functions which can be called without instantiating L.GeoJSON:\r\nL.extend(L.GeoJSON, {\r\n\t// @function geometryToLayer(featureData: Object, options?: GeoJSON options): Layer\r\n\t// Creates a `Layer` from a given GeoJSON feature. Can use a custom\r\n\t// [`pointToLayer`](#geojson-pointtolayer) and/or [`coordsToLatLng`](#geojson-coordstolatlng)\r\n\t// functions if provided as options.\r\n\tgeometryToLayer: function (geojson, options) {\r\n\r\n\t\tvar geometry = geojson.type === 'Feature' ? geojson.geometry : geojson,\r\n\t\t    coords = geometry ? geometry.coordinates : null,\r\n\t\t    layers = [],\r\n\t\t    pointToLayer = options && options.pointToLayer,\r\n\t\t    coordsToLatLng = options && options.coordsToLatLng || this.coordsToLatLng,\r\n\t\t    latlng, latlngs, i, len;\r\n\r\n\t\tif (!coords && !geometry) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tswitch (geometry.type) {\r\n\t\tcase 'Point':\r\n\t\t\tlatlng = coordsToLatLng(coords);\r\n\t\t\treturn pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng);\r\n\r\n\t\tcase 'MultiPoint':\r\n\t\t\tfor (i = 0, len = coords.length; i < len; i++) {\r\n\t\t\t\tlatlng = coordsToLatLng(coords[i]);\r\n\t\t\t\tlayers.push(pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng));\r\n\t\t\t}\r\n\t\t\treturn new L.FeatureGroup(layers);\r\n\r\n\t\tcase 'LineString':\r\n\t\tcase 'MultiLineString':\r\n\t\t\tlatlngs = this.coordsToLatLngs(coords, geometry.type === 'LineString' ? 0 : 1, coordsToLatLng);\r\n\t\t\treturn new L.Polyline(latlngs, options);\r\n\r\n\t\tcase 'Polygon':\r\n\t\tcase 'MultiPolygon':\r\n\t\t\tlatlngs = this.coordsToLatLngs(coords, geometry.type === 'Polygon' ? 1 : 2, coordsToLatLng);\r\n\t\t\treturn new L.Polygon(latlngs, options);\r\n\r\n\t\tcase 'GeometryCollection':\r\n\t\t\tfor (i = 0, len = geometry.geometries.length; i < len; i++) {\r\n\t\t\t\tvar layer = this.geometryToLayer({\r\n\t\t\t\t\tgeometry: geometry.geometries[i],\r\n\t\t\t\t\ttype: 'Feature',\r\n\t\t\t\t\tproperties: geojson.properties\r\n\t\t\t\t}, options);\r\n\r\n\t\t\t\tif (layer) {\r\n\t\t\t\t\tlayers.push(layer);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn new L.FeatureGroup(layers);\r\n\r\n\t\tdefault:\r\n\t\t\tthrow new Error('Invalid GeoJSON object.');\r\n\t\t}\r\n\t},\r\n\r\n\t// @function coordsToLatLng(coords: Array): LatLng\r\n\t// Creates a `LatLng` object from an array of 2 numbers (longitude, latitude)\r\n\t// or 3 numbers (longitude, latitude, altitude) used in GeoJSON for points.\r\n\tcoordsToLatLng: function (coords) {\r\n\t\treturn new L.LatLng(coords[1], coords[0], coords[2]);\r\n\t},\r\n\r\n\t// @function coordsToLatLngs(coords: Array, levelsDeep?: Number, coordsToLatLng?: Function): Array\r\n\t// Creates a multidimensional array of `LatLng`s from a GeoJSON coordinates array.\r\n\t// `levelsDeep` specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default).\r\n\t// Can use a custom [`coordsToLatLng`](#geojson-coordstolatlng) function.\r\n\tcoordsToLatLngs: function (coords, levelsDeep, coordsToLatLng) {\r\n\t\tvar latlngs = [];\r\n\r\n\t\tfor (var i = 0, len = coords.length, latlng; i < len; i++) {\r\n\t\t\tlatlng = levelsDeep ?\r\n\t\t\t        this.coordsToLatLngs(coords[i], levelsDeep - 1, coordsToLatLng) :\r\n\t\t\t        (coordsToLatLng || this.coordsToLatLng)(coords[i]);\r\n\r\n\t\t\tlatlngs.push(latlng);\r\n\t\t}\r\n\r\n\t\treturn latlngs;\r\n\t},\r\n\r\n\t// @function latLngToCoords(latlng: LatLng): Array\r\n\t// Reverse of [`coordsToLatLng`](#geojson-coordstolatlng)\r\n\tlatLngToCoords: function (latlng) {\r\n\t\treturn latlng.alt !== undefined ?\r\n\t\t\t\t[latlng.lng, latlng.lat, latlng.alt] :\r\n\t\t\t\t[latlng.lng, latlng.lat];\r\n\t},\r\n\r\n\t// @function latLngsToCoords(latlngs: Array, levelsDeep?: Number, closed?: Boolean): Array\r\n\t// Reverse of [`coordsToLatLngs`](#geojson-coordstolatlngs)\r\n\t// `closed` determines whether the first point should be appended to the end of the array to close the feature, only used when `levelsDeep` is 0. False by default.\r\n\tlatLngsToCoords: function (latlngs, levelsDeep, closed) {\r\n\t\tvar coords = [];\r\n\r\n\t\tfor (var i = 0, len = latlngs.length; i < len; i++) {\r\n\t\t\tcoords.push(levelsDeep ?\r\n\t\t\t\tL.GeoJSON.latLngsToCoords(latlngs[i], levelsDeep - 1, closed) :\r\n\t\t\t\tL.GeoJSON.latLngToCoords(latlngs[i]));\r\n\t\t}\r\n\r\n\t\tif (!levelsDeep && closed) {\r\n\t\t\tcoords.push(coords[0]);\r\n\t\t}\r\n\r\n\t\treturn coords;\r\n\t},\r\n\r\n\tgetFeature: function (layer, newGeometry) {\r\n\t\treturn layer.feature ?\r\n\t\t\t\tL.extend({}, layer.feature, {geometry: newGeometry}) :\r\n\t\t\t\tL.GeoJSON.asFeature(newGeometry);\r\n\t},\r\n\r\n\t// @function asFeature(geojson: Object): Object\r\n\t// Normalize GeoJSON geometries/features into GeoJSON features.\r\n\tasFeature: function (geojson) {\r\n\t\tif (geojson.type === 'Feature' || geojson.type === 'FeatureCollection') {\r\n\t\t\treturn geojson;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\ttype: 'Feature',\r\n\t\t\tproperties: {},\r\n\t\t\tgeometry: geojson\r\n\t\t};\r\n\t}\r\n});\r\n\r\nvar PointToGeoJSON = {\r\n\ttoGeoJSON: function () {\r\n\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\ttype: 'Point',\r\n\t\t\tcoordinates: L.GeoJSON.latLngToCoords(this.getLatLng())\r\n\t\t});\r\n\t}\r\n};\r\n\r\n// @namespace Marker\r\n// @method toGeoJSON(): Object\r\n// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the marker (as a GeoJSON `Point` Feature).\r\nL.Marker.include(PointToGeoJSON);\r\n\r\n// @namespace CircleMarker\r\n// @method toGeoJSON(): Object\r\n// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the circle marker (as a GeoJSON `Point` Feature).\r\nL.Circle.include(PointToGeoJSON);\r\nL.CircleMarker.include(PointToGeoJSON);\r\n\r\n\r\n// @namespace Polyline\r\n// @method toGeoJSON(): Object\r\n// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the polyline (as a GeoJSON `LineString` or `MultiLineString` Feature).\r\nL.Polyline.prototype.toGeoJSON = function () {\r\n\tvar multi = !L.Polyline._flat(this._latlngs);\r\n\r\n\tvar coords = L.GeoJSON.latLngsToCoords(this._latlngs, multi ? 1 : 0);\r\n\r\n\treturn L.GeoJSON.getFeature(this, {\r\n\t\ttype: (multi ? 'Multi' : '') + 'LineString',\r\n\t\tcoordinates: coords\r\n\t});\r\n};\r\n\r\n// @namespace Polygon\r\n// @method toGeoJSON(): Object\r\n// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the polygon (as a GeoJSON `Polygon` or `MultiPolygon` Feature).\r\nL.Polygon.prototype.toGeoJSON = function () {\r\n\tvar holes = !L.Polyline._flat(this._latlngs),\r\n\t    multi = holes && !L.Polyline._flat(this._latlngs[0]);\r\n\r\n\tvar coords = L.GeoJSON.latLngsToCoords(this._latlngs, multi ? 2 : holes ? 1 : 0, true);\r\n\r\n\tif (!holes) {\r\n\t\tcoords = [coords];\r\n\t}\r\n\r\n\treturn L.GeoJSON.getFeature(this, {\r\n\t\ttype: (multi ? 'Multi' : '') + 'Polygon',\r\n\t\tcoordinates: coords\r\n\t});\r\n};\r\n\r\n\r\n// @namespace LayerGroup\r\nL.LayerGroup.include({\r\n\ttoMultiPoint: function () {\r\n\t\tvar coords = [];\r\n\r\n\t\tthis.eachLayer(function (layer) {\r\n\t\t\tcoords.push(layer.toGeoJSON().geometry.coordinates);\r\n\t\t});\r\n\r\n\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\ttype: 'MultiPoint',\r\n\t\t\tcoordinates: coords\r\n\t\t});\r\n\t},\r\n\r\n\t// @method toGeoJSON(): Object\r\n\t// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the layer group (as a GeoJSON `GeometryCollection`).\r\n\ttoGeoJSON: function () {\r\n\r\n\t\tvar type = this.feature && this.feature.geometry && this.feature.geometry.type;\r\n\r\n\t\tif (type === 'MultiPoint') {\r\n\t\t\treturn this.toMultiPoint();\r\n\t\t}\r\n\r\n\t\tvar isGeometryCollection = type === 'GeometryCollection',\r\n\t\t    jsons = [];\r\n\r\n\t\tthis.eachLayer(function (layer) {\r\n\t\t\tif (layer.toGeoJSON) {\r\n\t\t\t\tvar json = layer.toGeoJSON();\r\n\t\t\t\tjsons.push(isGeometryCollection ? json.geometry : L.GeoJSON.asFeature(json));\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif (isGeometryCollection) {\r\n\t\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\t\tgeometries: jsons,\r\n\t\t\t\ttype: 'GeometryCollection'\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\ttype: 'FeatureCollection',\r\n\t\t\tfeatures: jsons\r\n\t\t};\r\n\t}\r\n});\r\n\r\n// @namespace GeoJSON\r\n// @factory L.geoJSON(geojson?: Object, options?: GeoJSON options)\r\n// Creates a GeoJSON layer. Optionally accepts an object in\r\n// [GeoJSON format](http://geojson.org/geojson-spec.html) to display on the map\r\n// (you can alternatively add it later with `addData` method) and an `options` object.\r\nL.geoJSON = function (geojson, options) {\r\n\treturn new L.GeoJSON(geojson, options);\r\n};\r\n// Backward compatibility.\r\nL.geoJson = L.geoJSON;\r\n\n\n\n/*\r\n * @class Draggable\r\n * @aka L.Draggable\r\n * @inherits Evented\r\n *\r\n * A class for making DOM elements draggable (including touch support).\r\n * Used internally for map and marker dragging. Only works for elements\r\n * that were positioned with [`L.DomUtil.setPosition`](#domutil-setposition).\r\n *\r\n * @example\r\n * ```js\r\n * var draggable = new L.Draggable(elementToDrag);\r\n * draggable.enable();\r\n * ```\r\n */\r\n\r\nL.Draggable = L.Evented.extend({\r\n\r\n\toptions: {\r\n\t\t// @option clickTolerance: Number = 3\r\n\t\t// The max number of pixels a user can shift the mouse pointer during a click\r\n\t\t// for it to be considered a valid click (as opposed to a mouse drag).\r\n\t\tclickTolerance: 3\r\n\t},\r\n\r\n\tstatics: {\r\n\t\tSTART: L.Browser.touch ? ['touchstart', 'mousedown'] : ['mousedown'],\r\n\t\tEND: {\r\n\t\t\tmousedown: 'mouseup',\r\n\t\t\ttouchstart: 'touchend',\r\n\t\t\tpointerdown: 'touchend',\r\n\t\t\tMSPointerDown: 'touchend'\r\n\t\t},\r\n\t\tMOVE: {\r\n\t\t\tmousedown: 'mousemove',\r\n\t\t\ttouchstart: 'touchmove',\r\n\t\t\tpointerdown: 'touchmove',\r\n\t\t\tMSPointerDown: 'touchmove'\r\n\t\t}\r\n\t},\r\n\r\n\t// @constructor L.Draggable(el: HTMLElement, dragHandle?: HTMLElement, preventOutline: Boolean)\r\n\t// Creates a `Draggable` object for moving `el` when you start dragging the `dragHandle` element (equals `el` itself by default).\r\n\tinitialize: function (element, dragStartTarget, preventOutline) {\r\n\t\tthis._element = element;\r\n\t\tthis._dragStartTarget = dragStartTarget || element;\r\n\t\tthis._preventOutline = preventOutline;\r\n\t},\r\n\r\n\t// @method enable()\r\n\t// Enables the dragging ability\r\n\tenable: function () {\r\n\t\tif (this._enabled) { return; }\r\n\r\n\t\tL.DomEvent.on(this._dragStartTarget, L.Draggable.START.join(' '), this._onDown, this);\r\n\r\n\t\tthis._enabled = true;\r\n\t},\r\n\r\n\t// @method disable()\r\n\t// Disables the dragging ability\r\n\tdisable: function () {\r\n\t\tif (!this._enabled) { return; }\r\n\r\n\t\t// If we're currently dragging this draggable,\r\n\t\t// disabling it counts as first ending the drag.\r\n\t\tif (L.Draggable._dragging === this) {\r\n\t\t\tthis.finishDrag();\r\n\t\t}\r\n\r\n\t\tL.DomEvent.off(this._dragStartTarget, L.Draggable.START.join(' '), this._onDown, this);\r\n\r\n\t\tthis._enabled = false;\r\n\t\tthis._moved = false;\r\n\t},\r\n\r\n\t_onDown: function (e) {\r\n\t\t// Ignore simulated events, since we handle both touch and\r\n\t\t// mouse explicitly; otherwise we risk getting duplicates of\r\n\t\t// touch events, see #4315.\r\n\t\t// Also ignore the event if disabled; this happens in IE11\r\n\t\t// under some circumstances, see #3666.\r\n\t\tif (e._simulated || !this._enabled) { return; }\r\n\r\n\t\tthis._moved = false;\r\n\r\n\t\tif (L.DomUtil.hasClass(this._element, 'leaflet-zoom-anim')) { return; }\r\n\r\n\t\tif (L.Draggable._dragging || e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; }\r\n\t\tL.Draggable._dragging = this;  // Prevent dragging multiple objects at once.\r\n\r\n\t\tif (this._preventOutline) {\r\n\t\t\tL.DomUtil.preventOutline(this._element);\r\n\t\t}\r\n\r\n\t\tL.DomUtil.disableImageDrag();\r\n\t\tL.DomUtil.disableTextSelection();\r\n\r\n\t\tif (this._moving) { return; }\r\n\r\n\t\t// @event down: Event\r\n\t\t// Fired when a drag is about to start.\r\n\t\tthis.fire('down');\r\n\r\n\t\tvar first = e.touches ? e.touches[0] : e;\r\n\r\n\t\tthis._startPoint = new L.Point(first.clientX, first.clientY);\r\n\r\n\t\tL.DomEvent\r\n\t\t\t.on(document, L.Draggable.MOVE[e.type], this._onMove, this)\r\n\t\t\t.on(document, L.Draggable.END[e.type], this._onUp, this);\r\n\t},\r\n\r\n\t_onMove: function (e) {\r\n\t\t// Ignore simulated events, since we handle both touch and\r\n\t\t// mouse explicitly; otherwise we risk getting duplicates of\r\n\t\t// touch events, see #4315.\r\n\t\t// Also ignore the event if disabled; this happens in IE11\r\n\t\t// under some circumstances, see #3666.\r\n\t\tif (e._simulated || !this._enabled) { return; }\r\n\r\n\t\tif (e.touches && e.touches.length > 1) {\r\n\t\t\tthis._moved = true;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar first = (e.touches && e.touches.length === 1 ? e.touches[0] : e),\r\n\t\t    newPoint = new L.Point(first.clientX, first.clientY),\r\n\t\t    offset = newPoint.subtract(this._startPoint);\r\n\r\n\t\tif (!offset.x && !offset.y) { return; }\r\n\t\tif (Math.abs(offset.x) + Math.abs(offset.y) < this.options.clickTolerance) { return; }\r\n\r\n\t\tL.DomEvent.preventDefault(e);\r\n\r\n\t\tif (!this._moved) {\r\n\t\t\t// @event dragstart: Event\r\n\t\t\t// Fired when a drag starts\r\n\t\t\tthis.fire('dragstart');\r\n\r\n\t\t\tthis._moved = true;\r\n\t\t\tthis._startPos = L.DomUtil.getPosition(this._element).subtract(offset);\r\n\r\n\t\t\tL.DomUtil.addClass(document.body, 'leaflet-dragging');\r\n\r\n\t\t\tthis._lastTarget = e.target || e.srcElement;\r\n\t\t\t// IE and Edge do not give the <use> element, so fetch it\r\n\t\t\t// if necessary\r\n\t\t\tif ((window.SVGElementInstance) && (this._lastTarget instanceof SVGElementInstance)) {\r\n\t\t\t\tthis._lastTarget = this._lastTarget.correspondingUseElement;\r\n\t\t\t}\r\n\t\t\tL.DomUtil.addClass(this._lastTarget, 'leaflet-drag-target');\r\n\t\t}\r\n\r\n\t\tthis._newPos = this._startPos.add(offset);\r\n\t\tthis._moving = true;\r\n\r\n\t\tL.Util.cancelAnimFrame(this._animRequest);\r\n\t\tthis._lastEvent = e;\r\n\t\tthis._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true);\r\n\t},\r\n\r\n\t_updatePosition: function () {\r\n\t\tvar e = {originalEvent: this._lastEvent};\r\n\r\n\t\t// @event predrag: Event\r\n\t\t// Fired continuously during dragging *before* each corresponding\r\n\t\t// update of the element's position.\r\n\t\tthis.fire('predrag', e);\r\n\t\tL.DomUtil.setPosition(this._element, this._newPos);\r\n\r\n\t\t// @event drag: Event\r\n\t\t// Fired continuously during dragging.\r\n\t\tthis.fire('drag', e);\r\n\t},\r\n\r\n\t_onUp: function (e) {\r\n\t\t// Ignore simulated events, since we handle both touch and\r\n\t\t// mouse explicitly; otherwise we risk getting duplicates of\r\n\t\t// touch events, see #4315.\r\n\t\t// Also ignore the event if disabled; this happens in IE11\r\n\t\t// under some circumstances, see #3666.\r\n\t\tif (e._simulated || !this._enabled) { return; }\r\n\t\tthis.finishDrag();\r\n\t},\r\n\r\n\tfinishDrag: function () {\r\n\t\tL.DomUtil.removeClass(document.body, 'leaflet-dragging');\r\n\r\n\t\tif (this._lastTarget) {\r\n\t\t\tL.DomUtil.removeClass(this._lastTarget, 'leaflet-drag-target');\r\n\t\t\tthis._lastTarget = null;\r\n\t\t}\r\n\r\n\t\tfor (var i in L.Draggable.MOVE) {\r\n\t\t\tL.DomEvent\r\n\t\t\t\t.off(document, L.Draggable.MOVE[i], this._onMove, this)\r\n\t\t\t\t.off(document, L.Draggable.END[i], this._onUp, this);\r\n\t\t}\r\n\r\n\t\tL.DomUtil.enableImageDrag();\r\n\t\tL.DomUtil.enableTextSelection();\r\n\r\n\t\tif (this._moved && this._moving) {\r\n\t\t\t// ensure drag is not fired after dragend\r\n\t\t\tL.Util.cancelAnimFrame(this._animRequest);\r\n\r\n\t\t\t// @event dragend: DragEndEvent\r\n\t\t\t// Fired when the drag ends.\r\n\t\t\tthis.fire('dragend', {\r\n\t\t\t\tdistance: this._newPos.distanceTo(this._startPos)\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis._moving = false;\r\n\t\tL.Draggable._dragging = false;\r\n\t}\r\n\r\n});\r\n\n\n\n/*\n\tL.Handler is a base class for handler classes that are used internally to inject\n\tinteraction features like dragging to classes like Map and Marker.\n*/\n\n// @class Handler\n// @aka L.Handler\n// Abstract class for map interaction handlers\n\nL.Handler = L.Class.extend({\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\t},\n\n\t// @method enable(): this\n\t// Enables the handler\n\tenable: function () {\n\t\tif (this._enabled) { return this; }\n\n\t\tthis._enabled = true;\n\t\tthis.addHooks();\n\t\treturn this;\n\t},\n\n\t// @method disable(): this\n\t// Disables the handler\n\tdisable: function () {\n\t\tif (!this._enabled) { return this; }\n\n\t\tthis._enabled = false;\n\t\tthis.removeHooks();\n\t\treturn this;\n\t},\n\n\t// @method enabled(): Boolean\n\t// Returns `true` if the handler is enabled\n\tenabled: function () {\n\t\treturn !!this._enabled;\n\t}\n\n\t// @section Extension methods\n\t// Classes inheriting from `Handler` must implement the two following methods:\n\t// @method addHooks()\n\t// Called when the handler is enabled, should add event hooks.\n\t// @method removeHooks()\n\t// Called when the handler is disabled, should remove the event hooks added previously.\n});\n\n\n\n/*\n * L.Handler.MapDrag is used to make the map draggable (with panning inertia), enabled by default.\n */\n\n// @namespace Map\n// @section Interaction Options\nL.Map.mergeOptions({\n\t// @option dragging: Boolean = true\n\t// Whether the map be draggable with mouse/touch or not.\n\tdragging: true,\n\n\t// @section Panning Inertia Options\n\t// @option inertia: Boolean = *\n\t// If enabled, panning of the map will have an inertia effect where\n\t// the map builds momentum while dragging and continues moving in\n\t// the same direction for some time. Feels especially nice on touch\n\t// devices. Enabled by default unless running on old Android devices.\n\tinertia: !L.Browser.android23,\n\n\t// @option inertiaDeceleration: Number = 3000\n\t// The rate with which the inertial movement slows down, in pixels/second².\n\tinertiaDeceleration: 3400, // px/s^2\n\n\t// @option inertiaMaxSpeed: Number = Infinity\n\t// Max speed of the inertial movement, in pixels/second.\n\tinertiaMaxSpeed: Infinity, // px/s\n\n\t// @option easeLinearity: Number = 0.2\n\teaseLinearity: 0.2,\n\n\t// TODO refactor, move to CRS\n\t// @option worldCopyJump: Boolean = false\n\t// With this option enabled, the map tracks when you pan to another \"copy\"\n\t// of the world and seamlessly jumps to the original one so that all overlays\n\t// like markers and vector layers are still visible.\n\tworldCopyJump: false,\n\n\t// @option maxBoundsViscosity: Number = 0.0\n\t// If `maxBounds` is set, this option will control how solid the bounds\n\t// are when dragging the map around. The default value of `0.0` allows the\n\t// user to drag outside the bounds at normal speed, higher values will\n\t// slow down map dragging outside bounds, and `1.0` makes the bounds fully\n\t// solid, preventing the user from dragging outside the bounds.\n\tmaxBoundsViscosity: 0.0\n});\n\nL.Map.Drag = L.Handler.extend({\n\taddHooks: function () {\n\t\tif (!this._draggable) {\n\t\t\tvar map = this._map;\n\n\t\t\tthis._draggable = new L.Draggable(map._mapPane, map._container);\n\n\t\t\tthis._draggable.on({\n\t\t\t\tdown: this._onDown,\n\t\t\t\tdragstart: this._onDragStart,\n\t\t\t\tdrag: this._onDrag,\n\t\t\t\tdragend: this._onDragEnd\n\t\t\t}, this);\n\n\t\t\tthis._draggable.on('predrag', this._onPreDragLimit, this);\n\t\t\tif (map.options.worldCopyJump) {\n\t\t\t\tthis._draggable.on('predrag', this._onPreDragWrap, this);\n\t\t\t\tmap.on('zoomend', this._onZoomEnd, this);\n\n\t\t\t\tmap.whenReady(this._onZoomEnd, this);\n\t\t\t}\n\t\t}\n\t\tL.DomUtil.addClass(this._map._container, 'leaflet-grab leaflet-touch-drag');\n\t\tthis._draggable.enable();\n\t\tthis._positions = [];\n\t\tthis._times = [];\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomUtil.removeClass(this._map._container, 'leaflet-grab');\n\t\tL.DomUtil.removeClass(this._map._container, 'leaflet-touch-drag');\n\t\tthis._draggable.disable();\n\t},\n\n\tmoved: function () {\n\t\treturn this._draggable && this._draggable._moved;\n\t},\n\n\tmoving: function () {\n\t\treturn this._draggable && this._draggable._moving;\n\t},\n\n\t_onDown: function () {\n\t\tthis._map._stop();\n\t},\n\n\t_onDragStart: function () {\n\t\tvar map = this._map;\n\n\t\tif (this._map.options.maxBounds && this._map.options.maxBoundsViscosity) {\n\t\t\tvar bounds = L.latLngBounds(this._map.options.maxBounds);\n\n\t\t\tthis._offsetLimit = L.bounds(\n\t\t\t\tthis._map.latLngToContainerPoint(bounds.getNorthWest()).multiplyBy(-1),\n\t\t\t\tthis._map.latLngToContainerPoint(bounds.getSouthEast()).multiplyBy(-1)\n\t\t\t\t\t.add(this._map.getSize()));\n\n\t\t\tthis._viscosity = Math.min(1.0, Math.max(0.0, this._map.options.maxBoundsViscosity));\n\t\t} else {\n\t\t\tthis._offsetLimit = null;\n\t\t}\n\n\t\tmap\n\t\t    .fire('movestart')\n\t\t    .fire('dragstart');\n\n\t\tif (map.options.inertia) {\n\t\t\tthis._positions = [];\n\t\t\tthis._times = [];\n\t\t}\n\t},\n\n\t_onDrag: function (e) {\n\t\tif (this._map.options.inertia) {\n\t\t\tvar time = this._lastTime = +new Date(),\n\t\t\t    pos = this._lastPos = this._draggable._absPos || this._draggable._newPos;\n\n\t\t\tthis._positions.push(pos);\n\t\t\tthis._times.push(time);\n\n\t\t\tif (time - this._times[0] > 50) {\n\t\t\t\tthis._positions.shift();\n\t\t\t\tthis._times.shift();\n\t\t\t}\n\t\t}\n\n\t\tthis._map\n\t\t    .fire('move', e)\n\t\t    .fire('drag', e);\n\t},\n\n\t_onZoomEnd: function () {\n\t\tvar pxCenter = this._map.getSize().divideBy(2),\n\t\t    pxWorldCenter = this._map.latLngToLayerPoint([0, 0]);\n\n\t\tthis._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x;\n\t\tthis._worldWidth = this._map.getPixelWorldBounds().getSize().x;\n\t},\n\n\t_viscousLimit: function (value, threshold) {\n\t\treturn value - (value - threshold) * this._viscosity;\n\t},\n\n\t_onPreDragLimit: function () {\n\t\tif (!this._viscosity || !this._offsetLimit) { return; }\n\n\t\tvar offset = this._draggable._newPos.subtract(this._draggable._startPos);\n\n\t\tvar limit = this._offsetLimit;\n\t\tif (offset.x < limit.min.x) { offset.x = this._viscousLimit(offset.x, limit.min.x); }\n\t\tif (offset.y < limit.min.y) { offset.y = this._viscousLimit(offset.y, limit.min.y); }\n\t\tif (offset.x > limit.max.x) { offset.x = this._viscousLimit(offset.x, limit.max.x); }\n\t\tif (offset.y > limit.max.y) { offset.y = this._viscousLimit(offset.y, limit.max.y); }\n\n\t\tthis._draggable._newPos = this._draggable._startPos.add(offset);\n\t},\n\n\t_onPreDragWrap: function () {\n\t\t// TODO refactor to be able to adjust map pane position after zoom\n\t\tvar worldWidth = this._worldWidth,\n\t\t    halfWidth = Math.round(worldWidth / 2),\n\t\t    dx = this._initialWorldOffset,\n\t\t    x = this._draggable._newPos.x,\n\t\t    newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx,\n\t\t    newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx,\n\t\t    newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2;\n\n\t\tthis._draggable._absPos = this._draggable._newPos.clone();\n\t\tthis._draggable._newPos.x = newX;\n\t},\n\n\t_onDragEnd: function (e) {\n\t\tvar map = this._map,\n\t\t    options = map.options,\n\n\t\t    noInertia = !options.inertia || this._times.length < 2;\n\n\t\tmap.fire('dragend', e);\n\n\t\tif (noInertia) {\n\t\t\tmap.fire('moveend');\n\n\t\t} else {\n\n\t\t\tvar direction = this._lastPos.subtract(this._positions[0]),\n\t\t\t    duration = (this._lastTime - this._times[0]) / 1000,\n\t\t\t    ease = options.easeLinearity,\n\n\t\t\t    speedVector = direction.multiplyBy(ease / duration),\n\t\t\t    speed = speedVector.distanceTo([0, 0]),\n\n\t\t\t    limitedSpeed = Math.min(options.inertiaMaxSpeed, speed),\n\t\t\t    limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed),\n\n\t\t\t    decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease),\n\t\t\t    offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round();\n\n\t\t\tif (!offset.x && !offset.y) {\n\t\t\t\tmap.fire('moveend');\n\n\t\t\t} else {\n\t\t\t\toffset = map._limitOffset(offset, map.options.maxBounds);\n\n\t\t\t\tL.Util.requestAnimFrame(function () {\n\t\t\t\t\tmap.panBy(offset, {\n\t\t\t\t\t\tduration: decelerationDuration,\n\t\t\t\t\t\teaseLinearity: ease,\n\t\t\t\t\t\tnoMoveStart: true,\n\t\t\t\t\t\tanimate: true\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n});\n\n// @section Handlers\n// @property dragging: Handler\n// Map dragging handler (by both mouse and touch).\nL.Map.addInitHook('addHandler', 'dragging', L.Map.Drag);\n\n\n\n/*\n * L.Handler.DoubleClickZoom is used to handle double-click zoom on the map, enabled by default.\n */\n\n// @namespace Map\n// @section Interaction Options\n\nL.Map.mergeOptions({\n\t// @option doubleClickZoom: Boolean|String = true\n\t// Whether the map can be zoomed in by double clicking on it and\n\t// zoomed out by double clicking while holding shift. If passed\n\t// `'center'`, double-click zoom will zoom to the center of the\n\t//  view regardless of where the mouse was.\n\tdoubleClickZoom: true\n});\n\nL.Map.DoubleClickZoom = L.Handler.extend({\n\taddHooks: function () {\n\t\tthis._map.on('dblclick', this._onDoubleClick, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._map.off('dblclick', this._onDoubleClick, this);\n\t},\n\n\t_onDoubleClick: function (e) {\n\t\tvar map = this._map,\n\t\t    oldZoom = map.getZoom(),\n\t\t    delta = map.options.zoomDelta,\n\t\t    zoom = e.originalEvent.shiftKey ? oldZoom - delta : oldZoom + delta;\n\n\t\tif (map.options.doubleClickZoom === 'center') {\n\t\t\tmap.setZoom(zoom);\n\t\t} else {\n\t\t\tmap.setZoomAround(e.containerPoint, zoom);\n\t\t}\n\t}\n});\n\n// @section Handlers\n//\n// Map properties include interaction handlers that allow you to control\n// interaction behavior in runtime, enabling or disabling certain features such\n// as dragging or touch zoom (see `Handler` methods). For example:\n//\n// ```js\n// map.doubleClickZoom.disable();\n// ```\n//\n// @property doubleClickZoom: Handler\n// Double click zoom handler.\nL.Map.addInitHook('addHandler', 'doubleClickZoom', L.Map.DoubleClickZoom);\n\n\n\n/*\n * L.Handler.ScrollWheelZoom is used by L.Map to enable mouse scroll wheel zoom on the map.\n */\n\n// @namespace Map\n// @section Interaction Options\nL.Map.mergeOptions({\n\t// @section Mousewheel options\n\t// @option scrollWheelZoom: Boolean|String = true\n\t// Whether the map can be zoomed by using the mouse wheel. If passed `'center'`,\n\t// it will zoom to the center of the view regardless of where the mouse was.\n\tscrollWheelZoom: true,\n\n\t// @option wheelDebounceTime: Number = 40\n\t// Limits the rate at which a wheel can fire (in milliseconds). By default\n\t// user can't zoom via wheel more often than once per 40 ms.\n\twheelDebounceTime: 40,\n\n\t// @option wheelPxPerZoomLevel: Number = 60\n\t// How many scroll pixels (as reported by [L.DomEvent.getWheelDelta](#domevent-getwheeldelta))\n\t// mean a change of one full zoom level. Smaller values will make wheel-zooming\n\t// faster (and vice versa).\n\twheelPxPerZoomLevel: 60\n});\n\nL.Map.ScrollWheelZoom = L.Handler.extend({\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._map._container, 'mousewheel', this._onWheelScroll, this);\n\n\t\tthis._delta = 0;\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._map._container, 'mousewheel', this._onWheelScroll, this);\n\t},\n\n\t_onWheelScroll: function (e) {\n\t\tvar delta = L.DomEvent.getWheelDelta(e);\n\n\t\tvar debounce = this._map.options.wheelDebounceTime;\n\n\t\tthis._delta += delta;\n\t\tthis._lastMousePos = this._map.mouseEventToContainerPoint(e);\n\n\t\tif (!this._startTime) {\n\t\t\tthis._startTime = +new Date();\n\t\t}\n\n\t\tvar left = Math.max(debounce - (+new Date() - this._startTime), 0);\n\n\t\tclearTimeout(this._timer);\n\t\tthis._timer = setTimeout(L.bind(this._performZoom, this), left);\n\n\t\tL.DomEvent.stop(e);\n\t},\n\n\t_performZoom: function () {\n\t\tvar map = this._map,\n\t\t    zoom = map.getZoom(),\n\t\t    snap = this._map.options.zoomSnap || 0;\n\n\t\tmap._stop(); // stop panning and fly animations if any\n\n\t\t// map the delta with a sigmoid function to -4..4 range leaning on -1..1\n\t\tvar d2 = this._delta / (this._map.options.wheelPxPerZoomLevel * 4),\n\t\t    d3 = 4 * Math.log(2 / (1 + Math.exp(-Math.abs(d2)))) / Math.LN2,\n\t\t    d4 = snap ? Math.ceil(d3 / snap) * snap : d3,\n\t\t    delta = map._limitZoom(zoom + (this._delta > 0 ? d4 : -d4)) - zoom;\n\n\t\tthis._delta = 0;\n\t\tthis._startTime = null;\n\n\t\tif (!delta) { return; }\n\n\t\tif (map.options.scrollWheelZoom === 'center') {\n\t\t\tmap.setZoom(zoom + delta);\n\t\t} else {\n\t\t\tmap.setZoomAround(this._lastMousePos, zoom + delta);\n\t\t}\n\t}\n});\n\n// @section Handlers\n// @property scrollWheelZoom: Handler\n// Scroll wheel zoom handler.\nL.Map.addInitHook('addHandler', 'scrollWheelZoom', L.Map.ScrollWheelZoom);\n\n\n\n/*\r\n * Extends the event handling code with double tap support for mobile browsers.\r\n */\r\n\r\nL.extend(L.DomEvent, {\r\n\r\n\t_touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart',\r\n\t_touchend: L.Browser.msPointer ? 'MSPointerUp' : L.Browser.pointer ? 'pointerup' : 'touchend',\r\n\r\n\t// inspired by Zepto touch code by Thomas Fuchs\r\n\taddDoubleTapListener: function (obj, handler, id) {\r\n\t\tvar last, touch,\r\n\t\t    doubleTap = false,\r\n\t\t    delay = 250;\r\n\r\n\t\tfunction onTouchStart(e) {\r\n\t\t\tvar count;\r\n\r\n\t\t\tif (L.Browser.pointer) {\r\n\t\t\t\tif ((!L.Browser.edge) || e.pointerType === 'mouse') { return; }\r\n\t\t\t\tcount = L.DomEvent._pointersCount;\r\n\t\t\t} else {\r\n\t\t\t\tcount = e.touches.length;\r\n\t\t\t}\r\n\r\n\t\t\tif (count > 1) { return; }\r\n\r\n\t\t\tvar now = Date.now(),\r\n\t\t\t    delta = now - (last || now);\r\n\r\n\t\t\ttouch = e.touches ? e.touches[0] : e;\r\n\t\t\tdoubleTap = (delta > 0 && delta <= delay);\r\n\t\t\tlast = now;\r\n\t\t}\r\n\r\n\t\tfunction onTouchEnd(e) {\r\n\t\t\tif (doubleTap && !touch.cancelBubble) {\r\n\t\t\t\tif (L.Browser.pointer) {\r\n\t\t\t\t\tif ((!L.Browser.edge) || e.pointerType === 'mouse') { return; }\r\n\r\n\t\t\t\t\t// work around .type being readonly with MSPointer* events\r\n\t\t\t\t\tvar newTouch = {},\r\n\t\t\t\t\t    prop, i;\r\n\r\n\t\t\t\t\tfor (i in touch) {\r\n\t\t\t\t\t\tprop = touch[i];\r\n\t\t\t\t\t\tnewTouch[i] = prop && prop.bind ? prop.bind(touch) : prop;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttouch = newTouch;\r\n\t\t\t\t}\r\n\t\t\t\ttouch.type = 'dblclick';\r\n\t\t\t\thandler(touch);\r\n\t\t\t\tlast = null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar pre = '_leaflet_',\r\n\t\t    touchstart = this._touchstart,\r\n\t\t    touchend = this._touchend;\r\n\r\n\t\tobj[pre + touchstart + id] = onTouchStart;\r\n\t\tobj[pre + touchend + id] = onTouchEnd;\r\n\t\tobj[pre + 'dblclick' + id] = handler;\r\n\r\n\t\tobj.addEventListener(touchstart, onTouchStart, false);\r\n\t\tobj.addEventListener(touchend, onTouchEnd, false);\r\n\r\n\t\t// On some platforms (notably, chrome<55 on win10 + touchscreen + mouse),\r\n\t\t// the browser doesn't fire touchend/pointerup events but does fire\r\n\t\t// native dblclicks. See #4127.\r\n\t\t// Edge 14 also fires native dblclicks, but only for pointerType mouse, see #5180.\r\n\t\tobj.addEventListener('dblclick', handler, false);\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveDoubleTapListener: function (obj, id) {\r\n\t\tvar pre = '_leaflet_',\r\n\t\t    touchstart = obj[pre + this._touchstart + id],\r\n\t\t    touchend = obj[pre + this._touchend + id],\r\n\t\t    dblclick = obj[pre + 'dblclick' + id];\r\n\r\n\t\tobj.removeEventListener(this._touchstart, touchstart, false);\r\n\t\tobj.removeEventListener(this._touchend, touchend, false);\r\n\t\tif (!L.Browser.edge) {\r\n\t\t\tobj.removeEventListener('dblclick', dblclick, false);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n});\r\n\n\n\n/*\n * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices.\n */\n\nL.extend(L.DomEvent, {\n\n\tPOINTER_DOWN:   L.Browser.msPointer ? 'MSPointerDown'   : 'pointerdown',\n\tPOINTER_MOVE:   L.Browser.msPointer ? 'MSPointerMove'   : 'pointermove',\n\tPOINTER_UP:     L.Browser.msPointer ? 'MSPointerUp'     : 'pointerup',\n\tPOINTER_CANCEL: L.Browser.msPointer ? 'MSPointerCancel' : 'pointercancel',\n\tTAG_WHITE_LIST: ['INPUT', 'SELECT', 'OPTION'],\n\n\t_pointers: {},\n\t_pointersCount: 0,\n\n\t// Provides a touch events wrapper for (ms)pointer events.\n\t// ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890\n\n\taddPointerListener: function (obj, type, handler, id) {\n\n\t\tif (type === 'touchstart') {\n\t\t\tthis._addPointerStart(obj, handler, id);\n\n\t\t} else if (type === 'touchmove') {\n\t\t\tthis._addPointerMove(obj, handler, id);\n\n\t\t} else if (type === 'touchend') {\n\t\t\tthis._addPointerEnd(obj, handler, id);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremovePointerListener: function (obj, type, id) {\n\t\tvar handler = obj['_leaflet_' + type + id];\n\n\t\tif (type === 'touchstart') {\n\t\t\tobj.removeEventListener(this.POINTER_DOWN, handler, false);\n\n\t\t} else if (type === 'touchmove') {\n\t\t\tobj.removeEventListener(this.POINTER_MOVE, handler, false);\n\n\t\t} else if (type === 'touchend') {\n\t\t\tobj.removeEventListener(this.POINTER_UP, handler, false);\n\t\t\tobj.removeEventListener(this.POINTER_CANCEL, handler, false);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_addPointerStart: function (obj, handler, id) {\n\t\tvar onDown = L.bind(function (e) {\n\t\t\tif (e.pointerType !== 'mouse' && e.MSPOINTER_TYPE_MOUSE && e.pointerType !== e.MSPOINTER_TYPE_MOUSE) {\n\t\t\t\t// In IE11, some touch events needs to fire for form controls, or\n\t\t\t\t// the controls will stop working. We keep a whitelist of tag names that\n\t\t\t\t// need these events. For other target tags, we prevent default on the event.\n\t\t\t\tif (this.TAG_WHITE_LIST.indexOf(e.target.tagName) < 0) {\n\t\t\t\t\tL.DomEvent.preventDefault(e);\n\t\t\t\t} else {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._handlePointer(e, handler);\n\t\t}, this);\n\n\t\tobj['_leaflet_touchstart' + id] = onDown;\n\t\tobj.addEventListener(this.POINTER_DOWN, onDown, false);\n\n\t\t// need to keep track of what pointers and how many are active to provide e.touches emulation\n\t\tif (!this._pointerDocListener) {\n\t\t\tvar pointerUp = L.bind(this._globalPointerUp, this);\n\n\t\t\t// we listen documentElement as any drags that end by moving the touch off the screen get fired there\n\t\t\tdocument.documentElement.addEventListener(this.POINTER_DOWN, L.bind(this._globalPointerDown, this), true);\n\t\t\tdocument.documentElement.addEventListener(this.POINTER_MOVE, L.bind(this._globalPointerMove, this), true);\n\t\t\tdocument.documentElement.addEventListener(this.POINTER_UP, pointerUp, true);\n\t\t\tdocument.documentElement.addEventListener(this.POINTER_CANCEL, pointerUp, true);\n\n\t\t\tthis._pointerDocListener = true;\n\t\t}\n\t},\n\n\t_globalPointerDown: function (e) {\n\t\tthis._pointers[e.pointerId] = e;\n\t\tthis._pointersCount++;\n\t},\n\n\t_globalPointerMove: function (e) {\n\t\tif (this._pointers[e.pointerId]) {\n\t\t\tthis._pointers[e.pointerId] = e;\n\t\t}\n\t},\n\n\t_globalPointerUp: function (e) {\n\t\tdelete this._pointers[e.pointerId];\n\t\tthis._pointersCount--;\n\t},\n\n\t_handlePointer: function (e, handler) {\n\t\te.touches = [];\n\t\tfor (var i in this._pointers) {\n\t\t\te.touches.push(this._pointers[i]);\n\t\t}\n\t\te.changedTouches = [e];\n\n\t\thandler(e);\n\t},\n\n\t_addPointerMove: function (obj, handler, id) {\n\t\tvar onMove = L.bind(function (e) {\n\t\t\t// don't fire touch moves when mouse isn't down\n\t\t\tif ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; }\n\n\t\t\tthis._handlePointer(e, handler);\n\t\t}, this);\n\n\t\tobj['_leaflet_touchmove' + id] = onMove;\n\t\tobj.addEventListener(this.POINTER_MOVE, onMove, false);\n\t},\n\n\t_addPointerEnd: function (obj, handler, id) {\n\t\tvar onUp = L.bind(function (e) {\n\t\t\tthis._handlePointer(e, handler);\n\t\t}, this);\n\n\t\tobj['_leaflet_touchend' + id] = onUp;\n\t\tobj.addEventListener(this.POINTER_UP, onUp, false);\n\t\tobj.addEventListener(this.POINTER_CANCEL, onUp, false);\n\t}\n});\n\n\n\n/*\n * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers.\n */\n\n// @namespace Map\n// @section Interaction Options\nL.Map.mergeOptions({\n\t// @section Touch interaction options\n\t// @option touchZoom: Boolean|String = *\n\t// Whether the map can be zoomed by touch-dragging with two fingers. If\n\t// passed `'center'`, it will zoom to the center of the view regardless of\n\t// where the touch events (fingers) were. Enabled for touch-capable web\n\t// browsers except for old Androids.\n\ttouchZoom: L.Browser.touch && !L.Browser.android23,\n\n\t// @option bounceAtZoomLimits: Boolean = true\n\t// Set it to false if you don't want the map to zoom beyond min/max zoom\n\t// and then bounce back when pinch-zooming.\n\tbounceAtZoomLimits: true\n});\n\nL.Map.TouchZoom = L.Handler.extend({\n\taddHooks: function () {\n\t\tL.DomUtil.addClass(this._map._container, 'leaflet-touch-zoom');\n\t\tL.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomUtil.removeClass(this._map._container, 'leaflet-touch-zoom');\n\t\tL.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this);\n\t},\n\n\t_onTouchStart: function (e) {\n\t\tvar map = this._map;\n\t\tif (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; }\n\n\t\tvar p1 = map.mouseEventToContainerPoint(e.touches[0]),\n\t\t    p2 = map.mouseEventToContainerPoint(e.touches[1]);\n\n\t\tthis._centerPoint = map.getSize()._divideBy(2);\n\t\tthis._startLatLng = map.containerPointToLatLng(this._centerPoint);\n\t\tif (map.options.touchZoom !== 'center') {\n\t\t\tthis._pinchStartLatLng = map.containerPointToLatLng(p1.add(p2)._divideBy(2));\n\t\t}\n\n\t\tthis._startDist = p1.distanceTo(p2);\n\t\tthis._startZoom = map.getZoom();\n\n\t\tthis._moved = false;\n\t\tthis._zooming = true;\n\n\t\tmap._stop();\n\n\t\tL.DomEvent\n\t\t    .on(document, 'touchmove', this._onTouchMove, this)\n\t\t    .on(document, 'touchend', this._onTouchEnd, this);\n\n\t\tL.DomEvent.preventDefault(e);\n\t},\n\n\t_onTouchMove: function (e) {\n\t\tif (!e.touches || e.touches.length !== 2 || !this._zooming) { return; }\n\n\t\tvar map = this._map,\n\t\t    p1 = map.mouseEventToContainerPoint(e.touches[0]),\n\t\t    p2 = map.mouseEventToContainerPoint(e.touches[1]),\n\t\t    scale = p1.distanceTo(p2) / this._startDist;\n\n\n\t\tthis._zoom = map.getScaleZoom(scale, this._startZoom);\n\n\t\tif (!map.options.bounceAtZoomLimits && (\n\t\t\t(this._zoom < map.getMinZoom() && scale < 1) ||\n\t\t\t(this._zoom > map.getMaxZoom() && scale > 1))) {\n\t\t\tthis._zoom = map._limitZoom(this._zoom);\n\t\t}\n\n\t\tif (map.options.touchZoom === 'center') {\n\t\t\tthis._center = this._startLatLng;\n\t\t\tif (scale === 1) { return; }\n\t\t} else {\n\t\t\t// Get delta from pinch to center, so centerLatLng is delta applied to initial pinchLatLng\n\t\t\tvar delta = p1._add(p2)._divideBy(2)._subtract(this._centerPoint);\n\t\t\tif (scale === 1 && delta.x === 0 && delta.y === 0) { return; }\n\t\t\tthis._center = map.unproject(map.project(this._pinchStartLatLng, this._zoom).subtract(delta), this._zoom);\n\t\t}\n\n\t\tif (!this._moved) {\n\t\t\tmap._moveStart(true);\n\t\t\tthis._moved = true;\n\t\t}\n\n\t\tL.Util.cancelAnimFrame(this._animRequest);\n\n\t\tvar moveFn = L.bind(map._move, map, this._center, this._zoom, {pinch: true, round: false});\n\t\tthis._animRequest = L.Util.requestAnimFrame(moveFn, this, true);\n\n\t\tL.DomEvent.preventDefault(e);\n\t},\n\n\t_onTouchEnd: function () {\n\t\tif (!this._moved || !this._zooming) {\n\t\t\tthis._zooming = false;\n\t\t\treturn;\n\t\t}\n\n\t\tthis._zooming = false;\n\t\tL.Util.cancelAnimFrame(this._animRequest);\n\n\t\tL.DomEvent\n\t\t    .off(document, 'touchmove', this._onTouchMove)\n\t\t    .off(document, 'touchend', this._onTouchEnd);\n\n\t\t// Pinch updates GridLayers' levels only when zoomSnap is off, so zoomSnap becomes noUpdate.\n\t\tif (this._map.options.zoomAnimation) {\n\t\t\tthis._map._animateZoom(this._center, this._map._limitZoom(this._zoom), true, this._map.options.zoomSnap);\n\t\t} else {\n\t\t\tthis._map._resetView(this._center, this._map._limitZoom(this._zoom));\n\t\t}\n\t}\n});\n\n// @section Handlers\n// @property touchZoom: Handler\n// Touch zoom handler.\nL.Map.addInitHook('addHandler', 'touchZoom', L.Map.TouchZoom);\n\n\n\n/*\n * L.Map.Tap is used to enable mobile hacks like quick taps and long hold.\n */\n\n// @namespace Map\n// @section Interaction Options\nL.Map.mergeOptions({\n\t// @section Touch interaction options\n\t// @option tap: Boolean = true\n\t// Enables mobile hacks for supporting instant taps (fixing 200ms click\n\t// delay on iOS/Android) and touch holds (fired as `contextmenu` events).\n\ttap: true,\n\n\t// @option tapTolerance: Number = 15\n\t// The max number of pixels a user can shift his finger during touch\n\t// for it to be considered a valid tap.\n\ttapTolerance: 15\n});\n\nL.Map.Tap = L.Handler.extend({\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._map._container, 'touchstart', this._onDown, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._map._container, 'touchstart', this._onDown, this);\n\t},\n\n\t_onDown: function (e) {\n\t\tif (!e.touches) { return; }\n\n\t\tL.DomEvent.preventDefault(e);\n\n\t\tthis._fireClick = true;\n\n\t\t// don't simulate click or track longpress if more than 1 touch\n\t\tif (e.touches.length > 1) {\n\t\t\tthis._fireClick = false;\n\t\t\tclearTimeout(this._holdTimeout);\n\t\t\treturn;\n\t\t}\n\n\t\tvar first = e.touches[0],\n\t\t    el = first.target;\n\n\t\tthis._startPos = this._newPos = new L.Point(first.clientX, first.clientY);\n\n\t\t// if touching a link, highlight it\n\t\tif (el.tagName && el.tagName.toLowerCase() === 'a') {\n\t\t\tL.DomUtil.addClass(el, 'leaflet-active');\n\t\t}\n\n\t\t// simulate long hold but setting a timeout\n\t\tthis._holdTimeout = setTimeout(L.bind(function () {\n\t\t\tif (this._isTapValid()) {\n\t\t\t\tthis._fireClick = false;\n\t\t\t\tthis._onUp();\n\t\t\t\tthis._simulateEvent('contextmenu', first);\n\t\t\t}\n\t\t}, this), 1000);\n\n\t\tthis._simulateEvent('mousedown', first);\n\n\t\tL.DomEvent.on(document, {\n\t\t\ttouchmove: this._onMove,\n\t\t\ttouchend: this._onUp\n\t\t}, this);\n\t},\n\n\t_onUp: function (e) {\n\t\tclearTimeout(this._holdTimeout);\n\n\t\tL.DomEvent.off(document, {\n\t\t\ttouchmove: this._onMove,\n\t\t\ttouchend: this._onUp\n\t\t}, this);\n\n\t\tif (this._fireClick && e && e.changedTouches) {\n\n\t\t\tvar first = e.changedTouches[0],\n\t\t\t    el = first.target;\n\n\t\t\tif (el && el.tagName && el.tagName.toLowerCase() === 'a') {\n\t\t\t\tL.DomUtil.removeClass(el, 'leaflet-active');\n\t\t\t}\n\n\t\t\tthis._simulateEvent('mouseup', first);\n\n\t\t\t// simulate click if the touch didn't move too much\n\t\t\tif (this._isTapValid()) {\n\t\t\t\tthis._simulateEvent('click', first);\n\t\t\t}\n\t\t}\n\t},\n\n\t_isTapValid: function () {\n\t\treturn this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance;\n\t},\n\n\t_onMove: function (e) {\n\t\tvar first = e.touches[0];\n\t\tthis._newPos = new L.Point(first.clientX, first.clientY);\n\t\tthis._simulateEvent('mousemove', first);\n\t},\n\n\t_simulateEvent: function (type, e) {\n\t\tvar simulatedEvent = document.createEvent('MouseEvents');\n\n\t\tsimulatedEvent._simulated = true;\n\t\te.target._simulatedClick = true;\n\n\t\tsimulatedEvent.initMouseEvent(\n\t\t        type, true, true, window, 1,\n\t\t        e.screenX, e.screenY,\n\t\t        e.clientX, e.clientY,\n\t\t        false, false, false, false, 0, null);\n\n\t\te.target.dispatchEvent(simulatedEvent);\n\t}\n});\n\n// @section Handlers\n// @property tap: Handler\n// Mobile touch hacks (quick tap and touch hold) handler.\nif (L.Browser.touch && !L.Browser.pointer) {\n\tL.Map.addInitHook('addHandler', 'tap', L.Map.Tap);\n}\n\n\n\n/*\n * L.Handler.BoxZoom is used to add shift-drag zoom interaction to the map\n * (zoom to a selected bounding box), enabled by default.\n */\n\n// @namespace Map\n// @section Interaction Options\nL.Map.mergeOptions({\n\t// @option boxZoom: Boolean = true\n\t// Whether the map can be zoomed to a rectangular area specified by\n\t// dragging the mouse while pressing the shift key.\n\tboxZoom: true\n});\n\nL.Map.BoxZoom = L.Handler.extend({\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\t\tthis._container = map._container;\n\t\tthis._pane = map._panes.overlayPane;\n\t},\n\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this);\n\t},\n\n\tmoved: function () {\n\t\treturn this._moved;\n\t},\n\n\t_resetState: function () {\n\t\tthis._moved = false;\n\t},\n\n\t_onMouseDown: function (e) {\n\t\tif (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }\n\n\t\tthis._resetState();\n\n\t\tL.DomUtil.disableTextSelection();\n\t\tL.DomUtil.disableImageDrag();\n\n\t\tthis._startPoint = this._map.mouseEventToContainerPoint(e);\n\n\t\tL.DomEvent.on(document, {\n\t\t\tcontextmenu: L.DomEvent.stop,\n\t\t\tmousemove: this._onMouseMove,\n\t\t\tmouseup: this._onMouseUp,\n\t\t\tkeydown: this._onKeyDown\n\t\t}, this);\n\t},\n\n\t_onMouseMove: function (e) {\n\t\tif (!this._moved) {\n\t\t\tthis._moved = true;\n\n\t\t\tthis._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._container);\n\t\t\tL.DomUtil.addClass(this._container, 'leaflet-crosshair');\n\n\t\t\tthis._map.fire('boxzoomstart');\n\t\t}\n\n\t\tthis._point = this._map.mouseEventToContainerPoint(e);\n\n\t\tvar bounds = new L.Bounds(this._point, this._startPoint),\n\t\t    size = bounds.getSize();\n\n\t\tL.DomUtil.setPosition(this._box, bounds.min);\n\n\t\tthis._box.style.width  = size.x + 'px';\n\t\tthis._box.style.height = size.y + 'px';\n\t},\n\n\t_finish: function () {\n\t\tif (this._moved) {\n\t\t\tL.DomUtil.remove(this._box);\n\t\t\tL.DomUtil.removeClass(this._container, 'leaflet-crosshair');\n\t\t}\n\n\t\tL.DomUtil.enableTextSelection();\n\t\tL.DomUtil.enableImageDrag();\n\n\t\tL.DomEvent.off(document, {\n\t\t\tcontextmenu: L.DomEvent.stop,\n\t\t\tmousemove: this._onMouseMove,\n\t\t\tmouseup: this._onMouseUp,\n\t\t\tkeydown: this._onKeyDown\n\t\t}, this);\n\t},\n\n\t_onMouseUp: function (e) {\n\t\tif ((e.which !== 1) && (e.button !== 1)) { return; }\n\n\t\tthis._finish();\n\n\t\tif (!this._moved) { return; }\n\t\t// Postpone to next JS tick so internal click event handling\n\t\t// still see it as \"moved\".\n\t\tsetTimeout(L.bind(this._resetState, this), 0);\n\n\t\tvar bounds = new L.LatLngBounds(\n\t\t        this._map.containerPointToLatLng(this._startPoint),\n\t\t        this._map.containerPointToLatLng(this._point));\n\n\t\tthis._map\n\t\t\t.fitBounds(bounds)\n\t\t\t.fire('boxzoomend', {boxZoomBounds: bounds});\n\t},\n\n\t_onKeyDown: function (e) {\n\t\tif (e.keyCode === 27) {\n\t\t\tthis._finish();\n\t\t}\n\t}\n});\n\n// @section Handlers\n// @property boxZoom: Handler\n// Box (shift-drag with mouse) zoom handler.\nL.Map.addInitHook('addHandler', 'boxZoom', L.Map.BoxZoom);\n\n\n\n/*\n * L.Map.Keyboard is handling keyboard interaction with the map, enabled by default.\n */\n\n// @namespace Map\n// @section Keyboard Navigation Options\nL.Map.mergeOptions({\n\t// @option keyboard: Boolean = true\n\t// Makes the map focusable and allows users to navigate the map with keyboard\n\t// arrows and `+`/`-` keys.\n\tkeyboard: true,\n\n\t// @option keyboardPanDelta: Number = 80\n\t// Amount of pixels to pan when pressing an arrow key.\n\tkeyboardPanDelta: 80\n});\n\nL.Map.Keyboard = L.Handler.extend({\n\n\tkeyCodes: {\n\t\tleft:    [37],\n\t\tright:   [39],\n\t\tdown:    [40],\n\t\tup:      [38],\n\t\tzoomIn:  [187, 107, 61, 171],\n\t\tzoomOut: [189, 109, 54, 173]\n\t},\n\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\n\t\tthis._setPanDelta(map.options.keyboardPanDelta);\n\t\tthis._setZoomDelta(map.options.zoomDelta);\n\t},\n\n\taddHooks: function () {\n\t\tvar container = this._map._container;\n\n\t\t// make the container focusable by tabbing\n\t\tif (container.tabIndex <= 0) {\n\t\t\tcontainer.tabIndex = '0';\n\t\t}\n\n\t\tL.DomEvent.on(container, {\n\t\t\tfocus: this._onFocus,\n\t\t\tblur: this._onBlur,\n\t\t\tmousedown: this._onMouseDown\n\t\t}, this);\n\n\t\tthis._map.on({\n\t\t\tfocus: this._addHooks,\n\t\t\tblur: this._removeHooks\n\t\t}, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._removeHooks();\n\n\t\tL.DomEvent.off(this._map._container, {\n\t\t\tfocus: this._onFocus,\n\t\t\tblur: this._onBlur,\n\t\t\tmousedown: this._onMouseDown\n\t\t}, this);\n\n\t\tthis._map.off({\n\t\t\tfocus: this._addHooks,\n\t\t\tblur: this._removeHooks\n\t\t}, this);\n\t},\n\n\t_onMouseDown: function () {\n\t\tif (this._focused) { return; }\n\n\t\tvar body = document.body,\n\t\t    docEl = document.documentElement,\n\t\t    top = body.scrollTop || docEl.scrollTop,\n\t\t    left = body.scrollLeft || docEl.scrollLeft;\n\n\t\tthis._map._container.focus();\n\n\t\twindow.scrollTo(left, top);\n\t},\n\n\t_onFocus: function () {\n\t\tthis._focused = true;\n\t\tthis._map.fire('focus');\n\t},\n\n\t_onBlur: function () {\n\t\tthis._focused = false;\n\t\tthis._map.fire('blur');\n\t},\n\n\t_setPanDelta: function (panDelta) {\n\t\tvar keys = this._panKeys = {},\n\t\t    codes = this.keyCodes,\n\t\t    i, len;\n\n\t\tfor (i = 0, len = codes.left.length; i < len; i++) {\n\t\t\tkeys[codes.left[i]] = [-1 * panDelta, 0];\n\t\t}\n\t\tfor (i = 0, len = codes.right.length; i < len; i++) {\n\t\t\tkeys[codes.right[i]] = [panDelta, 0];\n\t\t}\n\t\tfor (i = 0, len = codes.down.length; i < len; i++) {\n\t\t\tkeys[codes.down[i]] = [0, panDelta];\n\t\t}\n\t\tfor (i = 0, len = codes.up.length; i < len; i++) {\n\t\t\tkeys[codes.up[i]] = [0, -1 * panDelta];\n\t\t}\n\t},\n\n\t_setZoomDelta: function (zoomDelta) {\n\t\tvar keys = this._zoomKeys = {},\n\t\t    codes = this.keyCodes,\n\t\t    i, len;\n\n\t\tfor (i = 0, len = codes.zoomIn.length; i < len; i++) {\n\t\t\tkeys[codes.zoomIn[i]] = zoomDelta;\n\t\t}\n\t\tfor (i = 0, len = codes.zoomOut.length; i < len; i++) {\n\t\t\tkeys[codes.zoomOut[i]] = -zoomDelta;\n\t\t}\n\t},\n\n\t_addHooks: function () {\n\t\tL.DomEvent.on(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_removeHooks: function () {\n\t\tL.DomEvent.off(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_onKeyDown: function (e) {\n\t\tif (e.altKey || e.ctrlKey || e.metaKey) { return; }\n\n\t\tvar key = e.keyCode,\n\t\t    map = this._map,\n\t\t    offset;\n\n\t\tif (key in this._panKeys) {\n\n\t\t\tif (map._panAnim && map._panAnim._inProgress) { return; }\n\n\t\t\toffset = this._panKeys[key];\n\t\t\tif (e.shiftKey) {\n\t\t\t\toffset = L.point(offset).multiplyBy(3);\n\t\t\t}\n\n\t\t\tmap.panBy(offset);\n\n\t\t\tif (map.options.maxBounds) {\n\t\t\t\tmap.panInsideBounds(map.options.maxBounds);\n\t\t\t}\n\n\t\t} else if (key in this._zoomKeys) {\n\t\t\tmap.setZoom(map.getZoom() + (e.shiftKey ? 3 : 1) * this._zoomKeys[key]);\n\n\t\t} else if (key === 27) {\n\t\t\tmap.closePopup();\n\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\tL.DomEvent.stop(e);\n\t}\n});\n\n// @section Handlers\n// @section Handlers\n// @property keyboard: Handler\n// Keyboard navigation handler.\nL.Map.addInitHook('addHandler', 'keyboard', L.Map.Keyboard);\n\n\n\n/*\n * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable.\n */\n\n\n/* @namespace Marker\n * @section Interaction handlers\n *\n * Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see `Handler` methods). Example:\n *\n * ```js\n * marker.dragging.disable();\n * ```\n *\n * @property dragging: Handler\n * Marker dragging handler (by both mouse and touch).\n */\n\nL.Handler.MarkerDrag = L.Handler.extend({\n\tinitialize: function (marker) {\n\t\tthis._marker = marker;\n\t},\n\n\taddHooks: function () {\n\t\tvar icon = this._marker._icon;\n\n\t\tif (!this._draggable) {\n\t\t\tthis._draggable = new L.Draggable(icon, icon, true);\n\t\t}\n\n\t\tthis._draggable.on({\n\t\t\tdragstart: this._onDragStart,\n\t\t\tdrag: this._onDrag,\n\t\t\tdragend: this._onDragEnd\n\t\t}, this).enable();\n\n\t\tL.DomUtil.addClass(icon, 'leaflet-marker-draggable');\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._draggable.off({\n\t\t\tdragstart: this._onDragStart,\n\t\t\tdrag: this._onDrag,\n\t\t\tdragend: this._onDragEnd\n\t\t}, this).disable();\n\n\t\tif (this._marker._icon) {\n\t\t\tL.DomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable');\n\t\t}\n\t},\n\n\tmoved: function () {\n\t\treturn this._draggable && this._draggable._moved;\n\t},\n\n\t_onDragStart: function () {\n\t\t// @section Dragging events\n\t\t// @event dragstart: Event\n\t\t// Fired when the user starts dragging the marker.\n\n\t\t// @event movestart: Event\n\t\t// Fired when the marker starts moving (because of dragging).\n\n\t\tthis._oldLatLng = this._marker.getLatLng();\n\t\tthis._marker\n\t\t    .closePopup()\n\t\t    .fire('movestart')\n\t\t    .fire('dragstart');\n\t},\n\n\t_onDrag: function (e) {\n\t\tvar marker = this._marker,\n\t\t    shadow = marker._shadow,\n\t\t    iconPos = L.DomUtil.getPosition(marker._icon),\n\t\t    latlng = marker._map.layerPointToLatLng(iconPos);\n\n\t\t// update shadow position\n\t\tif (shadow) {\n\t\t\tL.DomUtil.setPosition(shadow, iconPos);\n\t\t}\n\n\t\tmarker._latlng = latlng;\n\t\te.latlng = latlng;\n\t\te.oldLatLng = this._oldLatLng;\n\n\t\t// @event drag: Event\n\t\t// Fired repeatedly while the user drags the marker.\n\t\tmarker\n\t\t    .fire('move', e)\n\t\t    .fire('drag', e);\n\t},\n\n\t_onDragEnd: function (e) {\n\t\t// @event dragend: DragEndEvent\n\t\t// Fired when the user stops dragging the marker.\n\n\t\t// @event moveend: Event\n\t\t// Fired when the marker stops moving (because of dragging).\n\t\tdelete this._oldLatLng;\n\t\tthis._marker\n\t\t    .fire('moveend')\n\t\t    .fire('dragend', e);\n\t}\n});\n\n\n\n/*\r\n * @class Control\r\n * @aka L.Control\r\n * @inherits Class\r\n *\r\n * L.Control is a base class for implementing map controls. Handles positioning.\r\n * All other controls extend from this class.\r\n */\r\n\r\nL.Control = L.Class.extend({\r\n\t// @section\r\n\t// @aka Control options\r\n\toptions: {\r\n\t\t// @option position: String = 'topright'\r\n\t\t// The position of the control (one of the map corners). Possible values are `'topleft'`,\r\n\t\t// `'topright'`, `'bottomleft'` or `'bottomright'`\r\n\t\tposition: 'topright'\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\t/* @section\r\n\t * Classes extending L.Control will inherit the following methods:\r\n\t *\r\n\t * @method getPosition: string\r\n\t * Returns the position of the control.\r\n\t */\r\n\tgetPosition: function () {\r\n\t\treturn this.options.position;\r\n\t},\r\n\r\n\t// @method setPosition(position: string): this\r\n\t// Sets the position of the control.\r\n\tsetPosition: function (position) {\r\n\t\tvar map = this._map;\r\n\r\n\t\tif (map) {\r\n\t\t\tmap.removeControl(this);\r\n\t\t}\r\n\r\n\t\tthis.options.position = position;\r\n\r\n\t\tif (map) {\r\n\t\t\tmap.addControl(this);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getContainer: HTMLElement\r\n\t// Returns the HTMLElement that contains the control.\r\n\tgetContainer: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\t// @method addTo(map: Map): this\r\n\t// Adds the control to the given map.\r\n\taddTo: function (map) {\r\n\t\tthis.remove();\r\n\t\tthis._map = map;\r\n\r\n\t\tvar container = this._container = this.onAdd(map),\r\n\t\t    pos = this.getPosition(),\r\n\t\t    corner = map._controlCorners[pos];\r\n\r\n\t\tL.DomUtil.addClass(container, 'leaflet-control');\r\n\r\n\t\tif (pos.indexOf('bottom') !== -1) {\r\n\t\t\tcorner.insertBefore(container, corner.firstChild);\r\n\t\t} else {\r\n\t\t\tcorner.appendChild(container);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method remove: this\r\n\t// Removes the control from the map it is currently active on.\r\n\tremove: function () {\r\n\t\tif (!this._map) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tL.DomUtil.remove(this._container);\r\n\r\n\t\tif (this.onRemove) {\r\n\t\t\tthis.onRemove(this._map);\r\n\t\t}\r\n\r\n\t\tthis._map = null;\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_refocusOnMap: function (e) {\r\n\t\t// if map exists and event is not a keyboard event\r\n\t\tif (this._map && e && e.screenX > 0 && e.screenY > 0) {\r\n\t\t\tthis._map.getContainer().focus();\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.control = function (options) {\r\n\treturn new L.Control(options);\r\n};\r\n\r\n/* @section Extension methods\r\n * @uninheritable\r\n *\r\n * Every control should extend from `L.Control` and (re-)implement the following methods.\r\n *\r\n * @method onAdd(map: Map): HTMLElement\r\n * Should return the container DOM element for the control and add listeners on relevant map events. Called on [`control.addTo(map)`](#control-addTo).\r\n *\r\n * @method onRemove(map: Map)\r\n * Optional method. Should contain all clean up code that removes the listeners previously added in [`onAdd`](#control-onadd). Called on [`control.remove()`](#control-remove).\r\n */\r\n\r\n/* @namespace Map\r\n * @section Methods for Layers and Controls\r\n */\r\nL.Map.include({\r\n\t// @method addControl(control: Control): this\r\n\t// Adds the given control to the map\r\n\taddControl: function (control) {\r\n\t\tcontrol.addTo(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method removeControl(control: Control): this\r\n\t// Removes the given control from the map\r\n\tremoveControl: function (control) {\r\n\t\tcontrol.remove();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initControlPos: function () {\r\n\t\tvar corners = this._controlCorners = {},\r\n\t\t    l = 'leaflet-',\r\n\t\t    container = this._controlContainer =\r\n\t\t            L.DomUtil.create('div', l + 'control-container', this._container);\r\n\r\n\t\tfunction createCorner(vSide, hSide) {\r\n\t\t\tvar className = l + vSide + ' ' + l + hSide;\r\n\r\n\t\t\tcorners[vSide + hSide] = L.DomUtil.create('div', className, container);\r\n\t\t}\r\n\r\n\t\tcreateCorner('top', 'left');\r\n\t\tcreateCorner('top', 'right');\r\n\t\tcreateCorner('bottom', 'left');\r\n\t\tcreateCorner('bottom', 'right');\r\n\t},\r\n\r\n\t_clearControlPos: function () {\r\n\t\tL.DomUtil.remove(this._controlContainer);\r\n\t}\r\n});\r\n\n\n\n/*\r\n * @class Control.Zoom\r\n * @aka L.Control.Zoom\r\n * @inherits Control\r\n *\r\n * A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its [`zoomControl` option](#map-zoomcontrol) to `false`. Extends `Control`.\r\n */\r\n\r\nL.Control.Zoom = L.Control.extend({\r\n\t// @section\r\n\t// @aka Control.Zoom options\r\n\toptions: {\r\n\t\tposition: 'topleft',\r\n\r\n\t\t// @option zoomInText: String = '+'\r\n\t\t// The text set on the 'zoom in' button.\r\n\t\tzoomInText: '+',\r\n\r\n\t\t// @option zoomInTitle: String = 'Zoom in'\r\n\t\t// The title set on the 'zoom in' button.\r\n\t\tzoomInTitle: 'Zoom in',\r\n\r\n\t\t// @option zoomOutText: String = '-'\r\n\t\t// The text set on the 'zoom out' button.\r\n\t\tzoomOutText: '-',\r\n\r\n\t\t// @option zoomOutTitle: String = 'Zoom out'\r\n\t\t// The title set on the 'zoom out' button.\r\n\t\tzoomOutTitle: 'Zoom out'\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tvar zoomName = 'leaflet-control-zoom',\r\n\t\t    container = L.DomUtil.create('div', zoomName + ' leaflet-bar'),\r\n\t\t    options = this.options;\r\n\r\n\t\tthis._zoomInButton  = this._createButton(options.zoomInText, options.zoomInTitle,\r\n\t\t        zoomName + '-in',  container, this._zoomIn);\r\n\t\tthis._zoomOutButton = this._createButton(options.zoomOutText, options.zoomOutTitle,\r\n\t\t        zoomName + '-out', container, this._zoomOut);\r\n\r\n\t\tthis._updateDisabled();\r\n\t\tmap.on('zoomend zoomlevelschange', this._updateDisabled, this);\r\n\r\n\t\treturn container;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap.off('zoomend zoomlevelschange', this._updateDisabled, this);\r\n\t},\r\n\r\n\tdisable: function () {\r\n\t\tthis._disabled = true;\r\n\t\tthis._updateDisabled();\r\n\t\treturn this;\r\n\t},\r\n\r\n\tenable: function () {\r\n\t\tthis._disabled = false;\r\n\t\tthis._updateDisabled();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_zoomIn: function (e) {\r\n\t\tif (!this._disabled && this._map._zoom < this._map.getMaxZoom()) {\r\n\t\t\tthis._map.zoomIn(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1));\r\n\t\t}\r\n\t},\r\n\r\n\t_zoomOut: function (e) {\r\n\t\tif (!this._disabled && this._map._zoom > this._map.getMinZoom()) {\r\n\t\t\tthis._map.zoomOut(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1));\r\n\t\t}\r\n\t},\r\n\r\n\t_createButton: function (html, title, className, container, fn) {\r\n\t\tvar link = L.DomUtil.create('a', className, container);\r\n\t\tlink.innerHTML = html;\r\n\t\tlink.href = '#';\r\n\t\tlink.title = title;\r\n\r\n\t\t/*\r\n\t\t * Will force screen readers like VoiceOver to read this as \"Zoom in - button\"\r\n\t\t */\r\n\t\tlink.setAttribute('role', 'button');\r\n\t\tlink.setAttribute('aria-label', title);\r\n\r\n\t\tL.DomEvent\r\n\t\t    .on(link, 'mousedown dblclick', L.DomEvent.stopPropagation)\r\n\t\t    .on(link, 'click', L.DomEvent.stop)\r\n\t\t    .on(link, 'click', fn, this)\r\n\t\t    .on(link, 'click', this._refocusOnMap, this);\r\n\r\n\t\treturn link;\r\n\t},\r\n\r\n\t_updateDisabled: function () {\r\n\t\tvar map = this._map,\r\n\t\t    className = 'leaflet-disabled';\r\n\r\n\t\tL.DomUtil.removeClass(this._zoomInButton, className);\r\n\t\tL.DomUtil.removeClass(this._zoomOutButton, className);\r\n\r\n\t\tif (this._disabled || map._zoom === map.getMinZoom()) {\r\n\t\t\tL.DomUtil.addClass(this._zoomOutButton, className);\r\n\t\t}\r\n\t\tif (this._disabled || map._zoom === map.getMaxZoom()) {\r\n\t\t\tL.DomUtil.addClass(this._zoomInButton, className);\r\n\t\t}\r\n\t}\r\n});\r\n\r\n// @namespace Map\r\n// @section Control options\r\n// @option zoomControl: Boolean = true\r\n// Whether a [zoom control](#control-zoom) is added to the map by default.\r\nL.Map.mergeOptions({\r\n\tzoomControl: true\r\n});\r\n\r\nL.Map.addInitHook(function () {\r\n\tif (this.options.zoomControl) {\r\n\t\tthis.zoomControl = new L.Control.Zoom();\r\n\t\tthis.addControl(this.zoomControl);\r\n\t}\r\n});\r\n\r\n// @namespace Control.Zoom\r\n// @factory L.control.zoom(options: Control.Zoom options)\r\n// Creates a zoom control\r\nL.control.zoom = function (options) {\r\n\treturn new L.Control.Zoom(options);\r\n};\r\n\n\n\n/*\r\n * @class Control.Attribution\r\n * @aka L.Control.Attribution\r\n * @inherits Control\r\n *\r\n * The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its [`attributionControl` option](#map-attributioncontrol) to `false`, and it fetches attribution texts from layers with the [`getAttribution` method](#layer-getattribution) automatically. Extends Control.\r\n */\r\n\r\nL.Control.Attribution = L.Control.extend({\r\n\t// @section\r\n\t// @aka Control.Attribution options\r\n\toptions: {\r\n\t\tposition: 'bottomright',\r\n\r\n\t\t// @option prefix: String = 'Leaflet'\r\n\t\t// The HTML text shown before the attributions. Pass `false` to disable.\r\n\t\tprefix: '<a href=\"http://leafletjs.com\" title=\"A JS library for interactive maps\">Leaflet</a>'\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._attributions = {};\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tmap.attributionControl = this;\r\n\t\tthis._container = L.DomUtil.create('div', 'leaflet-control-attribution');\r\n\t\tif (L.DomEvent) {\r\n\t\t\tL.DomEvent.disableClickPropagation(this._container);\r\n\t\t}\r\n\r\n\t\t// TODO ugly, refactor\r\n\t\tfor (var i in map._layers) {\r\n\t\t\tif (map._layers[i].getAttribution) {\r\n\t\t\t\tthis.addAttribution(map._layers[i].getAttribution());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._update();\r\n\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\t// @method setPrefix(prefix: String): this\r\n\t// Sets the text before the attributions.\r\n\tsetPrefix: function (prefix) {\r\n\t\tthis.options.prefix = prefix;\r\n\t\tthis._update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method addAttribution(text: String): this\r\n\t// Adds an attribution text (e.g. `'Vector data &copy; Mapbox'`).\r\n\taddAttribution: function (text) {\r\n\t\tif (!text) { return this; }\r\n\r\n\t\tif (!this._attributions[text]) {\r\n\t\t\tthis._attributions[text] = 0;\r\n\t\t}\r\n\t\tthis._attributions[text]++;\r\n\r\n\t\tthis._update();\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method removeAttribution(text: String): this\r\n\t// Removes an attribution text.\r\n\tremoveAttribution: function (text) {\r\n\t\tif (!text) { return this; }\r\n\r\n\t\tif (this._attributions[text]) {\r\n\t\t\tthis._attributions[text]--;\r\n\t\t\tthis._update();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_update: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tvar attribs = [];\r\n\r\n\t\tfor (var i in this._attributions) {\r\n\t\t\tif (this._attributions[i]) {\r\n\t\t\t\tattribs.push(i);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar prefixAndAttribs = [];\r\n\r\n\t\tif (this.options.prefix) {\r\n\t\t\tprefixAndAttribs.push(this.options.prefix);\r\n\t\t}\r\n\t\tif (attribs.length) {\r\n\t\t\tprefixAndAttribs.push(attribs.join(', '));\r\n\t\t}\r\n\r\n\t\tthis._container.innerHTML = prefixAndAttribs.join(' | ');\r\n\t}\r\n});\r\n\r\n// @namespace Map\r\n// @section Control options\r\n// @option attributionControl: Boolean = true\r\n// Whether a [attribution control](#control-attribution) is added to the map by default.\r\nL.Map.mergeOptions({\r\n\tattributionControl: true\r\n});\r\n\r\nL.Map.addInitHook(function () {\r\n\tif (this.options.attributionControl) {\r\n\t\tnew L.Control.Attribution().addTo(this);\r\n\t}\r\n});\r\n\r\n// @namespace Control.Attribution\r\n// @factory L.control.attribution(options: Control.Attribution options)\r\n// Creates an attribution control.\r\nL.control.attribution = function (options) {\r\n\treturn new L.Control.Attribution(options);\r\n};\r\n\n\n\n/*\n * @class Control.Scale\n * @aka L.Control.Scale\n * @inherits Control\n *\n * A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Extends `Control`.\n *\n * @example\n *\n * ```js\n * L.control.scale().addTo(map);\n * ```\n */\n\nL.Control.Scale = L.Control.extend({\n\t// @section\n\t// @aka Control.Scale options\n\toptions: {\n\t\tposition: 'bottomleft',\n\n\t\t// @option maxWidth: Number = 100\n\t\t// Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500).\n\t\tmaxWidth: 100,\n\n\t\t// @option metric: Boolean = True\n\t\t// Whether to show the metric scale line (m/km).\n\t\tmetric: true,\n\n\t\t// @option imperial: Boolean = True\n\t\t// Whether to show the imperial scale line (mi/ft).\n\t\timperial: true\n\n\t\t// @option updateWhenIdle: Boolean = false\n\t\t// If `true`, the control is updated on [`moveend`](#map-moveend), otherwise it's always up-to-date (updated on [`move`](#map-move)).\n\t},\n\n\tonAdd: function (map) {\n\t\tvar className = 'leaflet-control-scale',\n\t\t    container = L.DomUtil.create('div', className),\n\t\t    options = this.options;\n\n\t\tthis._addScales(options, className + '-line', container);\n\n\t\tmap.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this);\n\t\tmap.whenReady(this._update, this);\n\n\t\treturn container;\n\t},\n\n\tonRemove: function (map) {\n\t\tmap.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this);\n\t},\n\n\t_addScales: function (options, className, container) {\n\t\tif (options.metric) {\n\t\t\tthis._mScale = L.DomUtil.create('div', className, container);\n\t\t}\n\t\tif (options.imperial) {\n\t\t\tthis._iScale = L.DomUtil.create('div', className, container);\n\t\t}\n\t},\n\n\t_update: function () {\n\t\tvar map = this._map,\n\t\t    y = map.getSize().y / 2;\n\n\t\tvar maxMeters = map.distance(\n\t\t\t\tmap.containerPointToLatLng([0, y]),\n\t\t\t\tmap.containerPointToLatLng([this.options.maxWidth, y]));\n\n\t\tthis._updateScales(maxMeters);\n\t},\n\n\t_updateScales: function (maxMeters) {\n\t\tif (this.options.metric && maxMeters) {\n\t\t\tthis._updateMetric(maxMeters);\n\t\t}\n\t\tif (this.options.imperial && maxMeters) {\n\t\t\tthis._updateImperial(maxMeters);\n\t\t}\n\t},\n\n\t_updateMetric: function (maxMeters) {\n\t\tvar meters = this._getRoundNum(maxMeters),\n\t\t    label = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km';\n\n\t\tthis._updateScale(this._mScale, label, meters / maxMeters);\n\t},\n\n\t_updateImperial: function (maxMeters) {\n\t\tvar maxFeet = maxMeters * 3.2808399,\n\t\t    maxMiles, miles, feet;\n\n\t\tif (maxFeet > 5280) {\n\t\t\tmaxMiles = maxFeet / 5280;\n\t\t\tmiles = this._getRoundNum(maxMiles);\n\t\t\tthis._updateScale(this._iScale, miles + ' mi', miles / maxMiles);\n\n\t\t} else {\n\t\t\tfeet = this._getRoundNum(maxFeet);\n\t\t\tthis._updateScale(this._iScale, feet + ' ft', feet / maxFeet);\n\t\t}\n\t},\n\n\t_updateScale: function (scale, text, ratio) {\n\t\tscale.style.width = Math.round(this.options.maxWidth * ratio) + 'px';\n\t\tscale.innerHTML = text;\n\t},\n\n\t_getRoundNum: function (num) {\n\t\tvar pow10 = Math.pow(10, (Math.floor(num) + '').length - 1),\n\t\t    d = num / pow10;\n\n\t\td = d >= 10 ? 10 :\n\t\t    d >= 5 ? 5 :\n\t\t    d >= 3 ? 3 :\n\t\t    d >= 2 ? 2 : 1;\n\n\t\treturn pow10 * d;\n\t}\n});\n\n\n// @factory L.control.scale(options?: Control.Scale options)\n// Creates an scale control with the given options.\nL.control.scale = function (options) {\n\treturn new L.Control.Scale(options);\n};\n\n\n\n/*\r\n * @class Control.Layers\r\n * @aka L.Control.Layers\r\n * @inherits Control\r\n *\r\n * The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the [detailed example](http://leafletjs.com/examples/layers-control.html)). Extends `Control`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var baseLayers = {\r\n * \t\"Mapbox\": mapbox,\r\n * \t\"OpenStreetMap\": osm\r\n * };\r\n *\r\n * var overlays = {\r\n * \t\"Marker\": marker,\r\n * \t\"Roads\": roadsLayer\r\n * };\r\n *\r\n * L.control.layers(baseLayers, overlays).addTo(map);\r\n * ```\r\n *\r\n * The `baseLayers` and `overlays` parameters are object literals with layer names as keys and `Layer` objects as values:\r\n *\r\n * ```js\r\n * {\r\n *     \"<someName1>\": layer1,\r\n *     \"<someName2>\": layer2\r\n * }\r\n * ```\r\n *\r\n * The layer names can contain HTML, which allows you to add additional styling to the items:\r\n *\r\n * ```js\r\n * {\"<img src='my-layer-icon' /> <span class='my-layer-item'>My Layer</span>\": myLayer}\r\n * ```\r\n */\r\n\r\n\r\nL.Control.Layers = L.Control.extend({\r\n\t// @section\r\n\t// @aka Control.Layers options\r\n\toptions: {\r\n\t\t// @option collapsed: Boolean = true\r\n\t\t// If `true`, the control will be collapsed into an icon and expanded on mouse hover or touch.\r\n\t\tcollapsed: true,\r\n\t\tposition: 'topright',\r\n\r\n\t\t// @option autoZIndex: Boolean = true\r\n\t\t// If `true`, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off.\r\n\t\tautoZIndex: true,\r\n\r\n\t\t// @option hideSingleBase: Boolean = false\r\n\t\t// If `true`, the base layers in the control will be hidden when there is only one.\r\n\t\thideSingleBase: false,\r\n\r\n\t\t// @option sortLayers: Boolean = false\r\n\t\t// Whether to sort the layers. When `false`, layers will keep the order\r\n\t\t// in which they were added to the control.\r\n\t\tsortLayers: false,\r\n\r\n\t\t// @option sortFunction: Function = *\r\n\t\t// A [compare function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)\r\n\t\t// that will be used for sorting the layers, when `sortLayers` is `true`.\r\n\t\t// The function receives both the `L.Layer` instances and their names, as in\r\n\t\t// `sortFunction(layerA, layerB, nameA, nameB)`.\r\n\t\t// By default, it sorts layers alphabetically by their name.\r\n\t\tsortFunction: function (layerA, layerB, nameA, nameB) {\r\n\t\t\treturn nameA < nameB ? -1 : (nameB < nameA ? 1 : 0);\r\n\t\t}\r\n\t},\r\n\r\n\tinitialize: function (baseLayers, overlays, options) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._layers = [];\r\n\t\tthis._lastZIndex = 0;\r\n\t\tthis._handlingClick = false;\r\n\r\n\t\tfor (var i in baseLayers) {\r\n\t\t\tthis._addLayer(baseLayers[i], i);\r\n\t\t}\r\n\r\n\t\tfor (i in overlays) {\r\n\t\t\tthis._addLayer(overlays[i], i, true);\r\n\t\t}\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._initLayout();\r\n\t\tthis._update();\r\n\r\n\t\tthis._map = map;\r\n\t\tmap.on('zoomend', this._checkDisabledLayers, this);\r\n\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\tonRemove: function () {\r\n\t\tthis._map.off('zoomend', this._checkDisabledLayers, this);\r\n\r\n\t\tfor (var i = 0; i < this._layers.length; i++) {\r\n\t\t\tthis._layers[i].layer.off('add remove', this._onLayerChange, this);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method addBaseLayer(layer: Layer, name: String): this\r\n\t// Adds a base layer (radio button entry) with the given name to the control.\r\n\taddBaseLayer: function (layer, name) {\r\n\t\tthis._addLayer(layer, name);\r\n\t\treturn (this._map) ? this._update() : this;\r\n\t},\r\n\r\n\t// @method addOverlay(layer: Layer, name: String): this\r\n\t// Adds an overlay (checkbox entry) with the given name to the control.\r\n\taddOverlay: function (layer, name) {\r\n\t\tthis._addLayer(layer, name, true);\r\n\t\treturn (this._map) ? this._update() : this;\r\n\t},\r\n\r\n\t// @method removeLayer(layer: Layer): this\r\n\t// Remove the given layer from the control.\r\n\tremoveLayer: function (layer) {\r\n\t\tlayer.off('add remove', this._onLayerChange, this);\r\n\r\n\t\tvar obj = this._getLayer(L.stamp(layer));\r\n\t\tif (obj) {\r\n\t\t\tthis._layers.splice(this._layers.indexOf(obj), 1);\r\n\t\t}\r\n\t\treturn (this._map) ? this._update() : this;\r\n\t},\r\n\r\n\t// @method expand(): this\r\n\t// Expand the control container if collapsed.\r\n\texpand: function () {\r\n\t\tL.DomUtil.addClass(this._container, 'leaflet-control-layers-expanded');\r\n\t\tthis._form.style.height = null;\r\n\t\tvar acceptableHeight = this._map.getSize().y - (this._container.offsetTop + 50);\r\n\t\tif (acceptableHeight < this._form.clientHeight) {\r\n\t\t\tL.DomUtil.addClass(this._form, 'leaflet-control-layers-scrollbar');\r\n\t\t\tthis._form.style.height = acceptableHeight + 'px';\r\n\t\t} else {\r\n\t\t\tL.DomUtil.removeClass(this._form, 'leaflet-control-layers-scrollbar');\r\n\t\t}\r\n\t\tthis._checkDisabledLayers();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method collapse(): this\r\n\t// Collapse the control container if expanded.\r\n\tcollapse: function () {\r\n\t\tL.DomUtil.removeClass(this._container, 'leaflet-control-layers-expanded');\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar className = 'leaflet-control-layers',\r\n\t\t    container = this._container = L.DomUtil.create('div', className),\r\n\t\t    collapsed = this.options.collapsed;\r\n\r\n\t\t// makes this work on IE touch devices by stopping it from firing a mouseout event when the touch is released\r\n\t\tcontainer.setAttribute('aria-haspopup', true);\r\n\r\n\t\tL.DomEvent.disableClickPropagation(container);\r\n\t\tif (!L.Browser.touch) {\r\n\t\t\tL.DomEvent.disableScrollPropagation(container);\r\n\t\t}\r\n\r\n\t\tvar form = this._form = L.DomUtil.create('form', className + '-list');\r\n\r\n\t\tif (collapsed) {\r\n\t\t\tthis._map.on('click', this.collapse, this);\r\n\r\n\t\t\tif (!L.Browser.android) {\r\n\t\t\t\tL.DomEvent.on(container, {\r\n\t\t\t\t\tmouseenter: this.expand,\r\n\t\t\t\t\tmouseleave: this.collapse\r\n\t\t\t\t}, this);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar link = this._layersLink = L.DomUtil.create('a', className + '-toggle', container);\r\n\t\tlink.href = '#';\r\n\t\tlink.title = 'Layers';\r\n\r\n\t\tif (L.Browser.touch) {\r\n\t\t\tL.DomEvent\r\n\t\t\t    .on(link, 'click', L.DomEvent.stop)\r\n\t\t\t    .on(link, 'click', this.expand, this);\r\n\t\t} else {\r\n\t\t\tL.DomEvent.on(link, 'focus', this.expand, this);\r\n\t\t}\r\n\r\n\t\t// work around for Firefox Android issue https://github.com/Leaflet/Leaflet/issues/2033\r\n\t\tL.DomEvent.on(form, 'click', function () {\r\n\t\t\tsetTimeout(L.bind(this._onInputClick, this), 0);\r\n\t\t}, this);\r\n\r\n\t\t// TODO keyboard accessibility\r\n\r\n\t\tif (!collapsed) {\r\n\t\t\tthis.expand();\r\n\t\t}\r\n\r\n\t\tthis._baseLayersList = L.DomUtil.create('div', className + '-base', form);\r\n\t\tthis._separator = L.DomUtil.create('div', className + '-separator', form);\r\n\t\tthis._overlaysList = L.DomUtil.create('div', className + '-overlays', form);\r\n\r\n\t\tcontainer.appendChild(form);\r\n\t},\r\n\r\n\t_getLayer: function (id) {\r\n\t\tfor (var i = 0; i < this._layers.length; i++) {\r\n\r\n\t\t\tif (this._layers[i] && L.stamp(this._layers[i].layer) === id) {\r\n\t\t\t\treturn this._layers[i];\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_addLayer: function (layer, name, overlay) {\r\n\t\tlayer.on('add remove', this._onLayerChange, this);\r\n\r\n\t\tthis._layers.push({\r\n\t\t\tlayer: layer,\r\n\t\t\tname: name,\r\n\t\t\toverlay: overlay\r\n\t\t});\r\n\r\n\t\tif (this.options.sortLayers) {\r\n\t\t\tthis._layers.sort(L.bind(function (a, b) {\r\n\t\t\t\treturn this.options.sortFunction(a.layer, b.layer, a.name, b.name);\r\n\t\t\t}, this));\r\n\t\t}\r\n\r\n\t\tif (this.options.autoZIndex && layer.setZIndex) {\r\n\t\t\tthis._lastZIndex++;\r\n\t\t\tlayer.setZIndex(this._lastZIndex);\r\n\t\t}\r\n\t},\r\n\r\n\t_update: function () {\r\n\t\tif (!this._container) { return this; }\r\n\r\n\t\tL.DomUtil.empty(this._baseLayersList);\r\n\t\tL.DomUtil.empty(this._overlaysList);\r\n\r\n\t\tvar baseLayersPresent, overlaysPresent, i, obj, baseLayersCount = 0;\r\n\r\n\t\tfor (i = 0; i < this._layers.length; i++) {\r\n\t\t\tobj = this._layers[i];\r\n\t\t\tthis._addItem(obj);\r\n\t\t\toverlaysPresent = overlaysPresent || obj.overlay;\r\n\t\t\tbaseLayersPresent = baseLayersPresent || !obj.overlay;\r\n\t\t\tbaseLayersCount += !obj.overlay ? 1 : 0;\r\n\t\t}\r\n\r\n\t\t// Hide base layers section if there's only one layer.\r\n\t\tif (this.options.hideSingleBase) {\r\n\t\t\tbaseLayersPresent = baseLayersPresent && baseLayersCount > 1;\r\n\t\t\tthis._baseLayersList.style.display = baseLayersPresent ? '' : 'none';\r\n\t\t}\r\n\r\n\t\tthis._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none';\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_onLayerChange: function (e) {\r\n\t\tif (!this._handlingClick) {\r\n\t\t\tthis._update();\r\n\t\t}\r\n\r\n\t\tvar obj = this._getLayer(L.stamp(e.target));\r\n\r\n\t\t// @namespace Map\r\n\t\t// @section Layer events\r\n\t\t// @event baselayerchange: LayersControlEvent\r\n\t\t// Fired when the base layer is changed through the [layer control](#control-layers).\r\n\t\t// @event overlayadd: LayersControlEvent\r\n\t\t// Fired when an overlay is selected through the [layer control](#control-layers).\r\n\t\t// @event overlayremove: LayersControlEvent\r\n\t\t// Fired when an overlay is deselected through the [layer control](#control-layers).\r\n\t\t// @namespace Control.Layers\r\n\t\tvar type = obj.overlay ?\r\n\t\t\t(e.type === 'add' ? 'overlayadd' : 'overlayremove') :\r\n\t\t\t(e.type === 'add' ? 'baselayerchange' : null);\r\n\r\n\t\tif (type) {\r\n\t\t\tthis._map.fire(type, obj);\r\n\t\t}\r\n\t},\r\n\r\n\t// IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe)\r\n\t_createRadioElement: function (name, checked) {\r\n\r\n\t\tvar radioHtml = '<input type=\"radio\" class=\"leaflet-control-layers-selector\" name=\"' +\r\n\t\t\t\tname + '\"' + (checked ? ' checked=\"checked\"' : '') + '/>';\r\n\r\n\t\tvar radioFragment = document.createElement('div');\r\n\t\tradioFragment.innerHTML = radioHtml;\r\n\r\n\t\treturn radioFragment.firstChild;\r\n\t},\r\n\r\n\t_addItem: function (obj) {\r\n\t\tvar label = document.createElement('label'),\r\n\t\t    checked = this._map.hasLayer(obj.layer),\r\n\t\t    input;\r\n\r\n\t\tif (obj.overlay) {\r\n\t\t\tinput = document.createElement('input');\r\n\t\t\tinput.type = 'checkbox';\r\n\t\t\tinput.className = 'leaflet-control-layers-selector';\r\n\t\t\tinput.defaultChecked = checked;\r\n\t\t} else {\r\n\t\t\tinput = this._createRadioElement('leaflet-base-layers', checked);\r\n\t\t}\r\n\r\n\t\tinput.layerId = L.stamp(obj.layer);\r\n\r\n\t\tL.DomEvent.on(input, 'click', this._onInputClick, this);\r\n\r\n\t\tvar name = document.createElement('span');\r\n\t\tname.innerHTML = ' ' + obj.name;\r\n\r\n\t\t// Helps from preventing layer control flicker when checkboxes are disabled\r\n\t\t// https://github.com/Leaflet/Leaflet/issues/2771\r\n\t\tvar holder = document.createElement('div');\r\n\r\n\t\tlabel.appendChild(holder);\r\n\t\tholder.appendChild(input);\r\n\t\tholder.appendChild(name);\r\n\r\n\t\tvar container = obj.overlay ? this._overlaysList : this._baseLayersList;\r\n\t\tcontainer.appendChild(label);\r\n\r\n\t\tthis._checkDisabledLayers();\r\n\t\treturn label;\r\n\t},\r\n\r\n\t_onInputClick: function () {\r\n\t\tvar inputs = this._form.getElementsByTagName('input'),\r\n\t\t    input, layer, hasLayer;\r\n\t\tvar addedLayers = [],\r\n\t\t    removedLayers = [];\r\n\r\n\t\tthis._handlingClick = true;\r\n\r\n\t\tfor (var i = inputs.length - 1; i >= 0; i--) {\r\n\t\t\tinput = inputs[i];\r\n\t\t\tlayer = this._getLayer(input.layerId).layer;\r\n\t\t\thasLayer = this._map.hasLayer(layer);\r\n\r\n\t\t\tif (input.checked && !hasLayer) {\r\n\t\t\t\taddedLayers.push(layer);\r\n\r\n\t\t\t} else if (!input.checked && hasLayer) {\r\n\t\t\t\tremovedLayers.push(layer);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Bugfix issue 2318: Should remove all old layers before readding new ones\r\n\t\tfor (i = 0; i < removedLayers.length; i++) {\r\n\t\t\tthis._map.removeLayer(removedLayers[i]);\r\n\t\t}\r\n\t\tfor (i = 0; i < addedLayers.length; i++) {\r\n\t\t\tthis._map.addLayer(addedLayers[i]);\r\n\t\t}\r\n\r\n\t\tthis._handlingClick = false;\r\n\r\n\t\tthis._refocusOnMap();\r\n\t},\r\n\r\n\t_checkDisabledLayers: function () {\r\n\t\tvar inputs = this._form.getElementsByTagName('input'),\r\n\t\t    input,\r\n\t\t    layer,\r\n\t\t    zoom = this._map.getZoom();\r\n\r\n\t\tfor (var i = inputs.length - 1; i >= 0; i--) {\r\n\t\t\tinput = inputs[i];\r\n\t\t\tlayer = this._getLayer(input.layerId).layer;\r\n\t\t\tinput.disabled = (layer.options.minZoom !== undefined && zoom < layer.options.minZoom) ||\r\n\t\t\t                 (layer.options.maxZoom !== undefined && zoom > layer.options.maxZoom);\r\n\r\n\t\t}\r\n\t},\r\n\r\n\t_expand: function () {\r\n\t\t// Backward compatibility, remove me in 1.1.\r\n\t\treturn this.expand();\r\n\t},\r\n\r\n\t_collapse: function () {\r\n\t\t// Backward compatibility, remove me in 1.1.\r\n\t\treturn this.collapse();\r\n\t}\r\n\r\n});\r\n\r\n\r\n// @factory L.control.layers(baselayers?: Object, overlays?: Object, options?: Control.Layers options)\r\n// Creates an attribution control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. Note that all base layers should be passed in the base layers object, but only one should be added to the map during map instantiation.\r\nL.control.layers = function (baseLayers, overlays, options) {\r\n\treturn new L.Control.Layers(baseLayers, overlays, options);\r\n};\r\n\n\n\n}(window, document));\n\n},{}],19:[function(require,module,exports){\nvar getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n\n},{\"./_getNative\":69,\"./_root\":101}],20:[function(require,module,exports){\nvar hashClear = require('./_hashClear'),\n    hashDelete = require('./_hashDelete'),\n    hashGet = require('./_hashGet'),\n    hashHas = require('./_hashHas'),\n    hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n  var index = -1,\n      length = entries ? entries.length : 0;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n\n},{\"./_hashClear\":73,\"./_hashDelete\":74,\"./_hashGet\":75,\"./_hashHas\":76,\"./_hashSet\":77}],21:[function(require,module,exports){\nvar listCacheClear = require('./_listCacheClear'),\n    listCacheDelete = require('./_listCacheDelete'),\n    listCacheGet = require('./_listCacheGet'),\n    listCacheHas = require('./_listCacheHas'),\n    listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n  var index = -1,\n      length = entries ? entries.length : 0;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n\n},{\"./_listCacheClear\":84,\"./_listCacheDelete\":85,\"./_listCacheGet\":86,\"./_listCacheHas\":87,\"./_listCacheSet\":88}],22:[function(require,module,exports){\nvar getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n\n},{\"./_getNative\":69,\"./_root\":101}],23:[function(require,module,exports){\nvar mapCacheClear = require('./_mapCacheClear'),\n    mapCacheDelete = require('./_mapCacheDelete'),\n    mapCacheGet = require('./_mapCacheGet'),\n    mapCacheHas = require('./_mapCacheHas'),\n    mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n  var index = -1,\n      length = entries ? entries.length : 0;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n\n},{\"./_mapCacheClear\":89,\"./_mapCacheDelete\":90,\"./_mapCacheGet\":91,\"./_mapCacheHas\":92,\"./_mapCacheSet\":93}],24:[function(require,module,exports){\nvar getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n\n},{\"./_getNative\":69,\"./_root\":101}],25:[function(require,module,exports){\nvar getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n\n},{\"./_getNative\":69,\"./_root\":101}],26:[function(require,module,exports){\nvar MapCache = require('./_MapCache'),\n    setCacheAdd = require('./_setCacheAdd'),\n    setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n  var index = -1,\n      length = values ? values.length : 0;\n\n  this.__data__ = new MapCache;\n  while (++index < length) {\n    this.add(values[index]);\n  }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n\n},{\"./_MapCache\":23,\"./_setCacheAdd\":102,\"./_setCacheHas\":103}],27:[function(require,module,exports){\nvar ListCache = require('./_ListCache'),\n    stackClear = require('./_stackClear'),\n    stackDelete = require('./_stackDelete'),\n    stackGet = require('./_stackGet'),\n    stackHas = require('./_stackHas'),\n    stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n  var data = this.__data__ = new ListCache(entries);\n  this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n\n},{\"./_ListCache\":21,\"./_stackClear\":105,\"./_stackDelete\":106,\"./_stackGet\":107,\"./_stackHas\":108,\"./_stackSet\":109}],28:[function(require,module,exports){\nvar root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n\n},{\"./_root\":101}],29:[function(require,module,exports){\nvar root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n\n},{\"./_root\":101}],30:[function(require,module,exports){\nvar getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n\n},{\"./_getNative\":69,\"./_root\":101}],31:[function(require,module,exports){\nvar baseTimes = require('./_baseTimes'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isIndex = require('./_isIndex');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n  // Safari 9 makes `arguments.length` enumerable in strict mode.\n  var result = (isArray(value) || isArguments(value))\n    ? baseTimes(value.length, String)\n    : [];\n\n  var length = result.length,\n      skipIndexes = !!length;\n\n  for (var key in value) {\n    if ((inherited || hasOwnProperty.call(value, key)) &&\n        !(skipIndexes && (key == 'length' || isIndex(key, length)))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayLikeKeys;\n\n},{\"./_baseTimes\":55,\"./_isIndex\":78,\"./isArguments\":117,\"./isArray\":118}],32:[function(require,module,exports){\n/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1,\n      length = array ? array.length : 0,\n      result = Array(length);\n\n  while (++index < length) {\n    result[index] = iteratee(array[index], index, array);\n  }\n  return result;\n}\n\nmodule.exports = arrayMap;\n\n},{}],33:[function(require,module,exports){\n/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n *  the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n  var index = -1,\n      length = array ? array.length : 0;\n\n  if (initAccum && length) {\n    accumulator = array[++index];\n  }\n  while (++index < length) {\n    accumulator = iteratee(accumulator, array[index], index, array);\n  }\n  return accumulator;\n}\n\nmodule.exports = arrayReduce;\n\n},{}],34:[function(require,module,exports){\n/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n *  else `false`.\n */\nfunction arraySome(array, predicate) {\n  var index = -1,\n      length = array ? array.length : 0;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nmodule.exports = arraySome;\n\n},{}],35:[function(require,module,exports){\nvar eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n  var length = array.length;\n  while (length--) {\n    if (eq(array[length][0], key)) {\n      return length;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = assocIndexOf;\n\n},{\"./eq\":113}],36:[function(require,module,exports){\nvar baseForOwn = require('./_baseForOwn'),\n    createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n\n},{\"./_baseForOwn\":38,\"./_createBaseEach\":61}],37:[function(require,module,exports){\nvar createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n\n},{\"./_createBaseFor\":62}],38:[function(require,module,exports){\nvar baseFor = require('./_baseFor'),\n    keys = require('./keys');\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n  return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n\n},{\"./_baseFor\":37,\"./keys\":127}],39:[function(require,module,exports){\nvar castPath = require('./_castPath'),\n    isKey = require('./_isKey'),\n    toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n  path = isKey(path, object) ? [path] : castPath(path);\n\n  var index = 0,\n      length = path.length;\n\n  while (object != null && index < length) {\n    object = object[toKey(path[index++])];\n  }\n  return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n\n},{\"./_castPath\":59,\"./_isKey\":79,\"./_toKey\":111}],40:[function(require,module,exports){\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/**\n * The base implementation of `getTag`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  return objectToString.call(value);\n}\n\nmodule.exports = baseGetTag;\n\n},{}],41:[function(require,module,exports){\n/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n  return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n\n},{}],42:[function(require,module,exports){\nvar baseIsEqualDeep = require('./_baseIsEqualDeep'),\n    isObject = require('./isObject'),\n    isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {boolean} [bitmask] The bitmask of comparison flags.\n *  The bitmask may be composed of the following flags:\n *     1 - Unordered comparison\n *     2 - Partial comparison\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, customizer, bitmask, stack) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, baseIsEqual, customizer, bitmask, stack);\n}\n\nmodule.exports = baseIsEqual;\n\n},{\"./_baseIsEqualDeep\":43,\"./isObject\":123,\"./isObjectLike\":124}],43:[function(require,module,exports){\nvar Stack = require('./_Stack'),\n    equalArrays = require('./_equalArrays'),\n    equalByTag = require('./_equalByTag'),\n    equalObjects = require('./_equalObjects'),\n    getTag = require('./_getTag'),\n    isArray = require('./isArray'),\n    isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for comparison styles. */\nvar PARTIAL_COMPARE_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {number} [bitmask] The bitmask of comparison flags. See `baseIsEqual`\n *  for more details.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, equalFunc, customizer, bitmask, stack) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = arrayTag,\n      othTag = arrayTag;\n\n  if (!objIsArr) {\n    objTag = getTag(object);\n    objTag = objTag == argsTag ? objectTag : objTag;\n  }\n  if (!othIsArr) {\n    othTag = getTag(other);\n    othTag = othTag == argsTag ? objectTag : othTag;\n  }\n  var objIsObj = objTag == objectTag,\n      othIsObj = othTag == objectTag,\n      isSameTag = objTag == othTag;\n\n  if (isSameTag && !objIsObj) {\n    stack || (stack = new Stack);\n    return (objIsArr || isTypedArray(object))\n      ? equalArrays(object, other, equalFunc, customizer, bitmask, stack)\n      : equalByTag(object, other, objTag, equalFunc, customizer, bitmask, stack);\n  }\n  if (!(bitmask & PARTIAL_COMPARE_FLAG)) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      var objUnwrapped = objIsWrapped ? object.value() : object,\n          othUnwrapped = othIsWrapped ? other.value() : other;\n\n      stack || (stack = new Stack);\n      return equalFunc(objUnwrapped, othUnwrapped, customizer, bitmask, stack);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  stack || (stack = new Stack);\n  return equalObjects(object, other, equalFunc, customizer, bitmask, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n\n},{\"./_Stack\":27,\"./_equalArrays\":63,\"./_equalByTag\":64,\"./_equalObjects\":65,\"./_getTag\":70,\"./isArray\":118,\"./isTypedArray\":126}],44:[function(require,module,exports){\nvar Stack = require('./_Stack'),\n    baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for comparison styles. */\nvar UNORDERED_COMPARE_FLAG = 1,\n    PARTIAL_COMPARE_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n  var index = matchData.length,\n      length = index,\n      noCustomizer = !customizer;\n\n  if (object == null) {\n    return !length;\n  }\n  object = Object(object);\n  while (index--) {\n    var data = matchData[index];\n    if ((noCustomizer && data[2])\n          ? data[1] !== object[data[0]]\n          : !(data[0] in object)\n        ) {\n      return false;\n    }\n  }\n  while (++index < length) {\n    data = matchData[index];\n    var key = data[0],\n        objValue = object[key],\n        srcValue = data[1];\n\n    if (noCustomizer && data[2]) {\n      if (objValue === undefined && !(key in object)) {\n        return false;\n      }\n    } else {\n      var stack = new Stack;\n      if (customizer) {\n        var result = customizer(objValue, srcValue, key, object, source, stack);\n      }\n      if (!(result === undefined\n            ? baseIsEqual(srcValue, objValue, customizer, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG, stack)\n            : result\n          )) {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\nmodule.exports = baseIsMatch;\n\n},{\"./_Stack\":27,\"./_baseIsEqual\":42}],45:[function(require,module,exports){\nvar isFunction = require('./isFunction'),\n    isMasked = require('./_isMasked'),\n    isObject = require('./isObject'),\n    toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n */\nfunction baseIsNative(value) {\n  if (!isObject(value) || isMasked(value)) {\n    return false;\n  }\n  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n\n},{\"./_isMasked\":81,\"./_toSource\":112,\"./isFunction\":121,\"./isObject\":123}],46:[function(require,module,exports){\nvar isLength = require('./isLength'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n  return isObjectLike(value) &&\n    isLength(value.length) && !!typedArrayTags[objectToString.call(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n\n},{\"./isLength\":122,\"./isObjectLike\":124}],47:[function(require,module,exports){\nvar baseMatches = require('./_baseMatches'),\n    baseMatchesProperty = require('./_baseMatchesProperty'),\n    identity = require('./identity'),\n    isArray = require('./isArray'),\n    property = require('./property');\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n  // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n  // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n  if (typeof value == 'function') {\n    return value;\n  }\n  if (value == null) {\n    return identity;\n  }\n  if (typeof value == 'object') {\n    return isArray(value)\n      ? baseMatchesProperty(value[0], value[1])\n      : baseMatches(value);\n  }\n  return property(value);\n}\n\nmodule.exports = baseIteratee;\n\n},{\"./_baseMatches\":50,\"./_baseMatchesProperty\":51,\"./identity\":116,\"./isArray\":118,\"./property\":130}],48:[function(require,module,exports){\nvar isPrototype = require('./_isPrototype'),\n    nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n  if (!isPrototype(object)) {\n    return nativeKeys(object);\n  }\n  var result = [];\n  for (var key in Object(object)) {\n    if (hasOwnProperty.call(object, key) && key != 'constructor') {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseKeys;\n\n},{\"./_isPrototype\":82,\"./_nativeKeys\":98}],49:[function(require,module,exports){\nvar baseEach = require('./_baseEach'),\n    isArrayLike = require('./isArrayLike');\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n  var index = -1,\n      result = isArrayLike(collection) ? Array(collection.length) : [];\n\n  baseEach(collection, function(value, key, collection) {\n    result[++index] = iteratee(value, key, collection);\n  });\n  return result;\n}\n\nmodule.exports = baseMap;\n\n},{\"./_baseEach\":36,\"./isArrayLike\":119}],50:[function(require,module,exports){\nvar baseIsMatch = require('./_baseIsMatch'),\n    getMatchData = require('./_getMatchData'),\n    matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n  var matchData = getMatchData(source);\n  if (matchData.length == 1 && matchData[0][2]) {\n    return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n  }\n  return function(object) {\n    return object === source || baseIsMatch(object, source, matchData);\n  };\n}\n\nmodule.exports = baseMatches;\n\n},{\"./_baseIsMatch\":44,\"./_getMatchData\":68,\"./_matchesStrictComparable\":95}],51:[function(require,module,exports){\nvar baseIsEqual = require('./_baseIsEqual'),\n    get = require('./get'),\n    hasIn = require('./hasIn'),\n    isKey = require('./_isKey'),\n    isStrictComparable = require('./_isStrictComparable'),\n    matchesStrictComparable = require('./_matchesStrictComparable'),\n    toKey = require('./_toKey');\n\n/** Used to compose bitmasks for comparison styles. */\nvar UNORDERED_COMPARE_FLAG = 1,\n    PARTIAL_COMPARE_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n  if (isKey(path) && isStrictComparable(srcValue)) {\n    return matchesStrictComparable(toKey(path), srcValue);\n  }\n  return function(object) {\n    var objValue = get(object, path);\n    return (objValue === undefined && objValue === srcValue)\n      ? hasIn(object, path)\n      : baseIsEqual(srcValue, objValue, undefined, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG);\n  };\n}\n\nmodule.exports = baseMatchesProperty;\n\n},{\"./_baseIsEqual\":42,\"./_isKey\":79,\"./_isStrictComparable\":83,\"./_matchesStrictComparable\":95,\"./_toKey\":111,\"./get\":114,\"./hasIn\":115}],52:[function(require,module,exports){\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n  return function(object) {\n    return object == null ? undefined : object[key];\n  };\n}\n\nmodule.exports = baseProperty;\n\n},{}],53:[function(require,module,exports){\nvar baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n  return function(object) {\n    return baseGet(object, path);\n  };\n}\n\nmodule.exports = basePropertyDeep;\n\n},{\"./_baseGet\":39}],54:[function(require,module,exports){\n/**\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initAccum Specify using the first or last element of\n *  `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\nfunction baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n  eachFunc(collection, function(value, index, collection) {\n    accumulator = initAccum\n      ? (initAccum = false, value)\n      : iteratee(accumulator, value, index, collection);\n  });\n  return accumulator;\n}\n\nmodule.exports = baseReduce;\n\n},{}],55:[function(require,module,exports){\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n  var index = -1,\n      result = Array(n);\n\n  while (++index < n) {\n    result[index] = iteratee(index);\n  }\n  return result;\n}\n\nmodule.exports = baseTimes;\n\n},{}],56:[function(require,module,exports){\nvar Symbol = require('./_Symbol'),\n    isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n  // Exit early for strings to avoid a performance hit in some environments.\n  if (typeof value == 'string') {\n    return value;\n  }\n  if (isSymbol(value)) {\n    return symbolToString ? symbolToString.call(value) : '';\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n\n},{\"./_Symbol\":28,\"./isSymbol\":125}],57:[function(require,module,exports){\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n  return function(value) {\n    return func(value);\n  };\n}\n\nmodule.exports = baseUnary;\n\n},{}],58:[function(require,module,exports){\n/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n  return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n\n},{}],59:[function(require,module,exports){\nvar isArray = require('./isArray'),\n    stringToPath = require('./_stringToPath');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value) {\n  return isArray(value) ? value : stringToPath(value);\n}\n\nmodule.exports = castPath;\n\n},{\"./_stringToPath\":110,\"./isArray\":118}],60:[function(require,module,exports){\nvar root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n\n},{\"./_root\":101}],61:[function(require,module,exports){\nvar isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n  return function(collection, iteratee) {\n    if (collection == null) {\n      return collection;\n    }\n    if (!isArrayLike(collection)) {\n      return eachFunc(collection, iteratee);\n    }\n    var length = collection.length,\n        index = fromRight ? length : -1,\n        iterable = Object(collection);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (iteratee(iterable[index], index, iterable) === false) {\n        break;\n      }\n    }\n    return collection;\n  };\n}\n\nmodule.exports = createBaseEach;\n\n},{\"./isArrayLike\":119}],62:[function(require,module,exports){\n/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n  return function(object, iteratee, keysFunc) {\n    var index = -1,\n        iterable = Object(object),\n        props = keysFunc(object),\n        length = props.length;\n\n    while (length--) {\n      var key = props[fromRight ? length : ++index];\n      if (iteratee(iterable[key], key, iterable) === false) {\n        break;\n      }\n    }\n    return object;\n  };\n}\n\nmodule.exports = createBaseFor;\n\n},{}],63:[function(require,module,exports){\nvar SetCache = require('./_SetCache'),\n    arraySome = require('./_arraySome'),\n    cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for comparison styles. */\nvar UNORDERED_COMPARE_FLAG = 1,\n    PARTIAL_COMPARE_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} customizer The function to customize comparisons.\n * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`\n *  for more details.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, equalFunc, customizer, bitmask, stack) {\n  var isPartial = bitmask & PARTIAL_COMPARE_FLAG,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n    return false;\n  }\n  // Assume cyclic values are equal.\n  var stacked = stack.get(array);\n  if (stacked && stack.get(other)) {\n    return stacked == other;\n  }\n  var index = -1,\n      result = true,\n      seen = (bitmask & UNORDERED_COMPARE_FLAG) ? new SetCache : undefined;\n\n  stack.set(array, other);\n  stack.set(other, array);\n\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, arrValue, index, other, array, stack)\n        : customizer(arrValue, othValue, index, array, other, stack);\n    }\n    if (compared !== undefined) {\n      if (compared) {\n        continue;\n      }\n      result = false;\n      break;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (seen) {\n      if (!arraySome(other, function(othValue, othIndex) {\n            if (!cacheHas(seen, othIndex) &&\n                (arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) {\n              return seen.push(othIndex);\n            }\n          })) {\n        result = false;\n        break;\n      }\n    } else if (!(\n          arrValue === othValue ||\n            equalFunc(arrValue, othValue, customizer, bitmask, stack)\n        )) {\n      result = false;\n      break;\n    }\n  }\n  stack['delete'](array);\n  stack['delete'](other);\n  return result;\n}\n\nmodule.exports = equalArrays;\n\n},{\"./_SetCache\":26,\"./_arraySome\":34,\"./_cacheHas\":58}],64:[function(require,module,exports){\nvar Symbol = require('./_Symbol'),\n    Uint8Array = require('./_Uint8Array'),\n    eq = require('./eq'),\n    equalArrays = require('./_equalArrays'),\n    mapToArray = require('./_mapToArray'),\n    setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for comparison styles. */\nvar UNORDERED_COMPARE_FLAG = 1,\n    PARTIAL_COMPARE_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} customizer The function to customize comparisons.\n * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`\n *  for more details.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) {\n  switch (tag) {\n    case dataViewTag:\n      if ((object.byteLength != other.byteLength) ||\n          (object.byteOffset != other.byteOffset)) {\n        return false;\n      }\n      object = object.buffer;\n      other = other.buffer;\n\n    case arrayBufferTag:\n      if ((object.byteLength != other.byteLength) ||\n          !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n        return false;\n      }\n      return true;\n\n    case boolTag:\n    case dateTag:\n    case numberTag:\n      // Coerce booleans to `1` or `0` and dates to milliseconds.\n      // Invalid dates are coerced to `NaN`.\n      return eq(+object, +other);\n\n    case errorTag:\n      return object.name == other.name && object.message == other.message;\n\n    case regexpTag:\n    case stringTag:\n      // Coerce regexes to strings and treat strings, primitives and objects,\n      // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n      // for more details.\n      return object == (other + '');\n\n    case mapTag:\n      var convert = mapToArray;\n\n    case setTag:\n      var isPartial = bitmask & PARTIAL_COMPARE_FLAG;\n      convert || (convert = setToArray);\n\n      if (object.size != other.size && !isPartial) {\n        return false;\n      }\n      // Assume cyclic values are equal.\n      var stacked = stack.get(object);\n      if (stacked) {\n        return stacked == other;\n      }\n      bitmask |= UNORDERED_COMPARE_FLAG;\n\n      // Recursively compare objects (susceptible to call stack limits).\n      stack.set(object, other);\n      var result = equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack);\n      stack['delete'](object);\n      return result;\n\n    case symbolTag:\n      if (symbolValueOf) {\n        return symbolValueOf.call(object) == symbolValueOf.call(other);\n      }\n  }\n  return false;\n}\n\nmodule.exports = equalByTag;\n\n},{\"./_Symbol\":28,\"./_Uint8Array\":29,\"./_equalArrays\":63,\"./_mapToArray\":94,\"./_setToArray\":104,\"./eq\":113}],65:[function(require,module,exports){\nvar keys = require('./keys');\n\n/** Used to compose bitmasks for comparison styles. */\nvar PARTIAL_COMPARE_FLAG = 2;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} customizer The function to customize comparisons.\n * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`\n *  for more details.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, equalFunc, customizer, bitmask, stack) {\n  var isPartial = bitmask & PARTIAL_COMPARE_FLAG,\n      objProps = keys(object),\n      objLength = objProps.length,\n      othProps = keys(other),\n      othLength = othProps.length;\n\n  if (objLength != othLength && !isPartial) {\n    return false;\n  }\n  var index = objLength;\n  while (index--) {\n    var key = objProps[index];\n    if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  // Assume cyclic values are equal.\n  var stacked = stack.get(object);\n  if (stacked && stack.get(other)) {\n    return stacked == other;\n  }\n  var result = true;\n  stack.set(object, other);\n  stack.set(other, object);\n\n  var skipCtor = isPartial;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, objValue, key, other, object, stack)\n        : customizer(objValue, othValue, key, object, other, stack);\n    }\n    // Recursively compare objects (susceptible to call stack limits).\n    if (!(compared === undefined\n          ? (objValue === othValue || equalFunc(objValue, othValue, customizer, bitmask, stack))\n          : compared\n        )) {\n      result = false;\n      break;\n    }\n    skipCtor || (skipCtor = key == 'constructor');\n  }\n  if (result && !skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    // Non `Object` object instances with different constructors are not equal.\n    if (objCtor != othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n          typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n      result = false;\n    }\n  }\n  stack['delete'](object);\n  stack['delete'](other);\n  return result;\n}\n\nmodule.exports = equalObjects;\n\n},{\"./keys\":127}],66:[function(require,module,exports){\n(function (global){\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{}],67:[function(require,module,exports){\nvar isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n  var data = map.__data__;\n  return isKeyable(key)\n    ? data[typeof key == 'string' ? 'string' : 'hash']\n    : data.map;\n}\n\nmodule.exports = getMapData;\n\n},{\"./_isKeyable\":80}],68:[function(require,module,exports){\nvar isStrictComparable = require('./_isStrictComparable'),\n    keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n  var result = keys(object),\n      length = result.length;\n\n  while (length--) {\n    var key = result[length],\n        value = object[key];\n\n    result[length] = [key, value, isStrictComparable(value)];\n  }\n  return result;\n}\n\nmodule.exports = getMatchData;\n\n},{\"./_isStrictComparable\":83,\"./keys\":127}],69:[function(require,module,exports){\nvar baseIsNative = require('./_baseIsNative'),\n    getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = getValue(object, key);\n  return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n\n},{\"./_baseIsNative\":45,\"./_getValue\":71}],70:[function(require,module,exports){\nvar DataView = require('./_DataView'),\n    Map = require('./_Map'),\n    Promise = require('./_Promise'),\n    Set = require('./_Set'),\n    WeakMap = require('./_WeakMap'),\n    baseGetTag = require('./_baseGetTag'),\n    toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n    objectTag = '[object Object]',\n    promiseTag = '[object Promise]',\n    setTag = '[object Set]',\n    weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n    mapCtorString = toSource(Map),\n    promiseCtorString = toSource(Promise),\n    setCtorString = toSource(Set),\n    weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n    (Map && getTag(new Map) != mapTag) ||\n    (Promise && getTag(Promise.resolve()) != promiseTag) ||\n    (Set && getTag(new Set) != setTag) ||\n    (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n  getTag = function(value) {\n    var result = objectToString.call(value),\n        Ctor = result == objectTag ? value.constructor : undefined,\n        ctorString = Ctor ? toSource(Ctor) : undefined;\n\n    if (ctorString) {\n      switch (ctorString) {\n        case dataViewCtorString: return dataViewTag;\n        case mapCtorString: return mapTag;\n        case promiseCtorString: return promiseTag;\n        case setCtorString: return setTag;\n        case weakMapCtorString: return weakMapTag;\n      }\n    }\n    return result;\n  };\n}\n\nmodule.exports = getTag;\n\n},{\"./_DataView\":19,\"./_Map\":22,\"./_Promise\":24,\"./_Set\":25,\"./_WeakMap\":30,\"./_baseGetTag\":40,\"./_toSource\":112}],71:[function(require,module,exports){\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n  return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n\n},{}],72:[function(require,module,exports){\nvar castPath = require('./_castPath'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isIndex = require('./_isIndex'),\n    isKey = require('./_isKey'),\n    isLength = require('./isLength'),\n    toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n  path = isKey(path, object) ? [path] : castPath(path);\n\n  var index = -1,\n      length = path.length,\n      result = false;\n\n  while (++index < length) {\n    var key = toKey(path[index]);\n    if (!(result = object != null && hasFunc(object, key))) {\n      break;\n    }\n    object = object[key];\n  }\n  if (result || ++index != length) {\n    return result;\n  }\n  length = object ? object.length : 0;\n  return !!length && isLength(length) && isIndex(key, length) &&\n    (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n\n},{\"./_castPath\":59,\"./_isIndex\":78,\"./_isKey\":79,\"./_toKey\":111,\"./isArguments\":117,\"./isArray\":118,\"./isLength\":122}],73:[function(require,module,exports){\nvar nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n  this.__data__ = nativeCreate ? nativeCreate(null) : {};\n  this.size = 0;\n}\n\nmodule.exports = hashClear;\n\n},{\"./_nativeCreate\":97}],74:[function(require,module,exports){\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n  var result = this.has(key) && delete this.__data__[key];\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = hashDelete;\n\n},{}],75:[function(require,module,exports){\nvar nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n  var data = this.__data__;\n  if (nativeCreate) {\n    var result = data[key];\n    return result === HASH_UNDEFINED ? undefined : result;\n  }\n  return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n\n},{\"./_nativeCreate\":97}],76:[function(require,module,exports){\nvar nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n  var data = this.__data__;\n  return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n\n},{\"./_nativeCreate\":97}],77:[function(require,module,exports){\nvar nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n  var data = this.__data__;\n  this.size += this.has(key) ? 0 : 1;\n  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n  return this;\n}\n\nmodule.exports = hashSet;\n\n},{\"./_nativeCreate\":97}],78:[function(require,module,exports){\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  length = length == null ? MAX_SAFE_INTEGER : length;\n  return !!length &&\n    (typeof value == 'number' || reIsUint.test(value)) &&\n    (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n\n},{}],79:[function(require,module,exports){\nvar isArray = require('./isArray'),\n    isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n    reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n  if (isArray(value)) {\n    return false;\n  }\n  var type = typeof value;\n  if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n      value == null || isSymbol(value)) {\n    return true;\n  }\n  return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n    (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n\n},{\"./isArray\":118,\"./isSymbol\":125}],80:[function(require,module,exports){\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n  var type = typeof value;\n  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n    ? (value !== '__proto__')\n    : (value === null);\n}\n\nmodule.exports = isKeyable;\n\n},{}],81:[function(require,module,exports){\nvar coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n  return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n  return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n\n},{\"./_coreJsData\":60}],82:[function(require,module,exports){\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n  var Ctor = value && value.constructor,\n      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n  return value === proto;\n}\n\nmodule.exports = isPrototype;\n\n},{}],83:[function(require,module,exports){\nvar isObject = require('./isObject');\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n *  equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n  return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n\n},{\"./isObject\":123}],84:[function(require,module,exports){\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n  this.__data__ = [];\n  this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n\n},{}],85:[function(require,module,exports){\nvar assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    return false;\n  }\n  var lastIndex = data.length - 1;\n  if (index == lastIndex) {\n    data.pop();\n  } else {\n    splice.call(data, index, 1);\n  }\n  --this.size;\n  return true;\n}\n\nmodule.exports = listCacheDelete;\n\n},{\"./_assocIndexOf\":35}],86:[function(require,module,exports){\nvar assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n\n},{\"./_assocIndexOf\":35}],87:[function(require,module,exports){\nvar assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n  return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n\n},{\"./_assocIndexOf\":35}],88:[function(require,module,exports){\nvar assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    ++this.size;\n    data.push([key, value]);\n  } else {\n    data[index][1] = value;\n  }\n  return this;\n}\n\nmodule.exports = listCacheSet;\n\n},{\"./_assocIndexOf\":35}],89:[function(require,module,exports){\nvar Hash = require('./_Hash'),\n    ListCache = require('./_ListCache'),\n    Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n  this.size = 0;\n  this.__data__ = {\n    'hash': new Hash,\n    'map': new (Map || ListCache),\n    'string': new Hash\n  };\n}\n\nmodule.exports = mapCacheClear;\n\n},{\"./_Hash\":20,\"./_ListCache\":21,\"./_Map\":22}],90:[function(require,module,exports){\nvar getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n  var result = getMapData(this, key)['delete'](key);\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = mapCacheDelete;\n\n},{\"./_getMapData\":67}],91:[function(require,module,exports){\nvar getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n  return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n\n},{\"./_getMapData\":67}],92:[function(require,module,exports){\nvar getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n  return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n\n},{\"./_getMapData\":67}],93:[function(require,module,exports){\nvar getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n  var data = getMapData(this, key),\n      size = data.size;\n\n  data.set(key, value);\n  this.size += data.size == size ? 0 : 1;\n  return this;\n}\n\nmodule.exports = mapCacheSet;\n\n},{\"./_getMapData\":67}],94:[function(require,module,exports){\n/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n  var index = -1,\n      result = Array(map.size);\n\n  map.forEach(function(value, key) {\n    result[++index] = [key, value];\n  });\n  return result;\n}\n\nmodule.exports = mapToArray;\n\n},{}],95:[function(require,module,exports){\n/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n  return function(object) {\n    if (object == null) {\n      return false;\n    }\n    return object[key] === srcValue &&\n      (srcValue !== undefined || (key in Object(object)));\n  };\n}\n\nmodule.exports = matchesStrictComparable;\n\n},{}],96:[function(require,module,exports){\nvar memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n  var result = memoize(func, function(key) {\n    if (cache.size === MAX_MEMOIZE_SIZE) {\n      cache.clear();\n    }\n    return key;\n  });\n\n  var cache = result.cache;\n  return result;\n}\n\nmodule.exports = memoizeCapped;\n\n},{\"./memoize\":129}],97:[function(require,module,exports){\nvar getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n\n},{\"./_getNative\":69}],98:[function(require,module,exports){\nvar overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n\n},{\"./_overArg\":100}],99:[function(require,module,exports){\nvar freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n  try {\n    return freeProcess && freeProcess.binding('util');\n  } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n\n},{\"./_freeGlobal\":66}],100:[function(require,module,exports){\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n  return function(arg) {\n    return func(transform(arg));\n  };\n}\n\nmodule.exports = overArg;\n\n},{}],101:[function(require,module,exports){\nvar freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n\n},{\"./_freeGlobal\":66}],102:[function(require,module,exports){\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n  this.__data__.set(value, HASH_UNDEFINED);\n  return this;\n}\n\nmodule.exports = setCacheAdd;\n\n},{}],103:[function(require,module,exports){\n/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n  return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n\n},{}],104:[function(require,module,exports){\n/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n  var index = -1,\n      result = Array(set.size);\n\n  set.forEach(function(value) {\n    result[++index] = value;\n  });\n  return result;\n}\n\nmodule.exports = setToArray;\n\n},{}],105:[function(require,module,exports){\nvar ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n  this.__data__ = new ListCache;\n  this.size = 0;\n}\n\nmodule.exports = stackClear;\n\n},{\"./_ListCache\":21}],106:[function(require,module,exports){\n/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n  var data = this.__data__,\n      result = data['delete'](key);\n\n  this.size = data.size;\n  return result;\n}\n\nmodule.exports = stackDelete;\n\n},{}],107:[function(require,module,exports){\n/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n  return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n\n},{}],108:[function(require,module,exports){\n/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n  return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n\n},{}],109:[function(require,module,exports){\nvar ListCache = require('./_ListCache'),\n    Map = require('./_Map'),\n    MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n  var data = this.__data__;\n  if (data instanceof ListCache) {\n    var pairs = data.__data__;\n    if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n      pairs.push([key, value]);\n      this.size = ++data.size;\n      return this;\n    }\n    data = this.__data__ = new MapCache(pairs);\n  }\n  data.set(key, value);\n  this.size = data.size;\n  return this;\n}\n\nmodule.exports = stackSet;\n\n},{\"./_ListCache\":21,\"./_Map\":22,\"./_MapCache\":23}],110:[function(require,module,exports){\nvar memoizeCapped = require('./_memoizeCapped'),\n    toString = require('./toString');\n\n/** Used to match property names within property paths. */\nvar reLeadingDot = /^\\./,\n    rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n  string = toString(string);\n\n  var result = [];\n  if (reLeadingDot.test(string)) {\n    result.push('');\n  }\n  string.replace(rePropName, function(match, number, quote, string) {\n    result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\n  });\n  return result;\n});\n\nmodule.exports = stringToPath;\n\n},{\"./_memoizeCapped\":96,\"./toString\":132}],111:[function(require,module,exports){\nvar isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n  if (typeof value == 'string' || isSymbol(value)) {\n    return value;\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n\n},{\"./isSymbol\":125}],112:[function(require,module,exports){\n/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to process.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\nmodule.exports = toSource;\n\n},{}],113:[function(require,module,exports){\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n  return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n\n},{}],114:[function(require,module,exports){\nvar baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n  var result = object == null ? undefined : baseGet(object, path);\n  return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n\n},{\"./_baseGet\":39}],115:[function(require,module,exports){\nvar baseHasIn = require('./_baseHasIn'),\n    hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n  return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n\n},{\"./_baseHasIn\":41,\"./_hasPath\":72}],116:[function(require,module,exports){\n/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n  return value;\n}\n\nmodule.exports = identity;\n\n},{}],117:[function(require,module,exports){\nvar isArrayLikeObject = require('./isArrayLikeObject');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n  return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n    (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\nmodule.exports = isArguments;\n\n},{\"./isArrayLikeObject\":120}],118:[function(require,module,exports){\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n\n},{}],119:[function(require,module,exports){\nvar isFunction = require('./isFunction'),\n    isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n\n},{\"./isFunction\":121,\"./isLength\":122}],120:[function(require,module,exports){\nvar isArrayLike = require('./isArrayLike'),\n    isObjectLike = require('./isObjectLike');\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n *  else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n  return isObjectLike(value) && isArrayLike(value);\n}\n\nmodule.exports = isArrayLikeObject;\n\n},{\"./isArrayLike\":119,\"./isObjectLike\":124}],121:[function(require,module,exports){\nvar isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 8-9 which returns 'object' for typed array and other constructors.\n  var tag = isObject(value) ? objectToString.call(value) : '';\n  return tag == funcTag || tag == genTag;\n}\n\nmodule.exports = isFunction;\n\n},{\"./isObject\":123}],122:[function(require,module,exports){\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n\n},{}],123:[function(require,module,exports){\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n\n},{}],124:[function(require,module,exports){\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n\n},{}],125:[function(require,module,exports){\nvar isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n\n},{\"./isObjectLike\":124}],126:[function(require,module,exports){\nvar baseIsTypedArray = require('./_baseIsTypedArray'),\n    baseUnary = require('./_baseUnary'),\n    nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n\n},{\"./_baseIsTypedArray\":46,\"./_baseUnary\":57,\"./_nodeUtil\":99}],127:[function(require,module,exports){\nvar arrayLikeKeys = require('./_arrayLikeKeys'),\n    baseKeys = require('./_baseKeys'),\n    isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n\n},{\"./_arrayLikeKeys\":31,\"./_baseKeys\":48,\"./isArrayLike\":119}],128:[function(require,module,exports){\nvar arrayMap = require('./_arrayMap'),\n    baseIteratee = require('./_baseIteratee'),\n    baseMap = require('./_baseMap'),\n    isArray = require('./isArray');\n\n/**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n *   return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n *   { 'user': 'barney' },\n *   { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee) {\n  var func = isArray(collection) ? arrayMap : baseMap;\n  return func(collection, baseIteratee(iteratee, 3));\n}\n\nmodule.exports = map;\n\n},{\"./_arrayMap\":32,\"./_baseIteratee\":47,\"./_baseMap\":49,\"./isArray\":118}],129:[function(require,module,exports){\nvar MapCache = require('./_MapCache');\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n  if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  var memoized = function() {\n    var args = arguments,\n        key = resolver ? resolver.apply(this, args) : args[0],\n        cache = memoized.cache;\n\n    if (cache.has(key)) {\n      return cache.get(key);\n    }\n    var result = func.apply(this, args);\n    memoized.cache = cache.set(key, result) || cache;\n    return result;\n  };\n  memoized.cache = new (memoize.Cache || MapCache);\n  return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n\n},{\"./_MapCache\":23}],130:[function(require,module,exports){\nvar baseProperty = require('./_baseProperty'),\n    basePropertyDeep = require('./_basePropertyDeep'),\n    isKey = require('./_isKey'),\n    toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n *   { 'a': { 'b': 2 } },\n *   { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n  return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n\n},{\"./_baseProperty\":52,\"./_basePropertyDeep\":53,\"./_isKey\":79,\"./_toKey\":111}],131:[function(require,module,exports){\nvar arrayReduce = require('./_arrayReduce'),\n    baseEach = require('./_baseEach'),\n    baseIteratee = require('./_baseIteratee'),\n    baseReduce = require('./_baseReduce'),\n    isArray = require('./isArray');\n\n/**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` thru `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not given, the first element of `collection` is used as the initial\n * value. The iteratee is invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n * and `sortBy`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduceRight\n * @example\n *\n * _.reduce([1, 2], function(sum, n) {\n *   return sum + n;\n * }, 0);\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n *   (result[value] || (result[value] = [])).push(key);\n *   return result;\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n */\nfunction reduce(collection, iteratee, accumulator) {\n  var func = isArray(collection) ? arrayReduce : baseReduce,\n      initAccum = arguments.length < 3;\n\n  return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n}\n\nmodule.exports = reduce;\n\n},{\"./_arrayReduce\":33,\"./_baseEach\":36,\"./_baseIteratee\":47,\"./_baseReduce\":54,\"./isArray\":118}],132:[function(require,module,exports){\nvar baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n  return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n\n},{\"./_baseToString\":56}],133:[function(require,module,exports){\n(function() {\n  var callWithJQuery;\n\n  callWithJQuery = function(pivotModule) {\n    if (typeof exports === \"object\" && typeof module === \"object\") {\n      return pivotModule((function(){try{return require('jquery')}catch(e){return window.jQuery}})(), (function(){try{return require('d3')}catch(e){return window.d3}})());\n    } else if (typeof define === \"function\" && define.amd) {\n      return define([\"jquery\", \"d3\"], pivotModule);\n    } else {\n      return pivotModule(jQuery, d3);\n    }\n  };\n\n  callWithJQuery(function($, d3) {\n    return $.pivotUtilities.d3_renderers = {\n      Treemap: function(pivotData, opts) {\n        var addToTree, color, defaults, height, i, len, ref, result, rowKey, tree, treemap, value, width;\n        defaults = {\n          localeStrings: {},\n          d3: {\n            width: function() {\n              return $(window).width() / 1.4;\n            },\n            height: function() {\n              return $(window).height() / 1.4;\n            }\n          }\n        };\n        opts = $.extend(defaults, opts);\n        result = $(\"<div>\").css({\n          width: \"100%\",\n          height: \"100%\"\n        });\n        tree = {\n          name: \"All\",\n          children: []\n        };\n        addToTree = function(tree, path, value) {\n          var child, i, len, newChild, ref, x;\n          if (path.length === 0) {\n            tree.value = value;\n            return;\n          }\n          if (tree.children == null) {\n            tree.children = [];\n          }\n          x = path.shift();\n          ref = tree.children;\n          for (i = 0, len = ref.length; i < len; i++) {\n            child = ref[i];\n            if (!(child.name === x)) {\n              continue;\n            }\n            addToTree(child, path, value);\n            return;\n          }\n          newChild = {\n            name: x\n          };\n          addToTree(newChild, path, value);\n          return tree.children.push(newChild);\n        };\n        ref = pivotData.getRowKeys();\n        for (i = 0, len = ref.length; i < len; i++) {\n          rowKey = ref[i];\n          value = pivotData.getAggregator(rowKey, []).value();\n          if (value != null) {\n            addToTree(tree, rowKey, value);\n          }\n        }\n        color = d3.scale.category10();\n        width = opts.d3.width();\n        height = opts.d3.height();\n        treemap = d3.layout.treemap().size([width, height]).sticky(true).value(function(d) {\n          return d.size;\n        });\n        d3.select(result[0]).append(\"div\").style(\"position\", \"relative\").style(\"width\", width + \"px\").style(\"height\", height + \"px\").datum(tree).selectAll(\".node\").data(treemap.padding([15, 0, 0, 0]).value(function(d) {\n          return d.value;\n        }).nodes).enter().append(\"div\").attr(\"class\", \"node\").style(\"background\", function(d) {\n          if (d.children != null) {\n            return \"lightgrey\";\n          } else {\n            return color(d.name);\n          }\n        }).text(function(d) {\n          return d.name;\n        }).call(function() {\n          this.style(\"left\", function(d) {\n            return d.x + \"px\";\n          }).style(\"top\", function(d) {\n            return d.y + \"px\";\n          }).style(\"width\", function(d) {\n            return Math.max(0, d.dx - 1) + \"px\";\n          }).style(\"height\", function(d) {\n            return Math.max(0, d.dy - 1) + \"px\";\n          });\n        });\n        return result;\n      }\n    };\n  });\n\n}).call(this);\n\n\n\n},{\"d3\":undefined,\"jquery\":undefined}],134:[function(require,module,exports){\n(function() {\n  var callWithJQuery;\n\n  callWithJQuery = function(pivotModule) {\n    if (typeof exports === \"object\" && typeof module === \"object\") {\n      return pivotModule((function(){try{return require('jquery')}catch(e){return window.jQuery}})());\n    } else if (typeof define === \"function\" && define.amd) {\n      return define([\"jquery\"], pivotModule);\n    } else {\n      return pivotModule(jQuery);\n    }\n  };\n\n  callWithJQuery(function($) {\n    var makeGoogleChart;\n    makeGoogleChart = function(chartType, extraOptions) {\n      return function(pivotData, opts) {\n        var agg, base, base1, colKey, colKeys, dataArray, dataTable, defaults, fullAggName, groupByTitle, h, hAxisTitle, headers, i, j, len, len1, numCharsInHAxis, options, ref, result, row, rowKey, rowKeys, title, tree2, vAxisTitle, val, wrapper, x, y;\n        defaults = {\n          localeStrings: {\n            vs: \"vs\",\n            by: \"by\"\n          },\n          gchart: {}\n        };\n        opts = $.extend(true, defaults, opts);\n        if ((base = opts.gchart).width == null) {\n          base.width = window.innerWidth / 1.4;\n        }\n        if ((base1 = opts.gchart).height == null) {\n          base1.height = window.innerHeight / 1.4;\n        }\n        rowKeys = pivotData.getRowKeys();\n        if (rowKeys.length === 0) {\n          rowKeys.push([]);\n        }\n        colKeys = pivotData.getColKeys();\n        if (colKeys.length === 0) {\n          colKeys.push([]);\n        }\n        fullAggName = pivotData.aggregatorName;\n        if (pivotData.valAttrs.length) {\n          fullAggName += \"(\" + (pivotData.valAttrs.join(\", \")) + \")\";\n        }\n        headers = (function() {\n          var i, len, results;\n          results = [];\n          for (i = 0, len = rowKeys.length; i < len; i++) {\n            h = rowKeys[i];\n            results.push(h.join(\"-\"));\n          }\n          return results;\n        })();\n        headers.unshift(\"\");\n        numCharsInHAxis = 0;\n        if (chartType === \"ScatterChart\") {\n          dataArray = [];\n          ref = pivotData.tree;\n          for (y in ref) {\n            tree2 = ref[y];\n            for (x in tree2) {\n              agg = tree2[x];\n              dataArray.push([parseFloat(x), parseFloat(y), fullAggName + \": \\n\" + agg.format(agg.value())]);\n            }\n          }\n          dataTable = new google.visualization.DataTable();\n          dataTable.addColumn('number', pivotData.colAttrs.join(\"-\"));\n          dataTable.addColumn('number', pivotData.rowAttrs.join(\"-\"));\n          dataTable.addColumn({\n            type: \"string\",\n            role: \"tooltip\"\n          });\n          dataTable.addRows(dataArray);\n          hAxisTitle = pivotData.colAttrs.join(\"-\");\n          vAxisTitle = pivotData.rowAttrs.join(\"-\");\n          title = \"\";\n        } else {\n          dataArray = [headers];\n          for (i = 0, len = colKeys.length; i < len; i++) {\n            colKey = colKeys[i];\n            row = [colKey.join(\"-\")];\n            numCharsInHAxis += row[0].length;\n            for (j = 0, len1 = rowKeys.length; j < len1; j++) {\n              rowKey = rowKeys[j];\n              agg = pivotData.getAggregator(rowKey, colKey);\n              if (agg.value() != null) {\n                val = agg.value();\n                if ($.isNumeric(val)) {\n                  if (val < 1) {\n                    row.push(parseFloat(val.toPrecision(3)));\n                  } else {\n                    row.push(parseFloat(val.toFixed(3)));\n                  }\n                } else {\n                  row.push(val);\n                }\n              } else {\n                row.push(null);\n              }\n            }\n            dataArray.push(row);\n          }\n          dataTable = google.visualization.arrayToDataTable(dataArray);\n          title = vAxisTitle = fullAggName;\n          hAxisTitle = pivotData.colAttrs.join(\"-\");\n          if (hAxisTitle !== \"\") {\n            title += \" \" + opts.localeStrings.vs + \" \" + hAxisTitle;\n          }\n          groupByTitle = pivotData.rowAttrs.join(\"-\");\n          if (groupByTitle !== \"\") {\n            title += \" \" + opts.localeStrings.by + \" \" + groupByTitle;\n          }\n        }\n        options = {\n          title: title,\n          hAxis: {\n            title: hAxisTitle,\n            slantedText: numCharsInHAxis > 50\n          },\n          vAxis: {\n            title: vAxisTitle\n          },\n          tooltip: {\n            textStyle: {\n              fontName: 'Arial',\n              fontSize: 12\n            }\n          }\n        };\n        if (chartType === \"ColumnChart\") {\n          options.vAxis.minValue = 0;\n        }\n        if (chartType === \"ScatterChart\") {\n          options.legend = {\n            position: \"none\"\n          };\n          options.chartArea = {\n            'width': '80%',\n            'height': '80%'\n          };\n        } else if (dataArray[0].length === 2 && dataArray[0][1] === \"\") {\n          options.legend = {\n            position: \"none\"\n          };\n        }\n        $.extend(options, opts.gchart, extraOptions);\n        result = $(\"<div>\").css({\n          width: \"100%\",\n          height: \"100%\"\n        });\n        wrapper = new google.visualization.ChartWrapper({\n          dataTable: dataTable,\n          chartType: chartType,\n          options: options\n        });\n        wrapper.draw(result[0]);\n        result.bind(\"dblclick\", function() {\n          var editor;\n          editor = new google.visualization.ChartEditor();\n          google.visualization.events.addListener(editor, 'ok', function() {\n            return editor.getChartWrapper().draw(result[0]);\n          });\n          return editor.openDialog(wrapper);\n        });\n        return result;\n      };\n    };\n    return $.pivotUtilities.gchart_renderers = {\n      \"Line Chart\": makeGoogleChart(\"LineChart\"),\n      \"Bar Chart\": makeGoogleChart(\"ColumnChart\"),\n      \"Stacked Bar Chart\": makeGoogleChart(\"ColumnChart\", {\n        isStacked: true\n      }),\n      \"Area Chart\": makeGoogleChart(\"AreaChart\", {\n        isStacked: true\n      }),\n      \"Scatter Chart\": makeGoogleChart(\"ScatterChart\")\n    };\n  });\n\n}).call(this);\n\n\n\n},{\"jquery\":undefined}],135:[function(require,module,exports){\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.proj4 = factory());\n}(this, (function () { 'use strict';\n\n\tvar globals = function(defs) {\n\t  defs('EPSG:4326', \"+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees\");\n\t  defs('EPSG:4269', \"+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees\");\n\t  defs('EPSG:3857', \"+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs\");\n\n\t  defs.WGS84 = defs['EPSG:4326'];\n\t  defs['EPSG:3785'] = defs['EPSG:3857']; // maintain backward compat, official code is 3857\n\t  defs.GOOGLE = defs['EPSG:3857'];\n\t  defs['EPSG:900913'] = defs['EPSG:3857'];\n\t  defs['EPSG:102113'] = defs['EPSG:3857'];\n\t};\n\n\tvar PJD_3PARAM = 1;\n\tvar PJD_7PARAM = 2;\n\tvar PJD_WGS84 = 4; // WGS84 or equivalent\n\tvar PJD_NODATUM = 5; // WGS84 or equivalent\n\tvar SEC_TO_RAD = 4.84813681109535993589914102357e-6;\n\tvar HALF_PI = Math.PI/2;\n\t// ellipoid pj_set_ell.c\n\tvar SIXTH = 0.1666666666666666667;\n\t/* 1/6 */\n\tvar RA4 = 0.04722222222222222222;\n\t/* 17/360 */\n\tvar RA6 = 0.02215608465608465608;\n\tvar EPSLN = (typeof Number.EPSILON === 'undefined') ? 1.0e-10 : Number.EPSILON;\n\tvar D2R = 0.01745329251994329577;\n\tvar R2D = 57.29577951308232088;\n\tvar FORTPI = Math.PI/4;\n\tvar TWO_PI = Math.PI * 2;\n\t// SPI is slightly greater than Math.PI, so values that exceed the -180..180\n\t// degree range by a tiny amount don't get wrapped. This prevents points that\n\t// have drifted from their original location along the 180th meridian (due to\n\t// floating point error) from changing their sign.\n\tvar SPI = 3.14159265359;\n\n\tvar exports$1 = {};\n\texports$1.greenwich = 0.0; //\"0dE\",\n\texports$1.lisbon = -9.131906111111; //\"9d07'54.862\\\"W\",\n\texports$1.paris = 2.337229166667; //\"2d20'14.025\\\"E\",\n\texports$1.bogota = -74.080916666667; //\"74d04'51.3\\\"W\",\n\texports$1.madrid = -3.687938888889; //\"3d41'16.58\\\"W\",\n\texports$1.rome = 12.452333333333; //\"12d27'8.4\\\"E\",\n\texports$1.bern = 7.439583333333; //\"7d26'22.5\\\"E\",\n\texports$1.jakarta = 106.807719444444; //\"106d48'27.79\\\"E\",\n\texports$1.ferro = -17.666666666667; //\"17d40'W\",\n\texports$1.brussels = 4.367975; //\"4d22'4.71\\\"E\",\n\texports$1.stockholm = 18.058277777778; //\"18d3'29.8\\\"E\",\n\texports$1.athens = 23.7163375; //\"23d42'58.815\\\"E\",\n\texports$1.oslo = 10.722916666667; //\"10d43'22.5\\\"E\"\n\n\tvar units = {\n\t  ft: {to_meter: 0.3048},\n\t  'us-ft': {to_meter: 1200 / 3937}\n\t};\n\n\tvar ignoredChar = /[\\s_\\-\\/\\(\\)]/g;\n\tfunction match(obj, key) {\n\t  if (obj[key]) {\n\t    return obj[key];\n\t  }\n\t  var keys = Object.keys(obj);\n\t  var lkey = key.toLowerCase().replace(ignoredChar, '');\n\t  var i = -1;\n\t  var testkey, processedKey;\n\t  while (++i < keys.length) {\n\t    testkey = keys[i];\n\t    processedKey = testkey.toLowerCase().replace(ignoredChar, '');\n\t    if (processedKey === lkey) {\n\t      return obj[testkey];\n\t    }\n\t  }\n\t}\n\n\tvar parseProj = function(defData) {\n\t  var self = {};\n\t  var paramObj = defData.split('+').map(function(v) {\n\t    return v.trim();\n\t  }).filter(function(a) {\n\t    return a;\n\t  }).reduce(function(p, a) {\n\t    var split = a.split('=');\n\t    split.push(true);\n\t    p[split[0].toLowerCase()] = split[1];\n\t    return p;\n\t  }, {});\n\t  var paramName, paramVal, paramOutname;\n\t  var params = {\n\t    proj: 'projName',\n\t    datum: 'datumCode',\n\t    rf: function(v) {\n\t      self.rf = parseFloat(v);\n\t    },\n\t    lat_0: function(v) {\n\t      self.lat0 = v * D2R;\n\t    },\n\t    lat_1: function(v) {\n\t      self.lat1 = v * D2R;\n\t    },\n\t    lat_2: function(v) {\n\t      self.lat2 = v * D2R;\n\t    },\n\t    lat_ts: function(v) {\n\t      self.lat_ts = v * D2R;\n\t    },\n\t    lon_0: function(v) {\n\t      self.long0 = v * D2R;\n\t    },\n\t    lon_1: function(v) {\n\t      self.long1 = v * D2R;\n\t    },\n\t    lon_2: function(v) {\n\t      self.long2 = v * D2R;\n\t    },\n\t    alpha: function(v) {\n\t      self.alpha = parseFloat(v) * D2R;\n\t    },\n\t    lonc: function(v) {\n\t      self.longc = v * D2R;\n\t    },\n\t    x_0: function(v) {\n\t      self.x0 = parseFloat(v);\n\t    },\n\t    y_0: function(v) {\n\t      self.y0 = parseFloat(v);\n\t    },\n\t    k_0: function(v) {\n\t      self.k0 = parseFloat(v);\n\t    },\n\t    k: function(v) {\n\t      self.k0 = parseFloat(v);\n\t    },\n\t    a: function(v) {\n\t      self.a = parseFloat(v);\n\t    },\n\t    b: function(v) {\n\t      self.b = parseFloat(v);\n\t    },\n\t    r_a: function() {\n\t      self.R_A = true;\n\t    },\n\t    zone: function(v) {\n\t      self.zone = parseInt(v, 10);\n\t    },\n\t    south: function() {\n\t      self.utmSouth = true;\n\t    },\n\t    towgs84: function(v) {\n\t      self.datum_params = v.split(\",\").map(function(a) {\n\t        return parseFloat(a);\n\t      });\n\t    },\n\t    to_meter: function(v) {\n\t      self.to_meter = parseFloat(v);\n\t    },\n\t    units: function(v) {\n\t      self.units = v;\n\t      var unit = match(units, v);\n\t      if (unit) {\n\t        self.to_meter = unit.to_meter;\n\t      }\n\t    },\n\t    from_greenwich: function(v) {\n\t      self.from_greenwich = v * D2R;\n\t    },\n\t    pm: function(v) {\n\t      var pm = match(exports$1, v);\n\t      self.from_greenwich = (pm ? pm : parseFloat(v)) * D2R;\n\t    },\n\t    nadgrids: function(v) {\n\t      if (v === '@null') {\n\t        self.datumCode = 'none';\n\t      }\n\t      else {\n\t        self.nadgrids = v;\n\t      }\n\t    },\n\t    axis: function(v) {\n\t      var legalAxis = \"ewnsud\";\n\t      if (v.length === 3 && legalAxis.indexOf(v.substr(0, 1)) !== -1 && legalAxis.indexOf(v.substr(1, 1)) !== -1 && legalAxis.indexOf(v.substr(2, 1)) !== -1) {\n\t        self.axis = v;\n\t      }\n\t    }\n\t  };\n\t  for (paramName in paramObj) {\n\t    paramVal = paramObj[paramName];\n\t    if (paramName in params) {\n\t      paramOutname = params[paramName];\n\t      if (typeof paramOutname === 'function') {\n\t        paramOutname(paramVal);\n\t      }\n\t      else {\n\t        self[paramOutname] = paramVal;\n\t      }\n\t    }\n\t    else {\n\t      self[paramName] = paramVal;\n\t    }\n\t  }\n\t  if(typeof self.datumCode === 'string' && self.datumCode !== \"WGS84\"){\n\t    self.datumCode = self.datumCode.toLowerCase();\n\t  }\n\t  return self;\n\t};\n\n\tvar NEUTRAL = 1;\n\tvar KEYWORD = 2;\n\tvar NUMBER = 3;\n\tvar QUOTED = 4;\n\tvar AFTERQUOTE = 5;\n\tvar ENDED = -1;\n\tvar whitespace = /\\s/;\n\tvar latin = /[A-Za-z]/;\n\tvar keyword = /[A-Za-z84]/;\n\tvar endThings = /[,\\]]/;\n\tvar digets = /[\\d\\.E\\-\\+]/;\n\t// const ignoredChar = /[\\s_\\-\\/\\(\\)]/g;\n\tfunction Parser(text) {\n\t  if (typeof text !== 'string') {\n\t    throw new Error('not a string');\n\t  }\n\t  this.text = text.trim();\n\t  this.level = 0;\n\t  this.place = 0;\n\t  this.root = null;\n\t  this.stack = [];\n\t  this.currentObject = null;\n\t  this.state = NEUTRAL;\n\t}\n\tParser.prototype.readCharicter = function() {\n\t  var char = this.text[this.place++];\n\t  if (this.state !== QUOTED) {\n\t    while (whitespace.test(char)) {\n\t      if (this.place >= this.text.length) {\n\t        return;\n\t      }\n\t      char = this.text[this.place++];\n\t    }\n\t  }\n\t  switch (this.state) {\n\t    case NEUTRAL:\n\t      return this.neutral(char);\n\t    case KEYWORD:\n\t      return this.keyword(char)\n\t    case QUOTED:\n\t      return this.quoted(char);\n\t    case AFTERQUOTE:\n\t      return this.afterquote(char);\n\t    case NUMBER:\n\t      return this.number(char);\n\t    case ENDED:\n\t      return;\n\t  }\n\t};\n\tParser.prototype.afterquote = function(char) {\n\t  if (char === '\"') {\n\t    this.word += '\"';\n\t    this.state = QUOTED;\n\t    return;\n\t  }\n\t  if (endThings.test(char)) {\n\t    this.word = this.word.trim();\n\t    this.afterItem(char);\n\t    return;\n\t  }\n\t  throw new Error('havn\\'t handled \"' +char + '\" in afterquote yet, index ' + this.place);\n\t};\n\tParser.prototype.afterItem = function(char) {\n\t  if (char === ',') {\n\t    if (this.word !== null) {\n\t      this.currentObject.push(this.word);\n\t    }\n\t    this.word = null;\n\t    this.state = NEUTRAL;\n\t    return;\n\t  }\n\t  if (char === ']') {\n\t    this.level--;\n\t    if (this.word !== null) {\n\t      this.currentObject.push(this.word);\n\t      this.word = null;\n\t    }\n\t    this.state = NEUTRAL;\n\t    this.currentObject = this.stack.pop();\n\t    if (!this.currentObject) {\n\t      this.state = ENDED;\n\t    }\n\n\t    return;\n\t  }\n\t};\n\tParser.prototype.number = function(char) {\n\t  if (digets.test(char)) {\n\t    this.word += char;\n\t    return;\n\t  }\n\t  if (endThings.test(char)) {\n\t    this.word = parseFloat(this.word);\n\t    this.afterItem(char);\n\t    return;\n\t  }\n\t  throw new Error('havn\\'t handled \"' +char + '\" in number yet, index ' + this.place);\n\t};\n\tParser.prototype.quoted = function(char) {\n\t  if (char === '\"') {\n\t    this.state = AFTERQUOTE;\n\t    return;\n\t  }\n\t  this.word += char;\n\t  return;\n\t};\n\tParser.prototype.keyword = function(char) {\n\t  if (keyword.test(char)) {\n\t    this.word += char;\n\t    return;\n\t  }\n\t  if (char === '[') {\n\t    var newObjects = [];\n\t    newObjects.push(this.word);\n\t    this.level++;\n\t    if (this.root === null) {\n\t      this.root = newObjects;\n\t    } else {\n\t      this.currentObject.push(newObjects);\n\t    }\n\t    this.stack.push(this.currentObject);\n\t    this.currentObject = newObjects;\n\t    this.state = NEUTRAL;\n\t    return;\n\t  }\n\t  if (endThings.test(char)) {\n\t    this.afterItem(char);\n\t    return;\n\t  }\n\t  throw new Error('havn\\'t handled \"' +char + '\" in keyword yet, index ' + this.place);\n\t};\n\tParser.prototype.neutral = function(char) {\n\t  if (latin.test(char)) {\n\t    this.word = char;\n\t    this.state = KEYWORD;\n\t    return;\n\t  }\n\t  if (char === '\"') {\n\t    this.word = '';\n\t    this.state = QUOTED;\n\t    return;\n\t  }\n\t  if (digets.test(char)) {\n\t    this.word = char;\n\t    this.state = NUMBER;\n\t    return;\n\t  }\n\t  if (endThings.test(char)) {\n\t    this.afterItem(char);\n\t    return;\n\t  }\n\t  throw new Error('havn\\'t handled \"' +char + '\" in neutral yet, index ' + this.place);\n\t};\n\tParser.prototype.output = function() {\n\t  while (this.place < this.text.length) {\n\t    this.readCharicter();\n\t  }\n\t  if (this.state === ENDED) {\n\t    return this.root;\n\t  }\n\t  throw new Error('unable to parse string \"' +this.text + '\". State is ' + this.state);\n\t};\n\n\tfunction parseString(txt) {\n\t  var parser = new Parser(txt);\n\t  return parser.output();\n\t}\n\n\tfunction mapit(obj, key, value) {\n\t  if (Array.isArray(key)) {\n\t    value.unshift(key);\n\t    key = null;\n\t  }\n\t  var thing = key ? {} : obj;\n\n\t  var out = value.reduce(function(newObj, item) {\n\t    sExpr(item, newObj);\n\t    return newObj\n\t  }, thing);\n\t  if (key) {\n\t    obj[key] = out;\n\t  }\n\t}\n\n\tfunction sExpr(v, obj) {\n\t  if (!Array.isArray(v)) {\n\t    obj[v] = true;\n\t    return;\n\t  }\n\t  var key = v.shift();\n\t  if (key === 'PARAMETER') {\n\t    key = v.shift();\n\t  }\n\t  if (v.length === 1) {\n\t    if (Array.isArray(v[0])) {\n\t      obj[key] = {};\n\t      sExpr(v[0], obj[key]);\n\t      return;\n\t    }\n\t    obj[key] = v[0];\n\t    return;\n\t  }\n\t  if (!v.length) {\n\t    obj[key] = true;\n\t    return;\n\t  }\n\t  if (key === 'TOWGS84') {\n\t    obj[key] = v;\n\t    return;\n\t  }\n\t  if (!Array.isArray(key)) {\n\t    obj[key] = {};\n\t  }\n\n\t  var i;\n\t  switch (key) {\n\t    case 'UNIT':\n\t    case 'PRIMEM':\n\t    case 'VERT_DATUM':\n\t      obj[key] = {\n\t        name: v[0].toLowerCase(),\n\t        convert: v[1]\n\t      };\n\t      if (v.length === 3) {\n\t        sExpr(v[2], obj[key]);\n\t      }\n\t      return;\n\t    case 'SPHEROID':\n\t    case 'ELLIPSOID':\n\t      obj[key] = {\n\t        name: v[0],\n\t        a: v[1],\n\t        rf: v[2]\n\t      };\n\t      if (v.length === 4) {\n\t        sExpr(v[3], obj[key]);\n\t      }\n\t      return;\n\t    case 'PROJECTEDCRS':\n\t    case 'PROJCRS':\n\t    case 'GEOGCS':\n\t    case 'GEOCCS':\n\t    case 'PROJCS':\n\t    case 'LOCAL_CS':\n\t    case 'GEODCRS':\n\t    case 'GEODETICCRS':\n\t    case 'GEODETICDATUM':\n\t    case 'EDATUM':\n\t    case 'ENGINEERINGDATUM':\n\t    case 'VERT_CS':\n\t    case 'VERTCRS':\n\t    case 'VERTICALCRS':\n\t    case 'COMPD_CS':\n\t    case 'COMPOUNDCRS':\n\t    case 'ENGINEERINGCRS':\n\t    case 'ENGCRS':\n\t    case 'FITTED_CS':\n\t    case 'LOCAL_DATUM':\n\t    case 'DATUM':\n\t      v[0] = ['name', v[0]];\n\t      mapit(obj, key, v);\n\t      return;\n\t    default:\n\t      i = -1;\n\t      while (++i < v.length) {\n\t        if (!Array.isArray(v[i])) {\n\t          return sExpr(v, obj[key]);\n\t        }\n\t      }\n\t      return mapit(obj, key, v);\n\t  }\n\t}\n\n\tvar D2R$1 = 0.01745329251994329577;\n\tfunction rename(obj, params) {\n\t  var outName = params[0];\n\t  var inName = params[1];\n\t  if (!(outName in obj) && (inName in obj)) {\n\t    obj[outName] = obj[inName];\n\t    if (params.length === 3) {\n\t      obj[outName] = params[2](obj[outName]);\n\t    }\n\t  }\n\t}\n\n\tfunction d2r(input) {\n\t  return input * D2R$1;\n\t}\n\n\tfunction cleanWKT(wkt) {\n\t  if (wkt.type === 'GEOGCS') {\n\t    wkt.projName = 'longlat';\n\t  } else if (wkt.type === 'LOCAL_CS') {\n\t    wkt.projName = 'identity';\n\t    wkt.local = true;\n\t  } else {\n\t    if (typeof wkt.PROJECTION === 'object') {\n\t      wkt.projName = Object.keys(wkt.PROJECTION)[0];\n\t    } else {\n\t      wkt.projName = wkt.PROJECTION;\n\t    }\n\t  }\n\t  if (wkt.UNIT) {\n\t    wkt.units = wkt.UNIT.name.toLowerCase();\n\t    if (wkt.units === 'metre') {\n\t      wkt.units = 'meter';\n\t    }\n\t    if (wkt.UNIT.convert) {\n\t      if (wkt.type === 'GEOGCS') {\n\t        if (wkt.DATUM && wkt.DATUM.SPHEROID) {\n\t          wkt.to_meter = wkt.UNIT.convert*wkt.DATUM.SPHEROID.a;\n\t        }\n\t      } else {\n\t        wkt.to_meter = wkt.UNIT.convert, 10;\n\t      }\n\t    }\n\t  }\n\t  var geogcs = wkt.GEOGCS;\n\t  if (wkt.type === 'GEOGCS') {\n\t    geogcs = wkt;\n\t  }\n\t  if (geogcs) {\n\t    //if(wkt.GEOGCS.PRIMEM&&wkt.GEOGCS.PRIMEM.convert){\n\t    //  wkt.from_greenwich=wkt.GEOGCS.PRIMEM.convert*D2R;\n\t    //}\n\t    if (geogcs.DATUM) {\n\t      wkt.datumCode = geogcs.DATUM.name.toLowerCase();\n\t    } else {\n\t      wkt.datumCode = geogcs.name.toLowerCase();\n\t    }\n\t    if (wkt.datumCode.slice(0, 2) === 'd_') {\n\t      wkt.datumCode = wkt.datumCode.slice(2);\n\t    }\n\t    if (wkt.datumCode === 'new_zealand_geodetic_datum_1949' || wkt.datumCode === 'new_zealand_1949') {\n\t      wkt.datumCode = 'nzgd49';\n\t    }\n\t    if (wkt.datumCode === 'wgs_1984') {\n\t      if (wkt.PROJECTION === 'Mercator_Auxiliary_Sphere') {\n\t        wkt.sphere = true;\n\t      }\n\t      wkt.datumCode = 'wgs84';\n\t    }\n\t    if (wkt.datumCode.slice(-6) === '_ferro') {\n\t      wkt.datumCode = wkt.datumCode.slice(0, - 6);\n\t    }\n\t    if (wkt.datumCode.slice(-8) === '_jakarta') {\n\t      wkt.datumCode = wkt.datumCode.slice(0, - 8);\n\t    }\n\t    if (~wkt.datumCode.indexOf('belge')) {\n\t      wkt.datumCode = 'rnb72';\n\t    }\n\t    if (geogcs.DATUM && geogcs.DATUM.SPHEROID) {\n\t      wkt.ellps = geogcs.DATUM.SPHEROID.name.replace('_19', '').replace(/[Cc]larke\\_18/, 'clrk');\n\t      if (wkt.ellps.toLowerCase().slice(0, 13) === 'international') {\n\t        wkt.ellps = 'intl';\n\t      }\n\n\t      wkt.a = geogcs.DATUM.SPHEROID.a;\n\t      wkt.rf = parseFloat(geogcs.DATUM.SPHEROID.rf, 10);\n\t    }\n\t    if (~wkt.datumCode.indexOf('osgb_1936')) {\n\t      wkt.datumCode = 'osgb36';\n\t    }\n\t  }\n\t  if (wkt.b && !isFinite(wkt.b)) {\n\t    wkt.b = wkt.a;\n\t  }\n\n\t  function toMeter(input) {\n\t    var ratio = wkt.to_meter || 1;\n\t    return input * ratio;\n\t  }\n\t  var renamer = function(a) {\n\t    return rename(wkt, a);\n\t  };\n\t  var list = [\n\t    ['standard_parallel_1', 'Standard_Parallel_1'],\n\t    ['standard_parallel_2', 'Standard_Parallel_2'],\n\t    ['false_easting', 'False_Easting'],\n\t    ['false_northing', 'False_Northing'],\n\t    ['central_meridian', 'Central_Meridian'],\n\t    ['latitude_of_origin', 'Latitude_Of_Origin'],\n\t    ['latitude_of_origin', 'Central_Parallel'],\n\t    ['scale_factor', 'Scale_Factor'],\n\t    ['k0', 'scale_factor'],\n\t    ['latitude_of_center', 'Latitude_of_center'],\n\t    ['lat0', 'latitude_of_center', d2r],\n\t    ['longitude_of_center', 'Longitude_Of_Center'],\n\t    ['longc', 'longitude_of_center', d2r],\n\t    ['x0', 'false_easting', toMeter],\n\t    ['y0', 'false_northing', toMeter],\n\t    ['long0', 'central_meridian', d2r],\n\t    ['lat0', 'latitude_of_origin', d2r],\n\t    ['lat0', 'standard_parallel_1', d2r],\n\t    ['lat1', 'standard_parallel_1', d2r],\n\t    ['lat2', 'standard_parallel_2', d2r],\n\t    ['alpha', 'azimuth', d2r],\n\t    ['srsCode', 'name']\n\t  ];\n\t  list.forEach(renamer);\n\t  if (!wkt.long0 && wkt.longc && (wkt.projName === 'Albers_Conic_Equal_Area' || wkt.projName === 'Lambert_Azimuthal_Equal_Area')) {\n\t    wkt.long0 = wkt.longc;\n\t  }\n\t  if (!wkt.lat_ts && wkt.lat1 && (wkt.projName === 'Stereographic_South_Pole' || wkt.projName === 'Polar Stereographic (variant B)')) {\n\t    wkt.lat0 = d2r(wkt.lat1 > 0 ? 90 : -90);\n\t    wkt.lat_ts = wkt.lat1;\n\t  }\n\t}\n\tvar wkt = function(wkt) {\n\t  var lisp = parseString(wkt);\n\t  var type = lisp.shift();\n\t  var name = lisp.shift();\n\t  lisp.unshift(['name', name]);\n\t  lisp.unshift(['type', type]);\n\t  var obj = {};\n\t  sExpr(lisp, obj);\n\t  cleanWKT(obj);\n\t  return obj;\n\t};\n\n\tfunction defs(name) {\n\t  /*global console*/\n\t  var that = this;\n\t  if (arguments.length === 2) {\n\t    var def = arguments[1];\n\t    if (typeof def === 'string') {\n\t      if (def.charAt(0) === '+') {\n\t        defs[name] = parseProj(arguments[1]);\n\t      }\n\t      else {\n\t        defs[name] = wkt(arguments[1]);\n\t      }\n\t    } else {\n\t      defs[name] = def;\n\t    }\n\t  }\n\t  else if (arguments.length === 1) {\n\t    if (Array.isArray(name)) {\n\t      return name.map(function(v) {\n\t        if (Array.isArray(v)) {\n\t          defs.apply(that, v);\n\t        }\n\t        else {\n\t          defs(v);\n\t        }\n\t      });\n\t    }\n\t    else if (typeof name === 'string') {\n\t      if (name in defs) {\n\t        return defs[name];\n\t      }\n\t    }\n\t    else if ('EPSG' in name) {\n\t      defs['EPSG:' + name.EPSG] = name;\n\t    }\n\t    else if ('ESRI' in name) {\n\t      defs['ESRI:' + name.ESRI] = name;\n\t    }\n\t    else if ('IAU2000' in name) {\n\t      defs['IAU2000:' + name.IAU2000] = name;\n\t    }\n\t    else {\n\t      console.log(name);\n\t    }\n\t    return;\n\t  }\n\n\n\t}\n\tglobals(defs);\n\n\tfunction testObj(code){\n\t  return typeof code === 'string';\n\t}\n\tfunction testDef(code){\n\t  return code in defs;\n\t}\n\t var codeWords = ['PROJECTEDCRS', 'PROJCRS', 'GEOGCS','GEOCCS','PROJCS','LOCAL_CS', 'GEODCRS', 'GEODETICCRS', 'GEODETICDATUM', 'ENGCRS', 'ENGINEERINGCRS']; \n\tfunction testWKT(code){\n\t  return codeWords.some(function (word) {\n\t    return code.indexOf(word) > -1;\n\t  });\n\t}\n\tfunction testProj(code){\n\t  return code[0] === '+';\n\t}\n\tfunction parse(code){\n\t  if (testObj(code)) {\n\t    //check to see if this is a WKT string\n\t    if (testDef(code)) {\n\t      return defs[code];\n\t    }\n\t    if (testWKT(code)) {\n\t      return wkt(code);\n\t    }\n\t    if (testProj(code)) {\n\t      return parseProj(code);\n\t    }\n\t  }else{\n\t    return code;\n\t  }\n\t}\n\n\tvar extend = function(destination, source) {\n\t  destination = destination || {};\n\t  var value, property;\n\t  if (!source) {\n\t    return destination;\n\t  }\n\t  for (property in source) {\n\t    value = source[property];\n\t    if (value !== undefined) {\n\t      destination[property] = value;\n\t    }\n\t  }\n\t  return destination;\n\t};\n\n\tvar msfnz = function(eccent, sinphi, cosphi) {\n\t  var con = eccent * sinphi;\n\t  return cosphi / (Math.sqrt(1 - con * con));\n\t};\n\n\tvar sign = function(x) {\n\t  return x<0 ? -1 : 1;\n\t};\n\n\tvar adjust_lon = function(x) {\n\t  return (Math.abs(x) <= SPI) ? x : (x - (sign(x) * TWO_PI));\n\t};\n\n\tvar tsfnz = function(eccent, phi, sinphi) {\n\t  var con = eccent * sinphi;\n\t  var com = 0.5 * eccent;\n\t  con = Math.pow(((1 - con) / (1 + con)), com);\n\t  return (Math.tan(0.5 * (HALF_PI - phi)) / con);\n\t};\n\n\tvar phi2z = function(eccent, ts) {\n\t  var eccnth = 0.5 * eccent;\n\t  var con, dphi;\n\t  var phi = HALF_PI - 2 * Math.atan(ts);\n\t  for (var i = 0; i <= 15; i++) {\n\t    con = eccent * Math.sin(phi);\n\t    dphi = HALF_PI - 2 * Math.atan(ts * (Math.pow(((1 - con) / (1 + con)), eccnth))) - phi;\n\t    phi += dphi;\n\t    if (Math.abs(dphi) <= 0.0000000001) {\n\t      return phi;\n\t    }\n\t  }\n\t  //console.log(\"phi2z has NoConvergence\");\n\t  return -9999;\n\t};\n\n\tfunction init() {\n\t  var con = this.b / this.a;\n\t  this.es = 1 - con * con;\n\t  if(!('x0' in this)){\n\t    this.x0 = 0;\n\t  }\n\t  if(!('y0' in this)){\n\t    this.y0 = 0;\n\t  }\n\t  this.e = Math.sqrt(this.es);\n\t  if (this.lat_ts) {\n\t    if (this.sphere) {\n\t      this.k0 = Math.cos(this.lat_ts);\n\t    }\n\t    else {\n\t      this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts));\n\t    }\n\t  }\n\t  else {\n\t    if (!this.k0) {\n\t      if (this.k) {\n\t        this.k0 = this.k;\n\t      }\n\t      else {\n\t        this.k0 = 1;\n\t      }\n\t    }\n\t  }\n\t}\n\n\t/* Mercator forward equations--mapping lat,long to x,y\n\t  --------------------------------------------------*/\n\n\tfunction forward(p) {\n\t  var lon = p.x;\n\t  var lat = p.y;\n\t  // convert to radians\n\t  if (lat * R2D > 90 && lat * R2D < -90 && lon * R2D > 180 && lon * R2D < -180) {\n\t    return null;\n\t  }\n\n\t  var x, y;\n\t  if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) {\n\t    return null;\n\t  }\n\t  else {\n\t    if (this.sphere) {\n\t      x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0);\n\t      y = this.y0 + this.a * this.k0 * Math.log(Math.tan(FORTPI + 0.5 * lat));\n\t    }\n\t    else {\n\t      var sinphi = Math.sin(lat);\n\t      var ts = tsfnz(this.e, lat, sinphi);\n\t      x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0);\n\t      y = this.y0 - this.a * this.k0 * Math.log(ts);\n\t    }\n\t    p.x = x;\n\t    p.y = y;\n\t    return p;\n\t  }\n\t}\n\n\t/* Mercator inverse equations--mapping x,y to lat/long\n\t  --------------------------------------------------*/\n\tfunction inverse(p) {\n\n\t  var x = p.x - this.x0;\n\t  var y = p.y - this.y0;\n\t  var lon, lat;\n\n\t  if (this.sphere) {\n\t    lat = HALF_PI - 2 * Math.atan(Math.exp(-y / (this.a * this.k0)));\n\t  }\n\t  else {\n\t    var ts = Math.exp(-y / (this.a * this.k0));\n\t    lat = phi2z(this.e, ts);\n\t    if (lat === -9999) {\n\t      return null;\n\t    }\n\t  }\n\t  lon = adjust_lon(this.long0 + x / (this.a * this.k0));\n\n\t  p.x = lon;\n\t  p.y = lat;\n\t  return p;\n\t}\n\n\tvar names$1 = [\"Mercator\", \"Popular Visualisation Pseudo Mercator\", \"Mercator_1SP\", \"Mercator_Auxiliary_Sphere\", \"merc\"];\n\tvar merc = {\n\t  init: init,\n\t  forward: forward,\n\t  inverse: inverse,\n\t  names: names$1\n\t};\n\n\tfunction init$1() {\n\t  //no-op for longlat\n\t}\n\n\tfunction identity(pt) {\n\t  return pt;\n\t}\n\tvar names$2 = [\"longlat\", \"identity\"];\n\tvar longlat = {\n\t  init: init$1,\n\t  forward: identity,\n\t  inverse: identity,\n\t  names: names$2\n\t};\n\n\tvar projs = [merc, longlat];\n\tvar names$$1 = {};\n\tvar projStore = [];\n\n\tfunction add(proj, i) {\n\t  var len = projStore.length;\n\t  if (!proj.names) {\n\t    console.log(i);\n\t    return true;\n\t  }\n\t  projStore[len] = proj;\n\t  proj.names.forEach(function(n) {\n\t    names$$1[n.toLowerCase()] = len;\n\t  });\n\t  return this;\n\t}\n\n\tfunction get(name) {\n\t  if (!name) {\n\t    return false;\n\t  }\n\t  var n = name.toLowerCase();\n\t  if (typeof names$$1[n] !== 'undefined' && projStore[names$$1[n]]) {\n\t    return projStore[names$$1[n]];\n\t  }\n\t}\n\n\tfunction start() {\n\t  projs.forEach(add);\n\t}\n\tvar projections = {\n\t  start: start,\n\t  add: add,\n\t  get: get\n\t};\n\n\tvar exports$2 = {};\n\texports$2.MERIT = {\n\t  a: 6378137.0,\n\t  rf: 298.257,\n\t  ellipseName: \"MERIT 1983\"\n\t};\n\n\texports$2.SGS85 = {\n\t  a: 6378136.0,\n\t  rf: 298.257,\n\t  ellipseName: \"Soviet Geodetic System 85\"\n\t};\n\n\texports$2.GRS80 = {\n\t  a: 6378137.0,\n\t  rf: 298.257222101,\n\t  ellipseName: \"GRS 1980(IUGG, 1980)\"\n\t};\n\n\texports$2.IAU76 = {\n\t  a: 6378140.0,\n\t  rf: 298.257,\n\t  ellipseName: \"IAU 1976\"\n\t};\n\n\texports$2.airy = {\n\t  a: 6377563.396,\n\t  b: 6356256.910,\n\t  ellipseName: \"Airy 1830\"\n\t};\n\n\texports$2.APL4 = {\n\t  a: 6378137,\n\t  rf: 298.25,\n\t  ellipseName: \"Appl. Physics. 1965\"\n\t};\n\n\texports$2.NWL9D = {\n\t  a: 6378145.0,\n\t  rf: 298.25,\n\t  ellipseName: \"Naval Weapons Lab., 1965\"\n\t};\n\n\texports$2.mod_airy = {\n\t  a: 6377340.189,\n\t  b: 6356034.446,\n\t  ellipseName: \"Modified Airy\"\n\t};\n\n\texports$2.andrae = {\n\t  a: 6377104.43,\n\t  rf: 300.0,\n\t  ellipseName: \"Andrae 1876 (Den., Iclnd.)\"\n\t};\n\n\texports$2.aust_SA = {\n\t  a: 6378160.0,\n\t  rf: 298.25,\n\t  ellipseName: \"Australian Natl & S. Amer. 1969\"\n\t};\n\n\texports$2.GRS67 = {\n\t  a: 6378160.0,\n\t  rf: 298.2471674270,\n\t  ellipseName: \"GRS 67(IUGG 1967)\"\n\t};\n\n\texports$2.bessel = {\n\t  a: 6377397.155,\n\t  rf: 299.1528128,\n\t  ellipseName: \"Bessel 1841\"\n\t};\n\n\texports$2.bess_nam = {\n\t  a: 6377483.865,\n\t  rf: 299.1528128,\n\t  ellipseName: \"Bessel 1841 (Namibia)\"\n\t};\n\n\texports$2.clrk66 = {\n\t  a: 6378206.4,\n\t  b: 6356583.8,\n\t  ellipseName: \"Clarke 1866\"\n\t};\n\n\texports$2.clrk80 = {\n\t  a: 6378249.145,\n\t  rf: 293.4663,\n\t  ellipseName: \"Clarke 1880 mod.\"\n\t};\n\n\texports$2.clrk58 = {\n\t  a: 6378293.645208759,\n\t  rf: 294.2606763692654,\n\t  ellipseName: \"Clarke 1858\"\n\t};\n\n\texports$2.CPM = {\n\t  a: 6375738.7,\n\t  rf: 334.29,\n\t  ellipseName: \"Comm. des Poids et Mesures 1799\"\n\t};\n\n\texports$2.delmbr = {\n\t  a: 6376428.0,\n\t  rf: 311.5,\n\t  ellipseName: \"Delambre 1810 (Belgium)\"\n\t};\n\n\texports$2.engelis = {\n\t  a: 6378136.05,\n\t  rf: 298.2566,\n\t  ellipseName: \"Engelis 1985\"\n\t};\n\n\texports$2.evrst30 = {\n\t  a: 6377276.345,\n\t  rf: 300.8017,\n\t  ellipseName: \"Everest 1830\"\n\t};\n\n\texports$2.evrst48 = {\n\t  a: 6377304.063,\n\t  rf: 300.8017,\n\t  ellipseName: \"Everest 1948\"\n\t};\n\n\texports$2.evrst56 = {\n\t  a: 6377301.243,\n\t  rf: 300.8017,\n\t  ellipseName: \"Everest 1956\"\n\t};\n\n\texports$2.evrst69 = {\n\t  a: 6377295.664,\n\t  rf: 300.8017,\n\t  ellipseName: \"Everest 1969\"\n\t};\n\n\texports$2.evrstSS = {\n\t  a: 6377298.556,\n\t  rf: 300.8017,\n\t  ellipseName: \"Everest (Sabah & Sarawak)\"\n\t};\n\n\texports$2.fschr60 = {\n\t  a: 6378166.0,\n\t  rf: 298.3,\n\t  ellipseName: \"Fischer (Mercury Datum) 1960\"\n\t};\n\n\texports$2.fschr60m = {\n\t  a: 6378155.0,\n\t  rf: 298.3,\n\t  ellipseName: \"Fischer 1960\"\n\t};\n\n\texports$2.fschr68 = {\n\t  a: 6378150.0,\n\t  rf: 298.3,\n\t  ellipseName: \"Fischer 1968\"\n\t};\n\n\texports$2.helmert = {\n\t  a: 6378200.0,\n\t  rf: 298.3,\n\t  ellipseName: \"Helmert 1906\"\n\t};\n\n\texports$2.hough = {\n\t  a: 6378270.0,\n\t  rf: 297.0,\n\t  ellipseName: \"Hough\"\n\t};\n\n\texports$2.intl = {\n\t  a: 6378388.0,\n\t  rf: 297.0,\n\t  ellipseName: \"International 1909 (Hayford)\"\n\t};\n\n\texports$2.kaula = {\n\t  a: 6378163.0,\n\t  rf: 298.24,\n\t  ellipseName: \"Kaula 1961\"\n\t};\n\n\texports$2.lerch = {\n\t  a: 6378139.0,\n\t  rf: 298.257,\n\t  ellipseName: \"Lerch 1979\"\n\t};\n\n\texports$2.mprts = {\n\t  a: 6397300.0,\n\t  rf: 191.0,\n\t  ellipseName: \"Maupertius 1738\"\n\t};\n\n\texports$2.new_intl = {\n\t  a: 6378157.5,\n\t  b: 6356772.2,\n\t  ellipseName: \"New International 1967\"\n\t};\n\n\texports$2.plessis = {\n\t  a: 6376523.0,\n\t  rf: 6355863.0,\n\t  ellipseName: \"Plessis 1817 (France)\"\n\t};\n\n\texports$2.krass = {\n\t  a: 6378245.0,\n\t  rf: 298.3,\n\t  ellipseName: \"Krassovsky, 1942\"\n\t};\n\n\texports$2.SEasia = {\n\t  a: 6378155.0,\n\t  b: 6356773.3205,\n\t  ellipseName: \"Southeast Asia\"\n\t};\n\n\texports$2.walbeck = {\n\t  a: 6376896.0,\n\t  b: 6355834.8467,\n\t  ellipseName: \"Walbeck\"\n\t};\n\n\texports$2.WGS60 = {\n\t  a: 6378165.0,\n\t  rf: 298.3,\n\t  ellipseName: \"WGS 60\"\n\t};\n\n\texports$2.WGS66 = {\n\t  a: 6378145.0,\n\t  rf: 298.25,\n\t  ellipseName: \"WGS 66\"\n\t};\n\n\texports$2.WGS7 = {\n\t  a: 6378135.0,\n\t  rf: 298.26,\n\t  ellipseName: \"WGS 72\"\n\t};\n\n\tvar WGS84 = exports$2.WGS84 = {\n\t  a: 6378137.0,\n\t  rf: 298.257223563,\n\t  ellipseName: \"WGS 84\"\n\t};\n\n\texports$2.sphere = {\n\t  a: 6370997.0,\n\t  b: 6370997.0,\n\t  ellipseName: \"Normal Sphere (r=6370997)\"\n\t};\n\n\tfunction eccentricity(a, b, rf, R_A) {\n\t  var a2 = a * a; // used in geocentric\n\t  var b2 = b * b; // used in geocentric\n\t  var es = (a2 - b2) / a2; // e ^ 2\n\t  var e = 0;\n\t  if (R_A) {\n\t    a *= 1 - es * (SIXTH + es * (RA4 + es * RA6));\n\t    a2 = a * a;\n\t    es = 0;\n\t  } else {\n\t    e = Math.sqrt(es); // eccentricity\n\t  }\n\t  var ep2 = (a2 - b2) / b2; // used in geocentric\n\t  return {\n\t    es: es,\n\t    e: e,\n\t    ep2: ep2\n\t  };\n\t}\n\tfunction sphere(a, b, rf, ellps, sphere) {\n\t  if (!a) { // do we have an ellipsoid?\n\t    var ellipse = match(exports$2, ellps);\n\t    if (!ellipse) {\n\t      ellipse = WGS84;\n\t    }\n\t    a = ellipse.a;\n\t    b = ellipse.b;\n\t    rf = ellipse.rf;\n\t  }\n\n\t  if (rf && !b) {\n\t    b = (1.0 - 1.0 / rf) * a;\n\t  }\n\t  if (rf === 0 || Math.abs(a - b) < EPSLN) {\n\t    sphere = true;\n\t    b = a;\n\t  }\n\t  return {\n\t    a: a,\n\t    b: b,\n\t    rf: rf,\n\t    sphere: sphere\n\t  };\n\t}\n\n\tvar exports$3 = {};\n\texports$3.wgs84 = {\n\t  towgs84: \"0,0,0\",\n\t  ellipse: \"WGS84\",\n\t  datumName: \"WGS84\"\n\t};\n\n\texports$3.ch1903 = {\n\t  towgs84: \"674.374,15.056,405.346\",\n\t  ellipse: \"bessel\",\n\t  datumName: \"swiss\"\n\t};\n\n\texports$3.ggrs87 = {\n\t  towgs84: \"-199.87,74.79,246.62\",\n\t  ellipse: \"GRS80\",\n\t  datumName: \"Greek_Geodetic_Reference_System_1987\"\n\t};\n\n\texports$3.nad83 = {\n\t  towgs84: \"0,0,0\",\n\t  ellipse: \"GRS80\",\n\t  datumName: \"North_American_Datum_1983\"\n\t};\n\n\texports$3.nad27 = {\n\t  nadgrids: \"@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat\",\n\t  ellipse: \"clrk66\",\n\t  datumName: \"North_American_Datum_1927\"\n\t};\n\n\texports$3.potsdam = {\n\t  towgs84: \"606.0,23.0,413.0\",\n\t  ellipse: \"bessel\",\n\t  datumName: \"Potsdam Rauenberg 1950 DHDN\"\n\t};\n\n\texports$3.carthage = {\n\t  towgs84: \"-263.0,6.0,431.0\",\n\t  ellipse: \"clark80\",\n\t  datumName: \"Carthage 1934 Tunisia\"\n\t};\n\n\texports$3.hermannskogel = {\n\t  towgs84: \"653.0,-212.0,449.0\",\n\t  ellipse: \"bessel\",\n\t  datumName: \"Hermannskogel\"\n\t};\n\n\texports$3.ire65 = {\n\t  towgs84: \"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15\",\n\t  ellipse: \"mod_airy\",\n\t  datumName: \"Ireland 1965\"\n\t};\n\n\texports$3.rassadiran = {\n\t  towgs84: \"-133.63,-157.5,-158.62\",\n\t  ellipse: \"intl\",\n\t  datumName: \"Rassadiran\"\n\t};\n\n\texports$3.nzgd49 = {\n\t  towgs84: \"59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993\",\n\t  ellipse: \"intl\",\n\t  datumName: \"New Zealand Geodetic Datum 1949\"\n\t};\n\n\texports$3.osgb36 = {\n\t  towgs84: \"446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894\",\n\t  ellipse: \"airy\",\n\t  datumName: \"Airy 1830\"\n\t};\n\n\texports$3.s_jtsk = {\n\t  towgs84: \"589,76,480\",\n\t  ellipse: 'bessel',\n\t  datumName: 'S-JTSK (Ferro)'\n\t};\n\n\texports$3.beduaram = {\n\t  towgs84: '-106,-87,188',\n\t  ellipse: 'clrk80',\n\t  datumName: 'Beduaram'\n\t};\n\n\texports$3.gunung_segara = {\n\t  towgs84: '-403,684,41',\n\t  ellipse: 'bessel',\n\t  datumName: 'Gunung Segara Jakarta'\n\t};\n\n\texports$3.rnb72 = {\n\t  towgs84: \"106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1\",\n\t  ellipse: \"intl\",\n\t  datumName: \"Reseau National Belge 1972\"\n\t};\n\n\tfunction datum(datumCode, datum_params, a, b, es, ep2) {\n\t  var out = {};\n\n\t  if (datumCode === undefined || datumCode === 'none') {\n\t    out.datum_type = PJD_NODATUM;\n\t  } else {\n\t    out.datum_type = PJD_WGS84;\n\t  }\n\n\t  if (datum_params) {\n\t    out.datum_params = datum_params.map(parseFloat);\n\t    if (out.datum_params[0] !== 0 || out.datum_params[1] !== 0 || out.datum_params[2] !== 0) {\n\t      out.datum_type = PJD_3PARAM;\n\t    }\n\t    if (out.datum_params.length > 3) {\n\t      if (out.datum_params[3] !== 0 || out.datum_params[4] !== 0 || out.datum_params[5] !== 0 || out.datum_params[6] !== 0) {\n\t        out.datum_type = PJD_7PARAM;\n\t        out.datum_params[3] *= SEC_TO_RAD;\n\t        out.datum_params[4] *= SEC_TO_RAD;\n\t        out.datum_params[5] *= SEC_TO_RAD;\n\t        out.datum_params[6] = (out.datum_params[6] / 1000000.0) + 1.0;\n\t      }\n\t    }\n\t  }\n\n\t  out.a = a; //datum object also uses these values\n\t  out.b = b;\n\t  out.es = es;\n\t  out.ep2 = ep2;\n\t  return out;\n\t}\n\n\tfunction Projection$1(srsCode,callback) {\n\t  if (!(this instanceof Projection$1)) {\n\t    return new Projection$1(srsCode);\n\t  }\n\t  callback = callback || function(error){\n\t    if(error){\n\t      throw error;\n\t    }\n\t  };\n\t  var json = parse(srsCode);\n\t  if(typeof json !== 'object'){\n\t    callback(srsCode);\n\t    return;\n\t  }\n\t  var ourProj = Projection$1.projections.get(json.projName);\n\t  if(!ourProj){\n\t    callback(srsCode);\n\t    return;\n\t  }\n\t  if (json.datumCode && json.datumCode !== 'none') {\n\t    var datumDef = match(exports$3, json.datumCode);\n\t    if (datumDef) {\n\t      json.datum_params = datumDef.towgs84 ? datumDef.towgs84.split(',') : null;\n\t      json.ellps = datumDef.ellipse;\n\t      json.datumName = datumDef.datumName ? datumDef.datumName : json.datumCode;\n\t    }\n\t  }\n\t  json.k0 = json.k0 || 1.0;\n\t  json.axis = json.axis || 'enu';\n\t  json.ellps = json.ellps || 'wgs84';\n\t  var sphere_ = sphere(json.a, json.b, json.rf, json.ellps, json.sphere);\n\t  var ecc = eccentricity(sphere_.a, sphere_.b, sphere_.rf, json.R_A);\n\t  var datumObj = json.datum || datum(json.datumCode, json.datum_params, sphere_.a, sphere_.b, ecc.es, ecc.ep2);\n\n\t  extend(this, json); // transfer everything over from the projection because we don't know what we'll need\n\t  extend(this, ourProj); // transfer all the methods from the projection\n\n\t  // copy the 4 things over we calulated in deriveConstants.sphere\n\t  this.a = sphere_.a;\n\t  this.b = sphere_.b;\n\t  this.rf = sphere_.rf;\n\t  this.sphere = sphere_.sphere;\n\n\t  // copy the 3 things we calculated in deriveConstants.eccentricity\n\t  this.es = ecc.es;\n\t  this.e = ecc.e;\n\t  this.ep2 = ecc.ep2;\n\n\t  // add in the datum object\n\t  this.datum = datumObj;\n\n\t  // init the projection\n\t  this.init();\n\n\t  // legecy callback from back in the day when it went to spatialreference.org\n\t  callback(null, this);\n\n\t}\n\tProjection$1.projections = projections;\n\tProjection$1.projections.start();\n\n\tfunction compareDatums(source, dest) {\n\t  if (source.datum_type !== dest.datum_type) {\n\t    return false; // false, datums are not equal\n\t  } else if (source.a !== dest.a || Math.abs(source.es - dest.es) > 0.000000000050) {\n\t    // the tolerance for es is to ensure that GRS80 and WGS84\n\t    // are considered identical\n\t    return false;\n\t  } else if (source.datum_type === PJD_3PARAM) {\n\t    return (source.datum_params[0] === dest.datum_params[0] && source.datum_params[1] === dest.datum_params[1] && source.datum_params[2] === dest.datum_params[2]);\n\t  } else if (source.datum_type === PJD_7PARAM) {\n\t    return (source.datum_params[0] === dest.datum_params[0] && source.datum_params[1] === dest.datum_params[1] && source.datum_params[2] === dest.datum_params[2] && source.datum_params[3] === dest.datum_params[3] && source.datum_params[4] === dest.datum_params[4] && source.datum_params[5] === dest.datum_params[5] && source.datum_params[6] === dest.datum_params[6]);\n\t  } else {\n\t    return true; // datums are equal\n\t  }\n\t} // cs_compare_datums()\n\n\t/*\n\t * The function Convert_Geodetic_To_Geocentric converts geodetic coordinates\n\t * (latitude, longitude, and height) to geocentric coordinates (X, Y, Z),\n\t * according to the current ellipsoid parameters.\n\t *\n\t *    Latitude  : Geodetic latitude in radians                     (input)\n\t *    Longitude : Geodetic longitude in radians                    (input)\n\t *    Height    : Geodetic height, in meters                       (input)\n\t *    X         : Calculated Geocentric X coordinate, in meters    (output)\n\t *    Y         : Calculated Geocentric Y coordinate, in meters    (output)\n\t *    Z         : Calculated Geocentric Z coordinate, in meters    (output)\n\t *\n\t */\n\tfunction geodeticToGeocentric(p, es, a) {\n\t  var Longitude = p.x;\n\t  var Latitude = p.y;\n\t  var Height = p.z ? p.z : 0; //Z value not always supplied\n\n\t  var Rn; /*  Earth radius at location  */\n\t  var Sin_Lat; /*  Math.sin(Latitude)  */\n\t  var Sin2_Lat; /*  Square of Math.sin(Latitude)  */\n\t  var Cos_Lat; /*  Math.cos(Latitude)  */\n\n\t  /*\n\t   ** Don't blow up if Latitude is just a little out of the value\n\t   ** range as it may just be a rounding issue.  Also removed longitude\n\t   ** test, it should be wrapped by Math.cos() and Math.sin().  NFW for PROJ.4, Sep/2001.\n\t   */\n\t  if (Latitude < -HALF_PI && Latitude > -1.001 * HALF_PI) {\n\t    Latitude = -HALF_PI;\n\t  } else if (Latitude > HALF_PI && Latitude < 1.001 * HALF_PI) {\n\t    Latitude = HALF_PI;\n\t  } else if ((Latitude < -HALF_PI) || (Latitude > HALF_PI)) {\n\t    /* Latitude out of range */\n\t    //..reportError('geocent:lat out of range:' + Latitude);\n\t    return null;\n\t  }\n\n\t  if (Longitude > Math.PI) {\n\t    Longitude -= (2 * Math.PI);\n\t  }\n\t  Sin_Lat = Math.sin(Latitude);\n\t  Cos_Lat = Math.cos(Latitude);\n\t  Sin2_Lat = Sin_Lat * Sin_Lat;\n\t  Rn = a / (Math.sqrt(1.0e0 - es * Sin2_Lat));\n\t  return {\n\t    x: (Rn + Height) * Cos_Lat * Math.cos(Longitude),\n\t    y: (Rn + Height) * Cos_Lat * Math.sin(Longitude),\n\t    z: ((Rn * (1 - es)) + Height) * Sin_Lat\n\t  };\n\t} // cs_geodetic_to_geocentric()\n\n\tfunction geocentricToGeodetic(p, es, a, b) {\n\t  /* local defintions and variables */\n\t  /* end-criterium of loop, accuracy of sin(Latitude) */\n\t  var genau = 1e-12;\n\t  var genau2 = (genau * genau);\n\t  var maxiter = 30;\n\n\t  var P; /* distance between semi-minor axis and location */\n\t  var RR; /* distance between center and location */\n\t  var CT; /* sin of geocentric latitude */\n\t  var ST; /* cos of geocentric latitude */\n\t  var RX;\n\t  var RK;\n\t  var RN; /* Earth radius at location */\n\t  var CPHI0; /* cos of start or old geodetic latitude in iterations */\n\t  var SPHI0; /* sin of start or old geodetic latitude in iterations */\n\t  var CPHI; /* cos of searched geodetic latitude */\n\t  var SPHI; /* sin of searched geodetic latitude */\n\t  var SDPHI; /* end-criterium: addition-theorem of sin(Latitude(iter)-Latitude(iter-1)) */\n\t  var iter; /* # of continous iteration, max. 30 is always enough (s.a.) */\n\n\t  var X = p.x;\n\t  var Y = p.y;\n\t  var Z = p.z ? p.z : 0.0; //Z value not always supplied\n\t  var Longitude;\n\t  var Latitude;\n\t  var Height;\n\n\t  P = Math.sqrt(X * X + Y * Y);\n\t  RR = Math.sqrt(X * X + Y * Y + Z * Z);\n\n\t  /*      special cases for latitude and longitude */\n\t  if (P / a < genau) {\n\n\t    /*  special case, if P=0. (X=0., Y=0.) */\n\t    Longitude = 0.0;\n\n\t    /*  if (X,Y,Z)=(0.,0.,0.) then Height becomes semi-minor axis\n\t     *  of ellipsoid (=center of mass), Latitude becomes PI/2 */\n\t    if (RR / a < genau) {\n\t      Latitude = HALF_PI;\n\t      Height = -b;\n\t      return {\n\t        x: p.x,\n\t        y: p.y,\n\t        z: p.z\n\t      };\n\t    }\n\t  } else {\n\t    /*  ellipsoidal (geodetic) longitude\n\t     *  interval: -PI < Longitude <= +PI */\n\t    Longitude = Math.atan2(Y, X);\n\t  }\n\n\t  /* --------------------------------------------------------------\n\t   * Following iterative algorithm was developped by\n\t   * \"Institut for Erdmessung\", University of Hannover, July 1988.\n\t   * Internet: www.ife.uni-hannover.de\n\t   * Iterative computation of CPHI,SPHI and Height.\n\t   * Iteration of CPHI and SPHI to 10**-12 radian resp.\n\t   * 2*10**-7 arcsec.\n\t   * --------------------------------------------------------------\n\t   */\n\t  CT = Z / RR;\n\t  ST = P / RR;\n\t  RX = 1.0 / Math.sqrt(1.0 - es * (2.0 - es) * ST * ST);\n\t  CPHI0 = ST * (1.0 - es) * RX;\n\t  SPHI0 = CT * RX;\n\t  iter = 0;\n\n\t  /* loop to find sin(Latitude) resp. Latitude\n\t   * until |sin(Latitude(iter)-Latitude(iter-1))| < genau */\n\t  do {\n\t    iter++;\n\t    RN = a / Math.sqrt(1.0 - es * SPHI0 * SPHI0);\n\n\t    /*  ellipsoidal (geodetic) height */\n\t    Height = P * CPHI0 + Z * SPHI0 - RN * (1.0 - es * SPHI0 * SPHI0);\n\n\t    RK = es * RN / (RN + Height);\n\t    RX = 1.0 / Math.sqrt(1.0 - RK * (2.0 - RK) * ST * ST);\n\t    CPHI = ST * (1.0 - RK) * RX;\n\t    SPHI = CT * RX;\n\t    SDPHI = SPHI * CPHI0 - CPHI * SPHI0;\n\t    CPHI0 = CPHI;\n\t    SPHI0 = SPHI;\n\t  }\n\t  while (SDPHI * SDPHI > genau2 && iter < maxiter);\n\n\t  /*      ellipsoidal (geodetic) latitude */\n\t  Latitude = Math.atan(SPHI / Math.abs(CPHI));\n\t  return {\n\t    x: Longitude,\n\t    y: Latitude,\n\t    z: Height\n\t  };\n\t} // cs_geocentric_to_geodetic()\n\n\t/****************************************************************/\n\t// pj_geocentic_to_wgs84( p )\n\t//  p = point to transform in geocentric coordinates (x,y,z)\n\n\n\t/** point object, nothing fancy, just allows values to be\n\t    passed back and forth by reference rather than by value.\n\t    Other point classes may be used as long as they have\n\t    x and y properties, which will get modified in the transform method.\n\t*/\n\tfunction geocentricToWgs84(p, datum_type, datum_params) {\n\n\t  if (datum_type === PJD_3PARAM) {\n\t    // if( x[io] === HUGE_VAL )\n\t    //    continue;\n\t    return {\n\t      x: p.x + datum_params[0],\n\t      y: p.y + datum_params[1],\n\t      z: p.z + datum_params[2],\n\t    };\n\t  } else if (datum_type === PJD_7PARAM) {\n\t    var Dx_BF = datum_params[0];\n\t    var Dy_BF = datum_params[1];\n\t    var Dz_BF = datum_params[2];\n\t    var Rx_BF = datum_params[3];\n\t    var Ry_BF = datum_params[4];\n\t    var Rz_BF = datum_params[5];\n\t    var M_BF = datum_params[6];\n\t    // if( x[io] === HUGE_VAL )\n\t    //    continue;\n\t    return {\n\t      x: M_BF * (p.x - Rz_BF * p.y + Ry_BF * p.z) + Dx_BF,\n\t      y: M_BF * (Rz_BF * p.x + p.y - Rx_BF * p.z) + Dy_BF,\n\t      z: M_BF * (-Ry_BF * p.x + Rx_BF * p.y + p.z) + Dz_BF\n\t    };\n\t  }\n\t} // cs_geocentric_to_wgs84\n\n\t/****************************************************************/\n\t// pj_geocentic_from_wgs84()\n\t//  coordinate system definition,\n\t//  point to transform in geocentric coordinates (x,y,z)\n\tfunction geocentricFromWgs84(p, datum_type, datum_params) {\n\n\t  if (datum_type === PJD_3PARAM) {\n\t    //if( x[io] === HUGE_VAL )\n\t    //    continue;\n\t    return {\n\t      x: p.x - datum_params[0],\n\t      y: p.y - datum_params[1],\n\t      z: p.z - datum_params[2],\n\t    };\n\n\t  } else if (datum_type === PJD_7PARAM) {\n\t    var Dx_BF = datum_params[0];\n\t    var Dy_BF = datum_params[1];\n\t    var Dz_BF = datum_params[2];\n\t    var Rx_BF = datum_params[3];\n\t    var Ry_BF = datum_params[4];\n\t    var Rz_BF = datum_params[5];\n\t    var M_BF = datum_params[6];\n\t    var x_tmp = (p.x - Dx_BF) / M_BF;\n\t    var y_tmp = (p.y - Dy_BF) / M_BF;\n\t    var z_tmp = (p.z - Dz_BF) / M_BF;\n\t    //if( x[io] === HUGE_VAL )\n\t    //    continue;\n\n\t    return {\n\t      x: x_tmp + Rz_BF * y_tmp - Ry_BF * z_tmp,\n\t      y: -Rz_BF * x_tmp + y_tmp + Rx_BF * z_tmp,\n\t      z: Ry_BF * x_tmp - Rx_BF * y_tmp + z_tmp\n\t    };\n\t  } //cs_geocentric_from_wgs84()\n\t}\n\n\tfunction checkParams(type) {\n\t  return (type === PJD_3PARAM || type === PJD_7PARAM);\n\t}\n\n\tvar datum_transform = function(source, dest, point) {\n\t  // Short cut if the datums are identical.\n\t  if (compareDatums(source, dest)) {\n\t    return point; // in this case, zero is sucess,\n\t    // whereas cs_compare_datums returns 1 to indicate TRUE\n\t    // confusing, should fix this\n\t  }\n\n\t  // Explicitly skip datum transform by setting 'datum=none' as parameter for either source or dest\n\t  if (source.datum_type === PJD_NODATUM || dest.datum_type === PJD_NODATUM) {\n\t    return point;\n\t  }\n\n\t  // If this datum requires grid shifts, then apply it to geodetic coordinates.\n\n\t  // Do we need to go through geocentric coordinates?\n\t  if (source.es === dest.es && source.a === dest.a && !checkParams(source.datum_type) &&  !checkParams(dest.datum_type)) {\n\t    return point;\n\t  }\n\n\t  // Convert to geocentric coordinates.\n\t  point = geodeticToGeocentric(point, source.es, source.a);\n\t  // Convert between datums\n\t  if (checkParams(source.datum_type)) {\n\t    point = geocentricToWgs84(point, source.datum_type, source.datum_params);\n\t  }\n\t  if (checkParams(dest.datum_type)) {\n\t    point = geocentricFromWgs84(point, dest.datum_type, dest.datum_params);\n\t  }\n\t  return geocentricToGeodetic(point, dest.es, dest.a, dest.b);\n\n\t};\n\n\tvar adjust_axis = function(crs, denorm, point) {\n\t  var xin = point.x,\n\t    yin = point.y,\n\t    zin = point.z || 0.0;\n\t  var v, t, i;\n\t  var out = {};\n\t  for (i = 0; i < 3; i++) {\n\t    if (denorm && i === 2 && point.z === undefined) {\n\t      continue;\n\t    }\n\t    if (i === 0) {\n\t      v = xin;\n\t      t = 'x';\n\t    }\n\t    else if (i === 1) {\n\t      v = yin;\n\t      t = 'y';\n\t    }\n\t    else {\n\t      v = zin;\n\t      t = 'z';\n\t    }\n\t    switch (crs.axis[i]) {\n\t    case 'e':\n\t      out[t] = v;\n\t      break;\n\t    case 'w':\n\t      out[t] = -v;\n\t      break;\n\t    case 'n':\n\t      out[t] = v;\n\t      break;\n\t    case 's':\n\t      out[t] = -v;\n\t      break;\n\t    case 'u':\n\t      if (point[t] !== undefined) {\n\t        out.z = v;\n\t      }\n\t      break;\n\t    case 'd':\n\t      if (point[t] !== undefined) {\n\t        out.z = -v;\n\t      }\n\t      break;\n\t    default:\n\t      //console.log(\"ERROR: unknow axis (\"+crs.axis[i]+\") - check definition of \"+crs.projName);\n\t      return null;\n\t    }\n\t  }\n\t  return out;\n\t};\n\n\tvar toPoint = function (array){\n\t  var out = {\n\t    x: array[0],\n\t    y: array[1]\n\t  };\n\t  if (array.length>2) {\n\t    out.z = array[2];\n\t  }\n\t  if (array.length>3) {\n\t    out.m = array[3];\n\t  }\n\t  return out;\n\t};\n\n\tfunction checkNotWGS(source, dest) {\n\t  return ((source.datum.datum_type === PJD_3PARAM || source.datum.datum_type === PJD_7PARAM) && dest.datumCode !== 'WGS84') || ((dest.datum.datum_type === PJD_3PARAM || dest.datum.datum_type === PJD_7PARAM) && source.datumCode !== 'WGS84');\n\t}\n\n\tfunction transform(source, dest, point) {\n\t  var wgs84;\n\t  if (Array.isArray(point)) {\n\t    point = toPoint(point);\n\t  }\n\n\t  // Workaround for datum shifts towgs84, if either source or destination projection is not wgs84\n\t  if (source.datum && dest.datum && checkNotWGS(source, dest)) {\n\t    wgs84 = new Projection$1('WGS84');\n\t    point = transform(source, wgs84, point);\n\t    source = wgs84;\n\t  }\n\t  // DGR, 2010/11/12\n\t  if (source.axis !== 'enu') {\n\t    point = adjust_axis(source, false, point);\n\t  }\n\t  // Transform source points to long/lat, if they aren't already.\n\t  if (source.projName === 'longlat') {\n\t    point = {\n\t      x: point.x * D2R,\n\t      y: point.y * D2R\n\t    };\n\t  }\n\t  else {\n\t    if (source.to_meter) {\n\t      point = {\n\t        x: point.x * source.to_meter,\n\t        y: point.y * source.to_meter\n\t      };\n\t    }\n\t    point = source.inverse(point); // Convert Cartesian to longlat\n\t  }\n\t  // Adjust for the prime meridian if necessary\n\t  if (source.from_greenwich) {\n\t    point.x += source.from_greenwich;\n\t  }\n\n\t  // Convert datums if needed, and if possible.\n\t  point = datum_transform(source.datum, dest.datum, point);\n\n\t  // Adjust for the prime meridian if necessary\n\t  if (dest.from_greenwich) {\n\t    point = {\n\t      x: point.x - dest.from_greenwich,\n\t      y: point.y\n\t    };\n\t  }\n\n\t  if (dest.projName === 'longlat') {\n\t    // convert radians to decimal degrees\n\t    point = {\n\t      x: point.x * R2D,\n\t      y: point.y * R2D\n\t    };\n\t  } else { // else project\n\t    point = dest.forward(point);\n\t    if (dest.to_meter) {\n\t      point = {\n\t        x: point.x / dest.to_meter,\n\t        y: point.y / dest.to_meter\n\t      };\n\t    }\n\t  }\n\n\t  // DGR, 2010/11/12\n\t  if (dest.axis !== 'enu') {\n\t    return adjust_axis(dest, true, point);\n\t  }\n\n\t  return point;\n\t}\n\n\tvar wgs84 = Projection$1('WGS84');\n\n\tfunction transformer(from, to, coords) {\n\t  var transformedArray;\n\t  if (Array.isArray(coords)) {\n\t    transformedArray = transform(from, to, coords);\n\t    if (coords.length === 3) {\n\t      return [transformedArray.x, transformedArray.y, transformedArray.z];\n\t    }\n\t    else {\n\t      return [transformedArray.x, transformedArray.y];\n\t    }\n\t  }\n\t  else {\n\t    return transform(from, to, coords);\n\t  }\n\t}\n\n\tfunction checkProj(item) {\n\t  if (item instanceof Projection$1) {\n\t    return item;\n\t  }\n\t  if (item.oProj) {\n\t    return item.oProj;\n\t  }\n\t  return Projection$1(item);\n\t}\n\tfunction proj4$1(fromProj, toProj, coord) {\n\t  fromProj = checkProj(fromProj);\n\t  var single = false;\n\t  var obj;\n\t  if (typeof toProj === 'undefined') {\n\t    toProj = fromProj;\n\t    fromProj = wgs84;\n\t    single = true;\n\t  }\n\t  else if (typeof toProj.x !== 'undefined' || Array.isArray(toProj)) {\n\t    coord = toProj;\n\t    toProj = fromProj;\n\t    fromProj = wgs84;\n\t    single = true;\n\t  }\n\t  toProj = checkProj(toProj);\n\t  if (coord) {\n\t    return transformer(fromProj, toProj, coord);\n\t  }\n\t  else {\n\t    obj = {\n\t      forward: function(coords) {\n\t        return transformer(fromProj, toProj, coords);\n\t      },\n\t      inverse: function(coords) {\n\t        return transformer(toProj, fromProj, coords);\n\t      }\n\t    };\n\t    if (single) {\n\t      obj.oProj = toProj;\n\t    }\n\t    return obj;\n\t  }\n\t}\n\n\t/**\n\t * UTM zones are grouped, and assigned to one of a group of 6\n\t * sets.\n\t *\n\t * {int} @private\n\t */\n\tvar NUM_100K_SETS = 6;\n\n\t/**\n\t * The column letters (for easting) of the lower left value, per\n\t * set.\n\t *\n\t * {string} @private\n\t */\n\tvar SET_ORIGIN_COLUMN_LETTERS = 'AJSAJS';\n\n\t/**\n\t * The row letters (for northing) of the lower left value, per\n\t * set.\n\t *\n\t * {string} @private\n\t */\n\tvar SET_ORIGIN_ROW_LETTERS = 'AFAFAF';\n\n\tvar A = 65; // A\n\tvar I = 73; // I\n\tvar O = 79; // O\n\tvar V = 86; // V\n\tvar Z = 90; // Z\n\tvar mgrs = {\n\t  forward: forward$1,\n\t  inverse: inverse$1,\n\t  toPoint: toPoint$1\n\t};\n\t/**\n\t * Conversion of lat/lon to MGRS.\n\t *\n\t * @param {object} ll Object literal with lat and lon properties on a\n\t *     WGS84 ellipsoid.\n\t * @param {int} accuracy Accuracy in digits (5 for 1 m, 4 for 10 m, 3 for\n\t *      100 m, 2 for 1000 m or 1 for 10000 m). Optional, default is 5.\n\t * @return {string} the MGRS string for the given location and accuracy.\n\t */\n\tfunction forward$1(ll, accuracy) {\n\t  accuracy = accuracy || 5; // default accuracy 1m\n\t  return encode(LLtoUTM({\n\t    lat: ll[1],\n\t    lon: ll[0]\n\t  }), accuracy);\n\t}\n\n\t/**\n\t * Conversion of MGRS to lat/lon.\n\t *\n\t * @param {string} mgrs MGRS string.\n\t * @return {array} An array with left (longitude), bottom (latitude), right\n\t *     (longitude) and top (latitude) values in WGS84, representing the\n\t *     bounding box for the provided MGRS reference.\n\t */\n\tfunction inverse$1(mgrs) {\n\t  var bbox = UTMtoLL(decode(mgrs.toUpperCase()));\n\t  if (bbox.lat && bbox.lon) {\n\t    return [bbox.lon, bbox.lat, bbox.lon, bbox.lat];\n\t  }\n\t  return [bbox.left, bbox.bottom, bbox.right, bbox.top];\n\t}\n\n\tfunction toPoint$1(mgrs) {\n\t  var bbox = UTMtoLL(decode(mgrs.toUpperCase()));\n\t  if (bbox.lat && bbox.lon) {\n\t    return [bbox.lon, bbox.lat];\n\t  }\n\t  return [(bbox.left + bbox.right) / 2, (bbox.top + bbox.bottom) / 2];\n\t}\n\t/**\n\t * Conversion from degrees to radians.\n\t *\n\t * @private\n\t * @param {number} deg the angle in degrees.\n\t * @return {number} the angle in radians.\n\t */\n\tfunction degToRad(deg) {\n\t  return (deg * (Math.PI / 180.0));\n\t}\n\n\t/**\n\t * Conversion from radians to degrees.\n\t *\n\t * @private\n\t * @param {number} rad the angle in radians.\n\t * @return {number} the angle in degrees.\n\t */\n\tfunction radToDeg(rad) {\n\t  return (180.0 * (rad / Math.PI));\n\t}\n\n\t/**\n\t * Converts a set of Longitude and Latitude co-ordinates to UTM\n\t * using the WGS84 ellipsoid.\n\t *\n\t * @private\n\t * @param {object} ll Object literal with lat and lon properties\n\t *     representing the WGS84 coordinate to be converted.\n\t * @return {object} Object literal containing the UTM value with easting,\n\t *     northing, zoneNumber and zoneLetter properties, and an optional\n\t *     accuracy property in digits. Returns null if the conversion failed.\n\t */\n\tfunction LLtoUTM(ll) {\n\t  var Lat = ll.lat;\n\t  var Long = ll.lon;\n\t  var a = 6378137.0; //ellip.radius;\n\t  var eccSquared = 0.00669438; //ellip.eccsq;\n\t  var k0 = 0.9996;\n\t  var LongOrigin;\n\t  var eccPrimeSquared;\n\t  var N, T, C, A, M;\n\t  var LatRad = degToRad(Lat);\n\t  var LongRad = degToRad(Long);\n\t  var LongOriginRad;\n\t  var ZoneNumber;\n\t  // (int)\n\t  ZoneNumber = Math.floor((Long + 180) / 6) + 1;\n\n\t  //Make sure the longitude 180.00 is in Zone 60\n\t  if (Long === 180) {\n\t    ZoneNumber = 60;\n\t  }\n\n\t  // Special zone for Norway\n\t  if (Lat >= 56.0 && Lat < 64.0 && Long >= 3.0 && Long < 12.0) {\n\t    ZoneNumber = 32;\n\t  }\n\n\t  // Special zones for Svalbard\n\t  if (Lat >= 72.0 && Lat < 84.0) {\n\t    if (Long >= 0.0 && Long < 9.0) {\n\t      ZoneNumber = 31;\n\t    }\n\t    else if (Long >= 9.0 && Long < 21.0) {\n\t      ZoneNumber = 33;\n\t    }\n\t    else if (Long >= 21.0 && Long < 33.0) {\n\t      ZoneNumber = 35;\n\t    }\n\t    else if (Long >= 33.0 && Long < 42.0) {\n\t      ZoneNumber = 37;\n\t    }\n\t  }\n\n\t  LongOrigin = (ZoneNumber - 1) * 6 - 180 + 3; //+3 puts origin\n\t  // in middle of\n\t  // zone\n\t  LongOriginRad = degToRad(LongOrigin);\n\n\t  eccPrimeSquared = (eccSquared) / (1 - eccSquared);\n\n\t  N = a / Math.sqrt(1 - eccSquared * Math.sin(LatRad) * Math.sin(LatRad));\n\t  T = Math.tan(LatRad) * Math.tan(LatRad);\n\t  C = eccPrimeSquared * Math.cos(LatRad) * Math.cos(LatRad);\n\t  A = Math.cos(LatRad) * (LongRad - LongOriginRad);\n\n\t  M = a * ((1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256) * LatRad - (3 * eccSquared / 8 + 3 * eccSquared * eccSquared / 32 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(2 * LatRad) + (15 * eccSquared * eccSquared / 256 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(4 * LatRad) - (35 * eccSquared * eccSquared * eccSquared / 3072) * Math.sin(6 * LatRad));\n\n\t  var UTMEasting = (k0 * N * (A + (1 - T + C) * A * A * A / 6.0 + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * A * A * A * A * A / 120.0) + 500000.0);\n\n\t  var UTMNorthing = (k0 * (M + N * Math.tan(LatRad) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24.0 + (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared) * A * A * A * A * A * A / 720.0)));\n\t  if (Lat < 0.0) {\n\t    UTMNorthing += 10000000.0; //10000000 meter offset for\n\t    // southern hemisphere\n\t  }\n\n\t  return {\n\t    northing: Math.round(UTMNorthing),\n\t    easting: Math.round(UTMEasting),\n\t    zoneNumber: ZoneNumber,\n\t    zoneLetter: getLetterDesignator(Lat)\n\t  };\n\t}\n\n\t/**\n\t * Converts UTM coords to lat/long, using the WGS84 ellipsoid. This is a convenience\n\t * class where the Zone can be specified as a single string eg.\"60N\" which\n\t * is then broken down into the ZoneNumber and ZoneLetter.\n\t *\n\t * @private\n\t * @param {object} utm An object literal with northing, easting, zoneNumber\n\t *     and zoneLetter properties. If an optional accuracy property is\n\t *     provided (in meters), a bounding box will be returned instead of\n\t *     latitude and longitude.\n\t * @return {object} An object literal containing either lat and lon values\n\t *     (if no accuracy was provided), or top, right, bottom and left values\n\t *     for the bounding box calculated according to the provided accuracy.\n\t *     Returns null if the conversion failed.\n\t */\n\tfunction UTMtoLL(utm) {\n\n\t  var UTMNorthing = utm.northing;\n\t  var UTMEasting = utm.easting;\n\t  var zoneLetter = utm.zoneLetter;\n\t  var zoneNumber = utm.zoneNumber;\n\t  // check the ZoneNummber is valid\n\t  if (zoneNumber < 0 || zoneNumber > 60) {\n\t    return null;\n\t  }\n\n\t  var k0 = 0.9996;\n\t  var a = 6378137.0; //ellip.radius;\n\t  var eccSquared = 0.00669438; //ellip.eccsq;\n\t  var eccPrimeSquared;\n\t  var e1 = (1 - Math.sqrt(1 - eccSquared)) / (1 + Math.sqrt(1 - eccSquared));\n\t  var N1, T1, C1, R1, D, M;\n\t  var LongOrigin;\n\t  var mu, phi1Rad;\n\n\t  // remove 500,000 meter offset for longitude\n\t  var x = UTMEasting - 500000.0;\n\t  var y = UTMNorthing;\n\n\t  // We must know somehow if we are in the Northern or Southern\n\t  // hemisphere, this is the only time we use the letter So even\n\t  // if the Zone letter isn't exactly correct it should indicate\n\t  // the hemisphere correctly\n\t  if (zoneLetter < 'N') {\n\t    y -= 10000000.0; // remove 10,000,000 meter offset used\n\t    // for southern hemisphere\n\t  }\n\n\t  // There are 60 zones with zone 1 being at West -180 to -174\n\t  LongOrigin = (zoneNumber - 1) * 6 - 180 + 3; // +3 puts origin\n\t  // in middle of\n\t  // zone\n\n\t  eccPrimeSquared = (eccSquared) / (1 - eccSquared);\n\n\t  M = y / k0;\n\t  mu = M / (a * (1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256));\n\n\t  phi1Rad = mu + (3 * e1 / 2 - 27 * e1 * e1 * e1 / 32) * Math.sin(2 * mu) + (21 * e1 * e1 / 16 - 55 * e1 * e1 * e1 * e1 / 32) * Math.sin(4 * mu) + (151 * e1 * e1 * e1 / 96) * Math.sin(6 * mu);\n\t  // double phi1 = ProjMath.radToDeg(phi1Rad);\n\n\t  N1 = a / Math.sqrt(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad));\n\t  T1 = Math.tan(phi1Rad) * Math.tan(phi1Rad);\n\t  C1 = eccPrimeSquared * Math.cos(phi1Rad) * Math.cos(phi1Rad);\n\t  R1 = a * (1 - eccSquared) / Math.pow(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad), 1.5);\n\t  D = x / (N1 * k0);\n\n\t  var lat = phi1Rad - (N1 * Math.tan(phi1Rad) / R1) * (D * D / 2 - (5 + 3 * T1 + 10 * C1 - 4 * C1 * C1 - 9 * eccPrimeSquared) * D * D * D * D / 24 + (61 + 90 * T1 + 298 * C1 + 45 * T1 * T1 - 252 * eccPrimeSquared - 3 * C1 * C1) * D * D * D * D * D * D / 720);\n\t  lat = radToDeg(lat);\n\n\t  var lon = (D - (1 + 2 * T1 + C1) * D * D * D / 6 + (5 - 2 * C1 + 28 * T1 - 3 * C1 * C1 + 8 * eccPrimeSquared + 24 * T1 * T1) * D * D * D * D * D / 120) / Math.cos(phi1Rad);\n\t  lon = LongOrigin + radToDeg(lon);\n\n\t  var result;\n\t  if (utm.accuracy) {\n\t    var topRight = UTMtoLL({\n\t      northing: utm.northing + utm.accuracy,\n\t      easting: utm.easting + utm.accuracy,\n\t      zoneLetter: utm.zoneLetter,\n\t      zoneNumber: utm.zoneNumber\n\t    });\n\t    result = {\n\t      top: topRight.lat,\n\t      right: topRight.lon,\n\t      bottom: lat,\n\t      left: lon\n\t    };\n\t  }\n\t  else {\n\t    result = {\n\t      lat: lat,\n\t      lon: lon\n\t    };\n\t  }\n\t  return result;\n\t}\n\n\t/**\n\t * Calculates the MGRS letter designator for the given latitude.\n\t *\n\t * @private\n\t * @param {number} lat The latitude in WGS84 to get the letter designator\n\t *     for.\n\t * @return {char} The letter designator.\n\t */\n\tfunction getLetterDesignator(lat) {\n\t  //This is here as an error flag to show that the Latitude is\n\t  //outside MGRS limits\n\t  var LetterDesignator = 'Z';\n\n\t  if ((84 >= lat) && (lat >= 72)) {\n\t    LetterDesignator = 'X';\n\t  }\n\t  else if ((72 > lat) && (lat >= 64)) {\n\t    LetterDesignator = 'W';\n\t  }\n\t  else if ((64 > lat) && (lat >= 56)) {\n\t    LetterDesignator = 'V';\n\t  }\n\t  else if ((56 > lat) && (lat >= 48)) {\n\t    LetterDesignator = 'U';\n\t  }\n\t  else if ((48 > lat) && (lat >= 40)) {\n\t    LetterDesignator = 'T';\n\t  }\n\t  else if ((40 > lat) && (lat >= 32)) {\n\t    LetterDesignator = 'S';\n\t  }\n\t  else if ((32 > lat) && (lat >= 24)) {\n\t    LetterDesignator = 'R';\n\t  }\n\t  else if ((24 > lat) && (lat >= 16)) {\n\t    LetterDesignator = 'Q';\n\t  }\n\t  else if ((16 > lat) && (lat >= 8)) {\n\t    LetterDesignator = 'P';\n\t  }\n\t  else if ((8 > lat) && (lat >= 0)) {\n\t    LetterDesignator = 'N';\n\t  }\n\t  else if ((0 > lat) && (lat >= -8)) {\n\t    LetterDesignator = 'M';\n\t  }\n\t  else if ((-8 > lat) && (lat >= -16)) {\n\t    LetterDesignator = 'L';\n\t  }\n\t  else if ((-16 > lat) && (lat >= -24)) {\n\t    LetterDesignator = 'K';\n\t  }\n\t  else if ((-24 > lat) && (lat >= -32)) {\n\t    LetterDesignator = 'J';\n\t  }\n\t  else if ((-32 > lat) && (lat >= -40)) {\n\t    LetterDesignator = 'H';\n\t  }\n\t  else if ((-40 > lat) && (lat >= -48)) {\n\t    LetterDesignator = 'G';\n\t  }\n\t  else if ((-48 > lat) && (lat >= -56)) {\n\t    LetterDesignator = 'F';\n\t  }\n\t  else if ((-56 > lat) && (lat >= -64)) {\n\t    LetterDesignator = 'E';\n\t  }\n\t  else if ((-64 > lat) && (lat >= -72)) {\n\t    LetterDesignator = 'D';\n\t  }\n\t  else if ((-72 > lat) && (lat >= -80)) {\n\t    LetterDesignator = 'C';\n\t  }\n\t  return LetterDesignator;\n\t}\n\n\t/**\n\t * Encodes a UTM location as MGRS string.\n\t *\n\t * @private\n\t * @param {object} utm An object literal with easting, northing,\n\t *     zoneLetter, zoneNumber\n\t * @param {number} accuracy Accuracy in digits (1-5).\n\t * @return {string} MGRS string for the given UTM location.\n\t */\n\tfunction encode(utm, accuracy) {\n\t  // prepend with leading zeroes\n\t  var seasting = \"00000\" + utm.easting,\n\t    snorthing = \"00000\" + utm.northing;\n\n\t  return utm.zoneNumber + utm.zoneLetter + get100kID(utm.easting, utm.northing, utm.zoneNumber) + seasting.substr(seasting.length - 5, accuracy) + snorthing.substr(snorthing.length - 5, accuracy);\n\t}\n\n\t/**\n\t * Get the two letter 100k designator for a given UTM easting,\n\t * northing and zone number value.\n\t *\n\t * @private\n\t * @param {number} easting\n\t * @param {number} northing\n\t * @param {number} zoneNumber\n\t * @return the two letter 100k designator for the given UTM location.\n\t */\n\tfunction get100kID(easting, northing, zoneNumber) {\n\t  var setParm = get100kSetForZone(zoneNumber);\n\t  var setColumn = Math.floor(easting / 100000);\n\t  var setRow = Math.floor(northing / 100000) % 20;\n\t  return getLetter100kID(setColumn, setRow, setParm);\n\t}\n\n\t/**\n\t * Given a UTM zone number, figure out the MGRS 100K set it is in.\n\t *\n\t * @private\n\t * @param {number} i An UTM zone number.\n\t * @return {number} the 100k set the UTM zone is in.\n\t */\n\tfunction get100kSetForZone(i) {\n\t  var setParm = i % NUM_100K_SETS;\n\t  if (setParm === 0) {\n\t    setParm = NUM_100K_SETS;\n\t  }\n\n\t  return setParm;\n\t}\n\n\t/**\n\t * Get the two-letter MGRS 100k designator given information\n\t * translated from the UTM northing, easting and zone number.\n\t *\n\t * @private\n\t * @param {number} column the column index as it relates to the MGRS\n\t *        100k set spreadsheet, created from the UTM easting.\n\t *        Values are 1-8.\n\t * @param {number} row the row index as it relates to the MGRS 100k set\n\t *        spreadsheet, created from the UTM northing value. Values\n\t *        are from 0-19.\n\t * @param {number} parm the set block, as it relates to the MGRS 100k set\n\t *        spreadsheet, created from the UTM zone. Values are from\n\t *        1-60.\n\t * @return two letter MGRS 100k code.\n\t */\n\tfunction getLetter100kID(column, row, parm) {\n\t  // colOrigin and rowOrigin are the letters at the origin of the set\n\t  var index = parm - 1;\n\t  var colOrigin = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(index);\n\t  var rowOrigin = SET_ORIGIN_ROW_LETTERS.charCodeAt(index);\n\n\t  // colInt and rowInt are the letters to build to return\n\t  var colInt = colOrigin + column - 1;\n\t  var rowInt = rowOrigin + row;\n\t  var rollover = false;\n\n\t  if (colInt > Z) {\n\t    colInt = colInt - Z + A - 1;\n\t    rollover = true;\n\t  }\n\n\t  if (colInt === I || (colOrigin < I && colInt > I) || ((colInt > I || colOrigin < I) && rollover)) {\n\t    colInt++;\n\t  }\n\n\t  if (colInt === O || (colOrigin < O && colInt > O) || ((colInt > O || colOrigin < O) && rollover)) {\n\t    colInt++;\n\n\t    if (colInt === I) {\n\t      colInt++;\n\t    }\n\t  }\n\n\t  if (colInt > Z) {\n\t    colInt = colInt - Z + A - 1;\n\t  }\n\n\t  if (rowInt > V) {\n\t    rowInt = rowInt - V + A - 1;\n\t    rollover = true;\n\t  }\n\t  else {\n\t    rollover = false;\n\t  }\n\n\t  if (((rowInt === I) || ((rowOrigin < I) && (rowInt > I))) || (((rowInt > I) || (rowOrigin < I)) && rollover)) {\n\t    rowInt++;\n\t  }\n\n\t  if (((rowInt === O) || ((rowOrigin < O) && (rowInt > O))) || (((rowInt > O) || (rowOrigin < O)) && rollover)) {\n\t    rowInt++;\n\n\t    if (rowInt === I) {\n\t      rowInt++;\n\t    }\n\t  }\n\n\t  if (rowInt > V) {\n\t    rowInt = rowInt - V + A - 1;\n\t  }\n\n\t  var twoLetter = String.fromCharCode(colInt) + String.fromCharCode(rowInt);\n\t  return twoLetter;\n\t}\n\n\t/**\n\t * Decode the UTM parameters from a MGRS string.\n\t *\n\t * @private\n\t * @param {string} mgrsString an UPPERCASE coordinate string is expected.\n\t * @return {object} An object literal with easting, northing, zoneLetter,\n\t *     zoneNumber and accuracy (in meters) properties.\n\t */\n\tfunction decode(mgrsString) {\n\n\t  if (mgrsString && mgrsString.length === 0) {\n\t    throw (\"MGRSPoint coverting from nothing\");\n\t  }\n\n\t  var length = mgrsString.length;\n\n\t  var hunK = null;\n\t  var sb = \"\";\n\t  var testChar;\n\t  var i = 0;\n\n\t  // get Zone number\n\t  while (!(/[A-Z]/).test(testChar = mgrsString.charAt(i))) {\n\t    if (i >= 2) {\n\t      throw (\"MGRSPoint bad conversion from: \" + mgrsString);\n\t    }\n\t    sb += testChar;\n\t    i++;\n\t  }\n\n\t  var zoneNumber = parseInt(sb, 10);\n\n\t  if (i === 0 || i + 3 > length) {\n\t    // A good MGRS string has to be 4-5 digits long,\n\t    // ##AAA/#AAA at least.\n\t    throw (\"MGRSPoint bad conversion from: \" + mgrsString);\n\t  }\n\n\t  var zoneLetter = mgrsString.charAt(i++);\n\n\t  // Should we check the zone letter here? Why not.\n\t  if (zoneLetter <= 'A' || zoneLetter === 'B' || zoneLetter === 'Y' || zoneLetter >= 'Z' || zoneLetter === 'I' || zoneLetter === 'O') {\n\t    throw (\"MGRSPoint zone letter \" + zoneLetter + \" not handled: \" + mgrsString);\n\t  }\n\n\t  hunK = mgrsString.substring(i, i += 2);\n\n\t  var set = get100kSetForZone(zoneNumber);\n\n\t  var east100k = getEastingFromChar(hunK.charAt(0), set);\n\t  var north100k = getNorthingFromChar(hunK.charAt(1), set);\n\n\t  // We have a bug where the northing may be 2000000 too low.\n\t  // How\n\t  // do we know when to roll over?\n\n\t  while (north100k < getMinNorthing(zoneLetter)) {\n\t    north100k += 2000000;\n\t  }\n\n\t  // calculate the char index for easting/northing separator\n\t  var remainder = length - i;\n\n\t  if (remainder % 2 !== 0) {\n\t    throw (\"MGRSPoint has to have an even number \\nof digits after the zone letter and two 100km letters - front \\nhalf for easting meters, second half for \\nnorthing meters\" + mgrsString);\n\t  }\n\n\t  var sep = remainder / 2;\n\n\t  var sepEasting = 0.0;\n\t  var sepNorthing = 0.0;\n\t  var accuracyBonus, sepEastingString, sepNorthingString, easting, northing;\n\t  if (sep > 0) {\n\t    accuracyBonus = 100000.0 / Math.pow(10, sep);\n\t    sepEastingString = mgrsString.substring(i, i + sep);\n\t    sepEasting = parseFloat(sepEastingString) * accuracyBonus;\n\t    sepNorthingString = mgrsString.substring(i + sep);\n\t    sepNorthing = parseFloat(sepNorthingString) * accuracyBonus;\n\t  }\n\n\t  easting = sepEasting + east100k;\n\t  northing = sepNorthing + north100k;\n\n\t  return {\n\t    easting: easting,\n\t    northing: northing,\n\t    zoneLetter: zoneLetter,\n\t    zoneNumber: zoneNumber,\n\t    accuracy: accuracyBonus\n\t  };\n\t}\n\n\t/**\n\t * Given the first letter from a two-letter MGRS 100k zone, and given the\n\t * MGRS table set for the zone number, figure out the easting value that\n\t * should be added to the other, secondary easting value.\n\t *\n\t * @private\n\t * @param {char} e The first letter from a two-letter MGRS 100´k zone.\n\t * @param {number} set The MGRS table set for the zone number.\n\t * @return {number} The easting value for the given letter and set.\n\t */\n\tfunction getEastingFromChar(e, set) {\n\t  // colOrigin is the letter at the origin of the set for the\n\t  // column\n\t  var curCol = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(set - 1);\n\t  var eastingValue = 100000.0;\n\t  var rewindMarker = false;\n\n\t  while (curCol !== e.charCodeAt(0)) {\n\t    curCol++;\n\t    if (curCol === I) {\n\t      curCol++;\n\t    }\n\t    if (curCol === O) {\n\t      curCol++;\n\t    }\n\t    if (curCol > Z) {\n\t      if (rewindMarker) {\n\t        throw (\"Bad character: \" + e);\n\t      }\n\t      curCol = A;\n\t      rewindMarker = true;\n\t    }\n\t    eastingValue += 100000.0;\n\t  }\n\n\t  return eastingValue;\n\t}\n\n\t/**\n\t * Given the second letter from a two-letter MGRS 100k zone, and given the\n\t * MGRS table set for the zone number, figure out the northing value that\n\t * should be added to the other, secondary northing value. You have to\n\t * remember that Northings are determined from the equator, and the vertical\n\t * cycle of letters mean a 2000000 additional northing meters. This happens\n\t * approx. every 18 degrees of latitude. This method does *NOT* count any\n\t * additional northings. You have to figure out how many 2000000 meters need\n\t * to be added for the zone letter of the MGRS coordinate.\n\t *\n\t * @private\n\t * @param {char} n Second letter of the MGRS 100k zone\n\t * @param {number} set The MGRS table set number, which is dependent on the\n\t *     UTM zone number.\n\t * @return {number} The northing value for the given letter and set.\n\t */\n\tfunction getNorthingFromChar(n, set) {\n\n\t  if (n > 'V') {\n\t    throw (\"MGRSPoint given invalid Northing \" + n);\n\t  }\n\n\t  // rowOrigin is the letter at the origin of the set for the\n\t  // column\n\t  var curRow = SET_ORIGIN_ROW_LETTERS.charCodeAt(set - 1);\n\t  var northingValue = 0.0;\n\t  var rewindMarker = false;\n\n\t  while (curRow !== n.charCodeAt(0)) {\n\t    curRow++;\n\t    if (curRow === I) {\n\t      curRow++;\n\t    }\n\t    if (curRow === O) {\n\t      curRow++;\n\t    }\n\t    // fixing a bug making whole application hang in this loop\n\t    // when 'n' is a wrong character\n\t    if (curRow > V) {\n\t      if (rewindMarker) { // making sure that this loop ends\n\t        throw (\"Bad character: \" + n);\n\t      }\n\t      curRow = A;\n\t      rewindMarker = true;\n\t    }\n\t    northingValue += 100000.0;\n\t  }\n\n\t  return northingValue;\n\t}\n\n\t/**\n\t * The function getMinNorthing returns the minimum northing value of a MGRS\n\t * zone.\n\t *\n\t * Ported from Geotrans' c Lattitude_Band_Value structure table.\n\t *\n\t * @private\n\t * @param {char} zoneLetter The MGRS zone to get the min northing for.\n\t * @return {number}\n\t */\n\tfunction getMinNorthing(zoneLetter) {\n\t  var northing;\n\t  switch (zoneLetter) {\n\t  case 'C':\n\t    northing = 1100000.0;\n\t    break;\n\t  case 'D':\n\t    northing = 2000000.0;\n\t    break;\n\t  case 'E':\n\t    northing = 2800000.0;\n\t    break;\n\t  case 'F':\n\t    northing = 3700000.0;\n\t    break;\n\t  case 'G':\n\t    northing = 4600000.0;\n\t    break;\n\t  case 'H':\n\t    northing = 5500000.0;\n\t    break;\n\t  case 'J':\n\t    northing = 6400000.0;\n\t    break;\n\t  case 'K':\n\t    northing = 7300000.0;\n\t    break;\n\t  case 'L':\n\t    northing = 8200000.0;\n\t    break;\n\t  case 'M':\n\t    northing = 9100000.0;\n\t    break;\n\t  case 'N':\n\t    northing = 0.0;\n\t    break;\n\t  case 'P':\n\t    northing = 800000.0;\n\t    break;\n\t  case 'Q':\n\t    northing = 1700000.0;\n\t    break;\n\t  case 'R':\n\t    northing = 2600000.0;\n\t    break;\n\t  case 'S':\n\t    northing = 3500000.0;\n\t    break;\n\t  case 'T':\n\t    northing = 4400000.0;\n\t    break;\n\t  case 'U':\n\t    northing = 5300000.0;\n\t    break;\n\t  case 'V':\n\t    northing = 6200000.0;\n\t    break;\n\t  case 'W':\n\t    northing = 7000000.0;\n\t    break;\n\t  case 'X':\n\t    northing = 7900000.0;\n\t    break;\n\t  default:\n\t    northing = -1.0;\n\t  }\n\t  if (northing >= 0.0) {\n\t    return northing;\n\t  }\n\t  else {\n\t    throw (\"Invalid zone letter: \" + zoneLetter);\n\t  }\n\n\t}\n\n\tfunction Point(x, y, z) {\n\t  if (!(this instanceof Point)) {\n\t    return new Point(x, y, z);\n\t  }\n\t  if (Array.isArray(x)) {\n\t    this.x = x[0];\n\t    this.y = x[1];\n\t    this.z = x[2] || 0.0;\n\t  } else if(typeof x === 'object') {\n\t    this.x = x.x;\n\t    this.y = x.y;\n\t    this.z = x.z || 0.0;\n\t  } else if (typeof x === 'string' && typeof y === 'undefined') {\n\t    var coords = x.split(',');\n\t    this.x = parseFloat(coords[0], 10);\n\t    this.y = parseFloat(coords[1], 10);\n\t    this.z = parseFloat(coords[2], 10) || 0.0;\n\t  } else {\n\t    this.x = x;\n\t    this.y = y;\n\t    this.z = z || 0.0;\n\t  }\n\t  console.warn('proj4.Point will be removed in version 3, use proj4.toPoint');\n\t}\n\n\tPoint.fromMGRS = function(mgrsStr) {\n\t  return new Point(toPoint$1(mgrsStr));\n\t};\n\tPoint.prototype.toMGRS = function(accuracy) {\n\t  return forward$1([this.x, this.y], accuracy);\n\t};\n\n\tvar version = \"2.4.3\";\n\n\tvar C00 = 1;\n\tvar C02 = 0.25;\n\tvar C04 = 0.046875;\n\tvar C06 = 0.01953125;\n\tvar C08 = 0.01068115234375;\n\tvar C22 = 0.75;\n\tvar C44 = 0.46875;\n\tvar C46 = 0.01302083333333333333;\n\tvar C48 = 0.00712076822916666666;\n\tvar C66 = 0.36458333333333333333;\n\tvar C68 = 0.00569661458333333333;\n\tvar C88 = 0.3076171875;\n\n\tvar pj_enfn = function(es) {\n\t  var en = [];\n\t  en[0] = C00 - es * (C02 + es * (C04 + es * (C06 + es * C08)));\n\t  en[1] = es * (C22 - es * (C04 + es * (C06 + es * C08)));\n\t  var t = es * es;\n\t  en[2] = t * (C44 - es * (C46 + es * C48));\n\t  t *= es;\n\t  en[3] = t * (C66 - es * C68);\n\t  en[4] = t * es * C88;\n\t  return en;\n\t};\n\n\tvar pj_mlfn = function(phi, sphi, cphi, en) {\n\t  cphi *= sphi;\n\t  sphi *= sphi;\n\t  return (en[0] * phi - cphi * (en[1] + sphi * (en[2] + sphi * (en[3] + sphi * en[4]))));\n\t};\n\n\tvar MAX_ITER = 20;\n\n\tvar pj_inv_mlfn = function(arg, es, en) {\n\t  var k = 1 / (1 - es);\n\t  var phi = arg;\n\t  for (var i = MAX_ITER; i; --i) { /* rarely goes over 2 iterations */\n\t    var s = Math.sin(phi);\n\t    var t = 1 - es * s * s;\n\t    //t = this.pj_mlfn(phi, s, Math.cos(phi), en) - arg;\n\t    //phi -= t * (t * Math.sqrt(t)) * k;\n\t    t = (pj_mlfn(phi, s, Math.cos(phi), en) - arg) * (t * Math.sqrt(t)) * k;\n\t    phi -= t;\n\t    if (Math.abs(t) < EPSLN) {\n\t      return phi;\n\t    }\n\t  }\n\t  //..reportError(\"cass:pj_inv_mlfn: Convergence error\");\n\t  return phi;\n\t};\n\n\t// Heavily based on this tmerc projection implementation\n\t// https://github.com/mbloch/mapshaper-proj/blob/master/src/projections/tmerc.js\n\n\tfunction init$2() {\n\t  this.x0 = this.x0 !== undefined ? this.x0 : 0;\n\t  this.y0 = this.y0 !== undefined ? this.y0 : 0;\n\t  this.long0 = this.long0 !== undefined ? this.long0 : 0;\n\t  this.lat0 = this.lat0 !== undefined ? this.lat0 : 0;\n\n\t  if (this.es) {\n\t    this.en = pj_enfn(this.es);\n\t    this.ml0 = pj_mlfn(this.lat0, Math.sin(this.lat0), Math.cos(this.lat0), this.en);\n\t  }\n\t}\n\n\t/**\n\t    Transverse Mercator Forward  - long/lat to x/y\n\t    long/lat in radians\n\t  */\n\tfunction forward$2(p) {\n\t  var lon = p.x;\n\t  var lat = p.y;\n\n\t  var delta_lon = adjust_lon(lon - this.long0);\n\t  var con;\n\t  var x, y;\n\t  var sin_phi = Math.sin(lat);\n\t  var cos_phi = Math.cos(lat);\n\n\t  if (!this.es) {\n\t    var b = cos_phi * Math.sin(delta_lon);\n\n\t    if ((Math.abs(Math.abs(b) - 1)) < EPSLN) {\n\t      return (93);\n\t    }\n\t    else {\n\t      x = 0.5 * this.a * this.k0 * Math.log((1 + b) / (1 - b)) + this.x0;\n\t      y = cos_phi * Math.cos(delta_lon) / Math.sqrt(1 - Math.pow(b, 2));\n\t      b = Math.abs(y);\n\n\t      if (b >= 1) {\n\t        if ((b - 1) > EPSLN) {\n\t          return (93);\n\t        }\n\t        else {\n\t          y = 0;\n\t        }\n\t      }\n\t      else {\n\t        y = Math.acos(y);\n\t      }\n\n\t      if (lat < 0) {\n\t        y = -y;\n\t      }\n\n\t      y = this.a * this.k0 * (y - this.lat0) + this.y0;\n\t    }\n\t  }\n\t  else {\n\t    var al = cos_phi * delta_lon;\n\t    var als = Math.pow(al, 2);\n\t    var c = this.ep2 * Math.pow(cos_phi, 2);\n\t    var cs = Math.pow(c, 2);\n\t    var tq = Math.abs(cos_phi) > EPSLN ? Math.tan(lat) : 0;\n\t    var t = Math.pow(tq, 2);\n\t    var ts = Math.pow(t, 2);\n\t    con = 1 - this.es * Math.pow(sin_phi, 2);\n\t    al = al / Math.sqrt(con);\n\t    var ml = pj_mlfn(lat, sin_phi, cos_phi, this.en);\n\n\t    x = this.a * (this.k0 * al * (1 +\n\t      als / 6 * (1 - t + c +\n\t      als / 20 * (5 - 18 * t + ts + 14 * c - 58 * t * c +\n\t      als / 42 * (61 + 179 * ts - ts * t - 479 * t))))) +\n\t      this.x0;\n\n\t    y = this.a * (this.k0 * (ml - this.ml0 +\n\t      sin_phi * delta_lon * al / 2 * (1 +\n\t      als / 12 * (5 - t + 9 * c + 4 * cs +\n\t      als / 30 * (61 + ts - 58 * t + 270 * c - 330 * t * c +\n\t      als / 56 * (1385 + 543 * ts - ts * t - 3111 * t)))))) +\n\t      this.y0;\n\t  }\n\n\t  p.x = x;\n\t  p.y = y;\n\n\t  return p;\n\t}\n\n\t/**\n\t    Transverse Mercator Inverse  -  x/y to long/lat\n\t  */\n\tfunction inverse$2(p) {\n\t  var con, phi;\n\t  var lat, lon;\n\t  var x = (p.x - this.x0) * (1 / this.a);\n\t  var y = (p.y - this.y0) * (1 / this.a);\n\n\t  if (!this.es) {\n\t    var f = Math.exp(x / this.k0);\n\t    var g = 0.5 * (f - 1 / f);\n\t    var temp = this.lat0 + y / this.k0;\n\t    var h = Math.cos(temp);\n\t    con = Math.sqrt((1 - Math.pow(h, 2)) / (1 + Math.pow(g, 2)));\n\t    lat = Math.asin(con);\n\n\t    if (y < 0) {\n\t      lat = -lat;\n\t    }\n\n\t    if ((g === 0) && (h === 0)) {\n\t      lon = 0;\n\t    }\n\t    else {\n\t      lon = adjust_lon(Math.atan2(g, h) + this.long0);\n\t    }\n\t  }\n\t  else { // ellipsoidal form\n\t    con = this.ml0 + y / this.k0;\n\t    phi = pj_inv_mlfn(con, this.es, this.en);\n\n\t    if (Math.abs(phi) < HALF_PI) {\n\t      var sin_phi = Math.sin(phi);\n\t      var cos_phi = Math.cos(phi);\n\t      var tan_phi = Math.abs(cos_phi) > EPSLN ? Math.tan(phi) : 0;\n\t      var c = this.ep2 * Math.pow(cos_phi, 2);\n\t      var cs = Math.pow(c, 2);\n\t      var t = Math.pow(tan_phi, 2);\n\t      var ts = Math.pow(t, 2);\n\t      con = 1 - this.es * Math.pow(sin_phi, 2);\n\t      var d = x * Math.sqrt(con) / this.k0;\n\t      var ds = Math.pow(d, 2);\n\t      con = con * tan_phi;\n\n\t      lat = phi - (con * ds / (1 - this.es)) * 0.5 * (1 -\n\t        ds / 12 * (5 + 3 * t - 9 * c * t + c - 4 * cs -\n\t        ds / 30 * (61 + 90 * t - 252 * c * t + 45 * ts + 46 * c -\n\t        ds / 56 * (1385 + 3633 * t + 4095 * ts + 1574 * ts * t))));\n\n\t      lon = adjust_lon(this.long0 + (d * (1 -\n\t        ds / 6 * (1 + 2 * t + c -\n\t        ds / 20 * (5 + 28 * t + 24 * ts + 8 * c * t + 6 * c -\n\t        ds / 42 * (61 + 662 * t + 1320 * ts + 720 * ts * t)))) / cos_phi));\n\t    }\n\t    else {\n\t      lat = HALF_PI * sign(y);\n\t      lon = 0;\n\t    }\n\t  }\n\n\t  p.x = lon;\n\t  p.y = lat;\n\n\t  return p;\n\t}\n\n\tvar names$3 = [\"Transverse_Mercator\", \"Transverse Mercator\", \"tmerc\"];\n\tvar tmerc = {\n\t  init: init$2,\n\t  forward: forward$2,\n\t  inverse: inverse$2,\n\t  names: names$3\n\t};\n\n\tvar sinh = function(x) {\n\t  var r = Math.exp(x);\n\t  r = (r - 1 / r) / 2;\n\t  return r;\n\t};\n\n\tvar hypot = function(x, y) {\n\t  x = Math.abs(x);\n\t  y = Math.abs(y);\n\t  var a = Math.max(x, y);\n\t  var b = Math.min(x, y) / (a ? a : 1);\n\n\t  return a * Math.sqrt(1 + Math.pow(b, 2));\n\t};\n\n\tvar log1py = function(x) {\n\t  var y = 1 + x;\n\t  var z = y - 1;\n\n\t  return z === 0 ? x : x * Math.log(y) / z;\n\t};\n\n\tvar asinhy = function(x) {\n\t  var y = Math.abs(x);\n\t  y = log1py(y * (1 + y / (hypot(1, y) + 1)));\n\n\t  return x < 0 ? -y : y;\n\t};\n\n\tvar gatg = function(pp, B) {\n\t  var cos_2B = 2 * Math.cos(2 * B);\n\t  var i = pp.length - 1;\n\t  var h1 = pp[i];\n\t  var h2 = 0;\n\t  var h;\n\n\t  while (--i >= 0) {\n\t    h = -h2 + cos_2B * h1 + pp[i];\n\t    h2 = h1;\n\t    h1 = h;\n\t  }\n\n\t  return (B + h * Math.sin(2 * B));\n\t};\n\n\tvar clens = function(pp, arg_r) {\n\t  var r = 2 * Math.cos(arg_r);\n\t  var i = pp.length - 1;\n\t  var hr1 = pp[i];\n\t  var hr2 = 0;\n\t  var hr;\n\n\t  while (--i >= 0) {\n\t    hr = -hr2 + r * hr1 + pp[i];\n\t    hr2 = hr1;\n\t    hr1 = hr;\n\t  }\n\n\t  return Math.sin(arg_r) * hr;\n\t};\n\n\tvar cosh = function(x) {\n\t  var r = Math.exp(x);\n\t  r = (r + 1 / r) / 2;\n\t  return r;\n\t};\n\n\tvar clens_cmplx = function(pp, arg_r, arg_i) {\n\t  var sin_arg_r = Math.sin(arg_r);\n\t  var cos_arg_r = Math.cos(arg_r);\n\t  var sinh_arg_i = sinh(arg_i);\n\t  var cosh_arg_i = cosh(arg_i);\n\t  var r = 2 * cos_arg_r * cosh_arg_i;\n\t  var i = -2 * sin_arg_r * sinh_arg_i;\n\t  var j = pp.length - 1;\n\t  var hr = pp[j];\n\t  var hi1 = 0;\n\t  var hr1 = 0;\n\t  var hi = 0;\n\t  var hr2;\n\t  var hi2;\n\n\t  while (--j >= 0) {\n\t    hr2 = hr1;\n\t    hi2 = hi1;\n\t    hr1 = hr;\n\t    hi1 = hi;\n\t    hr = -hr2 + r * hr1 - i * hi1 + pp[j];\n\t    hi = -hi2 + i * hr1 + r * hi1;\n\t  }\n\n\t  r = sin_arg_r * cosh_arg_i;\n\t  i = cos_arg_r * sinh_arg_i;\n\n\t  return [r * hr - i * hi, r * hi + i * hr];\n\t};\n\n\t// Heavily based on this etmerc projection implementation\n\t// https://github.com/mbloch/mapshaper-proj/blob/master/src/projections/etmerc.js\n\n\tfunction init$3() {\n\t  if (this.es === undefined || this.es <= 0) {\n\t    throw new Error('incorrect elliptical usage');\n\t  }\n\n\t  this.x0 = this.x0 !== undefined ? this.x0 : 0;\n\t  this.y0 = this.y0 !== undefined ? this.y0 : 0;\n\t  this.long0 = this.long0 !== undefined ? this.long0 : 0;\n\t  this.lat0 = this.lat0 !== undefined ? this.lat0 : 0;\n\n\t  this.cgb = [];\n\t  this.cbg = [];\n\t  this.utg = [];\n\t  this.gtu = [];\n\n\t  var f = this.es / (1 + Math.sqrt(1 - this.es));\n\t  var n = f / (2 - f);\n\t  var np = n;\n\n\t  this.cgb[0] = n * (2 + n * (-2 / 3 + n * (-2 + n * (116 / 45 + n * (26 / 45 + n * (-2854 / 675 ))))));\n\t  this.cbg[0] = n * (-2 + n * ( 2 / 3 + n * ( 4 / 3 + n * (-82 / 45 + n * (32 / 45 + n * (4642 / 4725))))));\n\n\t  np = np * n;\n\t  this.cgb[1] = np * (7 / 3 + n * (-8 / 5 + n * (-227 / 45 + n * (2704 / 315 + n * (2323 / 945)))));\n\t  this.cbg[1] = np * (5 / 3 + n * (-16 / 15 + n * ( -13 / 9 + n * (904 / 315 + n * (-1522 / 945)))));\n\n\t  np = np * n;\n\t  this.cgb[2] = np * (56 / 15 + n * (-136 / 35 + n * (-1262 / 105 + n * (73814 / 2835))));\n\t  this.cbg[2] = np * (-26 / 15 + n * (34 / 21 + n * (8 / 5 + n * (-12686 / 2835))));\n\n\t  np = np * n;\n\t  this.cgb[3] = np * (4279 / 630 + n * (-332 / 35 + n * (-399572 / 14175)));\n\t  this.cbg[3] = np * (1237 / 630 + n * (-12 / 5 + n * ( -24832 / 14175)));\n\n\t  np = np * n;\n\t  this.cgb[4] = np * (4174 / 315 + n * (-144838 / 6237));\n\t  this.cbg[4] = np * (-734 / 315 + n * (109598 / 31185));\n\n\t  np = np * n;\n\t  this.cgb[5] = np * (601676 / 22275);\n\t  this.cbg[5] = np * (444337 / 155925);\n\n\t  np = Math.pow(n, 2);\n\t  this.Qn = this.k0 / (1 + n) * (1 + np * (1 / 4 + np * (1 / 64 + np / 256)));\n\n\t  this.utg[0] = n * (-0.5 + n * ( 2 / 3 + n * (-37 / 96 + n * ( 1 / 360 + n * (81 / 512 + n * (-96199 / 604800))))));\n\t  this.gtu[0] = n * (0.5 + n * (-2 / 3 + n * (5 / 16 + n * (41 / 180 + n * (-127 / 288 + n * (7891 / 37800))))));\n\n\t  this.utg[1] = np * (-1 / 48 + n * (-1 / 15 + n * (437 / 1440 + n * (-46 / 105 + n * (1118711 / 3870720)))));\n\t  this.gtu[1] = np * (13 / 48 + n * (-3 / 5 + n * (557 / 1440 + n * (281 / 630 + n * (-1983433 / 1935360)))));\n\n\t  np = np * n;\n\t  this.utg[2] = np * (-17 / 480 + n * (37 / 840 + n * (209 / 4480 + n * (-5569 / 90720 ))));\n\t  this.gtu[2] = np * (61 / 240 + n * (-103 / 140 + n * (15061 / 26880 + n * (167603 / 181440))));\n\n\t  np = np * n;\n\t  this.utg[3] = np * (-4397 / 161280 + n * (11 / 504 + n * (830251 / 7257600)));\n\t  this.gtu[3] = np * (49561 / 161280 + n * (-179 / 168 + n * (6601661 / 7257600)));\n\n\t  np = np * n;\n\t  this.utg[4] = np * (-4583 / 161280 + n * (108847 / 3991680));\n\t  this.gtu[4] = np * (34729 / 80640 + n * (-3418889 / 1995840));\n\n\t  np = np * n;\n\t  this.utg[5] = np * (-20648693 / 638668800);\n\t  this.gtu[5] = np * (212378941 / 319334400);\n\n\t  var Z = gatg(this.cbg, this.lat0);\n\t  this.Zb = -this.Qn * (Z + clens(this.gtu, 2 * Z));\n\t}\n\n\tfunction forward$3(p) {\n\t  var Ce = adjust_lon(p.x - this.long0);\n\t  var Cn = p.y;\n\n\t  Cn = gatg(this.cbg, Cn);\n\t  var sin_Cn = Math.sin(Cn);\n\t  var cos_Cn = Math.cos(Cn);\n\t  var sin_Ce = Math.sin(Ce);\n\t  var cos_Ce = Math.cos(Ce);\n\n\t  Cn = Math.atan2(sin_Cn, cos_Ce * cos_Cn);\n\t  Ce = Math.atan2(sin_Ce * cos_Cn, hypot(sin_Cn, cos_Cn * cos_Ce));\n\t  Ce = asinhy(Math.tan(Ce));\n\n\t  var tmp = clens_cmplx(this.gtu, 2 * Cn, 2 * Ce);\n\n\t  Cn = Cn + tmp[0];\n\t  Ce = Ce + tmp[1];\n\n\t  var x;\n\t  var y;\n\n\t  if (Math.abs(Ce) <= 2.623395162778) {\n\t    x = this.a * (this.Qn * Ce) + this.x0;\n\t    y = this.a * (this.Qn * Cn + this.Zb) + this.y0;\n\t  }\n\t  else {\n\t    x = Infinity;\n\t    y = Infinity;\n\t  }\n\n\t  p.x = x;\n\t  p.y = y;\n\n\t  return p;\n\t}\n\n\tfunction inverse$3(p) {\n\t  var Ce = (p.x - this.x0) * (1 / this.a);\n\t  var Cn = (p.y - this.y0) * (1 / this.a);\n\n\t  Cn = (Cn - this.Zb) / this.Qn;\n\t  Ce = Ce / this.Qn;\n\n\t  var lon;\n\t  var lat;\n\n\t  if (Math.abs(Ce) <= 2.623395162778) {\n\t    var tmp = clens_cmplx(this.utg, 2 * Cn, 2 * Ce);\n\n\t    Cn = Cn + tmp[0];\n\t    Ce = Ce + tmp[1];\n\t    Ce = Math.atan(sinh(Ce));\n\n\t    var sin_Cn = Math.sin(Cn);\n\t    var cos_Cn = Math.cos(Cn);\n\t    var sin_Ce = Math.sin(Ce);\n\t    var cos_Ce = Math.cos(Ce);\n\n\t    Cn = Math.atan2(sin_Cn * cos_Ce, hypot(sin_Ce, cos_Ce * cos_Cn));\n\t    Ce = Math.atan2(sin_Ce, cos_Ce * cos_Cn);\n\n\t    lon = adjust_lon(Ce + this.long0);\n\t    lat = gatg(this.cgb, Cn);\n\t  }\n\t  else {\n\t    lon = Infinity;\n\t    lat = Infinity;\n\t  }\n\n\t  p.x = lon;\n\t  p.y = lat;\n\n\t  return p;\n\t}\n\n\tvar names$4 = [\"Extended_Transverse_Mercator\", \"Extended Transverse Mercator\", \"etmerc\"];\n\tvar etmerc = {\n\t  init: init$3,\n\t  forward: forward$3,\n\t  inverse: inverse$3,\n\t  names: names$4\n\t};\n\n\tvar adjust_zone = function(zone, lon) {\n\t  if (zone === undefined) {\n\t    zone = Math.floor((adjust_lon(lon) + Math.PI) * 30 / Math.PI) + 1;\n\n\t    if (zone < 0) {\n\t      return 0;\n\t    } else if (zone > 60) {\n\t      return 60;\n\t    }\n\t  }\n\t  return zone;\n\t};\n\n\tvar dependsOn = 'etmerc';\n\tfunction init$4() {\n\t  var zone = adjust_zone(this.zone, this.long0);\n\t  if (zone === undefined) {\n\t    throw new Error('unknown utm zone');\n\t  }\n\t  this.lat0 = 0;\n\t  this.long0 =  ((6 * Math.abs(zone)) - 183) * D2R;\n\t  this.x0 = 500000;\n\t  this.y0 = this.utmSouth ? 10000000 : 0;\n\t  this.k0 = 0.9996;\n\n\t  etmerc.init.apply(this);\n\t  this.forward = etmerc.forward;\n\t  this.inverse = etmerc.inverse;\n\t}\n\n\tvar names$5 = [\"Universal Transverse Mercator System\", \"utm\"];\n\tvar utm = {\n\t  init: init$4,\n\t  names: names$5,\n\t  dependsOn: dependsOn\n\t};\n\n\tvar srat = function(esinp, exp) {\n\t  return (Math.pow((1 - esinp) / (1 + esinp), exp));\n\t};\n\n\tvar MAX_ITER$1 = 20;\n\tfunction init$6() {\n\t  var sphi = Math.sin(this.lat0);\n\t  var cphi = Math.cos(this.lat0);\n\t  cphi *= cphi;\n\t  this.rc = Math.sqrt(1 - this.es) / (1 - this.es * sphi * sphi);\n\t  this.C = Math.sqrt(1 + this.es * cphi * cphi / (1 - this.es));\n\t  this.phic0 = Math.asin(sphi / this.C);\n\t  this.ratexp = 0.5 * this.C * this.e;\n\t  this.K = Math.tan(0.5 * this.phic0 + FORTPI) / (Math.pow(Math.tan(0.5 * this.lat0 + FORTPI), this.C) * srat(this.e * sphi, this.ratexp));\n\t}\n\n\tfunction forward$5(p) {\n\t  var lon = p.x;\n\t  var lat = p.y;\n\n\t  p.y = 2 * Math.atan(this.K * Math.pow(Math.tan(0.5 * lat + FORTPI), this.C) * srat(this.e * Math.sin(lat), this.ratexp)) - HALF_PI;\n\t  p.x = this.C * lon;\n\t  return p;\n\t}\n\n\tfunction inverse$5(p) {\n\t  var DEL_TOL = 1e-14;\n\t  var lon = p.x / this.C;\n\t  var lat = p.y;\n\t  var num = Math.pow(Math.tan(0.5 * lat + FORTPI) / this.K, 1 / this.C);\n\t  for (var i = MAX_ITER$1; i > 0; --i) {\n\t    lat = 2 * Math.atan(num * srat(this.e * Math.sin(p.y), - 0.5 * this.e)) - HALF_PI;\n\t    if (Math.abs(lat - p.y) < DEL_TOL) {\n\t      break;\n\t    }\n\t    p.y = lat;\n\t  }\n\t  /* convergence failed */\n\t  if (!i) {\n\t    return null;\n\t  }\n\t  p.x = lon;\n\t  p.y = lat;\n\t  return p;\n\t}\n\n\tvar names$7 = [\"gauss\"];\n\tvar gauss = {\n\t  init: init$6,\n\t  forward: forward$5,\n\t  inverse: inverse$5,\n\t  names: names$7\n\t};\n\n\tfunction init$5() {\n\t  gauss.init.apply(this);\n\t  if (!this.rc) {\n\t    return;\n\t  }\n\t  this.sinc0 = Math.sin(this.phic0);\n\t  this.cosc0 = Math.cos(this.phic0);\n\t  this.R2 = 2 * this.rc;\n\t  if (!this.title) {\n\t    this.title = \"Oblique Stereographic Alternative\";\n\t  }\n\t}\n\n\tfunction forward$4(p) {\n\t  var sinc, cosc, cosl, k;\n\t  p.x = adjust_lon(p.x - this.long0);\n\t  gauss.forward.apply(this, [p]);\n\t  sinc = Math.sin(p.y);\n\t  cosc = Math.cos(p.y);\n\t  cosl = Math.cos(p.x);\n\t  k = this.k0 * this.R2 / (1 + this.sinc0 * sinc + this.cosc0 * cosc * cosl);\n\t  p.x = k * cosc * Math.sin(p.x);\n\t  p.y = k * (this.cosc0 * sinc - this.sinc0 * cosc * cosl);\n\t  p.x = this.a * p.x + this.x0;\n\t  p.y = this.a * p.y + this.y0;\n\t  return p;\n\t}\n\n\tfunction inverse$4(p) {\n\t  var sinc, cosc, lon, lat, rho;\n\t  p.x = (p.x - this.x0) / this.a;\n\t  p.y = (p.y - this.y0) / this.a;\n\n\t  p.x /= this.k0;\n\t  p.y /= this.k0;\n\t  if ((rho = Math.sqrt(p.x * p.x + p.y * p.y))) {\n\t    var c = 2 * Math.atan2(rho, this.R2);\n\t    sinc = Math.sin(c);\n\t    cosc = Math.cos(c);\n\t    lat = Math.asin(cosc * this.sinc0 + p.y * sinc * this.cosc0 / rho);\n\t    lon = Math.atan2(p.x * sinc, rho * this.cosc0 * cosc - p.y * this.sinc0 * sinc);\n\t  }\n\t  else {\n\t    lat = this.phic0;\n\t    lon = 0;\n\t  }\n\n\t  p.x = lon;\n\t  p.y = lat;\n\t  gauss.inverse.apply(this, [p]);\n\t  p.x = adjust_lon(p.x + this.long0);\n\t  return p;\n\t}\n\n\tvar names$6 = [\"Stereographic_North_Pole\", \"Oblique_Stereographic\", \"Polar_Stereographic\", \"sterea\",\"Oblique Stereographic Alternative\"];\n\tvar sterea = {\n\t  init: init$5,\n\t  forward: forward$4,\n\t  inverse: inverse$4,\n\t  names: names$6\n\t};\n\n\tfunction ssfn_(phit, sinphi, eccen) {\n\t  sinphi *= eccen;\n\t  return (Math.tan(0.5 * (HALF_PI + phit)) * Math.pow((1 - sinphi) / (1 + sinphi), 0.5 * eccen));\n\t}\n\n\tfunction init$7() {\n\t  this.coslat0 = Math.cos(this.lat0);\n\t  this.sinlat0 = Math.sin(this.lat0);\n\t  if (this.sphere) {\n\t    if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) {\n\t      this.k0 = 0.5 * (1 + sign(this.lat0) * Math.sin(this.lat_ts));\n\t    }\n\t  }\n\t  else {\n\t    if (Math.abs(this.coslat0) <= EPSLN) {\n\t      if (this.lat0 > 0) {\n\t        //North pole\n\t        //trace('stere:north pole');\n\t        this.con = 1;\n\t      }\n\t      else {\n\t        //South pole\n\t        //trace('stere:south pole');\n\t        this.con = -1;\n\t      }\n\t    }\n\t    this.cons = Math.sqrt(Math.pow(1 + this.e, 1 + this.e) * Math.pow(1 - this.e, 1 - this.e));\n\t    if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) {\n\t      this.k0 = 0.5 * this.cons * msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)) / tsfnz(this.e, this.con * this.lat_ts, this.con * Math.sin(this.lat_ts));\n\t    }\n\t    this.ms1 = msfnz(this.e, this.sinlat0, this.coslat0);\n\t    this.X0 = 2 * Math.atan(this.ssfn_(this.lat0, this.sinlat0, this.e)) - HALF_PI;\n\t    this.cosX0 = Math.cos(this.X0);\n\t    this.sinX0 = Math.sin(this.X0);\n\t  }\n\t}\n\n\t// Stereographic forward equations--mapping lat,long to x,y\n\tfunction forward$6(p) {\n\t  var lon = p.x;\n\t  var lat = p.y;\n\t  var sinlat = Math.sin(lat);\n\t  var coslat = Math.cos(lat);\n\t  var A, X, sinX, cosX, ts, rh;\n\t  var dlon = adjust_lon(lon - this.long0);\n\n\t  if (Math.abs(Math.abs(lon - this.long0) - Math.PI) <= EPSLN && Math.abs(lat + this.lat0) <= EPSLN) {\n\t    //case of the origine point\n\t    //trace('stere:this is the origin point');\n\t    p.x = NaN;\n\t    p.y = NaN;\n\t    return p;\n\t  }\n\t  if (this.sphere) {\n\t    //trace('stere:sphere case');\n\t    A = 2 * this.k0 / (1 + this.sinlat0 * sinlat + this.coslat0 * coslat * Math.cos(dlon));\n\t    p.x = this.a * A * coslat * Math.sin(dlon) + this.x0;\n\t    p.y = this.a * A * (this.coslat0 * sinlat - this.sinlat0 * coslat * Math.cos(dlon)) + this.y0;\n\t    return p;\n\t  }\n\t  else {\n\t    X = 2 * Math.atan(this.ssfn_(lat, sinlat, this.e)) - HALF_PI;\n\t    cosX = Math.cos(X);\n\t    sinX = Math.sin(X);\n\t    if (Math.abs(this.coslat0) <= EPSLN) {\n\t      ts = tsfnz(this.e, lat * this.con, this.con * sinlat);\n\t      rh = 2 * this.a * this.k0 * ts / this.cons;\n\t      p.x = this.x0 + rh * Math.sin(lon - this.long0);\n\t      p.y = this.y0 - this.con * rh * Math.cos(lon - this.long0);\n\t      //trace(p.toString());\n\t      return p;\n\t    }\n\t    else if (Math.abs(this.sinlat0) < EPSLN) {\n\t      //Eq\n\t      //trace('stere:equateur');\n\t      A = 2 * this.a * this.k0 / (1 + cosX * Math.cos(dlon));\n\t      p.y = A * sinX;\n\t    }\n\t    else {\n\t      //other case\n\t      //trace('stere:normal case');\n\t      A = 2 * this.a * this.k0 * this.ms1 / (this.cosX0 * (1 + this.sinX0 * sinX + this.cosX0 * cosX * Math.cos(dlon)));\n\t      p.y = A * (this.cosX0 * sinX - this.sinX0 * cosX * Math.cos(dlon)) + this.y0;\n\t    }\n\t    p.x = A * cosX * Math.sin(dlon) + this.x0;\n\t  }\n\t  //trace(p.toString());\n\t  return p;\n\t}\n\n\t//* Stereographic inverse equations--mapping x,y to lat/long\n\tfunction inverse$6(p) {\n\t  p.x -= this.x0;\n\t  p.y -= this.y0;\n\t  var lon, lat, ts, ce, Chi;\n\t  var rh = Math.sqrt(p.x * p.x + p.y * p.y);\n\t  if (this.sphere) {\n\t    var c = 2 * Math.atan(rh / (0.5 * this.a * this.k0));\n\t    lon = this.long0;\n\t    lat = this.lat0;\n\t    if (rh <= EPSLN) {\n\t      p.x = lon;\n\t      p.y = lat;\n\t      return p;\n\t    }\n\t    lat = Math.asin(Math.cos(c) * this.sinlat0 + p.y * Math.sin(c) * this.coslat0 / rh);\n\t    if (Math.abs(this.coslat0) < EPSLN) {\n\t      if (this.lat0 > 0) {\n\t        lon = adjust_lon(this.long0 + Math.atan2(p.x, - 1 * p.y));\n\t      }\n\t      else {\n\t        lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y));\n\t      }\n\t    }\n\t    else {\n\t      lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(c), rh * this.coslat0 * Math.cos(c) - p.y * this.sinlat0 * Math.sin(c)));\n\t    }\n\t    p.x = lon;\n\t    p.y = lat;\n\t    return p;\n\t  }\n\t  else {\n\t    if (Math.abs(this.coslat0) <= EPSLN) {\n\t      if (rh <= EPSLN) {\n\t        lat = this.lat0;\n\t        lon = this.long0;\n\t        p.x = lon;\n\t        p.y = lat;\n\t        //trace(p.toString());\n\t        return p;\n\t      }\n\t      p.x *= this.con;\n\t      p.y *= this.con;\n\t      ts = rh * this.cons / (2 * this.a * this.k0);\n\t      lat = this.con * phi2z(this.e, ts);\n\t      lon = this.con * adjust_lon(this.con * this.long0 + Math.atan2(p.x, - 1 * p.y));\n\t    }\n\t    else {\n\t      ce = 2 * Math.atan(rh * this.cosX0 / (2 * this.a * this.k0 * this.ms1));\n\t      lon = this.long0;\n\t      if (rh <= EPSLN) {\n\t        Chi = this.X0;\n\t      }\n\t      else {\n\t        Chi = Math.asin(Math.cos(ce) * this.sinX0 + p.y * Math.sin(ce) * this.cosX0 / rh);\n\t        lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(ce), rh * this.cosX0 * Math.cos(ce) - p.y * this.sinX0 * Math.sin(ce)));\n\t      }\n\t      lat = -1 * phi2z(this.e, Math.tan(0.5 * (HALF_PI + Chi)));\n\t    }\n\t  }\n\t  p.x = lon;\n\t  p.y = lat;\n\n\t  //trace(p.toString());\n\t  return p;\n\n\t}\n\n\tvar names$8 = [\"stere\", \"Stereographic_South_Pole\", \"Polar Stereographic (variant B)\"];\n\tvar stere = {\n\t  init: init$7,\n\t  forward: forward$6,\n\t  inverse: inverse$6,\n\t  names: names$8,\n\t  ssfn_: ssfn_\n\t};\n\n\t/*\n\t  references:\n\t    Formules et constantes pour le Calcul pour la\n\t    projection cylindrique conforme à axe oblique et pour la transformation entre\n\t    des systèmes de référence.\n\t    http://www.swisstopo.admin.ch/internet/swisstopo/fr/home/topics/survey/sys/refsys/switzerland.parsysrelated1.31216.downloadList.77004.DownloadFile.tmp/swissprojectionfr.pdf\n\t  */\n\n\tfunction init$8() {\n\t  var phy0 = this.lat0;\n\t  this.lambda0 = this.long0;\n\t  var sinPhy0 = Math.sin(phy0);\n\t  var semiMajorAxis = this.a;\n\t  var invF = this.rf;\n\t  var flattening = 1 / invF;\n\t  var e2 = 2 * flattening - Math.pow(flattening, 2);\n\t  var e = this.e = Math.sqrt(e2);\n\t  this.R = this.k0 * semiMajorAxis * Math.sqrt(1 - e2) / (1 - e2 * Math.pow(sinPhy0, 2));\n\t  this.alpha = Math.sqrt(1 + e2 / (1 - e2) * Math.pow(Math.cos(phy0), 4));\n\t  this.b0 = Math.asin(sinPhy0 / this.alpha);\n\t  var k1 = Math.log(Math.tan(Math.PI / 4 + this.b0 / 2));\n\t  var k2 = Math.log(Math.tan(Math.PI / 4 + phy0 / 2));\n\t  var k3 = Math.log((1 + e * sinPhy0) / (1 - e * sinPhy0));\n\t  this.K = k1 - this.alpha * k2 + this.alpha * e / 2 * k3;\n\t}\n\n\tfunction forward$7(p) {\n\t  var Sa1 = Math.log(Math.tan(Math.PI / 4 - p.y / 2));\n\t  var Sa2 = this.e / 2 * Math.log((1 + this.e * Math.sin(p.y)) / (1 - this.e * Math.sin(p.y)));\n\t  var S = -this.alpha * (Sa1 + Sa2) + this.K;\n\n\t  // spheric latitude\n\t  var b = 2 * (Math.atan(Math.exp(S)) - Math.PI / 4);\n\n\t  // spheric longitude\n\t  var I = this.alpha * (p.x - this.lambda0);\n\n\t  // psoeudo equatorial rotation\n\t  var rotI = Math.atan(Math.sin(I) / (Math.sin(this.b0) * Math.tan(b) + Math.cos(this.b0) * Math.cos(I)));\n\n\t  var rotB = Math.asin(Math.cos(this.b0) * Math.sin(b) - Math.sin(this.b0) * Math.cos(b) * Math.cos(I));\n\n\t  p.y = this.R / 2 * Math.log((1 + Math.sin(rotB)) / (1 - Math.sin(rotB))) + this.y0;\n\t  p.x = this.R * rotI + this.x0;\n\t  return p;\n\t}\n\n\tfunction inverse$7(p) {\n\t  var Y = p.x - this.x0;\n\t  var X = p.y - this.y0;\n\n\t  var rotI = Y / this.R;\n\t  var rotB = 2 * (Math.atan(Math.exp(X / this.R)) - Math.PI / 4);\n\n\t  var b = Math.asin(Math.cos(this.b0) * Math.sin(rotB) + Math.sin(this.b0) * Math.cos(rotB) * Math.cos(rotI));\n\t  var I = Math.atan(Math.sin(rotI) / (Math.cos(this.b0) * Math.cos(rotI) - Math.sin(this.b0) * Math.tan(rotB)));\n\n\t  var lambda = this.lambda0 + I / this.alpha;\n\n\t  var S = 0;\n\t  var phy = b;\n\t  var prevPhy = -1000;\n\t  var iteration = 0;\n\t  while (Math.abs(phy - prevPhy) > 0.0000001) {\n\t    if (++iteration > 20) {\n\t      //...reportError(\"omercFwdInfinity\");\n\t      return;\n\t    }\n\t    //S = Math.log(Math.tan(Math.PI / 4 + phy / 2));\n\t    S = 1 / this.alpha * (Math.log(Math.tan(Math.PI / 4 + b / 2)) - this.K) + this.e * Math.log(Math.tan(Math.PI / 4 + Math.asin(this.e * Math.sin(phy)) / 2));\n\t    prevPhy = phy;\n\t    phy = 2 * Math.atan(Math.exp(S)) - Math.PI / 2;\n\t  }\n\n\t  p.x = lambda;\n\t  p.y = phy;\n\t  return p;\n\t}\n\n\tvar names$9 = [\"somerc\"];\n\tvar somerc = {\n\t  init: init$8,\n\t  forward: forward$7,\n\t  inverse: inverse$7,\n\t  names: names$9\n\t};\n\n\t/* Initialize the Oblique Mercator  projection\n\t    ------------------------------------------*/\n\tfunction init$9() {\n\t  this.no_off = this.no_off || false;\n\t  this.no_rot = this.no_rot || false;\n\n\t  if (isNaN(this.k0)) {\n\t    this.k0 = 1;\n\t  }\n\t  var sinlat = Math.sin(this.lat0);\n\t  var coslat = Math.cos(this.lat0);\n\t  var con = this.e * sinlat;\n\n\t  this.bl = Math.sqrt(1 + this.es / (1 - this.es) * Math.pow(coslat, 4));\n\t  this.al = this.a * this.bl * this.k0 * Math.sqrt(1 - this.es) / (1 - con * con);\n\t  var t0 = tsfnz(this.e, this.lat0, sinlat);\n\t  var dl = this.bl / coslat * Math.sqrt((1 - this.es) / (1 - con * con));\n\t  if (dl * dl < 1) {\n\t    dl = 1;\n\t  }\n\t  var fl;\n\t  var gl;\n\t  if (!isNaN(this.longc)) {\n\t    //Central point and azimuth method\n\n\t    if (this.lat0 >= 0) {\n\t      fl = dl + Math.sqrt(dl * dl - 1);\n\t    }\n\t    else {\n\t      fl = dl - Math.sqrt(dl * dl - 1);\n\t    }\n\t    this.el = fl * Math.pow(t0, this.bl);\n\t    gl = 0.5 * (fl - 1 / fl);\n\t    this.gamma0 = Math.asin(Math.sin(this.alpha) / dl);\n\t    this.long0 = this.longc - Math.asin(gl * Math.tan(this.gamma0)) / this.bl;\n\n\t  }\n\t  else {\n\t    //2 points method\n\t    var t1 = tsfnz(this.e, this.lat1, Math.sin(this.lat1));\n\t    var t2 = tsfnz(this.e, this.lat2, Math.sin(this.lat2));\n\t    if (this.lat0 >= 0) {\n\t      this.el = (dl + Math.sqrt(dl * dl - 1)) * Math.pow(t0, this.bl);\n\t    }\n\t    else {\n\t      this.el = (dl - Math.sqrt(dl * dl - 1)) * Math.pow(t0, this.bl);\n\t    }\n\t    var hl = Math.pow(t1, this.bl);\n\t    var ll = Math.pow(t2, this.bl);\n\t    fl = this.el / hl;\n\t    gl = 0.5 * (fl - 1 / fl);\n\t    var jl = (this.el * this.el - ll * hl) / (this.el * this.el + ll * hl);\n\t    var pl = (ll - hl) / (ll + hl);\n\t    var dlon12 = adjust_lon(this.long1 - this.long2);\n\t    this.long0 = 0.5 * (this.long1 + this.long2) - Math.atan(jl * Math.tan(0.5 * this.bl * (dlon12)) / pl) / this.bl;\n\t    this.long0 = adjust_lon(this.long0);\n\t    var dlon10 = adjust_lon(this.long1 - this.long0);\n\t    this.gamma0 = Math.atan(Math.sin(this.bl * (dlon10)) / gl);\n\t    this.alpha = Math.asin(dl * Math.sin(this.gamma0));\n\t  }\n\n\t  if (this.no_off) {\n\t    this.uc = 0;\n\t  }\n\t  else {\n\t    if (this.lat0 >= 0) {\n\t      this.uc = this.al / this.bl * Math.atan2(Math.sqrt(dl * dl - 1), Math.cos(this.alpha));\n\t    }\n\t    else {\n\t      this.uc = -1 * this.al / this.bl * Math.atan2(Math.sqrt(dl * dl - 1), Math.cos(this.alpha));\n\t    }\n\t  }\n\n\t}\n\n\t/* Oblique Mercator forward equations--mapping lat,long to x,y\n\t    ----------------------------------------------------------*/\n\tfunction forward$8(p) {\n\t  var lon = p.x;\n\t  var lat = p.y;\n\t  var dlon = adjust_lon(lon - this.long0);\n\t  var us, vs;\n\t  var con;\n\t  if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) {\n\t    if (lat > 0) {\n\t      con = -1;\n\t    }\n\t    else {\n\t      con = 1;\n\t    }\n\t    vs = this.al / this.bl * Math.log(Math.tan(FORTPI + con * this.gamma0 * 0.5));\n\t    us = -1 * con * HALF_PI * this.al / this.bl;\n\t  }\n\t  else {\n\t    var t = tsfnz(this.e, lat, Math.sin(lat));\n\t    var ql = this.el / Math.pow(t, this.bl);\n\t    var sl = 0.5 * (ql - 1 / ql);\n\t    var tl = 0.5 * (ql + 1 / ql);\n\t    var vl = Math.sin(this.bl * (dlon));\n\t    var ul = (sl * Math.sin(this.gamma0) - vl * Math.cos(this.gamma0)) / tl;\n\t    if (Math.abs(Math.abs(ul) - 1) <= EPSLN) {\n\t      vs = Number.POSITIVE_INFINITY;\n\t    }\n\t    else {\n\t      vs = 0.5 * this.al * Math.log((1 - ul) / (1 + ul)) / this.bl;\n\t    }\n\t    if (Math.abs(Math.cos(this.bl * (dlon))) <= EPSLN) {\n\t      us = this.al * this.bl * (dlon);\n\t    }\n\t    else {\n\t      us = this.al * Math.atan2(sl * Math.cos(this.gamma0) + vl * Math.sin(this.gamma0), Math.cos(this.bl * dlon)) / this.bl;\n\t    }\n\t  }\n\n\t  if (this.no_rot) {\n\t    p.x = this.x0 + us;\n\t    p.y = this.y0 + vs;\n\t  }\n\t  else {\n\n\t    us -= this.uc;\n\t    p.x = this.x0 + vs * Math.cos(this.alpha) + us * Math.sin(this.alpha);\n\t    p.y = this.y0 + us * Math.cos(this.alpha) - vs * Math.sin(this.alpha);\n\t  }\n\t  return p;\n\t}\n\n\tfunction inverse$8(p) {\n\t  var us, vs;\n\t  if (this.no_rot) {\n\t    vs = p.y - this.y0;\n\t    us = p.x - this.x0;\n\t  }\n\t  else {\n\t    vs = (p.x - this.x0) * Math.cos(this.alpha) - (p.y - this.y0) * Math.sin(this.alpha);\n\t    us = (p.y - this.y0) * Math.cos(this.alpha) + (p.x - this.x0) * Math.sin(this.alpha);\n\t    us += this.uc;\n\t  }\n\t  var qp = Math.exp(-1 * this.bl * vs / this.al);\n\t  var sp = 0.5 * (qp - 1 / qp);\n\t  var tp = 0.5 * (qp + 1 / qp);\n\t  var vp = Math.sin(this.bl * us / this.al);\n\t  var up = (vp * Math.cos(this.gamma0) + sp * Math.sin(this.gamma0)) / tp;\n\t  var ts = Math.pow(this.el / Math.sqrt((1 + up) / (1 - up)), 1 / this.bl);\n\t  if (Math.abs(up - 1) < EPSLN) {\n\t    p.x = this.long0;\n\t    p.y = HALF_PI;\n\t  }\n\t  else if (Math.abs(up + 1) < EPSLN) {\n\t    p.x = this.long0;\n\t    p.y = -1 * HALF_PI;\n\t  }\n\t  else {\n\t    p.y = phi2z(this.e, ts);\n\t    p.x = adjust_lon(this.long0 - Math.atan2(sp * Math.cos(this.gamma0) - vp * Math.sin(this.gamma0), Math.cos(this.bl * us / this.al)) / this.bl);\n\t  }\n\t  return p;\n\t}\n\n\tvar names$10 = [\"Hotine_Oblique_Mercator\", \"Hotine Oblique Mercator\", \"Hotine_Oblique_Mercator_Azimuth_Natural_Origin\", \"Hotine_Oblique_Mercator_Azimuth_Center\", \"omerc\"];\n\tvar omerc = {\n\t  init: init$9,\n\t  forward: forward$8,\n\t  inverse: inverse$8,\n\t  names: names$10\n\t};\n\n\tfunction init$10() {\n\n\t  // array of:  r_maj,r_min,lat1,lat2,c_lon,c_lat,false_east,false_north\n\t  //double c_lat;                   /* center latitude                      */\n\t  //double c_lon;                   /* center longitude                     */\n\t  //double lat1;                    /* first standard parallel              */\n\t  //double lat2;                    /* second standard parallel             */\n\t  //double r_maj;                   /* major axis                           */\n\t  //double r_min;                   /* minor axis                           */\n\t  //double false_east;              /* x offset in meters                   */\n\t  //double false_north;             /* y offset in meters                   */\n\n\t  if (!this.lat2) {\n\t    this.lat2 = this.lat1;\n\t  } //if lat2 is not defined\n\t  if (!this.k0) {\n\t    this.k0 = 1;\n\t  }\n\t  this.x0 = this.x0 || 0;\n\t  this.y0 = this.y0 || 0;\n\t  // Standard Parallels cannot be equal and on opposite sides of the equator\n\t  if (Math.abs(this.lat1 + this.lat2) < EPSLN) {\n\t    return;\n\t  }\n\n\t  var temp = this.b / this.a;\n\t  this.e = Math.sqrt(1 - temp * temp);\n\n\t  var sin1 = Math.sin(this.lat1);\n\t  var cos1 = Math.cos(this.lat1);\n\t  var ms1 = msfnz(this.e, sin1, cos1);\n\t  var ts1 = tsfnz(this.e, this.lat1, sin1);\n\n\t  var sin2 = Math.sin(this.lat2);\n\t  var cos2 = Math.cos(this.lat2);\n\t  var ms2 = msfnz(this.e, sin2, cos2);\n\t  var ts2 = tsfnz(this.e, this.lat2, sin2);\n\n\t  var ts0 = tsfnz(this.e, this.lat0, Math.sin(this.lat0));\n\n\t  if (Math.abs(this.lat1 - this.lat2) > EPSLN) {\n\t    this.ns = Math.log(ms1 / ms2) / Math.log(ts1 / ts2);\n\t  }\n\t  else {\n\t    this.ns = sin1;\n\t  }\n\t  if (isNaN(this.ns)) {\n\t    this.ns = sin1;\n\t  }\n\t  this.f0 = ms1 / (this.ns * Math.pow(ts1, this.ns));\n\t  this.rh = this.a * this.f0 * Math.pow(ts0, this.ns);\n\t  if (!this.title) {\n\t    this.title = \"Lambert Conformal Conic\";\n\t  }\n\t}\n\n\t// Lambert Conformal conic forward equations--mapping lat,long to x,y\n\t// -----------------------------------------------------------------\n\tfunction forward$9(p) {\n\n\t  var lon = p.x;\n\t  var lat = p.y;\n\n\t  // singular cases :\n\t  if (Math.abs(2 * Math.abs(lat) - Math.PI) <= EPSLN) {\n\t    lat = sign(lat) * (HALF_PI - 2 * EPSLN);\n\t  }\n\n\t  var con = Math.abs(Math.abs(lat) - HALF_PI);\n\t  var ts, rh1;\n\t  if (con > EPSLN) {\n\t    ts = tsfnz(this.e, lat, Math.sin(lat));\n\t    rh1 = this.a * this.f0 * Math.pow(ts, this.ns);\n\t  }\n\t  else {\n\t    con = lat * this.ns;\n\t    if (con <= 0) {\n\t      return null;\n\t    }\n\t    rh1 = 0;\n\t  }\n\t  var theta = this.ns * adjust_lon(lon - this.long0);\n\t  p.x = this.k0 * (rh1 * Math.sin(theta)) + this.x0;\n\t  p.y = this.k0 * (this.rh - rh1 * Math.cos(theta)) + this.y0;\n\n\t  return p;\n\t}\n\n\t// Lambert Conformal Conic inverse equations--mapping x,y to lat/long\n\t// -----------------------------------------------------------------\n\tfunction inverse$9(p) {\n\n\t  var rh1, con, ts;\n\t  var lat, lon;\n\t  var x = (p.x - this.x0) / this.k0;\n\t  var y = (this.rh - (p.y - this.y0) / this.k0);\n\t  if (this.ns > 0) {\n\t    rh1 = Math.sqrt(x * x + y * y);\n\t    con = 1;\n\t  }\n\t  else {\n\t    rh1 = -Math.sqrt(x * x + y * y);\n\t    con = -1;\n\t  }\n\t  var theta = 0;\n\t  if (rh1 !== 0) {\n\t    theta = Math.atan2((con * x), (con * y));\n\t  }\n\t  if ((rh1 !== 0) || (this.ns > 0)) {\n\t    con = 1 / this.ns;\n\t    ts = Math.pow((rh1 / (this.a * this.f0)), con);\n\t    lat = phi2z(this.e, ts);\n\t    if (lat === -9999) {\n\t      return null;\n\t    }\n\t  }\n\t  else {\n\t    lat = -HALF_PI;\n\t  }\n\t  lon = adjust_lon(theta / this.ns + this.long0);\n\n\t  p.x = lon;\n\t  p.y = lat;\n\t  return p;\n\t}\n\n\tvar names$11 = [\"Lambert Tangential Conformal Conic Projection\", \"Lambert_Conformal_Conic\", \"Lambert_Conformal_Conic_2SP\", \"lcc\"];\n\tvar lcc = {\n\t  init: init$10,\n\t  forward: forward$9,\n\t  inverse: inverse$9,\n\t  names: names$11\n\t};\n\n\tfunction init$11() {\n\t  this.a = 6377397.155;\n\t  this.es = 0.006674372230614;\n\t  this.e = Math.sqrt(this.es);\n\t  if (!this.lat0) {\n\t    this.lat0 = 0.863937979737193;\n\t  }\n\t  if (!this.long0) {\n\t    this.long0 = 0.7417649320975901 - 0.308341501185665;\n\t  }\n\t  /* if scale not set default to 0.9999 */\n\t  if (!this.k0) {\n\t    this.k0 = 0.9999;\n\t  }\n\t  this.s45 = 0.785398163397448; /* 45 */\n\t  this.s90 = 2 * this.s45;\n\t  this.fi0 = this.lat0;\n\t  this.e2 = this.es;\n\t  this.e = Math.sqrt(this.e2);\n\t  this.alfa = Math.sqrt(1 + (this.e2 * Math.pow(Math.cos(this.fi0), 4)) / (1 - this.e2));\n\t  this.uq = 1.04216856380474;\n\t  this.u0 = Math.asin(Math.sin(this.fi0) / this.alfa);\n\t  this.g = Math.pow((1 + this.e * Math.sin(this.fi0)) / (1 - this.e * Math.sin(this.fi0)), this.alfa * this.e / 2);\n\t  this.k = Math.tan(this.u0 / 2 + this.s45) / Math.pow(Math.tan(this.fi0 / 2 + this.s45), this.alfa) * this.g;\n\t  this.k1 = this.k0;\n\t  this.n0 = this.a * Math.sqrt(1 - this.e2) / (1 - this.e2 * Math.pow(Math.sin(this.fi0), 2));\n\t  this.s0 = 1.37008346281555;\n\t  this.n = Math.sin(this.s0);\n\t  this.ro0 = this.k1 * this.n0 / Math.tan(this.s0);\n\t  this.ad = this.s90 - this.uq;\n\t}\n\n\t/* ellipsoid */\n\t/* calculate xy from lat/lon */\n\t/* Constants, identical to inverse transform function */\n\tfunction forward$10(p) {\n\t  var gfi, u, deltav, s, d, eps, ro;\n\t  var lon = p.x;\n\t  var lat = p.y;\n\t  var delta_lon = adjust_lon(lon - this.long0);\n\t  /* Transformation */\n\t  gfi = Math.pow(((1 + this.e * Math.sin(lat)) / (1 - this.e * Math.sin(lat))), (this.alfa * this.e / 2));\n\t  u = 2 * (Math.atan(this.k * Math.pow(Math.tan(lat / 2 + this.s45), this.alfa) / gfi) - this.s45);\n\t  deltav = -delta_lon * this.alfa;\n\t  s = Math.asin(Math.cos(this.ad) * Math.sin(u) + Math.sin(this.ad) * Math.cos(u) * Math.cos(deltav));\n\t  d = Math.asin(Math.cos(u) * Math.sin(deltav) / Math.cos(s));\n\t  eps = this.n * d;\n\t  ro = this.ro0 * Math.pow(Math.tan(this.s0 / 2 + this.s45), this.n) / Math.pow(Math.tan(s / 2 + this.s45), this.n);\n\t  p.y = ro * Math.cos(eps) / 1;\n\t  p.x = ro * Math.sin(eps) / 1;\n\n\t  if (!this.czech) {\n\t    p.y *= -1;\n\t    p.x *= -1;\n\t  }\n\t  return (p);\n\t}\n\n\t/* calculate lat/lon from xy */\n\tfunction inverse$10(p) {\n\t  var u, deltav, s, d, eps, ro, fi1;\n\t  var ok;\n\n\t  /* Transformation */\n\t  /* revert y, x*/\n\t  var tmp = p.x;\n\t  p.x = p.y;\n\t  p.y = tmp;\n\t  if (!this.czech) {\n\t    p.y *= -1;\n\t    p.x *= -1;\n\t  }\n\t  ro = Math.sqrt(p.x * p.x + p.y * p.y);\n\t  eps = Math.atan2(p.y, p.x);\n\t  d = eps / Math.sin(this.s0);\n\t  s = 2 * (Math.atan(Math.pow(this.ro0 / ro, 1 / this.n) * Math.tan(this.s0 / 2 + this.s45)) - this.s45);\n\t  u = Math.asin(Math.cos(this.ad) * Math.sin(s) - Math.sin(this.ad) * Math.cos(s) * Math.cos(d));\n\t  deltav = Math.asin(Math.cos(s) * Math.sin(d) / Math.cos(u));\n\t  p.x = this.long0 - deltav / this.alfa;\n\t  fi1 = u;\n\t  ok = 0;\n\t  var iter = 0;\n\t  do {\n\t    p.y = 2 * (Math.atan(Math.pow(this.k, - 1 / this.alfa) * Math.pow(Math.tan(u / 2 + this.s45), 1 / this.alfa) * Math.pow((1 + this.e * Math.sin(fi1)) / (1 - this.e * Math.sin(fi1)), this.e / 2)) - this.s45);\n\t    if (Math.abs(fi1 - p.y) < 0.0000000001) {\n\t      ok = 1;\n\t    }\n\t    fi1 = p.y;\n\t    iter += 1;\n\t  } while (ok === 0 && iter < 15);\n\t  if (iter >= 15) {\n\t    return null;\n\t  }\n\n\t  return (p);\n\t}\n\n\tvar names$12 = [\"Krovak\", \"krovak\"];\n\tvar krovak = {\n\t  init: init$11,\n\t  forward: forward$10,\n\t  inverse: inverse$10,\n\t  names: names$12\n\t};\n\n\tvar mlfn = function(e0, e1, e2, e3, phi) {\n\t  return (e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi));\n\t};\n\n\tvar e0fn = function(x) {\n\t  return (1 - 0.25 * x * (1 + x / 16 * (3 + 1.25 * x)));\n\t};\n\n\tvar e1fn = function(x) {\n\t  return (0.375 * x * (1 + 0.25 * x * (1 + 0.46875 * x)));\n\t};\n\n\tvar e2fn = function(x) {\n\t  return (0.05859375 * x * x * (1 + 0.75 * x));\n\t};\n\n\tvar e3fn = function(x) {\n\t  return (x * x * x * (35 / 3072));\n\t};\n\n\tvar gN = function(a, e, sinphi) {\n\t  var temp = e * sinphi;\n\t  return a / Math.sqrt(1 - temp * temp);\n\t};\n\n\tvar adjust_lat = function(x) {\n\t  return (Math.abs(x) < HALF_PI) ? x : (x - (sign(x) * Math.PI));\n\t};\n\n\tvar imlfn = function(ml, e0, e1, e2, e3) {\n\t  var phi;\n\t  var dphi;\n\n\t  phi = ml / e0;\n\t  for (var i = 0; i < 15; i++) {\n\t    dphi = (ml - (e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi))) / (e0 - 2 * e1 * Math.cos(2 * phi) + 4 * e2 * Math.cos(4 * phi) - 6 * e3 * Math.cos(6 * phi));\n\t    phi += dphi;\n\t    if (Math.abs(dphi) <= 0.0000000001) {\n\t      return phi;\n\t    }\n\t  }\n\n\t  //..reportError(\"IMLFN-CONV:Latitude failed to converge after 15 iterations\");\n\t  return NaN;\n\t};\n\n\tfunction init$12() {\n\t  if (!this.sphere) {\n\t    this.e0 = e0fn(this.es);\n\t    this.e1 = e1fn(this.es);\n\t    this.e2 = e2fn(this.es);\n\t    this.e3 = e3fn(this.es);\n\t    this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0);\n\t  }\n\t}\n\n\t/* Cassini forward equations--mapping lat,long to x,y\n\t  -----------------------------------------------------------------------*/\n\tfunction forward$11(p) {\n\n\t  /* Forward equations\n\t      -----------------*/\n\t  var x, y;\n\t  var lam = p.x;\n\t  var phi = p.y;\n\t  lam = adjust_lon(lam - this.long0);\n\n\t  if (this.sphere) {\n\t    x = this.a * Math.asin(Math.cos(phi) * Math.sin(lam));\n\t    y = this.a * (Math.atan2(Math.tan(phi), Math.cos(lam)) - this.lat0);\n\t  }\n\t  else {\n\t    //ellipsoid\n\t    var sinphi = Math.sin(phi);\n\t    var cosphi = Math.cos(phi);\n\t    var nl = gN(this.a, this.e, sinphi);\n\t    var tl = Math.tan(phi) * Math.tan(phi);\n\t    var al = lam * Math.cos(phi);\n\t    var asq = al * al;\n\t    var cl = this.es * cosphi * cosphi / (1 - this.es);\n\t    var ml = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi);\n\n\t    x = nl * al * (1 - asq * tl * (1 / 6 - (8 - tl + 8 * cl) * asq / 120));\n\t    y = ml - this.ml0 + nl * sinphi / cosphi * asq * (0.5 + (5 - tl + 6 * cl) * asq / 24);\n\n\n\t  }\n\n\t  p.x = x + this.x0;\n\t  p.y = y + this.y0;\n\t  return p;\n\t}\n\n\t/* Inverse equations\n\t  -----------------*/\n\tfunction inverse$11(p) {\n\t  p.x -= this.x0;\n\t  p.y -= this.y0;\n\t  var x = p.x / this.a;\n\t  var y = p.y / this.a;\n\t  var phi, lam;\n\n\t  if (this.sphere) {\n\t    var dd = y + this.lat0;\n\t    phi = Math.asin(Math.sin(dd) * Math.cos(x));\n\t    lam = Math.atan2(Math.tan(x), Math.cos(dd));\n\t  }\n\t  else {\n\t    /* ellipsoid */\n\t    var ml1 = this.ml0 / this.a + y;\n\t    var phi1 = imlfn(ml1, this.e0, this.e1, this.e2, this.e3);\n\t    if (Math.abs(Math.abs(phi1) - HALF_PI) <= EPSLN) {\n\t      p.x = this.long0;\n\t      p.y = HALF_PI;\n\t      if (y < 0) {\n\t        p.y *= -1;\n\t      }\n\t      return p;\n\t    }\n\t    var nl1 = gN(this.a, this.e, Math.sin(phi1));\n\n\t    var rl1 = nl1 * nl1 * nl1 / this.a / this.a * (1 - this.es);\n\t    var tl1 = Math.pow(Math.tan(phi1), 2);\n\t    var dl = x * this.a / nl1;\n\t    var dsq = dl * dl;\n\t    phi = phi1 - nl1 * Math.tan(phi1) / rl1 * dl * dl * (0.5 - (1 + 3 * tl1) * dl * dl / 24);\n\t    lam = dl * (1 - dsq * (tl1 / 3 + (1 + 3 * tl1) * tl1 * dsq / 15)) / Math.cos(phi1);\n\n\t  }\n\n\t  p.x = adjust_lon(lam + this.long0);\n\t  p.y = adjust_lat(phi);\n\t  return p;\n\n\t}\n\n\tvar names$13 = [\"Cassini\", \"Cassini_Soldner\", \"cass\"];\n\tvar cass = {\n\t  init: init$12,\n\t  forward: forward$11,\n\t  inverse: inverse$11,\n\t  names: names$13\n\t};\n\n\tvar qsfnz = function(eccent, sinphi) {\n\t  var con;\n\t  if (eccent > 1.0e-7) {\n\t    con = eccent * sinphi;\n\t    return ((1 - eccent * eccent) * (sinphi / (1 - con * con) - (0.5 / eccent) * Math.log((1 - con) / (1 + con))));\n\t  }\n\t  else {\n\t    return (2 * sinphi);\n\t  }\n\t};\n\n\t/*\n\t  reference\n\t    \"New Equal-Area Map Projections for Noncircular Regions\", John P. Snyder,\n\t    The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355.\n\t  */\n\n\tvar S_POLE = 1;\n\n\tvar N_POLE = 2;\n\tvar EQUIT = 3;\n\tvar OBLIQ = 4;\n\n\t/* Initialize the Lambert Azimuthal Equal Area projection\n\t  ------------------------------------------------------*/\n\tfunction init$13() {\n\t  var t = Math.abs(this.lat0);\n\t  if (Math.abs(t - HALF_PI) < EPSLN) {\n\t    this.mode = this.lat0 < 0 ? this.S_POLE : this.N_POLE;\n\t  }\n\t  else if (Math.abs(t) < EPSLN) {\n\t    this.mode = this.EQUIT;\n\t  }\n\t  else {\n\t    this.mode = this.OBLIQ;\n\t  }\n\t  if (this.es > 0) {\n\t    var sinphi;\n\n\t    this.qp = qsfnz(this.e, 1);\n\t    this.mmf = 0.5 / (1 - this.es);\n\t    this.apa = authset(this.es);\n\t    switch (this.mode) {\n\t    case this.N_POLE:\n\t      this.dd = 1;\n\t      break;\n\t    case this.S_POLE:\n\t      this.dd = 1;\n\t      break;\n\t    case this.EQUIT:\n\t      this.rq = Math.sqrt(0.5 * this.qp);\n\t      this.dd = 1 / this.rq;\n\t      this.xmf = 1;\n\t      this.ymf = 0.5 * this.qp;\n\t      break;\n\t    case this.OBLIQ:\n\t      this.rq = Math.sqrt(0.5 * this.qp);\n\t      sinphi = Math.sin(this.lat0);\n\t      this.sinb1 = qsfnz(this.e, sinphi) / this.qp;\n\t      this.cosb1 = Math.sqrt(1 - this.sinb1 * this.sinb1);\n\t      this.dd = Math.cos(this.lat0) / (Math.sqrt(1 - this.es * sinphi * sinphi) * this.rq * this.cosb1);\n\t      this.ymf = (this.xmf = this.rq) / this.dd;\n\t      this.xmf *= this.dd;\n\t      break;\n\t    }\n\t  }\n\t  else {\n\t    if (this.mode === this.OBLIQ) {\n\t      this.sinph0 = Math.sin(this.lat0);\n\t      this.cosph0 = Math.cos(this.lat0);\n\t    }\n\t  }\n\t}\n\n\t/* Lambert Azimuthal Equal Area forward equations--mapping lat,long to x,y\n\t  -----------------------------------------------------------------------*/\n\tfunction forward$12(p) {\n\n\t  /* Forward equations\n\t      -----------------*/\n\t  var x, y, coslam, sinlam, sinphi, q, sinb, cosb, b, cosphi;\n\t  var lam = p.x;\n\t  var phi = p.y;\n\n\t  lam = adjust_lon(lam - this.long0);\n\t  if (this.sphere) {\n\t    sinphi = Math.sin(phi);\n\t    cosphi = Math.cos(phi);\n\t    coslam = Math.cos(lam);\n\t    if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {\n\t      y = (this.mode === this.EQUIT) ? 1 + cosphi * coslam : 1 + this.sinph0 * sinphi + this.cosph0 * cosphi * coslam;\n\t      if (y <= EPSLN) {\n\t        return null;\n\t      }\n\t      y = Math.sqrt(2 / y);\n\t      x = y * cosphi * Math.sin(lam);\n\t      y *= (this.mode === this.EQUIT) ? sinphi : this.cosph0 * sinphi - this.sinph0 * cosphi * coslam;\n\t    }\n\t    else if (this.mode === this.N_POLE || this.mode === this.S_POLE) {\n\t      if (this.mode === this.N_POLE) {\n\t        coslam = -coslam;\n\t      }\n\t      if (Math.abs(phi + this.phi0) < EPSLN) {\n\t        return null;\n\t      }\n\t      y = FORTPI - phi * 0.5;\n\t      y = 2 * ((this.mode === this.S_POLE) ? Math.cos(y) : Math.sin(y));\n\t      x = y * Math.sin(lam);\n\t      y *= coslam;\n\t    }\n\t  }\n\t  else {\n\t    sinb = 0;\n\t    cosb = 0;\n\t    b = 0;\n\t    coslam = Math.cos(lam);\n\t    sinlam = Math.sin(lam);\n\t    sinphi = Math.sin(phi);\n\t    q = qsfnz(this.e, sinphi);\n\t    if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {\n\t      sinb = q / this.qp;\n\t      cosb = Math.sqrt(1 - sinb * sinb);\n\t    }\n\t    switch (this.mode) {\n\t    case this.OBLIQ:\n\t      b = 1 + this.sinb1 * sinb + this.cosb1 * cosb * coslam;\n\t      break;\n\t    case this.EQUIT:\n\t      b = 1 + cosb * coslam;\n\t      break;\n\t    case this.N_POLE:\n\t      b = HALF_PI + phi;\n\t      q = this.qp - q;\n\t      break;\n\t    case this.S_POLE:\n\t      b = phi - HALF_PI;\n\t      q = this.qp + q;\n\t      break;\n\t    }\n\t    if (Math.abs(b) < EPSLN) {\n\t      return null;\n\t    }\n\t    switch (this.mode) {\n\t    case this.OBLIQ:\n\t    case this.EQUIT:\n\t      b = Math.sqrt(2 / b);\n\t      if (this.mode === this.OBLIQ) {\n\t        y = this.ymf * b * (this.cosb1 * sinb - this.sinb1 * cosb * coslam);\n\t      }\n\t      else {\n\t        y = (b = Math.sqrt(2 / (1 + cosb * coslam))) * sinb * this.ymf;\n\t      }\n\t      x = this.xmf * b * cosb * sinlam;\n\t      break;\n\t    case this.N_POLE:\n\t    case this.S_POLE:\n\t      if (q >= 0) {\n\t        x = (b = Math.sqrt(q)) * sinlam;\n\t        y = coslam * ((this.mode === this.S_POLE) ? b : -b);\n\t      }\n\t      else {\n\t        x = y = 0;\n\t      }\n\t      break;\n\t    }\n\t  }\n\n\t  p.x = this.a * x + this.x0;\n\t  p.y = this.a * y + this.y0;\n\t  return p;\n\t}\n\n\t/* Inverse equations\n\t  -----------------*/\n\tfunction inverse$12(p) {\n\t  p.x -= this.x0;\n\t  p.y -= this.y0;\n\t  var x = p.x / this.a;\n\t  var y = p.y / this.a;\n\t  var lam, phi, cCe, sCe, q, rho, ab;\n\t  if (this.sphere) {\n\t    var cosz = 0,\n\t      rh, sinz = 0;\n\n\t    rh = Math.sqrt(x * x + y * y);\n\t    phi = rh * 0.5;\n\t    if (phi > 1) {\n\t      return null;\n\t    }\n\t    phi = 2 * Math.asin(phi);\n\t    if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {\n\t      sinz = Math.sin(phi);\n\t      cosz = Math.cos(phi);\n\t    }\n\t    switch (this.mode) {\n\t    case this.EQUIT:\n\t      phi = (Math.abs(rh) <= EPSLN) ? 0 : Math.asin(y * sinz / rh);\n\t      x *= sinz;\n\t      y = cosz * rh;\n\t      break;\n\t    case this.OBLIQ:\n\t      phi = (Math.abs(rh) <= EPSLN) ? this.phi0 : Math.asin(cosz * this.sinph0 + y * sinz * this.cosph0 / rh);\n\t      x *= sinz * this.cosph0;\n\t      y = (cosz - Math.sin(phi) * this.sinph0) * rh;\n\t      break;\n\t    case this.N_POLE:\n\t      y = -y;\n\t      phi = HALF_PI - phi;\n\t      break;\n\t    case this.S_POLE:\n\t      phi -= HALF_PI;\n\t      break;\n\t    }\n\t    lam = (y === 0 && (this.mode === this.EQUIT || this.mode === this.OBLIQ)) ? 0 : Math.atan2(x, y);\n\t  }\n\t  else {\n\t    ab = 0;\n\t    if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {\n\t      x /= this.dd;\n\t      y *= this.dd;\n\t      rho = Math.sqrt(x * x + y * y);\n\t      if (rho < EPSLN) {\n\t        p.x = 0;\n\t        p.y = this.phi0;\n\t        return p;\n\t      }\n\t      sCe = 2 * Math.asin(0.5 * rho / this.rq);\n\t      cCe = Math.cos(sCe);\n\t      x *= (sCe = Math.sin(sCe));\n\t      if (this.mode === this.OBLIQ) {\n\t        ab = cCe * this.sinb1 + y * sCe * this.cosb1 / rho;\n\t        q = this.qp * ab;\n\t        y = rho * this.cosb1 * cCe - y * this.sinb1 * sCe;\n\t      }\n\t      else {\n\t        ab = y * sCe / rho;\n\t        q = this.qp * ab;\n\t        y = rho * cCe;\n\t      }\n\t    }\n\t    else if (this.mode === this.N_POLE || this.mode === this.S_POLE) {\n\t      if (this.mode === this.N_POLE) {\n\t        y = -y;\n\t      }\n\t      q = (x * x + y * y);\n\t      if (!q) {\n\t        p.x = 0;\n\t        p.y = this.phi0;\n\t        return p;\n\t      }\n\t      ab = 1 - q / this.qp;\n\t      if (this.mode === this.S_POLE) {\n\t        ab = -ab;\n\t      }\n\t    }\n\t    lam = Math.atan2(x, y);\n\t    phi = authlat(Math.asin(ab), this.apa);\n\t  }\n\n\t  p.x = adjust_lon(this.long0 + lam);\n\t  p.y = phi;\n\t  return p;\n\t}\n\n\t/* determine latitude from authalic latitude */\n\tvar P00 = 0.33333333333333333333;\n\n\tvar P01 = 0.17222222222222222222;\n\tvar P02 = 0.10257936507936507936;\n\tvar P10 = 0.06388888888888888888;\n\tvar P11 = 0.06640211640211640211;\n\tvar P20 = 0.01641501294219154443;\n\n\tfunction authset(es) {\n\t  var t;\n\t  var APA = [];\n\t  APA[0] = es * P00;\n\t  t = es * es;\n\t  APA[0] += t * P01;\n\t  APA[1] = t * P10;\n\t  t *= es;\n\t  APA[0] += t * P02;\n\t  APA[1] += t * P11;\n\t  APA[2] = t * P20;\n\t  return APA;\n\t}\n\n\tfunction authlat(beta, APA) {\n\t  var t = beta + beta;\n\t  return (beta + APA[0] * Math.sin(t) + APA[1] * Math.sin(t + t) + APA[2] * Math.sin(t + t + t));\n\t}\n\n\tvar names$14 = [\"Lambert Azimuthal Equal Area\", \"Lambert_Azimuthal_Equal_Area\", \"laea\"];\n\tvar laea = {\n\t  init: init$13,\n\t  forward: forward$12,\n\t  inverse: inverse$12,\n\t  names: names$14,\n\t  S_POLE: S_POLE,\n\t  N_POLE: N_POLE,\n\t  EQUIT: EQUIT,\n\t  OBLIQ: OBLIQ\n\t};\n\n\tvar asinz = function(x) {\n\t  if (Math.abs(x) > 1) {\n\t    x = (x > 1) ? 1 : -1;\n\t  }\n\t  return Math.asin(x);\n\t};\n\n\tfunction init$14() {\n\n\t  if (Math.abs(this.lat1 + this.lat2) < EPSLN) {\n\t    return;\n\t  }\n\t  this.temp = this.b / this.a;\n\t  this.es = 1 - Math.pow(this.temp, 2);\n\t  this.e3 = Math.sqrt(this.es);\n\n\t  this.sin_po = Math.sin(this.lat1);\n\t  this.cos_po = Math.cos(this.lat1);\n\t  this.t1 = this.sin_po;\n\t  this.con = this.sin_po;\n\t  this.ms1 = msfnz(this.e3, this.sin_po, this.cos_po);\n\t  this.qs1 = qsfnz(this.e3, this.sin_po, this.cos_po);\n\n\t  this.sin_po = Math.sin(this.lat2);\n\t  this.cos_po = Math.cos(this.lat2);\n\t  this.t2 = this.sin_po;\n\t  this.ms2 = msfnz(this.e3, this.sin_po, this.cos_po);\n\t  this.qs2 = qsfnz(this.e3, this.sin_po, this.cos_po);\n\n\t  this.sin_po = Math.sin(this.lat0);\n\t  this.cos_po = Math.cos(this.lat0);\n\t  this.t3 = this.sin_po;\n\t  this.qs0 = qsfnz(this.e3, this.sin_po, this.cos_po);\n\n\t  if (Math.abs(this.lat1 - this.lat2) > EPSLN) {\n\t    this.ns0 = (this.ms1 * this.ms1 - this.ms2 * this.ms2) / (this.qs2 - this.qs1);\n\t  }\n\t  else {\n\t    this.ns0 = this.con;\n\t  }\n\t  this.c = this.ms1 * this.ms1 + this.ns0 * this.qs1;\n\t  this.rh = this.a * Math.sqrt(this.c - this.ns0 * this.qs0) / this.ns0;\n\t}\n\n\t/* Albers Conical Equal Area forward equations--mapping lat,long to x,y\n\t  -------------------------------------------------------------------*/\n\tfunction forward$13(p) {\n\n\t  var lon = p.x;\n\t  var lat = p.y;\n\n\t  this.sin_phi = Math.sin(lat);\n\t  this.cos_phi = Math.cos(lat);\n\n\t  var qs = qsfnz(this.e3, this.sin_phi, this.cos_phi);\n\t  var rh1 = this.a * Math.sqrt(this.c - this.ns0 * qs) / this.ns0;\n\t  var theta = this.ns0 * adjust_lon(lon - this.long0);\n\t  var x = rh1 * Math.sin(theta) + this.x0;\n\t  var y = this.rh - rh1 * Math.cos(theta) + this.y0;\n\n\t  p.x = x;\n\t  p.y = y;\n\t  return p;\n\t}\n\n\tfunction inverse$13(p) {\n\t  var rh1, qs, con, theta, lon, lat;\n\n\t  p.x -= this.x0;\n\t  p.y = this.rh - p.y + this.y0;\n\t  if (this.ns0 >= 0) {\n\t    rh1 = Math.sqrt(p.x * p.x + p.y * p.y);\n\t    con = 1;\n\t  }\n\t  else {\n\t    rh1 = -Math.sqrt(p.x * p.x + p.y * p.y);\n\t    con = -1;\n\t  }\n\t  theta = 0;\n\t  if (rh1 !== 0) {\n\t    theta = Math.atan2(con * p.x, con * p.y);\n\t  }\n\t  con = rh1 * this.ns0 / this.a;\n\t  if (this.sphere) {\n\t    lat = Math.asin((this.c - con * con) / (2 * this.ns0));\n\t  }\n\t  else {\n\t    qs = (this.c - con * con) / this.ns0;\n\t    lat = this.phi1z(this.e3, qs);\n\t  }\n\n\t  lon = adjust_lon(theta / this.ns0 + this.long0);\n\t  p.x = lon;\n\t  p.y = lat;\n\t  return p;\n\t}\n\n\t/* Function to compute phi1, the latitude for the inverse of the\n\t   Albers Conical Equal-Area projection.\n\t-------------------------------------------*/\n\tfunction phi1z(eccent, qs) {\n\t  var sinphi, cosphi, con, com, dphi;\n\t  var phi = asinz(0.5 * qs);\n\t  if (eccent < EPSLN) {\n\t    return phi;\n\t  }\n\n\t  var eccnts = eccent * eccent;\n\t  for (var i = 1; i <= 25; i++) {\n\t    sinphi = Math.sin(phi);\n\t    cosphi = Math.cos(phi);\n\t    con = eccent * sinphi;\n\t    com = 1 - con * con;\n\t    dphi = 0.5 * com * com / cosphi * (qs / (1 - eccnts) - sinphi / com + 0.5 / eccent * Math.log((1 - con) / (1 + con)));\n\t    phi = phi + dphi;\n\t    if (Math.abs(dphi) <= 1e-7) {\n\t      return phi;\n\t    }\n\t  }\n\t  return null;\n\t}\n\n\tvar names$15 = [\"Albers_Conic_Equal_Area\", \"Albers\", \"aea\"];\n\tvar aea = {\n\t  init: init$14,\n\t  forward: forward$13,\n\t  inverse: inverse$13,\n\t  names: names$15,\n\t  phi1z: phi1z\n\t};\n\n\t/*\n\t  reference:\n\t    Wolfram Mathworld \"Gnomonic Projection\"\n\t    http://mathworld.wolfram.com/GnomonicProjection.html\n\t    Accessed: 12th November 2009\n\t  */\n\tfunction init$15() {\n\n\t  /* Place parameters in static storage for common use\n\t      -------------------------------------------------*/\n\t  this.sin_p14 = Math.sin(this.lat0);\n\t  this.cos_p14 = Math.cos(this.lat0);\n\t  // Approximation for projecting points to the horizon (infinity)\n\t  this.infinity_dist = 1000 * this.a;\n\t  this.rc = 1;\n\t}\n\n\t/* Gnomonic forward equations--mapping lat,long to x,y\n\t    ---------------------------------------------------*/\n\tfunction forward$14(p) {\n\t  var sinphi, cosphi; /* sin and cos value        */\n\t  var dlon; /* delta longitude value      */\n\t  var coslon; /* cos of longitude        */\n\t  var ksp; /* scale factor          */\n\t  var g;\n\t  var x, y;\n\t  var lon = p.x;\n\t  var lat = p.y;\n\t  /* Forward equations\n\t      -----------------*/\n\t  dlon = adjust_lon(lon - this.long0);\n\n\t  sinphi = Math.sin(lat);\n\t  cosphi = Math.cos(lat);\n\n\t  coslon = Math.cos(dlon);\n\t  g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon;\n\t  ksp = 1;\n\t  if ((g > 0) || (Math.abs(g) <= EPSLN)) {\n\t    x = this.x0 + this.a * ksp * cosphi * Math.sin(dlon) / g;\n\t    y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon) / g;\n\t  }\n\t  else {\n\n\t    // Point is in the opposing hemisphere and is unprojectable\n\t    // We still need to return a reasonable point, so we project\n\t    // to infinity, on a bearing\n\t    // equivalent to the northern hemisphere equivalent\n\t    // This is a reasonable approximation for short shapes and lines that\n\t    // straddle the horizon.\n\n\t    x = this.x0 + this.infinity_dist * cosphi * Math.sin(dlon);\n\t    y = this.y0 + this.infinity_dist * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon);\n\n\t  }\n\t  p.x = x;\n\t  p.y = y;\n\t  return p;\n\t}\n\n\tfunction inverse$14(p) {\n\t  var rh; /* Rho */\n\t  var sinc, cosc;\n\t  var c;\n\t  var lon, lat;\n\n\t  /* Inverse equations\n\t      -----------------*/\n\t  p.x = (p.x - this.x0) / this.a;\n\t  p.y = (p.y - this.y0) / this.a;\n\n\t  p.x /= this.k0;\n\t  p.y /= this.k0;\n\n\t  if ((rh = Math.sqrt(p.x * p.x + p.y * p.y))) {\n\t    c = Math.atan2(rh, this.rc);\n\t    sinc = Math.sin(c);\n\t    cosc = Math.cos(c);\n\n\t    lat = asinz(cosc * this.sin_p14 + (p.y * sinc * this.cos_p14) / rh);\n\t    lon = Math.atan2(p.x * sinc, rh * this.cos_p14 * cosc - p.y * this.sin_p14 * sinc);\n\t    lon = adjust_lon(this.long0 + lon);\n\t  }\n\t  else {\n\t    lat = this.phic0;\n\t    lon = 0;\n\t  }\n\n\t  p.x = lon;\n\t  p.y = lat;\n\t  return p;\n\t}\n\n\tvar names$16 = [\"gnom\"];\n\tvar gnom = {\n\t  init: init$15,\n\t  forward: forward$14,\n\t  inverse: inverse$14,\n\t  names: names$16\n\t};\n\n\tvar iqsfnz = function(eccent, q) {\n\t  var temp = 1 - (1 - eccent * eccent) / (2 * eccent) * Math.log((1 - eccent) / (1 + eccent));\n\t  if (Math.abs(Math.abs(q) - temp) < 1.0E-6) {\n\t    if (q < 0) {\n\t      return (-1 * HALF_PI);\n\t    }\n\t    else {\n\t      return HALF_PI;\n\t    }\n\t  }\n\t  //var phi = 0.5* q/(1-eccent*eccent);\n\t  var phi = Math.asin(0.5 * q);\n\t  var dphi;\n\t  var sin_phi;\n\t  var cos_phi;\n\t  var con;\n\t  for (var i = 0; i < 30; i++) {\n\t    sin_phi = Math.sin(phi);\n\t    cos_phi = Math.cos(phi);\n\t    con = eccent * sin_phi;\n\t    dphi = Math.pow(1 - con * con, 2) / (2 * cos_phi) * (q / (1 - eccent * eccent) - sin_phi / (1 - con * con) + 0.5 / eccent * Math.log((1 - con) / (1 + con)));\n\t    phi += dphi;\n\t    if (Math.abs(dphi) <= 0.0000000001) {\n\t      return phi;\n\t    }\n\t  }\n\n\t  //console.log(\"IQSFN-CONV:Latitude failed to converge after 30 iterations\");\n\t  return NaN;\n\t};\n\n\t/*\n\t  reference:\n\t    \"Cartographic Projection Procedures for the UNIX Environment-\n\t    A User's Manual\" by Gerald I. Evenden,\n\t    USGS Open File Report 90-284and Release 4 Interim Reports (2003)\n\t*/\n\tfunction init$16() {\n\t  //no-op\n\t  if (!this.sphere) {\n\t    this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts));\n\t  }\n\t}\n\n\t/* Cylindrical Equal Area forward equations--mapping lat,long to x,y\n\t    ------------------------------------------------------------*/\n\tfunction forward$15(p) {\n\t  var lon = p.x;\n\t  var lat = p.y;\n\t  var x, y;\n\t  /* Forward equations\n\t      -----------------*/\n\t  var dlon = adjust_lon(lon - this.long0);\n\t  if (this.sphere) {\n\t    x = this.x0 + this.a * dlon * Math.cos(this.lat_ts);\n\t    y = this.y0 + this.a * Math.sin(lat) / Math.cos(this.lat_ts);\n\t  }\n\t  else {\n\t    var qs = qsfnz(this.e, Math.sin(lat));\n\t    x = this.x0 + this.a * this.k0 * dlon;\n\t    y = this.y0 + this.a * qs * 0.5 / this.k0;\n\t  }\n\n\t  p.x = x;\n\t  p.y = y;\n\t  return p;\n\t}\n\n\t/* Cylindrical Equal Area inverse equations--mapping x,y to lat/long\n\t    ------------------------------------------------------------*/\n\tfunction inverse$15(p) {\n\t  p.x -= this.x0;\n\t  p.y -= this.y0;\n\t  var lon, lat;\n\n\t  if (this.sphere) {\n\t    lon = adjust_lon(this.long0 + (p.x / this.a) / Math.cos(this.lat_ts));\n\t    lat = Math.asin((p.y / this.a) * Math.cos(this.lat_ts));\n\t  }\n\t  else {\n\t    lat = iqsfnz(this.e, 2 * p.y * this.k0 / this.a);\n\t    lon = adjust_lon(this.long0 + p.x / (this.a * this.k0));\n\t  }\n\n\t  p.x = lon;\n\t  p.y = lat;\n\t  return p;\n\t}\n\n\tvar names$17 = [\"cea\"];\n\tvar cea = {\n\t  init: init$16,\n\t  forward: forward$15,\n\t  inverse: inverse$15,\n\t  names: names$17\n\t};\n\n\tfunction init$17() {\n\n\t  this.x0 = this.x0 || 0;\n\t  this.y0 = this.y0 || 0;\n\t  this.lat0 = this.lat0 || 0;\n\t  this.long0 = this.long0 || 0;\n\t  this.lat_ts = this.lat_ts || 0;\n\t  this.title = this.title || \"Equidistant Cylindrical (Plate Carre)\";\n\n\t  this.rc = Math.cos(this.lat_ts);\n\t}\n\n\t// forward equations--mapping lat,long to x,y\n\t// -----------------------------------------------------------------\n\tfunction forward$16(p) {\n\n\t  var lon = p.x;\n\t  var lat = p.y;\n\n\t  var dlon = adjust_lon(lon - this.long0);\n\t  var dlat = adjust_lat(lat - this.lat0);\n\t  p.x = this.x0 + (this.a * dlon * this.rc);\n\t  p.y = this.y0 + (this.a * dlat);\n\t  return p;\n\t}\n\n\t// inverse equations--mapping x,y to lat/long\n\t// -----------------------------------------------------------------\n\tfunction inverse$16(p) {\n\n\t  var x = p.x;\n\t  var y = p.y;\n\n\t  p.x = adjust_lon(this.long0 + ((x - this.x0) / (this.a * this.rc)));\n\t  p.y = adjust_lat(this.lat0 + ((y - this.y0) / (this.a)));\n\t  return p;\n\t}\n\n\tvar names$18 = [\"Equirectangular\", \"Equidistant_Cylindrical\", \"eqc\"];\n\tvar eqc = {\n\t  init: init$17,\n\t  forward: forward$16,\n\t  inverse: inverse$16,\n\t  names: names$18\n\t};\n\n\tvar MAX_ITER$2 = 20;\n\n\tfunction init$18() {\n\t  /* Place parameters in static storage for common use\n\t      -------------------------------------------------*/\n\t  this.temp = this.b / this.a;\n\t  this.es = 1 - Math.pow(this.temp, 2); // devait etre dans tmerc.js mais n y est pas donc je commente sinon retour de valeurs nulles\n\t  this.e = Math.sqrt(this.es);\n\t  this.e0 = e0fn(this.es);\n\t  this.e1 = e1fn(this.es);\n\t  this.e2 = e2fn(this.es);\n\t  this.e3 = e3fn(this.es);\n\t  this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); //si que des zeros le calcul ne se fait pas\n\t}\n\n\t/* Polyconic forward equations--mapping lat,long to x,y\n\t    ---------------------------------------------------*/\n\tfunction forward$17(p) {\n\t  var lon = p.x;\n\t  var lat = p.y;\n\t  var x, y, el;\n\t  var dlon = adjust_lon(lon - this.long0);\n\t  el = dlon * Math.sin(lat);\n\t  if (this.sphere) {\n\t    if (Math.abs(lat) <= EPSLN) {\n\t      x = this.a * dlon;\n\t      y = -1 * this.a * this.lat0;\n\t    }\n\t    else {\n\t      x = this.a * Math.sin(el) / Math.tan(lat);\n\t      y = this.a * (adjust_lat(lat - this.lat0) + (1 - Math.cos(el)) / Math.tan(lat));\n\t    }\n\t  }\n\t  else {\n\t    if (Math.abs(lat) <= EPSLN) {\n\t      x = this.a * dlon;\n\t      y = -1 * this.ml0;\n\t    }\n\t    else {\n\t      var nl = gN(this.a, this.e, Math.sin(lat)) / Math.tan(lat);\n\t      x = nl * Math.sin(el);\n\t      y = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, lat) - this.ml0 + nl * (1 - Math.cos(el));\n\t    }\n\n\t  }\n\t  p.x = x + this.x0;\n\t  p.y = y + this.y0;\n\t  return p;\n\t}\n\n\t/* Inverse equations\n\t  -----------------*/\n\tfunction inverse$17(p) {\n\t  var lon, lat, x, y, i;\n\t  var al, bl;\n\t  var phi, dphi;\n\t  x = p.x - this.x0;\n\t  y = p.y - this.y0;\n\n\t  if (this.sphere) {\n\t    if (Math.abs(y + this.a * this.lat0) <= EPSLN) {\n\t      lon = adjust_lon(x / this.a + this.long0);\n\t      lat = 0;\n\t    }\n\t    else {\n\t      al = this.lat0 + y / this.a;\n\t      bl = x * x / this.a / this.a + al * al;\n\t      phi = al;\n\t      var tanphi;\n\t      for (i = MAX_ITER$2; i; --i) {\n\t        tanphi = Math.tan(phi);\n\t        dphi = -1 * (al * (phi * tanphi + 1) - phi - 0.5 * (phi * phi + bl) * tanphi) / ((phi - al) / tanphi - 1);\n\t        phi += dphi;\n\t        if (Math.abs(dphi) <= EPSLN) {\n\t          lat = phi;\n\t          break;\n\t        }\n\t      }\n\t      lon = adjust_lon(this.long0 + (Math.asin(x * Math.tan(phi) / this.a)) / Math.sin(lat));\n\t    }\n\t  }\n\t  else {\n\t    if (Math.abs(y + this.ml0) <= EPSLN) {\n\t      lat = 0;\n\t      lon = adjust_lon(this.long0 + x / this.a);\n\t    }\n\t    else {\n\n\t      al = (this.ml0 + y) / this.a;\n\t      bl = x * x / this.a / this.a + al * al;\n\t      phi = al;\n\t      var cl, mln, mlnp, ma;\n\t      var con;\n\t      for (i = MAX_ITER$2; i; --i) {\n\t        con = this.e * Math.sin(phi);\n\t        cl = Math.sqrt(1 - con * con) * Math.tan(phi);\n\t        mln = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi);\n\t        mlnp = this.e0 - 2 * this.e1 * Math.cos(2 * phi) + 4 * this.e2 * Math.cos(4 * phi) - 6 * this.e3 * Math.cos(6 * phi);\n\t        ma = mln / this.a;\n\t        dphi = (al * (cl * ma + 1) - ma - 0.5 * cl * (ma * ma + bl)) / (this.es * Math.sin(2 * phi) * (ma * ma + bl - 2 * al * ma) / (4 * cl) + (al - ma) * (cl * mlnp - 2 / Math.sin(2 * phi)) - mlnp);\n\t        phi -= dphi;\n\t        if (Math.abs(dphi) <= EPSLN) {\n\t          lat = phi;\n\t          break;\n\t        }\n\t      }\n\n\t      //lat=phi4z(this.e,this.e0,this.e1,this.e2,this.e3,al,bl,0,0);\n\t      cl = Math.sqrt(1 - this.es * Math.pow(Math.sin(lat), 2)) * Math.tan(lat);\n\t      lon = adjust_lon(this.long0 + Math.asin(x * cl / this.a) / Math.sin(lat));\n\t    }\n\t  }\n\n\t  p.x = lon;\n\t  p.y = lat;\n\t  return p;\n\t}\n\n\tvar names$19 = [\"Polyconic\", \"poly\"];\n\tvar poly = {\n\t  init: init$18,\n\t  forward: forward$17,\n\t  inverse: inverse$17,\n\t  names: names$19\n\t};\n\n\t/*\n\t  reference\n\t    Department of Land and Survey Technical Circular 1973/32\n\t      http://www.linz.govt.nz/docs/miscellaneous/nz-map-definition.pdf\n\t    OSG Technical Report 4.1\n\t      http://www.linz.govt.nz/docs/miscellaneous/nzmg.pdf\n\t  */\n\n\t/**\n\t * iterations: Number of iterations to refine inverse transform.\n\t *     0 -> km accuracy\n\t *     1 -> m accuracy -- suitable for most mapping applications\n\t *     2 -> mm accuracy\n\t */\n\n\n\tfunction init$19() {\n\t  this.A = [];\n\t  this.A[1] = 0.6399175073;\n\t  this.A[2] = -0.1358797613;\n\t  this.A[3] = 0.063294409;\n\t  this.A[4] = -0.02526853;\n\t  this.A[5] = 0.0117879;\n\t  this.A[6] = -0.0055161;\n\t  this.A[7] = 0.0026906;\n\t  this.A[8] = -0.001333;\n\t  this.A[9] = 0.00067;\n\t  this.A[10] = -0.00034;\n\n\t  this.B_re = [];\n\t  this.B_im = [];\n\t  this.B_re[1] = 0.7557853228;\n\t  this.B_im[1] = 0;\n\t  this.B_re[2] = 0.249204646;\n\t  this.B_im[2] = 0.003371507;\n\t  this.B_re[3] = -0.001541739;\n\t  this.B_im[3] = 0.041058560;\n\t  this.B_re[4] = -0.10162907;\n\t  this.B_im[4] = 0.01727609;\n\t  this.B_re[5] = -0.26623489;\n\t  this.B_im[5] = -0.36249218;\n\t  this.B_re[6] = -0.6870983;\n\t  this.B_im[6] = -1.1651967;\n\n\t  this.C_re = [];\n\t  this.C_im = [];\n\t  this.C_re[1] = 1.3231270439;\n\t  this.C_im[1] = 0;\n\t  this.C_re[2] = -0.577245789;\n\t  this.C_im[2] = -0.007809598;\n\t  this.C_re[3] = 0.508307513;\n\t  this.C_im[3] = -0.112208952;\n\t  this.C_re[4] = -0.15094762;\n\t  this.C_im[4] = 0.18200602;\n\t  this.C_re[5] = 1.01418179;\n\t  this.C_im[5] = 1.64497696;\n\t  this.C_re[6] = 1.9660549;\n\t  this.C_im[6] = 2.5127645;\n\n\t  this.D = [];\n\t  this.D[1] = 1.5627014243;\n\t  this.D[2] = 0.5185406398;\n\t  this.D[3] = -0.03333098;\n\t  this.D[4] = -0.1052906;\n\t  this.D[5] = -0.0368594;\n\t  this.D[6] = 0.007317;\n\t  this.D[7] = 0.01220;\n\t  this.D[8] = 0.00394;\n\t  this.D[9] = -0.0013;\n\t}\n\n\t/**\n\t    New Zealand Map Grid Forward  - long/lat to x/y\n\t    long/lat in radians\n\t  */\n\tfunction forward$18(p) {\n\t  var n;\n\t  var lon = p.x;\n\t  var lat = p.y;\n\n\t  var delta_lat = lat - this.lat0;\n\t  var delta_lon = lon - this.long0;\n\n\t  // 1. Calculate d_phi and d_psi    ...                          // and d_lambda\n\t  // For this algorithm, delta_latitude is in seconds of arc x 10-5, so we need to scale to those units. Longitude is radians.\n\t  var d_phi = delta_lat / SEC_TO_RAD * 1E-5;\n\t  var d_lambda = delta_lon;\n\t  var d_phi_n = 1; // d_phi^0\n\n\t  var d_psi = 0;\n\t  for (n = 1; n <= 10; n++) {\n\t    d_phi_n = d_phi_n * d_phi;\n\t    d_psi = d_psi + this.A[n] * d_phi_n;\n\t  }\n\n\t  // 2. Calculate theta\n\t  var th_re = d_psi;\n\t  var th_im = d_lambda;\n\n\t  // 3. Calculate z\n\t  var th_n_re = 1;\n\t  var th_n_im = 0; // theta^0\n\t  var th_n_re1;\n\t  var th_n_im1;\n\n\t  var z_re = 0;\n\t  var z_im = 0;\n\t  for (n = 1; n <= 6; n++) {\n\t    th_n_re1 = th_n_re * th_re - th_n_im * th_im;\n\t    th_n_im1 = th_n_im * th_re + th_n_re * th_im;\n\t    th_n_re = th_n_re1;\n\t    th_n_im = th_n_im1;\n\t    z_re = z_re + this.B_re[n] * th_n_re - this.B_im[n] * th_n_im;\n\t    z_im = z_im + this.B_im[n] * th_n_re + this.B_re[n] * th_n_im;\n\t  }\n\n\t  // 4. Calculate easting and northing\n\t  p.x = (z_im * this.a) + this.x0;\n\t  p.y = (z_re * this.a) + this.y0;\n\n\t  return p;\n\t}\n\n\t/**\n\t    New Zealand Map Grid Inverse  -  x/y to long/lat\n\t  */\n\tfunction inverse$18(p) {\n\t  var n;\n\t  var x = p.x;\n\t  var y = p.y;\n\n\t  var delta_x = x - this.x0;\n\t  var delta_y = y - this.y0;\n\n\t  // 1. Calculate z\n\t  var z_re = delta_y / this.a;\n\t  var z_im = delta_x / this.a;\n\n\t  // 2a. Calculate theta - first approximation gives km accuracy\n\t  var z_n_re = 1;\n\t  var z_n_im = 0; // z^0\n\t  var z_n_re1;\n\t  var z_n_im1;\n\n\t  var th_re = 0;\n\t  var th_im = 0;\n\t  for (n = 1; n <= 6; n++) {\n\t    z_n_re1 = z_n_re * z_re - z_n_im * z_im;\n\t    z_n_im1 = z_n_im * z_re + z_n_re * z_im;\n\t    z_n_re = z_n_re1;\n\t    z_n_im = z_n_im1;\n\t    th_re = th_re + this.C_re[n] * z_n_re - this.C_im[n] * z_n_im;\n\t    th_im = th_im + this.C_im[n] * z_n_re + this.C_re[n] * z_n_im;\n\t  }\n\n\t  // 2b. Iterate to refine the accuracy of the calculation\n\t  //        0 iterations gives km accuracy\n\t  //        1 iteration gives m accuracy -- good enough for most mapping applications\n\t  //        2 iterations bives mm accuracy\n\t  for (var i = 0; i < this.iterations; i++) {\n\t    var th_n_re = th_re;\n\t    var th_n_im = th_im;\n\t    var th_n_re1;\n\t    var th_n_im1;\n\n\t    var num_re = z_re;\n\t    var num_im = z_im;\n\t    for (n = 2; n <= 6; n++) {\n\t      th_n_re1 = th_n_re * th_re - th_n_im * th_im;\n\t      th_n_im1 = th_n_im * th_re + th_n_re * th_im;\n\t      th_n_re = th_n_re1;\n\t      th_n_im = th_n_im1;\n\t      num_re = num_re + (n - 1) * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im);\n\t      num_im = num_im + (n - 1) * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im);\n\t    }\n\n\t    th_n_re = 1;\n\t    th_n_im = 0;\n\t    var den_re = this.B_re[1];\n\t    var den_im = this.B_im[1];\n\t    for (n = 2; n <= 6; n++) {\n\t      th_n_re1 = th_n_re * th_re - th_n_im * th_im;\n\t      th_n_im1 = th_n_im * th_re + th_n_re * th_im;\n\t      th_n_re = th_n_re1;\n\t      th_n_im = th_n_im1;\n\t      den_re = den_re + n * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im);\n\t      den_im = den_im + n * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im);\n\t    }\n\n\t    // Complex division\n\t    var den2 = den_re * den_re + den_im * den_im;\n\t    th_re = (num_re * den_re + num_im * den_im) / den2;\n\t    th_im = (num_im * den_re - num_re * den_im) / den2;\n\t  }\n\n\t  // 3. Calculate d_phi              ...                                    // and d_lambda\n\t  var d_psi = th_re;\n\t  var d_lambda = th_im;\n\t  var d_psi_n = 1; // d_psi^0\n\n\t  var d_phi = 0;\n\t  for (n = 1; n <= 9; n++) {\n\t    d_psi_n = d_psi_n * d_psi;\n\t    d_phi = d_phi + this.D[n] * d_psi_n;\n\t  }\n\n\t  // 4. Calculate latitude and longitude\n\t  // d_phi is calcuated in second of arc * 10^-5, so we need to scale back to radians. d_lambda is in radians.\n\t  var lat = this.lat0 + (d_phi * SEC_TO_RAD * 1E5);\n\t  var lon = this.long0 + d_lambda;\n\n\t  p.x = lon;\n\t  p.y = lat;\n\n\t  return p;\n\t}\n\n\tvar names$20 = [\"New_Zealand_Map_Grid\", \"nzmg\"];\n\tvar nzmg = {\n\t  init: init$19,\n\t  forward: forward$18,\n\t  inverse: inverse$18,\n\t  names: names$20\n\t};\n\n\t/*\n\t  reference\n\t    \"New Equal-Area Map Projections for Noncircular Regions\", John P. Snyder,\n\t    The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355.\n\t  */\n\n\n\t/* Initialize the Miller Cylindrical projection\n\t  -------------------------------------------*/\n\tfunction init$20() {\n\t  //no-op\n\t}\n\n\t/* Miller Cylindrical forward equations--mapping lat,long to x,y\n\t    ------------------------------------------------------------*/\n\tfunction forward$19(p) {\n\t  var lon = p.x;\n\t  var lat = p.y;\n\t  /* Forward equations\n\t      -----------------*/\n\t  var dlon = adjust_lon(lon - this.long0);\n\t  var x = this.x0 + this.a * dlon;\n\t  var y = this.y0 + this.a * Math.log(Math.tan((Math.PI / 4) + (lat / 2.5))) * 1.25;\n\n\t  p.x = x;\n\t  p.y = y;\n\t  return p;\n\t}\n\n\t/* Miller Cylindrical inverse equations--mapping x,y to lat/long\n\t    ------------------------------------------------------------*/\n\tfunction inverse$19(p) {\n\t  p.x -= this.x0;\n\t  p.y -= this.y0;\n\n\t  var lon = adjust_lon(this.long0 + p.x / this.a);\n\t  var lat = 2.5 * (Math.atan(Math.exp(0.8 * p.y / this.a)) - Math.PI / 4);\n\n\t  p.x = lon;\n\t  p.y = lat;\n\t  return p;\n\t}\n\n\tvar names$21 = [\"Miller_Cylindrical\", \"mill\"];\n\tvar mill = {\n\t  init: init$20,\n\t  forward: forward$19,\n\t  inverse: inverse$19,\n\t  names: names$21\n\t};\n\n\tvar MAX_ITER$3 = 20;\n\tfunction init$21() {\n\t  /* Place parameters in static storage for common use\n\t    -------------------------------------------------*/\n\n\n\t  if (!this.sphere) {\n\t    this.en = pj_enfn(this.es);\n\t  }\n\t  else {\n\t    this.n = 1;\n\t    this.m = 0;\n\t    this.es = 0;\n\t    this.C_y = Math.sqrt((this.m + 1) / this.n);\n\t    this.C_x = this.C_y / (this.m + 1);\n\t  }\n\n\t}\n\n\t/* Sinusoidal forward equations--mapping lat,long to x,y\n\t  -----------------------------------------------------*/\n\tfunction forward$20(p) {\n\t  var x, y;\n\t  var lon = p.x;\n\t  var lat = p.y;\n\t  /* Forward equations\n\t    -----------------*/\n\t  lon = adjust_lon(lon - this.long0);\n\n\t  if (this.sphere) {\n\t    if (!this.m) {\n\t      lat = this.n !== 1 ? Math.asin(this.n * Math.sin(lat)) : lat;\n\t    }\n\t    else {\n\t      var k = this.n * Math.sin(lat);\n\t      for (var i = MAX_ITER$3; i; --i) {\n\t        var V = (this.m * lat + Math.sin(lat) - k) / (this.m + Math.cos(lat));\n\t        lat -= V;\n\t        if (Math.abs(V) < EPSLN) {\n\t          break;\n\t        }\n\t      }\n\t    }\n\t    x = this.a * this.C_x * lon * (this.m + Math.cos(lat));\n\t    y = this.a * this.C_y * lat;\n\n\t  }\n\t  else {\n\n\t    var s = Math.sin(lat);\n\t    var c = Math.cos(lat);\n\t    y = this.a * pj_mlfn(lat, s, c, this.en);\n\t    x = this.a * lon * c / Math.sqrt(1 - this.es * s * s);\n\t  }\n\n\t  p.x = x;\n\t  p.y = y;\n\t  return p;\n\t}\n\n\tfunction inverse$20(p) {\n\t  var lat, temp, lon, s;\n\n\t  p.x -= this.x0;\n\t  lon = p.x / this.a;\n\t  p.y -= this.y0;\n\t  lat = p.y / this.a;\n\n\t  if (this.sphere) {\n\t    lat /= this.C_y;\n\t    lon = lon / (this.C_x * (this.m + Math.cos(lat)));\n\t    if (this.m) {\n\t      lat = asinz((this.m * lat + Math.sin(lat)) / this.n);\n\t    }\n\t    else if (this.n !== 1) {\n\t      lat = asinz(Math.sin(lat) / this.n);\n\t    }\n\t    lon = adjust_lon(lon + this.long0);\n\t    lat = adjust_lat(lat);\n\t  }\n\t  else {\n\t    lat = pj_inv_mlfn(p.y / this.a, this.es, this.en);\n\t    s = Math.abs(lat);\n\t    if (s < HALF_PI) {\n\t      s = Math.sin(lat);\n\t      temp = this.long0 + p.x * Math.sqrt(1 - this.es * s * s) / (this.a * Math.cos(lat));\n\t      //temp = this.long0 + p.x / (this.a * Math.cos(lat));\n\t      lon = adjust_lon(temp);\n\t    }\n\t    else if ((s - EPSLN) < HALF_PI) {\n\t      lon = this.long0;\n\t    }\n\t  }\n\t  p.x = lon;\n\t  p.y = lat;\n\t  return p;\n\t}\n\n\tvar names$22 = [\"Sinusoidal\", \"sinu\"];\n\tvar sinu = {\n\t  init: init$21,\n\t  forward: forward$20,\n\t  inverse: inverse$20,\n\t  names: names$22\n\t};\n\n\tfunction init$22() {}\n\t/* Mollweide forward equations--mapping lat,long to x,y\n\t    ----------------------------------------------------*/\n\tfunction forward$21(p) {\n\n\t  /* Forward equations\n\t      -----------------*/\n\t  var lon = p.x;\n\t  var lat = p.y;\n\n\t  var delta_lon = adjust_lon(lon - this.long0);\n\t  var theta = lat;\n\t  var con = Math.PI * Math.sin(lat);\n\n\t  /* Iterate using the Newton-Raphson method to find theta\n\t      -----------------------------------------------------*/\n\t  for (var i = 0; true; i++) {\n\t    var delta_theta = -(theta + Math.sin(theta) - con) / (1 + Math.cos(theta));\n\t    theta += delta_theta;\n\t    if (Math.abs(delta_theta) < EPSLN) {\n\t      break;\n\t    }\n\t  }\n\t  theta /= 2;\n\n\t  /* If the latitude is 90 deg, force the x coordinate to be \"0 + false easting\"\n\t       this is done here because of precision problems with \"cos(theta)\"\n\t       --------------------------------------------------------------------------*/\n\t  if (Math.PI / 2 - Math.abs(lat) < EPSLN) {\n\t    delta_lon = 0;\n\t  }\n\t  var x = 0.900316316158 * this.a * delta_lon * Math.cos(theta) + this.x0;\n\t  var y = 1.4142135623731 * this.a * Math.sin(theta) + this.y0;\n\n\t  p.x = x;\n\t  p.y = y;\n\t  return p;\n\t}\n\n\tfunction inverse$21(p) {\n\t  var theta;\n\t  var arg;\n\n\t  /* Inverse equations\n\t      -----------------*/\n\t  p.x -= this.x0;\n\t  p.y -= this.y0;\n\t  arg = p.y / (1.4142135623731 * this.a);\n\n\t  /* Because of division by zero problems, 'arg' can not be 1.  Therefore\n\t       a number very close to one is used instead.\n\t       -------------------------------------------------------------------*/\n\t  if (Math.abs(arg) > 0.999999999999) {\n\t    arg = 0.999999999999;\n\t  }\n\t  theta = Math.asin(arg);\n\t  var lon = adjust_lon(this.long0 + (p.x / (0.900316316158 * this.a * Math.cos(theta))));\n\t  if (lon < (-Math.PI)) {\n\t    lon = -Math.PI;\n\t  }\n\t  if (lon > Math.PI) {\n\t    lon = Math.PI;\n\t  }\n\t  arg = (2 * theta + Math.sin(2 * theta)) / Math.PI;\n\t  if (Math.abs(arg) > 1) {\n\t    arg = 1;\n\t  }\n\t  var lat = Math.asin(arg);\n\n\t  p.x = lon;\n\t  p.y = lat;\n\t  return p;\n\t}\n\n\tvar names$23 = [\"Mollweide\", \"moll\"];\n\tvar moll = {\n\t  init: init$22,\n\t  forward: forward$21,\n\t  inverse: inverse$21,\n\t  names: names$23\n\t};\n\n\tfunction init$23() {\n\n\t  /* Place parameters in static storage for common use\n\t      -------------------------------------------------*/\n\t  // Standard Parallels cannot be equal and on opposite sides of the equator\n\t  if (Math.abs(this.lat1 + this.lat2) < EPSLN) {\n\t    return;\n\t  }\n\t  this.lat2 = this.lat2 || this.lat1;\n\t  this.temp = this.b / this.a;\n\t  this.es = 1 - Math.pow(this.temp, 2);\n\t  this.e = Math.sqrt(this.es);\n\t  this.e0 = e0fn(this.es);\n\t  this.e1 = e1fn(this.es);\n\t  this.e2 = e2fn(this.es);\n\t  this.e3 = e3fn(this.es);\n\n\t  this.sinphi = Math.sin(this.lat1);\n\t  this.cosphi = Math.cos(this.lat1);\n\n\t  this.ms1 = msfnz(this.e, this.sinphi, this.cosphi);\n\t  this.ml1 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat1);\n\n\t  if (Math.abs(this.lat1 - this.lat2) < EPSLN) {\n\t    this.ns = this.sinphi;\n\t  }\n\t  else {\n\t    this.sinphi = Math.sin(this.lat2);\n\t    this.cosphi = Math.cos(this.lat2);\n\t    this.ms2 = msfnz(this.e, this.sinphi, this.cosphi);\n\t    this.ml2 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat2);\n\t    this.ns = (this.ms1 - this.ms2) / (this.ml2 - this.ml1);\n\t  }\n\t  this.g = this.ml1 + this.ms1 / this.ns;\n\t  this.ml0 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0);\n\t  this.rh = this.a * (this.g - this.ml0);\n\t}\n\n\t/* Equidistant Conic forward equations--mapping lat,long to x,y\n\t  -----------------------------------------------------------*/\n\tfunction forward$22(p) {\n\t  var lon = p.x;\n\t  var lat = p.y;\n\t  var rh1;\n\n\t  /* Forward equations\n\t      -----------------*/\n\t  if (this.sphere) {\n\t    rh1 = this.a * (this.g - lat);\n\t  }\n\t  else {\n\t    var ml = mlfn(this.e0, this.e1, this.e2, this.e3, lat);\n\t    rh1 = this.a * (this.g - ml);\n\t  }\n\t  var theta = this.ns * adjust_lon(lon - this.long0);\n\t  var x = this.x0 + rh1 * Math.sin(theta);\n\t  var y = this.y0 + this.rh - rh1 * Math.cos(theta);\n\t  p.x = x;\n\t  p.y = y;\n\t  return p;\n\t}\n\n\t/* Inverse equations\n\t  -----------------*/\n\tfunction inverse$22(p) {\n\t  p.x -= this.x0;\n\t  p.y = this.rh - p.y + this.y0;\n\t  var con, rh1, lat, lon;\n\t  if (this.ns >= 0) {\n\t    rh1 = Math.sqrt(p.x * p.x + p.y * p.y);\n\t    con = 1;\n\t  }\n\t  else {\n\t    rh1 = -Math.sqrt(p.x * p.x + p.y * p.y);\n\t    con = -1;\n\t  }\n\t  var theta = 0;\n\t  if (rh1 !== 0) {\n\t    theta = Math.atan2(con * p.x, con * p.y);\n\t  }\n\n\t  if (this.sphere) {\n\t    lon = adjust_lon(this.long0 + theta / this.ns);\n\t    lat = adjust_lat(this.g - rh1 / this.a);\n\t    p.x = lon;\n\t    p.y = lat;\n\t    return p;\n\t  }\n\t  else {\n\t    var ml = this.g - rh1 / this.a;\n\t    lat = imlfn(ml, this.e0, this.e1, this.e2, this.e3);\n\t    lon = adjust_lon(this.long0 + theta / this.ns);\n\t    p.x = lon;\n\t    p.y = lat;\n\t    return p;\n\t  }\n\n\t}\n\n\tvar names$24 = [\"Equidistant_Conic\", \"eqdc\"];\n\tvar eqdc = {\n\t  init: init$23,\n\t  forward: forward$22,\n\t  inverse: inverse$22,\n\t  names: names$24\n\t};\n\n\t/* Initialize the Van Der Grinten projection\n\t  ----------------------------------------*/\n\tfunction init$24() {\n\t  //this.R = 6370997; //Radius of earth\n\t  this.R = this.a;\n\t}\n\n\tfunction forward$23(p) {\n\n\t  var lon = p.x;\n\t  var lat = p.y;\n\n\t  /* Forward equations\n\t    -----------------*/\n\t  var dlon = adjust_lon(lon - this.long0);\n\t  var x, y;\n\n\t  if (Math.abs(lat) <= EPSLN) {\n\t    x = this.x0 + this.R * dlon;\n\t    y = this.y0;\n\t  }\n\t  var theta = asinz(2 * Math.abs(lat / Math.PI));\n\t  if ((Math.abs(dlon) <= EPSLN) || (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN)) {\n\t    x = this.x0;\n\t    if (lat >= 0) {\n\t      y = this.y0 + Math.PI * this.R * Math.tan(0.5 * theta);\n\t    }\n\t    else {\n\t      y = this.y0 + Math.PI * this.R * -Math.tan(0.5 * theta);\n\t    }\n\t    //  return(OK);\n\t  }\n\t  var al = 0.5 * Math.abs((Math.PI / dlon) - (dlon / Math.PI));\n\t  var asq = al * al;\n\t  var sinth = Math.sin(theta);\n\t  var costh = Math.cos(theta);\n\n\t  var g = costh / (sinth + costh - 1);\n\t  var gsq = g * g;\n\t  var m = g * (2 / sinth - 1);\n\t  var msq = m * m;\n\t  var con = Math.PI * this.R * (al * (g - msq) + Math.sqrt(asq * (g - msq) * (g - msq) - (msq + asq) * (gsq - msq))) / (msq + asq);\n\t  if (dlon < 0) {\n\t    con = -con;\n\t  }\n\t  x = this.x0 + con;\n\t  //con = Math.abs(con / (Math.PI * this.R));\n\t  var q = asq + g;\n\t  con = Math.PI * this.R * (m * q - al * Math.sqrt((msq + asq) * (asq + 1) - q * q)) / (msq + asq);\n\t  if (lat >= 0) {\n\t    //y = this.y0 + Math.PI * this.R * Math.sqrt(1 - con * con - 2 * al * con);\n\t    y = this.y0 + con;\n\t  }\n\t  else {\n\t    //y = this.y0 - Math.PI * this.R * Math.sqrt(1 - con * con - 2 * al * con);\n\t    y = this.y0 - con;\n\t  }\n\t  p.x = x;\n\t  p.y = y;\n\t  return p;\n\t}\n\n\t/* Van Der Grinten inverse equations--mapping x,y to lat/long\n\t  ---------------------------------------------------------*/\n\tfunction inverse$23(p) {\n\t  var lon, lat;\n\t  var xx, yy, xys, c1, c2, c3;\n\t  var a1;\n\t  var m1;\n\t  var con;\n\t  var th1;\n\t  var d;\n\n\t  /* inverse equations\n\t    -----------------*/\n\t  p.x -= this.x0;\n\t  p.y -= this.y0;\n\t  con = Math.PI * this.R;\n\t  xx = p.x / con;\n\t  yy = p.y / con;\n\t  xys = xx * xx + yy * yy;\n\t  c1 = -Math.abs(yy) * (1 + xys);\n\t  c2 = c1 - 2 * yy * yy + xx * xx;\n\t  c3 = -2 * c1 + 1 + 2 * yy * yy + xys * xys;\n\t  d = yy * yy / c3 + (2 * c2 * c2 * c2 / c3 / c3 / c3 - 9 * c1 * c2 / c3 / c3) / 27;\n\t  a1 = (c1 - c2 * c2 / 3 / c3) / c3;\n\t  m1 = 2 * Math.sqrt(-a1 / 3);\n\t  con = ((3 * d) / a1) / m1;\n\t  if (Math.abs(con) > 1) {\n\t    if (con >= 0) {\n\t      con = 1;\n\t    }\n\t    else {\n\t      con = -1;\n\t    }\n\t  }\n\t  th1 = Math.acos(con) / 3;\n\t  if (p.y >= 0) {\n\t    lat = (-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI;\n\t  }\n\t  else {\n\t    lat = -(-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI;\n\t  }\n\n\t  if (Math.abs(xx) < EPSLN) {\n\t    lon = this.long0;\n\t  }\n\t  else {\n\t    lon = adjust_lon(this.long0 + Math.PI * (xys - 1 + Math.sqrt(1 + 2 * (xx * xx - yy * yy) + xys * xys)) / 2 / xx);\n\t  }\n\n\t  p.x = lon;\n\t  p.y = lat;\n\t  return p;\n\t}\n\n\tvar names$25 = [\"Van_der_Grinten_I\", \"VanDerGrinten\", \"vandg\"];\n\tvar vandg = {\n\t  init: init$24,\n\t  forward: forward$23,\n\t  inverse: inverse$23,\n\t  names: names$25\n\t};\n\n\tfunction init$25() {\n\t  this.sin_p12 = Math.sin(this.lat0);\n\t  this.cos_p12 = Math.cos(this.lat0);\n\t}\n\n\tfunction forward$24(p) {\n\t  var lon = p.x;\n\t  var lat = p.y;\n\t  var sinphi = Math.sin(p.y);\n\t  var cosphi = Math.cos(p.y);\n\t  var dlon = adjust_lon(lon - this.long0);\n\t  var e0, e1, e2, e3, Mlp, Ml, tanphi, Nl1, Nl, psi, Az, G, H, GH, Hs, c, kp, cos_c, s, s2, s3, s4, s5;\n\t  if (this.sphere) {\n\t    if (Math.abs(this.sin_p12 - 1) <= EPSLN) {\n\t      //North Pole case\n\t      p.x = this.x0 + this.a * (HALF_PI - lat) * Math.sin(dlon);\n\t      p.y = this.y0 - this.a * (HALF_PI - lat) * Math.cos(dlon);\n\t      return p;\n\t    }\n\t    else if (Math.abs(this.sin_p12 + 1) <= EPSLN) {\n\t      //South Pole case\n\t      p.x = this.x0 + this.a * (HALF_PI + lat) * Math.sin(dlon);\n\t      p.y = this.y0 + this.a * (HALF_PI + lat) * Math.cos(dlon);\n\t      return p;\n\t    }\n\t    else {\n\t      //default case\n\t      cos_c = this.sin_p12 * sinphi + this.cos_p12 * cosphi * Math.cos(dlon);\n\t      c = Math.acos(cos_c);\n\t      kp = c / Math.sin(c);\n\t      p.x = this.x0 + this.a * kp * cosphi * Math.sin(dlon);\n\t      p.y = this.y0 + this.a * kp * (this.cos_p12 * sinphi - this.sin_p12 * cosphi * Math.cos(dlon));\n\t      return p;\n\t    }\n\t  }\n\t  else {\n\t    e0 = e0fn(this.es);\n\t    e1 = e1fn(this.es);\n\t    e2 = e2fn(this.es);\n\t    e3 = e3fn(this.es);\n\t    if (Math.abs(this.sin_p12 - 1) <= EPSLN) {\n\t      //North Pole case\n\t      Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);\n\t      Ml = this.a * mlfn(e0, e1, e2, e3, lat);\n\t      p.x = this.x0 + (Mlp - Ml) * Math.sin(dlon);\n\t      p.y = this.y0 - (Mlp - Ml) * Math.cos(dlon);\n\t      return p;\n\t    }\n\t    else if (Math.abs(this.sin_p12 + 1) <= EPSLN) {\n\t      //South Pole case\n\t      Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);\n\t      Ml = this.a * mlfn(e0, e1, e2, e3, lat);\n\t      p.x = this.x0 + (Mlp + Ml) * Math.sin(dlon);\n\t      p.y = this.y0 + (Mlp + Ml) * Math.cos(dlon);\n\t      return p;\n\t    }\n\t    else {\n\t      //Default case\n\t      tanphi = sinphi / cosphi;\n\t      Nl1 = gN(this.a, this.e, this.sin_p12);\n\t      Nl = gN(this.a, this.e, sinphi);\n\t      psi = Math.atan((1 - this.es) * tanphi + this.es * Nl1 * this.sin_p12 / (Nl * cosphi));\n\t      Az = Math.atan2(Math.sin(dlon), this.cos_p12 * Math.tan(psi) - this.sin_p12 * Math.cos(dlon));\n\t      if (Az === 0) {\n\t        s = Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi));\n\t      }\n\t      else if (Math.abs(Math.abs(Az) - Math.PI) <= EPSLN) {\n\t        s = -Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi));\n\t      }\n\t      else {\n\t        s = Math.asin(Math.sin(dlon) * Math.cos(psi) / Math.sin(Az));\n\t      }\n\t      G = this.e * this.sin_p12 / Math.sqrt(1 - this.es);\n\t      H = this.e * this.cos_p12 * Math.cos(Az) / Math.sqrt(1 - this.es);\n\t      GH = G * H;\n\t      Hs = H * H;\n\t      s2 = s * s;\n\t      s3 = s2 * s;\n\t      s4 = s3 * s;\n\t      s5 = s4 * s;\n\t      c = Nl1 * s * (1 - s2 * Hs * (1 - Hs) / 6 + s3 / 8 * GH * (1 - 2 * Hs) + s4 / 120 * (Hs * (4 - 7 * Hs) - 3 * G * G * (1 - 7 * Hs)) - s5 / 48 * GH);\n\t      p.x = this.x0 + c * Math.sin(Az);\n\t      p.y = this.y0 + c * Math.cos(Az);\n\t      return p;\n\t    }\n\t  }\n\n\n\t}\n\n\tfunction inverse$24(p) {\n\t  p.x -= this.x0;\n\t  p.y -= this.y0;\n\t  var rh, z, sinz, cosz, lon, lat, con, e0, e1, e2, e3, Mlp, M, N1, psi, Az, cosAz, tmp, A, B, D, Ee, F;\n\t  if (this.sphere) {\n\t    rh = Math.sqrt(p.x * p.x + p.y * p.y);\n\t    if (rh > (2 * HALF_PI * this.a)) {\n\t      return;\n\t    }\n\t    z = rh / this.a;\n\n\t    sinz = Math.sin(z);\n\t    cosz = Math.cos(z);\n\n\t    lon = this.long0;\n\t    if (Math.abs(rh) <= EPSLN) {\n\t      lat = this.lat0;\n\t    }\n\t    else {\n\t      lat = asinz(cosz * this.sin_p12 + (p.y * sinz * this.cos_p12) / rh);\n\t      con = Math.abs(this.lat0) - HALF_PI;\n\t      if (Math.abs(con) <= EPSLN) {\n\t        if (this.lat0 >= 0) {\n\t          lon = adjust_lon(this.long0 + Math.atan2(p.x, - p.y));\n\t        }\n\t        else {\n\t          lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y));\n\t        }\n\t      }\n\t      else {\n\t        /*con = cosz - this.sin_p12 * Math.sin(lat);\n\t        if ((Math.abs(con) < EPSLN) && (Math.abs(p.x) < EPSLN)) {\n\t          //no-op, just keep the lon value as is\n\t        } else {\n\t          var temp = Math.atan2((p.x * sinz * this.cos_p12), (con * rh));\n\t          lon = adjust_lon(this.long0 + Math.atan2((p.x * sinz * this.cos_p12), (con * rh)));\n\t        }*/\n\t        lon = adjust_lon(this.long0 + Math.atan2(p.x * sinz, rh * this.cos_p12 * cosz - p.y * this.sin_p12 * sinz));\n\t      }\n\t    }\n\n\t    p.x = lon;\n\t    p.y = lat;\n\t    return p;\n\t  }\n\t  else {\n\t    e0 = e0fn(this.es);\n\t    e1 = e1fn(this.es);\n\t    e2 = e2fn(this.es);\n\t    e3 = e3fn(this.es);\n\t    if (Math.abs(this.sin_p12 - 1) <= EPSLN) {\n\t      //North pole case\n\t      Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);\n\t      rh = Math.sqrt(p.x * p.x + p.y * p.y);\n\t      M = Mlp - rh;\n\t      lat = imlfn(M / this.a, e0, e1, e2, e3);\n\t      lon = adjust_lon(this.long0 + Math.atan2(p.x, - 1 * p.y));\n\t      p.x = lon;\n\t      p.y = lat;\n\t      return p;\n\t    }\n\t    else if (Math.abs(this.sin_p12 + 1) <= EPSLN) {\n\t      //South pole case\n\t      Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);\n\t      rh = Math.sqrt(p.x * p.x + p.y * p.y);\n\t      M = rh - Mlp;\n\n\t      lat = imlfn(M / this.a, e0, e1, e2, e3);\n\t      lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y));\n\t      p.x = lon;\n\t      p.y = lat;\n\t      return p;\n\t    }\n\t    else {\n\t      //default case\n\t      rh = Math.sqrt(p.x * p.x + p.y * p.y);\n\t      Az = Math.atan2(p.x, p.y);\n\t      N1 = gN(this.a, this.e, this.sin_p12);\n\t      cosAz = Math.cos(Az);\n\t      tmp = this.e * this.cos_p12 * cosAz;\n\t      A = -tmp * tmp / (1 - this.es);\n\t      B = 3 * this.es * (1 - A) * this.sin_p12 * this.cos_p12 * cosAz / (1 - this.es);\n\t      D = rh / N1;\n\t      Ee = D - A * (1 + A) * Math.pow(D, 3) / 6 - B * (1 + 3 * A) * Math.pow(D, 4) / 24;\n\t      F = 1 - A * Ee * Ee / 2 - D * Ee * Ee * Ee / 6;\n\t      psi = Math.asin(this.sin_p12 * Math.cos(Ee) + this.cos_p12 * Math.sin(Ee) * cosAz);\n\t      lon = adjust_lon(this.long0 + Math.asin(Math.sin(Az) * Math.sin(Ee) / Math.cos(psi)));\n\t      lat = Math.atan((1 - this.es * F * this.sin_p12 / Math.sin(psi)) * Math.tan(psi) / (1 - this.es));\n\t      p.x = lon;\n\t      p.y = lat;\n\t      return p;\n\t    }\n\t  }\n\n\t}\n\n\tvar names$26 = [\"Azimuthal_Equidistant\", \"aeqd\"];\n\tvar aeqd = {\n\t  init: init$25,\n\t  forward: forward$24,\n\t  inverse: inverse$24,\n\t  names: names$26\n\t};\n\n\tfunction init$26() {\n\t  //double temp;      /* temporary variable    */\n\n\t  /* Place parameters in static storage for common use\n\t      -------------------------------------------------*/\n\t  this.sin_p14 = Math.sin(this.lat0);\n\t  this.cos_p14 = Math.cos(this.lat0);\n\t}\n\n\t/* Orthographic forward equations--mapping lat,long to x,y\n\t    ---------------------------------------------------*/\n\tfunction forward$25(p) {\n\t  var sinphi, cosphi; /* sin and cos value        */\n\t  var dlon; /* delta longitude value      */\n\t  var coslon; /* cos of longitude        */\n\t  var ksp; /* scale factor          */\n\t  var g, x, y;\n\t  var lon = p.x;\n\t  var lat = p.y;\n\t  /* Forward equations\n\t      -----------------*/\n\t  dlon = adjust_lon(lon - this.long0);\n\n\t  sinphi = Math.sin(lat);\n\t  cosphi = Math.cos(lat);\n\n\t  coslon = Math.cos(dlon);\n\t  g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon;\n\t  ksp = 1;\n\t  if ((g > 0) || (Math.abs(g) <= EPSLN)) {\n\t    x = this.a * ksp * cosphi * Math.sin(dlon);\n\t    y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon);\n\t  }\n\t  p.x = x;\n\t  p.y = y;\n\t  return p;\n\t}\n\n\tfunction inverse$25(p) {\n\t  var rh; /* height above ellipsoid      */\n\t  var z; /* angle          */\n\t  var sinz, cosz; /* sin of z and cos of z      */\n\t  var con;\n\t  var lon, lat;\n\t  /* Inverse equations\n\t      -----------------*/\n\t  p.x -= this.x0;\n\t  p.y -= this.y0;\n\t  rh = Math.sqrt(p.x * p.x + p.y * p.y);\n\t  z = asinz(rh / this.a);\n\n\t  sinz = Math.sin(z);\n\t  cosz = Math.cos(z);\n\n\t  lon = this.long0;\n\t  if (Math.abs(rh) <= EPSLN) {\n\t    lat = this.lat0;\n\t    p.x = lon;\n\t    p.y = lat;\n\t    return p;\n\t  }\n\t  lat = asinz(cosz * this.sin_p14 + (p.y * sinz * this.cos_p14) / rh);\n\t  con = Math.abs(this.lat0) - HALF_PI;\n\t  if (Math.abs(con) <= EPSLN) {\n\t    if (this.lat0 >= 0) {\n\t      lon = adjust_lon(this.long0 + Math.atan2(p.x, - p.y));\n\t    }\n\t    else {\n\t      lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y));\n\t    }\n\t    p.x = lon;\n\t    p.y = lat;\n\t    return p;\n\t  }\n\t  lon = adjust_lon(this.long0 + Math.atan2((p.x * sinz), rh * this.cos_p14 * cosz - p.y * this.sin_p14 * sinz));\n\t  p.x = lon;\n\t  p.y = lat;\n\t  return p;\n\t}\n\n\tvar names$27 = [\"ortho\"];\n\tvar ortho = {\n\t  init: init$26,\n\t  forward: forward$25,\n\t  inverse: inverse$25,\n\t  names: names$27\n\t};\n\n\tvar includedProjections = function(proj4){\n\t  proj4.Proj.projections.add(tmerc);\n\t  proj4.Proj.projections.add(etmerc);\n\t  proj4.Proj.projections.add(utm);\n\t  proj4.Proj.projections.add(sterea);\n\t  proj4.Proj.projections.add(stere);\n\t  proj4.Proj.projections.add(somerc);\n\t  proj4.Proj.projections.add(omerc);\n\t  proj4.Proj.projections.add(lcc);\n\t  proj4.Proj.projections.add(krovak);\n\t  proj4.Proj.projections.add(cass);\n\t  proj4.Proj.projections.add(laea);\n\t  proj4.Proj.projections.add(aea);\n\t  proj4.Proj.projections.add(gnom);\n\t  proj4.Proj.projections.add(cea);\n\t  proj4.Proj.projections.add(eqc);\n\t  proj4.Proj.projections.add(poly);\n\t  proj4.Proj.projections.add(nzmg);\n\t  proj4.Proj.projections.add(mill);\n\t  proj4.Proj.projections.add(sinu);\n\t  proj4.Proj.projections.add(moll);\n\t  proj4.Proj.projections.add(eqdc);\n\t  proj4.Proj.projections.add(vandg);\n\t  proj4.Proj.projections.add(aeqd);\n\t  proj4.Proj.projections.add(ortho);\n\t};\n\n\tproj4$1.defaultDatum = 'WGS84'; //default datum\n\tproj4$1.Proj = Projection$1;\n\tproj4$1.WGS84 = new proj4$1.Proj('WGS84');\n\tproj4$1.Point = Point;\n\tproj4$1.toPoint = toPoint;\n\tproj4$1.defs = defs;\n\tproj4$1.transform = transform;\n\tproj4$1.mgrs = mgrs;\n\tproj4$1.version = version;\n\tincludedProjections(proj4$1);\n\n\treturn proj4$1;\n\n})));\n\n},{}],136:[function(require,module,exports){\n(function (factory) {\r\n\tvar L, proj4;\r\n\tif (typeof define === 'function' && define.amd) {\r\n\t\t// AMD\r\n\t\tdefine(['leaflet', 'proj4'], factory);\r\n\t} else if (typeof module === 'object' && typeof module.exports === \"object\") {\r\n\t\t// Node/CommonJS\r\n\t\tL = require('leaflet');\r\n\t\tproj4 = require('proj4');\r\n\t\tmodule.exports = factory(L, proj4);\r\n\t} else {\r\n\t\t// Browser globals\r\n\t\tif (typeof window.L === 'undefined' || typeof window.proj4 === 'undefined')\r\n\t\t\tthrow 'Leaflet and proj4 must be loaded first';\r\n\t\tfactory(window.L, window.proj4);\r\n\t}\r\n}(function (L, proj4) {\r\n\r\n\tL.Proj = {};\r\n\r\n\tL.Proj._isProj4Obj = function(a) {\r\n\t\treturn (typeof a.inverse !== 'undefined' &&\r\n\t\t\ttypeof a.forward !== 'undefined');\r\n\t};\r\n\r\n\tL.Proj.Projection = L.Class.extend({\r\n\t\tinitialize: function(code, def, bounds) {\r\n\t\t\tvar isP4 = L.Proj._isProj4Obj(code);\r\n\t\t\tthis._proj = isP4 ? code : this._projFromCodeDef(code, def);\r\n\t\t\tthis.bounds = isP4 ? def : bounds;\r\n\t\t},\r\n\r\n\t\tproject: function (latlng) {\r\n\t\t\tvar point = this._proj.forward([latlng.lng, latlng.lat]);\r\n\t\t\treturn new L.Point(point[0], point[1]);\r\n\t\t},\r\n\r\n\t\tunproject: function (point, unbounded) {\r\n\t\t\tvar point2 = this._proj.inverse([point.x, point.y]);\r\n\t\t\treturn new L.LatLng(point2[1], point2[0], unbounded);\r\n\t\t},\r\n\r\n\t\t_projFromCodeDef: function(code, def) {\r\n\t\t\tif (def) {\r\n\t\t\t\tproj4.defs(code, def);\r\n\t\t\t} else if (proj4.defs[code] === undefined) {\r\n\t\t\t\tvar urn = code.split(':');\r\n\t\t\t\tif (urn.length > 3) {\r\n\t\t\t\t\tcode = urn[urn.length - 3] + ':' + urn[urn.length - 1];\r\n\t\t\t\t}\r\n\t\t\t\tif (proj4.defs[code] === undefined) {\r\n\t\t\t\t\tthrow 'No projection definition for code ' + code;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn proj4(code);\r\n\t\t}\r\n\t});\r\n\r\n\tL.Proj.CRS = L.Class.extend({\r\n\t\tincludes: L.CRS,\r\n\r\n\t\toptions: {\r\n\t\t\ttransformation: new L.Transformation(1, 0, -1, 0)\r\n\t\t},\r\n\r\n\t\tinitialize: function(a, b, c) {\r\n\t\t\tvar code,\r\n\t\t\t    proj,\r\n\t\t\t    def,\r\n\t\t\t    options;\r\n\r\n\t\t\tif (L.Proj._isProj4Obj(a)) {\r\n\t\t\t\tproj = a;\r\n\t\t\t\tcode = proj.srsCode;\r\n\t\t\t\toptions = b || {};\r\n\r\n\t\t\t\tthis.projection = new L.Proj.Projection(proj, options.bounds);\r\n\t\t\t} else {\r\n\t\t\t\tcode = a;\r\n\t\t\t\tdef = b;\r\n\t\t\t\toptions = c || {};\r\n\t\t\t\tthis.projection = new L.Proj.Projection(code, def, options.bounds);\r\n\t\t\t}\r\n\r\n\t\t\tL.Util.setOptions(this, options);\r\n\t\t\tthis.code = code;\r\n\t\t\tthis.transformation = this.options.transformation;\r\n\r\n\t\t\tif (this.options.origin) {\r\n\t\t\t\tthis.transformation =\r\n\t\t\t\t\tnew L.Transformation(1, -this.options.origin[0],\r\n\t\t\t\t\t\t-1, this.options.origin[1]);\r\n\t\t\t}\r\n\r\n\t\t\tif (this.options.scales) {\r\n\t\t\t\tthis._scales = this.options.scales;\r\n\t\t\t} else if (this.options.resolutions) {\r\n\t\t\t\tthis._scales = [];\r\n\t\t\t\tfor (var i = this.options.resolutions.length - 1; i >= 0; i--) {\r\n\t\t\t\t\tif (this.options.resolutions[i]) {\r\n\t\t\t\t\t\tthis._scales[i] = 1 / this.options.resolutions[i];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.infinite = !this.options.bounds;\r\n\r\n\t\t},\r\n\r\n\t\tscale: function(zoom) {\r\n\t\t\tvar iZoom = Math.floor(zoom),\r\n\t\t\t\tbaseScale,\r\n\t\t\t\tnextScale,\r\n\t\t\t\tscaleDiff,\r\n\t\t\t\tzDiff;\r\n\t\t\tif (zoom === iZoom) {\r\n\t\t\t\treturn this._scales[zoom];\r\n\t\t\t} else {\r\n\t\t\t\t// Non-integer zoom, interpolate\r\n\t\t\t\tbaseScale = this._scales[iZoom];\r\n\t\t\t\tnextScale = this._scales[iZoom + 1];\r\n\t\t\t\tscaleDiff = nextScale - baseScale;\r\n\t\t\t\tzDiff = (zoom - iZoom);\r\n\t\t\t\treturn baseScale + scaleDiff * zDiff;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tzoom: function(scale) {\r\n\t\t\t// Find closest number in this._scales, down\r\n\t\t\tvar downScale = this._closestElement(this._scales, scale),\r\n\t\t\t\tdownZoom = this._scales.indexOf(downScale),\r\n\t\t\t\tnextScale,\r\n\t\t\t\tnextZoom,\r\n\t\t\t\tscaleDiff;\r\n\t\t\t// Check if scale is downScale => return array index\r\n\t\t\tif (scale === downScale) {\r\n\t\t\t\treturn downZoom;\r\n\t\t\t}\r\n\t\t\t// Interpolate\r\n\t\t\tnextZoom = downZoom + 1;\r\n\t\t\tnextScale = this._scales[nextZoom];\r\n\t\t\tif (nextScale === undefined) {\r\n\t\t\t\treturn Infinity;\r\n\t\t\t}\r\n\t\t\tscaleDiff = nextScale - downScale;\r\n\t\t\treturn (scale - downScale) / scaleDiff + downZoom;\r\n\t\t},\r\n\r\n\t\tdistance: L.CRS.Earth.distance,\r\n\r\n\t\tR: L.CRS.Earth.R,\r\n\r\n\t\t/* Get the closest lowest element in an array */\r\n\t\t_closestElement: function(array, element) {\r\n\t\t\tvar low;\r\n\t\t\tfor (var i = array.length; i--;) {\r\n\t\t\t\tif (array[i] <= element && (low === undefined || low < array[i])) {\r\n\t\t\t\t\tlow = array[i];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn low;\r\n\t\t}\r\n\t});\r\n\r\n\tL.Proj.GeoJSON = L.GeoJSON.extend({\r\n\t\tinitialize: function(geojson, options) {\r\n\t\t\tthis._callLevel = 0;\r\n\t\t\tL.GeoJSON.prototype.initialize.call(this, geojson, options);\r\n\t\t},\r\n\r\n\t\taddData: function(geojson) {\r\n\t\t\tvar crs;\r\n\r\n\t\t\tif (geojson) {\r\n\t\t\t\tif (geojson.crs && geojson.crs.type === 'name') {\r\n\t\t\t\t\tcrs = new L.Proj.CRS(geojson.crs.properties.name);\r\n\t\t\t\t} else if (geojson.crs && geojson.crs.type) {\r\n\t\t\t\t\tcrs = new L.Proj.CRS(geojson.crs.type + ':' + geojson.crs.properties.code);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (crs !== undefined) {\r\n\t\t\t\t\tthis.options.coordsToLatLng = function(coords) {\r\n\t\t\t\t\t\tvar point = L.point(coords[0], coords[1]);\r\n\t\t\t\t\t\treturn crs.projection.unproject(point);\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Base class' addData might call us recursively, but\r\n\t\t\t// CRS shouldn't be cleared in that case, since CRS applies\r\n\t\t\t// to the whole GeoJSON, inluding sub-features.\r\n\t\t\tthis._callLevel++;\r\n\t\t\ttry {\r\n\t\t\t\tL.GeoJSON.prototype.addData.call(this, geojson);\r\n\t\t\t} finally {\r\n\t\t\t\tthis._callLevel--;\r\n\t\t\t\tif (this._callLevel === 0) {\r\n\t\t\t\t\tdelete this.options.coordsToLatLng;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\tL.Proj.geoJson = function(geojson, options) {\r\n\t\treturn new L.Proj.GeoJSON(geojson, options);\r\n\t};\r\n\r\n\tL.Proj.ImageOverlay = L.ImageOverlay.extend({\r\n\t\tinitialize: function (url, bounds, options) {\r\n\t\t\tL.ImageOverlay.prototype.initialize.call(this, url, null, options);\r\n\t\t\tthis._projectedBounds = bounds;\r\n\t\t},\r\n\r\n\t\t// Danger ahead: Overriding internal methods in Leaflet.\r\n\t\t// Decided to do this rather than making a copy of L.ImageOverlay\r\n\t\t// and doing very tiny modifications to it.\r\n\t\t// Future will tell if this was wise or not.\r\n\t\t_animateZoom: function (event) {\r\n\t\t\tvar scale = this._map.getZoomScale(event.zoom);\r\n\t\t\tvar northWest = L.point(this._projectedBounds.min.x, this._projectedBounds.max.y);\r\n\t\t\tvar offset = this._projectedToNewLayerPoint(northWest, event.zoom, event.center);\r\n\r\n\t\t\tL.DomUtil.setTransform(this._image, offset, scale);\r\n\t\t},\r\n\r\n\t\t_reset: function () {\r\n\t\t\tvar zoom = this._map.getZoom();\r\n\t\t\tvar pixelOrigin = this._map.getPixelOrigin();\r\n\t\t\tvar bounds = L.bounds(\r\n\t\t\t\tthis._transform(this._projectedBounds.min, zoom)._subtract(pixelOrigin),\r\n\t\t\t\tthis._transform(this._projectedBounds.max, zoom)._subtract(pixelOrigin)\r\n\t\t\t);\r\n\t\t\tvar size = bounds.getSize();\r\n\r\n\t\t\tL.DomUtil.setPosition(this._image, bounds.min);\r\n\t\t\tthis._image.style.width = size.x + 'px';\r\n\t\t\tthis._image.style.height = size.y + 'px';\r\n\t\t},\r\n\r\n\t\t_projectedToNewLayerPoint: function (point, zoom, center) {\r\n\t\t\tvar viewHalf = this._map.getSize()._divideBy(2);\r\n\t\t\tvar newTopLeft = this._map.project(center, zoom)._subtract(viewHalf)._round();\r\n\t\t\tvar topLeft = newTopLeft.add(this._map._getMapPanePos());\r\n\r\n\t\t\treturn this._transform(point, zoom)._subtract(topLeft);\r\n\t\t},\r\n\r\n\t\t_transform: function (point, zoom) {\r\n\t\t\tvar crs = this._map.options.crs;\r\n\t\t\tvar transformation = crs.transformation;\r\n\t\t\tvar scale = crs.scale(zoom);\r\n\r\n\t\t\treturn transformation.transform(point, scale);\r\n\t\t}\r\n\t});\r\n\r\n\tL.Proj.imageOverlay = function (url, bounds, options) {\r\n\t\treturn new L.Proj.ImageOverlay(url, bounds, options);\r\n\t};\r\n\r\n\treturn L.Proj;\r\n}));\r\n\n},{\"leaflet\":18,\"proj4\":135}],137:[function(require,module,exports){\n'use strict';\n\nvar isArrayish = require('is-arrayish');\n\nvar concat = Array.prototype.concat;\nvar slice = Array.prototype.slice;\n\nvar swizzle = module.exports = function swizzle(args) {\n\tvar results = [];\n\n\tfor (var i = 0, len = args.length; i < len; i++) {\n\t\tvar arg = args[i];\n\n\t\tif (isArrayish(arg)) {\n\t\t\t// http://jsperf.com/javascript-array-concat-vs-push/98\n\t\t\tresults = concat.call(results, slice.call(arg));\n\t\t} else {\n\t\t\tresults.push(arg);\n\t\t}\n\t}\n\n\treturn results;\n};\n\nswizzle.wrap = function (fn) {\n\treturn function () {\n\t\treturn fn(swizzle(arguments));\n\t};\n};\n\n},{\"is-arrayish\":138}],138:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function isArrayish(obj) {\n\tif (!obj || typeof obj === 'string') {\n\t\treturn false;\n\t}\n\n\treturn obj instanceof Array || Array.isArray(obj) ||\n\t\t(obj.length >= 0 && (obj.splice instanceof Function ||\n\t\t\t(Object.getOwnPropertyDescriptor(obj, (obj.length - 1)) && obj.constructor.name !== 'String')));\n};\n\n},{}],139:[function(require,module,exports){\nvar engine = require('../src/store-engine')\n\nvar storages = require('../storages/all')\nvar plugins = [require('../plugins/json2')]\n\nmodule.exports = engine.createStore(storages, plugins)\n\n},{\"../plugins/json2\":140,\"../src/store-engine\":142,\"../storages/all\":144}],140:[function(require,module,exports){\nmodule.exports = json2Plugin\n\nfunction json2Plugin() {\n\trequire('./lib/json2')\n\treturn {}\n}\n\n},{\"./lib/json2\":141}],141:[function(require,module,exports){\n//  json2.js\n//  2016-10-28\n//  Public Domain.\n//  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n//  See http://www.JSON.org/js.html\n//  This code should be minified before deployment.\n//  See http://javascript.crockford.com/jsmin.html\n\n//  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO\n//  NOT CONTROL.\n\n//  This file creates a global JSON object containing two methods: stringify\n//  and parse. This file provides the ES5 JSON capability to ES3 systems.\n//  If a project might run on IE8 or earlier, then this file should be included.\n//  This file does nothing on ES5 systems.\n\n//      JSON.stringify(value, replacer, space)\n//          value       any JavaScript value, usually an object or array.\n//          replacer    an optional parameter that determines how object\n//                      values are stringified for objects. It can be a\n//                      function or an array of strings.\n//          space       an optional parameter that specifies the indentation\n//                      of nested structures. If it is omitted, the text will\n//                      be packed without extra whitespace. If it is a number,\n//                      it will specify the number of spaces to indent at each\n//                      level. If it is a string (such as \"\\t\" or \"&nbsp;\"),\n//                      it contains the characters used to indent at each level.\n//          This method produces a JSON text from a JavaScript value.\n//          When an object value is found, if the object contains a toJSON\n//          method, its toJSON method will be called and the result will be\n//          stringified. A toJSON method does not serialize: it returns the\n//          value represented by the name/value pair that should be serialized,\n//          or undefined if nothing should be serialized. The toJSON method\n//          will be passed the key associated with the value, and this will be\n//          bound to the value.\n\n//          For example, this would serialize Dates as ISO strings.\n\n//              Date.prototype.toJSON = function (key) {\n//                  function f(n) {\n//                      // Format integers to have at least two digits.\n//                      return (n < 10)\n//                          ? \"0\" + n\n//                          : n;\n//                  }\n//                  return this.getUTCFullYear()   + \"-\" +\n//                       f(this.getUTCMonth() + 1) + \"-\" +\n//                       f(this.getUTCDate())      + \"T\" +\n//                       f(this.getUTCHours())     + \":\" +\n//                       f(this.getUTCMinutes())   + \":\" +\n//                       f(this.getUTCSeconds())   + \"Z\";\n//              };\n\n//          You can provide an optional replacer method. It will be passed the\n//          key and value of each member, with this bound to the containing\n//          object. The value that is returned from your method will be\n//          serialized. If your method returns undefined, then the member will\n//          be excluded from the serialization.\n\n//          If the replacer parameter is an array of strings, then it will be\n//          used to select the members to be serialized. It filters the results\n//          such that only members with keys listed in the replacer array are\n//          stringified.\n\n//          Values that do not have JSON representations, such as undefined or\n//          functions, will not be serialized. Such values in objects will be\n//          dropped; in arrays they will be replaced with null. You can use\n//          a replacer function to replace those with JSON values.\n\n//          JSON.stringify(undefined) returns undefined.\n\n//          The optional space parameter produces a stringification of the\n//          value that is filled with line breaks and indentation to make it\n//          easier to read.\n\n//          If the space parameter is a non-empty string, then that string will\n//          be used for indentation. If the space parameter is a number, then\n//          the indentation will be that many spaces.\n\n//          Example:\n\n//          text = JSON.stringify([\"e\", {pluribus: \"unum\"}]);\n//          // text is '[\"e\",{\"pluribus\":\"unum\"}]'\n\n//          text = JSON.stringify([\"e\", {pluribus: \"unum\"}], null, \"\\t\");\n//          // text is '[\\n\\t\"e\",\\n\\t{\\n\\t\\t\"pluribus\": \"unum\"\\n\\t}\\n]'\n\n//          text = JSON.stringify([new Date()], function (key, value) {\n//              return this[key] instanceof Date\n//                  ? \"Date(\" + this[key] + \")\"\n//                  : value;\n//          });\n//          // text is '[\"Date(---current time---)\"]'\n\n//      JSON.parse(text, reviver)\n//          This method parses a JSON text to produce an object or array.\n//          It can throw a SyntaxError exception.\n\n//          The optional reviver parameter is a function that can filter and\n//          transform the results. It receives each of the keys and values,\n//          and its return value is used instead of the original value.\n//          If it returns what it received, then the structure is not modified.\n//          If it returns undefined then the member is deleted.\n\n//          Example:\n\n//          // Parse the text. Values that look like ISO date strings will\n//          // be converted to Date objects.\n\n//          myData = JSON.parse(text, function (key, value) {\n//              var a;\n//              if (typeof value === \"string\") {\n//                  a =\n//   /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2}(?:\\.\\d*)?)Z$/.exec(value);\n//                  if (a) {\n//                      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],\n//                          +a[5], +a[6]));\n//                  }\n//              }\n//              return value;\n//          });\n\n//          myData = JSON.parse('[\"Date(09/09/2001)\"]', function (key, value) {\n//              var d;\n//              if (typeof value === \"string\" &&\n//                      value.slice(0, 5) === \"Date(\" &&\n//                      value.slice(-1) === \")\") {\n//                  d = new Date(value.slice(5, -1));\n//                  if (d) {\n//                      return d;\n//                  }\n//              }\n//              return value;\n//          });\n\n//  This is a reference implementation. You are free to copy, modify, or\n//  redistribute.\n\n/*jslint\n    eval, for, this\n*/\n\n/*property\n    JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,\n    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,\n    lastIndex, length, parse, prototype, push, replace, slice, stringify,\n    test, toJSON, toString, valueOf\n*/\n\n\n// Create a JSON object only if one does not already exist. We create the\n// methods in a closure to avoid creating global variables.\n\nif (typeof JSON !== \"object\") {\n    JSON = {};\n}\n\n(function () {\n    \"use strict\";\n\n    var rx_one = /^[\\],:{}\\s]*$/;\n    var rx_two = /\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g;\n    var rx_three = /\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g;\n    var rx_four = /(?:^|:|,)(?:\\s*\\[)+/g;\n    var rx_escapable = /[\\\\\"\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;\n    var rx_dangerous = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;\n\n    function f(n) {\n        // Format integers to have at least two digits.\n        return n < 10\n            ? \"0\" + n\n            : n;\n    }\n\n    function this_value() {\n        return this.valueOf();\n    }\n\n    if (typeof Date.prototype.toJSON !== \"function\") {\n\n        Date.prototype.toJSON = function () {\n\n            return isFinite(this.valueOf())\n                ? this.getUTCFullYear() + \"-\" +\n                        f(this.getUTCMonth() + 1) + \"-\" +\n                        f(this.getUTCDate()) + \"T\" +\n                        f(this.getUTCHours()) + \":\" +\n                        f(this.getUTCMinutes()) + \":\" +\n                        f(this.getUTCSeconds()) + \"Z\"\n                : null;\n        };\n\n        Boolean.prototype.toJSON = this_value;\n        Number.prototype.toJSON = this_value;\n        String.prototype.toJSON = this_value;\n    }\n\n    var gap;\n    var indent;\n    var meta;\n    var rep;\n\n\n    function quote(string) {\n\n// If the string contains no control characters, no quote characters, and no\n// backslash characters, then we can safely slap some quotes around it.\n// Otherwise we must also replace the offending characters with safe escape\n// sequences.\n\n        rx_escapable.lastIndex = 0;\n        return rx_escapable.test(string)\n            ? \"\\\"\" + string.replace(rx_escapable, function (a) {\n                var c = meta[a];\n                return typeof c === \"string\"\n                    ? c\n                    : \"\\\\u\" + (\"0000\" + a.charCodeAt(0).toString(16)).slice(-4);\n            }) + \"\\\"\"\n            : \"\\\"\" + string + \"\\\"\";\n    }\n\n\n    function str(key, holder) {\n\n// Produce a string from holder[key].\n\n        var i;          // The loop counter.\n        var k;          // The member key.\n        var v;          // The member value.\n        var length;\n        var mind = gap;\n        var partial;\n        var value = holder[key];\n\n// If the value has a toJSON method, call it to obtain a replacement value.\n\n        if (value && typeof value === \"object\" &&\n                typeof value.toJSON === \"function\") {\n            value = value.toJSON(key);\n        }\n\n// If we were called with a replacer function, then call the replacer to\n// obtain a replacement value.\n\n        if (typeof rep === \"function\") {\n            value = rep.call(holder, key, value);\n        }\n\n// What happens next depends on the value's type.\n\n        switch (typeof value) {\n        case \"string\":\n            return quote(value);\n\n        case \"number\":\n\n// JSON numbers must be finite. Encode non-finite numbers as null.\n\n            return isFinite(value)\n                ? String(value)\n                : \"null\";\n\n        case \"boolean\":\n        case \"null\":\n\n// If the value is a boolean or null, convert it to a string. Note:\n// typeof null does not produce \"null\". The case is included here in\n// the remote chance that this gets fixed someday.\n\n            return String(value);\n\n// If the type is \"object\", we might be dealing with an object or an array or\n// null.\n\n        case \"object\":\n\n// Due to a specification blunder in ECMAScript, typeof null is \"object\",\n// so watch out for that case.\n\n            if (!value) {\n                return \"null\";\n            }\n\n// Make an array to hold the partial results of stringifying this object value.\n\n            gap += indent;\n            partial = [];\n\n// Is the value an array?\n\n            if (Object.prototype.toString.apply(value) === \"[object Array]\") {\n\n// The value is an array. Stringify every element. Use null as a placeholder\n// for non-JSON values.\n\n                length = value.length;\n                for (i = 0; i < length; i += 1) {\n                    partial[i] = str(i, value) || \"null\";\n                }\n\n// Join all of the elements together, separated with commas, and wrap them in\n// brackets.\n\n                v = partial.length === 0\n                    ? \"[]\"\n                    : gap\n                        ? \"[\\n\" + gap + partial.join(\",\\n\" + gap) + \"\\n\" + mind + \"]\"\n                        : \"[\" + partial.join(\",\") + \"]\";\n                gap = mind;\n                return v;\n            }\n\n// If the replacer is an array, use it to select the members to be stringified.\n\n            if (rep && typeof rep === \"object\") {\n                length = rep.length;\n                for (i = 0; i < length; i += 1) {\n                    if (typeof rep[i] === \"string\") {\n                        k = rep[i];\n                        v = str(k, value);\n                        if (v) {\n                            partial.push(quote(k) + (\n                                gap\n                                    ? \": \"\n                                    : \":\"\n                            ) + v);\n                        }\n                    }\n                }\n            } else {\n\n// Otherwise, iterate through all of the keys in the object.\n\n                for (k in value) {\n                    if (Object.prototype.hasOwnProperty.call(value, k)) {\n                        v = str(k, value);\n                        if (v) {\n                            partial.push(quote(k) + (\n                                gap\n                                    ? \": \"\n                                    : \":\"\n                            ) + v);\n                        }\n                    }\n                }\n            }\n\n// Join all of the member texts together, separated with commas,\n// and wrap them in braces.\n\n            v = partial.length === 0\n                ? \"{}\"\n                : gap\n                    ? \"{\\n\" + gap + partial.join(\",\\n\" + gap) + \"\\n\" + mind + \"}\"\n                    : \"{\" + partial.join(\",\") + \"}\";\n            gap = mind;\n            return v;\n        }\n    }\n\n// If the JSON object does not yet have a stringify method, give it one.\n\n    if (typeof JSON.stringify !== \"function\") {\n        meta = {    // table of character substitutions\n            \"\\b\": \"\\\\b\",\n            \"\\t\": \"\\\\t\",\n            \"\\n\": \"\\\\n\",\n            \"\\f\": \"\\\\f\",\n            \"\\r\": \"\\\\r\",\n            \"\\\"\": \"\\\\\\\"\",\n            \"\\\\\": \"\\\\\\\\\"\n        };\n        JSON.stringify = function (value, replacer, space) {\n\n// The stringify method takes a value and an optional replacer, and an optional\n// space parameter, and returns a JSON text. The replacer can be a function\n// that can replace values, or an array of strings that will select the keys.\n// A default replacer method can be provided. Use of the space parameter can\n// produce text that is more easily readable.\n\n            var i;\n            gap = \"\";\n            indent = \"\";\n\n// If the space parameter is a number, make an indent string containing that\n// many spaces.\n\n            if (typeof space === \"number\") {\n                for (i = 0; i < space; i += 1) {\n                    indent += \" \";\n                }\n\n// If the space parameter is a string, it will be used as the indent string.\n\n            } else if (typeof space === \"string\") {\n                indent = space;\n            }\n\n// If there is a replacer, it must be a function or an array.\n// Otherwise, throw an error.\n\n            rep = replacer;\n            if (replacer && typeof replacer !== \"function\" &&\n                    (typeof replacer !== \"object\" ||\n                    typeof replacer.length !== \"number\")) {\n                throw new Error(\"JSON.stringify\");\n            }\n\n// Make a fake root object containing our value under the key of \"\".\n// Return the result of stringifying the value.\n\n            return str(\"\", {\"\": value});\n        };\n    }\n\n\n// If the JSON object does not yet have a parse method, give it one.\n\n    if (typeof JSON.parse !== \"function\") {\n        JSON.parse = function (text, reviver) {\n\n// The parse method takes a text and an optional reviver function, and returns\n// a JavaScript value if the text is a valid JSON text.\n\n            var j;\n\n            function walk(holder, key) {\n\n// The walk method is used to recursively walk the resulting structure so\n// that modifications can be made.\n\n                var k;\n                var v;\n                var value = holder[key];\n                if (value && typeof value === \"object\") {\n                    for (k in value) {\n                        if (Object.prototype.hasOwnProperty.call(value, k)) {\n                            v = walk(value, k);\n                            if (v !== undefined) {\n                                value[k] = v;\n                            } else {\n                                delete value[k];\n                            }\n                        }\n                    }\n                }\n                return reviver.call(holder, key, value);\n            }\n\n\n// Parsing happens in four stages. In the first stage, we replace certain\n// Unicode characters with escape sequences. JavaScript handles many characters\n// incorrectly, either silently deleting them, or treating them as line endings.\n\n            text = String(text);\n            rx_dangerous.lastIndex = 0;\n            if (rx_dangerous.test(text)) {\n                text = text.replace(rx_dangerous, function (a) {\n                    return \"\\\\u\" +\n                            (\"0000\" + a.charCodeAt(0).toString(16)).slice(-4);\n                });\n            }\n\n// In the second stage, we run the text against regular expressions that look\n// for non-JSON patterns. We are especially concerned with \"()\" and \"new\"\n// because they can cause invocation, and \"=\" because it can cause mutation.\n// But just to be safe, we want to reject all unexpected forms.\n\n// We split the second stage into 4 regexp operations in order to work around\n// crippling inefficiencies in IE's and Safari's regexp engines. First we\n// replace the JSON backslash pairs with \"@\" (a non-JSON character). Second, we\n// replace all simple value tokens with \"]\" characters. Third, we delete all\n// open brackets that follow a colon or comma or that begin the text. Finally,\n// we look to see that the remaining characters are only whitespace or \"]\" or\n// \",\" or \":\" or \"{\" or \"}\". If that is so, then the text is safe for eval.\n\n            if (\n                rx_one.test(\n                    text\n                        .replace(rx_two, \"@\")\n                        .replace(rx_three, \"]\")\n                        .replace(rx_four, \"\")\n                )\n            ) {\n\n// In the third stage we use the eval function to compile the text into a\n// JavaScript structure. The \"{\" operator is subject to a syntactic ambiguity\n// in JavaScript: it can begin a block or an object literal. We wrap the text\n// in parens to eliminate the ambiguity.\n\n                j = eval(\"(\" + text + \")\");\n\n// In the optional fourth stage, we recursively walk the new structure, passing\n// each name/value pair to a reviver function for possible transformation.\n\n                return (typeof reviver === \"function\")\n                    ? walk({\"\": j}, \"\")\n                    : j;\n            }\n\n// If the text is not JSON parseable, then a SyntaxError is thrown.\n\n            throw new SyntaxError(\"JSON.parse\");\n        };\n    }\n}());\n},{}],142:[function(require,module,exports){\nvar util = require('./util')\nvar slice = util.slice\nvar pluck = util.pluck\nvar each = util.each\nvar create = util.create\nvar isList = util.isList\nvar isFunction = util.isFunction\nvar isObject = util.isObject\n\nmodule.exports = {\n\tcreateStore: createStore,\n}\n\nvar storeAPI = {\n\tversion: '2.0.4',\n\tenabled: false,\n\tstorage: null,\n\n\t// addStorage adds another storage to this store. The store\n\t// will use the first storage it receives that is enabled, so\n\t// call addStorage in the order of preferred storage.\n\taddStorage: function(storage) {\n\t\tif (this.enabled) { return }\n\t\tif (this._testStorage(storage)) {\n\t\t\tthis._storage.resolved = storage\n\t\t\tthis.enabled = true\n\t\t\tthis.storage = storage.name\n\t\t}\n\t},\n\n\t// addPlugin will add a plugin to this store.\n\taddPlugin: function(plugin) {\n\t\tvar self = this\n\n\t\t// If the plugin is an array, then add all plugins in the array.\n\t\t// This allows for a plugin to depend on other plugins.\n\t\tif (isList(plugin)) {\n\t\t\teach(plugin, function(plugin) {\n\t\t\t\tself.addPlugin(plugin)\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\t// Keep track of all plugins we've seen so far, so that we\n\t\t// don't add any of them twice.\n\t\tvar seenPlugin = pluck(this._seenPlugins, function(seenPlugin) { return (plugin === seenPlugin) })\n\t\tif (seenPlugin) {\n\t\t\treturn\n\t\t}\n\t\tthis._seenPlugins.push(plugin)\n\n\t\t// Check that the plugin is properly formed\n\t\tif (!isFunction(plugin)) {\n\t\t\tthrow new Error('Plugins must be function values that return objects')\n\t\t}\n\n\t\tvar pluginProperties = plugin.call(this)\n\t\tif (!isObject(pluginProperties)) {\n\t\t\tthrow new Error('Plugins must return an object of function properties')\n\t\t}\n\n\t\t// Add the plugin function properties to this store instance.\n\t\teach(pluginProperties, function(pluginFnProp, propName) {\n\t\t\tif (!isFunction(pluginFnProp)) {\n\t\t\t\tthrow new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')\n\t\t\t}\n\t\t\tself._assignPluginFnProp(pluginFnProp, propName)\n\t\t})\n\t},\n\n\t// get returns the value of the given key. If that value\n\t// is undefined, it returns optionalDefaultValue instead.\n\tget: function(key, optionalDefaultValue) {\n\t\tvar data = this._storage().read(this._namespacePrefix + key)\n\t\treturn this._deserialize(data, optionalDefaultValue)\n\t},\n\n\t// set will store the given value at key and returns value.\n\t// Calling set with value === undefined is equivalent to calling remove.\n\tset: function(key, value) {\n\t\tif (value === undefined) {\n\t\t\treturn this.remove(key)\n\t\t}\n\t\tthis._storage().write(this._namespacePrefix + key, this._serialize(value))\n\t\treturn value\n\t},\n\n\t// remove deletes the key and value stored at the given key.\n\tremove: function(key) {\n\t\tthis._storage().remove(this._namespacePrefix + key)\n\t},\n\n\t// each will call the given callback once for each key-value pair\n\t// in this store.\n\teach: function(callback) {\n\t\tvar self = this\n\t\tthis._storage().each(function(val, namespacedKey) {\n\t\t\tcallback(self._deserialize(val), namespacedKey.replace(self._namespaceRegexp, ''))\n\t\t})\n\t},\n\n\t// clearAll will remove all the stored key-value pairs in this store.\n\tclearAll: function() {\n\t\tthis._storage().clearAll()\n\t},\n\n\t// additional functionality that can't live in plugins\n\t// ---------------------------------------------------\n\n\t// hasNamespace returns true if this store instance has the given namespace.\n\thasNamespace: function(namespace) {\n\t\treturn (this._namespacePrefix == '__storejs_'+namespace+'_')\n\t},\n\n\t// namespace clones the current store and assigns it the given namespace\n\tnamespace: function(namespace) {\n\t\tif (!this._legalNamespace.test(namespace)) {\n\t\t\tthrow new Error('store.js namespaces can only have alhpanumerics + underscores and dashes')\n\t\t}\n\t\t// create a prefix that is very unlikely to collide with un-namespaced keys\n\t\tvar namespacePrefix = '__storejs_'+namespace+'_'\n\t\treturn create(this, {\n\t\t\t_namespacePrefix: namespacePrefix,\n\t\t\t_namespaceRegexp: namespacePrefix ? new RegExp('^'+namespacePrefix) : null\n\t\t})\n\t},\n\n\t// createStore creates a store.js instance with the first\n\t// functioning storage in the list of storage candidates,\n\t// and applies the the given mixins to the instance.\n\tcreateStore: function(storages, plugins) {\n\t\treturn createStore(storages, plugins)\n\t},\n}\n\nfunction createStore(storages, plugins) {\n\tvar _privateStoreProps = {\n\t\t_seenPlugins: [],\n\t\t_namespacePrefix: '',\n\t\t_namespaceRegexp: null,\n\t\t_legalNamespace: /^[a-zA-Z0-9_\\-]+$/, // alpha-numeric + underscore and dash\n\n\t\t_storage: function() {\n\t\t\tif (!this.enabled) {\n\t\t\t\tthrow new Error(\"store.js: No supported storage has been added! \"+\n\t\t\t\t\t\"Add one (e.g store.addStorage(require('store/storages/cookieStorage')) \"+\n\t\t\t\t\t\"or use a build with more built-in storages (e.g \"+\n\t\t\t\t\t\"https://github.com/marcuswestin/store.js/tree/master/dist/store.legacy.min.js)\")\n\t\t\t}\n\t\t\treturn this._storage.resolved\n\t\t},\n\n\t\t_testStorage: function(storage) {\n\t\t\ttry {\n\t\t\t\tvar testStr = '__storejs__test__'\n\t\t\t\tstorage.write(testStr, testStr)\n\t\t\t\tvar ok = (storage.read(testStr) === testStr)\n\t\t\t\tstorage.remove(testStr)\n\t\t\t\treturn ok\n\t\t\t} catch(e) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t},\n\n\t\t_assignPluginFnProp: function(pluginFnProp, propName) {\n\t\t\tvar oldFn = this[propName]\n\t\t\tthis[propName] = function pluginFn() {\n\t\t\t\tvar args = slice(arguments, 0)\n\t\t\t\tvar self = this\n\n\t\t\t\t// super_fn calls the old function which was overwritten by\n\t\t\t\t// this mixin.\n\t\t\t\tfunction super_fn() {\n\t\t\t\t\tif (!oldFn) { return }\n\t\t\t\t\teach(arguments, function(arg, i) {\n\t\t\t\t\t\targs[i] = arg\n\t\t\t\t\t})\n\t\t\t\t\treturn oldFn.apply(self, args)\n\t\t\t\t}\n\n\t\t\t\t// Give mixing function access to super_fn by prefixing all mixin function\n\t\t\t\t// arguments with super_fn.\n\t\t\t\tvar newFnArgs = [super_fn].concat(args)\n\n\t\t\t\treturn pluginFnProp.apply(self, newFnArgs)\n\t\t\t}\n\t\t},\n\n\t\t_serialize: function(obj) {\n\t\t\treturn JSON.stringify(obj)\n\t\t},\n\n\t\t_deserialize: function(strVal, defaultVal) {\n\t\t\tif (!strVal) { return defaultVal }\n\t\t\t// It is possible that a raw string value has been previously stored\n\t\t\t// in a storage without using store.js, meaning it will be a raw\n\t\t\t// string value instead of a JSON serialized string. By defaulting\n\t\t\t// to the raw string value in case of a JSON parse error, we allow\n\t\t\t// for past stored values to be forwards-compatible with store.js\n\t\t\tvar val = ''\n\t\t\ttry { val = JSON.parse(strVal) }\n\t\t\tcatch(e) { val = strVal }\n\n\t\t\treturn (val !== undefined ? val : defaultVal)\n\t\t},\n\t}\n\n\tvar store = create(_privateStoreProps, storeAPI)\n\teach(storages, function(storage) {\n\t\tstore.addStorage(storage)\n\t})\n\teach(plugins, function(plugin) {\n\t\tstore.addPlugin(plugin)\n\t})\n\treturn store\n}\n\n},{\"./util\":143}],143:[function(require,module,exports){\n(function (global){\nvar assign = make_assign()\nvar create = make_create()\nvar trim = make_trim()\nvar Global = (typeof window !== 'undefined' ? window : global)\n\nmodule.exports = {\n\tassign: assign,\n\tcreate: create,\n\ttrim: trim,\n\tbind: bind,\n\tslice: slice,\n\teach: each,\n\tmap: map,\n\tpluck: pluck,\n\tisList: isList,\n\tisFunction: isFunction,\n\tisObject: isObject,\n\tGlobal: Global,\n}\n\nfunction make_assign() {\n\tif (Object.assign) {\n\t\treturn Object.assign\n\t} else {\n\t\treturn function shimAssign(obj, props1, props2, etc) {\n\t\t\tfor (var i = 1; i < arguments.length; i++) {\n\t\t\t\teach(Object(arguments[i]), function(val, key) {\n\t\t\t\t\tobj[key] = val\n\t\t\t\t})\n\t\t\t}\t\t\t\n\t\t\treturn obj\n\t\t}\n\t}\n}\n\nfunction make_create() {\n\tif (Object.create) {\n\t\treturn function create(obj, assignProps1, assignProps2, etc) {\n\t\t\tvar assignArgsList = slice(arguments, 1)\n\t\t\treturn assign.apply(this, [Object.create(obj)].concat(assignArgsList))\n\t\t}\n\t} else {\n\t\tfunction F() {} // eslint-disable-line no-inner-declarations\n\t\treturn function create(obj, assignProps1, assignProps2, etc) {\n\t\t\tvar assignArgsList = slice(arguments, 1)\n\t\t\tF.prototype = obj\n\t\t\treturn assign.apply(this, [new F()].concat(assignArgsList))\n\t\t}\n\t}\n}\n\nfunction make_trim() {\n\tif (String.prototype.trim) {\n\t\treturn function trim(str) {\n\t\t\treturn String.prototype.trim.call(str)\n\t\t}\n\t} else {\n\t\treturn function trim(str) {\n\t\t\treturn str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '')\n\t\t}\n\t}\n}\n\nfunction bind(obj, fn) {\n\treturn function() {\n\t\treturn fn.apply(obj, Array.prototype.slice.call(arguments, 0))\n\t}\n}\n\nfunction slice(arr, index) {\n\treturn Array.prototype.slice.call(arr, index || 0)\n}\n\nfunction each(obj, fn) {\n\tpluck(obj, function(key, val) {\n\t\tfn(key, val)\n\t\treturn false\n\t})\n}\n\nfunction map(obj, fn) {\n\tvar res = (isList(obj) ? [] : {})\n\tpluck(obj, function(v, k) {\n\t\tres[k] = fn(v, k)\n\t\treturn false\n\t})\n\treturn res\n}\n\nfunction pluck(obj, fn) {\n\tif (isList(obj)) {\n\t\tfor (var i=0; i<obj.length; i++) {\n\t\t\tif (fn(obj[i], i)) {\n\t\t\t\treturn obj[i]\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor (var key in obj) {\n\t\t\tif (obj.hasOwnProperty(key)) {\n\t\t\t\tif (fn(obj[key], key)) {\n\t\t\t\t\treturn obj[key]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction isList(val) {\n\treturn (val != null && typeof val != 'function' && typeof val.length == 'number')\n}\n\nfunction isFunction(val) {\n\treturn val && {}.toString.call(val) === '[object Function]'\n}\n\nfunction isObject(val) {\n\treturn val && {}.toString.call(val) === '[object Object]'\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{}],144:[function(require,module,exports){\nmodule.exports = {\n\t// Listed in order of usage preference\n\t'localStorage': require('./localStorage'),\n\t'oldFF-globalStorage': require('./oldFF-globalStorage'),\n\t'oldIE-userDataStorage': require('./oldIE-userDataStorage'),\n\t'cookieStorage': require('./cookieStorage'),\n\t'sessionStorage': require('./sessionStorage'),\n\t'memoryStorage': require('./memoryStorage'),\n}\n\n},{\"./cookieStorage\":145,\"./localStorage\":146,\"./memoryStorage\":147,\"./oldFF-globalStorage\":148,\"./oldIE-userDataStorage\":149,\"./sessionStorage\":150}],145:[function(require,module,exports){\n// cookieStorage is useful Safari private browser mode, where localStorage\n// doesn't work but cookies do. This implementation is adopted from\n// https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage\n\nvar util = require('../src/util')\nvar Global = util.Global\nvar trim = util.trim\n\nmodule.exports = {\n\tname: 'cookieStorage',\n\tread: read,\n\twrite: write,\n\teach: each,\n\tremove: remove,\n\tclearAll: clearAll,\n}\n\nvar doc = Global.document\n\nfunction read(key) {\n\tif (!key || !_has(key)) { return null }\n\tvar regexpStr = \"(?:^|.*;\\\\s*)\" +\n\t\tescape(key).replace(/[\\-\\.\\+\\*]/g, \"\\\\$&\") +\n\t\t\"\\\\s*\\\\=\\\\s*((?:[^;](?!;))*[^;]?).*\"\n\treturn unescape(doc.cookie.replace(new RegExp(regexpStr), \"$1\"))\n}\n\nfunction each(callback) {\n\tvar cookies = doc.cookie.split(/; ?/g)\n\tfor (var i = cookies.length - 1; i >= 0; i--) {\n\t\tif (!trim(cookies[i])) {\n\t\t\tcontinue\n\t\t}\n\t\tvar kvp = cookies[i].split('=')\n\t\tvar key = unescape(kvp[0])\n\t\tvar val = unescape(kvp[1])\n\t\tcallback(val, key)\n\t}\n}\n\nfunction write(key, data) {\n\tif(!key) { return }\n\tdoc.cookie = escape(key) + \"=\" + escape(data) + \"; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/\"\n}\n\nfunction remove(key) {\n\tif (!key || !_has(key)) {\n\t\treturn\n\t}\n\tdoc.cookie = escape(key) + \"=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/\"\n}\n\nfunction clearAll() {\n\teach(function(_, key) {\n\t\tremove(key)\n\t})\n}\n\nfunction _has(key) {\n\treturn (new RegExp(\"(?:^|;\\\\s*)\" + escape(key).replace(/[\\-\\.\\+\\*]/g, \"\\\\$&\") + \"\\\\s*\\\\=\")).test(doc.cookie)\n}\n\n},{\"../src/util\":143}],146:[function(require,module,exports){\nvar util = require('../src/util')\nvar Global = util.Global\n\nmodule.exports = {\n\tname: 'localStorage',\n\tread: read,\n\twrite: write,\n\teach: each,\n\tremove: remove,\n\tclearAll: clearAll,\n}\n\nfunction localStorage() {\n\treturn Global.localStorage\n}\n\nfunction read(key) {\n\treturn localStorage().getItem(key)\n}\n\nfunction write(key, data) {\n\treturn localStorage().setItem(key, data)\n}\n\nfunction each(fn) {\n\tfor (var i = localStorage().length - 1; i >= 0; i--) {\n\t\tvar key = localStorage().key(i)\n\t\tfn(read(key), key)\n\t}\n}\n\nfunction remove(key) {\n\treturn localStorage().removeItem(key)\n}\n\nfunction clearAll() {\n\treturn localStorage().clear()\n}\n\n},{\"../src/util\":143}],147:[function(require,module,exports){\n// memoryStorage is a useful last fallback to ensure that the store\n// is functions (meaning store.get(), store.set(), etc will all function).\n// However, stored values will not persist when the browser navigates to\n// a new page or reloads the current page.\n\nmodule.exports = {\n\tname: 'memoryStorage',\n\tread: read,\n\twrite: write,\n\teach: each,\n\tremove: remove,\n\tclearAll: clearAll,\n}\n\nvar memoryStorage = {}\n\nfunction read(key) {\n\treturn memoryStorage[key]\n}\n\nfunction write(key, data) {\n\tmemoryStorage[key] = data\n}\n\nfunction each(callback) {\n\tfor (var key in memoryStorage) {\n\t\tif (memoryStorage.hasOwnProperty(key)) {\n\t\t\tcallback(memoryStorage[key], key)\n\t\t}\n\t}\n}\n\nfunction remove(key) {\n\tdelete memoryStorage[key]\n}\n\nfunction clearAll(key) {\n\tmemoryStorage = {}\n}\n\n},{}],148:[function(require,module,exports){\n// oldFF-globalStorage provides storage for Firefox\n// versions 6 and 7, where no localStorage, etc\n// is available.\n\nvar util = require('../src/util')\nvar Global = util.Global\n\nmodule.exports = {\n\tname: 'oldFF-globalStorage',\n\tread: read,\n\twrite: write,\n\teach: each,\n\tremove: remove,\n\tclearAll: clearAll,\n}\n\nvar globalStorage = Global.globalStorage\n\nfunction read(key) {\n\treturn globalStorage[key]\n}\n\nfunction write(key, data) {\n\tglobalStorage[key] = data\n}\n\nfunction each(fn) {\n\tfor (var i = globalStorage.length - 1; i >= 0; i--) {\n\t\tvar key = globalStorage.key(i)\n\t\tfn(globalStorage[key], key)\n\t}\n}\n\nfunction remove(key) {\n\treturn globalStorage.removeItem(key)\n}\n\nfunction clearAll() {\n\teach(function(key, _) {\n\t\tdelete globalStorage[key]\n\t})\n}\n\n},{\"../src/util\":143}],149:[function(require,module,exports){\n// oldIE-userDataStorage provides storage for Internet Explorer\n// versions 6 and 7, where no localStorage, sessionStorage, etc\n// is available.\n\nvar util = require('../src/util')\nvar Global = util.Global\n\nmodule.exports = {\n\tname: 'oldIE-userDataStorage',\n\twrite: write,\n\tread: read,\n\teach: each,\n\tremove: remove,\n\tclearAll: clearAll,\n}\n\nvar storageName = 'storejs'\nvar doc = Global.document\nvar _withStorageEl = _makeIEStorageElFunction()\nvar disable = (Global.navigator ? Global.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\\./) // MSIE 9.x, MSIE 10.x\n\nfunction write(unfixedKey, data) {\n\tif (disable) { return }\n\tvar fixedKey = fixKey(unfixedKey)\n\t_withStorageEl(function(storageEl) {\n\t\tstorageEl.setAttribute(fixedKey, data)\n\t\tstorageEl.save(storageName)\n\t})\n}\n\nfunction read(unfixedKey) {\n\tif (disable) { return }\n\tvar fixedKey = fixKey(unfixedKey)\n\tvar res = null\n\t_withStorageEl(function(storageEl) {\n\t\tres = storageEl.getAttribute(fixedKey)\n\t})\n\treturn res\n}\n\nfunction each(callback) {\n\t_withStorageEl(function(storageEl) {\n\t\tvar attributes = storageEl.XMLDocument.documentElement.attributes\n\t\tfor (var i=attributes.length-1; i>=0; i--) {\n\t\t\tvar attr = attributes[i]\n\t\t\tcallback(storageEl.getAttribute(attr.name), attr.name)\n\t\t}\n\t})\n}\n\nfunction remove(unfixedKey) {\n\tvar fixedKey = fixKey(unfixedKey)\n\t_withStorageEl(function(storageEl) {\n\t\tstorageEl.removeAttribute(fixedKey)\n\t\tstorageEl.save(storageName)\n\t})\n}\n\nfunction clearAll() {\n\t_withStorageEl(function(storageEl) {\n\t\tvar attributes = storageEl.XMLDocument.documentElement.attributes\n\t\tstorageEl.load(storageName)\n\t\tfor (var i=attributes.length-1; i>=0; i--) {\n\t\t\tstorageEl.removeAttribute(attributes[i].name)\n\t\t}\n\t\tstorageEl.save(storageName)\n\t})\n}\n\n// Helpers\n//////////\n\n// In IE7, keys cannot start with a digit or contain certain chars.\n// See https://github.com/marcuswestin/store.js/issues/40\n// See https://github.com/marcuswestin/store.js/issues/83\nvar forbiddenCharsRegex = new RegExp(\"[!\\\"#$%&'()*+,/\\\\\\\\:;<=>?@[\\\\]^`{|}~]\", \"g\")\nfunction fixKey(key) {\n\treturn key.replace(/^\\d/, '___$&').replace(forbiddenCharsRegex, '___')\n}\n\nfunction _makeIEStorageElFunction() {\n\tif (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {\n\t\treturn null\n\t}\n\tvar scriptTag = 'script',\n\t\tstorageOwner,\n\t\tstorageContainer,\n\t\tstorageEl\n\n\t// Since #userData storage applies only to specific paths, we need to\n\t// somehow link our data to a specific path.  We choose /favicon.ico\n\t// as a pretty safe option, since all browsers already make a request to\n\t// this URL anyway and being a 404 will not hurt us here.  We wrap an\n\t// iframe pointing to the favicon in an ActiveXObject(htmlfile) object\n\t// (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)\n\t// since the iframe access rules appear to allow direct access and\n\t// manipulation of the document element, even for a 404 page.  This\n\t// document can be used instead of the current document (which would\n\t// have been limited to the current path) to perform #userData storage.\n\ttry {\n\t\t/* global ActiveXObject */\n\t\tstorageContainer = new ActiveXObject('htmlfile')\n\t\tstorageContainer.open()\n\t\tstorageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src=\"/favicon.ico\"></iframe>')\n\t\tstorageContainer.close()\n\t\tstorageOwner = storageContainer.w.frames[0].document\n\t\tstorageEl = storageOwner.createElement('div')\n\t} catch(e) {\n\t\t// somehow ActiveXObject instantiation failed (perhaps some special\n\t\t// security settings or otherwse), fall back to per-path storage\n\t\tstorageEl = doc.createElement('div')\n\t\tstorageOwner = doc.body\n\t}\n\n\treturn function(storeFunction) {\n\t\tvar args = [].slice.call(arguments, 0)\n\t\targs.unshift(storageEl)\n\t\t// See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx\n\t\t// and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx\n\t\tstorageOwner.appendChild(storageEl)\n\t\tstorageEl.addBehavior('#default#userData')\n\t\tstorageEl.load(storageName)\n\t\tstoreFunction.apply(this, args)\n\t\tstorageOwner.removeChild(storageEl)\n\t\treturn\n\t}\n}\n\n},{\"../src/util\":143}],150:[function(require,module,exports){\nvar util = require('../src/util')\nvar Global = util.Global\n\nmodule.exports = {\n\tname: 'sessionStorage',\n\tread: read,\n\twrite: write,\n\teach: each,\n\tremove: remove,\n\tclearAll: clearAll,\n}\n\nfunction sessionStorage() {\n\treturn Global.sessionStorage\n}\n\nfunction read(key) {\n\treturn sessionStorage().getItem(key)\n}\n\nfunction write(key, data) {\n\treturn sessionStorage().setItem(key, data)\n}\n\nfunction each(fn) {\n\tfor (var i = sessionStorage().length - 1; i >= 0; i--) {\n\t\tvar key = sessionStorage().key(i)\n\t\tfn(read(key), key)\n\t}\n}\n\nfunction remove(key) {\n\treturn sessionStorage().removeItem(key)\n}\n\nfunction clearAll() {\n\treturn sessionStorage().clear()\n}\n\n},{\"../src/util\":143}],151:[function(require,module,exports){\n/** @license\n *\n *  Copyright (C) 2012 K. Arthur Endsley (kaendsle@mtu.edu)\n *  Michigan Tech Research Institute (MTRI)\n *  3600 Green Court, Suite 100, Ann Arbor, MI, 48105\n *\n *  This program is free software: you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 3 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License\n *  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\n/**\n * @augments Wkt.Wkt\n * A framework-dependent flag, set for each Wkt.Wkt() instance, that indicates\n * whether or not a closed polygon geometry should be interpreted as a rectangle.\n */\nWkt.Wkt.prototype.isRectangle = false;\n\n/**\n * @augments Wkt.Wkt\n * Truncates an Array of coordinates by the closing coordinate when it is\n * equal to the first coordinate given--this is only to be used for closed\n * geometries in order to provide merely an \"implied\" closure to Leaflet.\n * @param   coords  {Array}     An Array of x,y coordinates (objects)\n * @return          {Array}\n */\nWkt.Wkt.prototype.trunc = function (coords) {\n    var i, verts = [];\n\n    for (i = 0; i < coords.length; i += 1) {\n        if (Wkt.isArray(coords[i])) {\n            verts.push(this.trunc(coords[i]));\n\n        } else {\n\n            // Add the first coord, but skip the last if it is identical\n            if (i === 0 || !this.sameCoords(coords[0], coords[i])) {\n                verts.push(coords[i]);\n            }\n        }\n    }\n\n    return verts;\n};\n\n/**\n * @augments Wkt.Wkt\n * An object of framework-dependent construction methods used to generate\n * objects belonging to the various geometry classes of the framework.\n */\nWkt.Wkt.prototype.construct = {\n    /**\n     * Creates the framework's equivalent point geometry object.\n     * @param   config      {Object}    An optional properties hash the object should use\n     * @param   component   {Object}    An optional component to build from\n     * @return              {L.marker}\n     */\n    point: function (config, component) {\n        var coord = component || this.components;\n        if (coord instanceof Array) {\n            coord = coord[0];\n        }\n\n        return L.marker(this.coordsToLatLng(coord), config);\n    },\n\n    /**\n     * Creates the framework's equivalent multipoint geometry object.\n     * @param   config  {Object}    An optional properties hash the object should use\n     * @return          {L.featureGroup}\n     */\n    multipoint: function (config) {\n        var i,\n            layers = [],\n            coords = this.components;\n\n        for (i = 0; i < coords.length; i += 1) {\n            layers.push(this.construct.point.call(this, config, coords[i]));\n        }\n\n        return L.featureGroup(layers, config);\n    },\n\n    /**\n     * Creates the framework's equivalent linestring geometry object.\n     * @param   config      {Object}    An optional properties hash the object should use\n     * @param   component   {Object}    An optional component to build from\n     * @return              {L.polyline}\n     */\n    linestring: function (config, component) {\n        var coords = component || this.components,\n            latlngs = this.coordsToLatLngs(coords);\n\n        return L.polyline(latlngs, config);\n    },\n\n    /**\n     * Creates the framework's equivalent multilinestring geometry object.\n     * @param   config  {Object}    An optional properties hash the object should use\n     * @return          {L.multiPolyline}\n     */\n    multilinestring: function (config) {\n        var coords = this.components,\n            latlngs = this.coordsToLatLngs(coords, 1);\n\n        if (L.multiPolyline) {\n            return L.multiPolyline(latlngs, config);\n        }\n        else {\n            return L.polyline(latlngs, config);\n        }\n    },\n\n    /**\n     * Creates the framework's equivalent polygon geometry object.\n     * @param   config      {Object}    An optional properties hash the object should use\n     * @return              {L.multiPolygon}\n     */\n    polygon: function (config) {\n        // Truncate the coordinates to remove the closing coordinate\n        var coords = this.trunc(this.components),\n            latlngs = this.coordsToLatLngs(coords, 1);\n        return L.polygon(latlngs, config);\n    },\n\n    /**\n     * Creates the framework's equivalent multipolygon geometry object.\n     * @param   config  {Object}    An optional properties hash the object should use\n     * @return          {L.multiPolygon}\n     */\n    multipolygon: function (config) {\n        // Truncate the coordinates to remove the closing coordinate\n        var coords = this.trunc(this.components),\n            latlngs = this.coordsToLatLngs(coords, 2);\n\n        if (L.multiPolygon) {\n            return L.multiPolygon(latlngs, config);\n        }\n        else {\n            return L.polygon(latlngs, config);\n        }\n    },\n\n    /**\n     * Creates the framework's equivalent collection of geometry objects.\n     * @param   config  {Object}    An optional properties hash the object should use\n     * @return          {L.featureGroup}\n     */\n    geometrycollection: function (config) {\n        var comps, i, layers;\n\n        comps = this.trunc(this.components);\n        layers = [];\n        for (i = 0; i < this.components.length; i += 1) {\n            layers.push(this.construct[comps[i].type].call(this, comps[i]));\n        }\n\n        return L.featureGroup(layers, config);\n\n    }\n};\n\nL.Util.extend(Wkt.Wkt.prototype, {\n    coordsToLatLngs: L.GeoJSON.coordsToLatLngs,\n    // TODO Why doesn't the coordsToLatLng function in L.GeoJSON already suffice?\n    coordsToLatLng: function (coords, reverse) {\n        var lat = reverse ? coords.x : coords.y,\n            lng = reverse ? coords.y : coords.x;\n\n        return L.latLng(lat, lng, true);\n    }\n});\n\n/**\n * @augments Wkt.Wkt\n * A framework-dependent deconstruction method used to generate internal\n * geometric representations from instances of framework geometry. This method\n * uses object detection to attempt to classify members of framework geometry\n * classes into the standard WKT types.\n * @param   obj {Object}    An instance of one of the framework's geometry classes\n * @return      {Object}    A hash of the 'type' and 'components' thus derived\n */\nWkt.Wkt.prototype.deconstruct = function (obj) {\n    var attr, coordsFromLatLngs, features, i, verts, rings, tmp;\n\n    /**\n     * Accepts an Array (arr) of LatLngs from which it extracts each one as a\n     *  vertex; calls itself recursively to deal with nested Arrays.\n     */\n    coordsFromLatLngs = function (arr) {\n        var i, coords;\n\n        coords = [];\n        for (i = 0; i < arr.length; i += 1) {\n            if (Wkt.isArray(arr[i])) {\n                coords.push(coordsFromLatLngs(arr[i]));\n\n            } else {\n                coords.push({\n                    x: arr[i].lng,\n                    y: arr[i].lat\n                });\n            }\n        }\n\n        return coords;\n    };\n\n    // L.Marker ////////////////////////////////////////////////////////////////\n    if (obj.constructor === L.Marker || obj.constructor === L.marker) {\n        return {\n            type: 'point',\n            components: [{\n                x: obj.getLatLng().lng,\n                y: obj.getLatLng().lat\n            }]\n        };\n    }\n\n    // L.Rectangle /////////////////////////////////////////////////////////////\n    if (obj.constructor === L.Rectangle || obj.constructor === L.rectangle) {\n        tmp = obj.getBounds(); // L.LatLngBounds instance\n        return {\n            type: 'polygon',\n            isRectangle: true,\n            components: [\n                [\n                    { // NW corner\n                        x: tmp.getSouthWest().lng,\n                        y: tmp.getNorthEast().lat\n                    },\n                    { // NE corner\n                        x: tmp.getNorthEast().lng,\n                        y: tmp.getNorthEast().lat\n                    },\n                    { // SE corner\n                        x: tmp.getNorthEast().lng,\n                        y: tmp.getSouthWest().lat\n                    },\n                    { // SW corner\n                        x: tmp.getSouthWest().lng,\n                        y: tmp.getSouthWest().lat\n                    },\n                    { // NW corner (again, for closure)\n                        x: tmp.getSouthWest().lng,\n                        y: tmp.getNorthEast().lat\n                    }\n                ]\n            ]\n        };\n\n    }\n\n    // L.Polyline //////////////////////////////////////////////////////////////\n    if (obj.constructor === L.Polyline || obj.constructor === L.polyline) {\n        verts = [];\n        tmp = obj.getLatLngs();\n\n        if (!tmp[0].equals(tmp[tmp.length - 1])) {\n\n            for (i = 0; i < tmp.length; i += 1) {\n                verts.push({\n                    x: tmp[i].lng,\n                    y: tmp[i].lat\n                });\n            }\n\n            return {\n                type: 'linestring',\n                components: verts\n            };\n\n        }\n    }\n\n    // L.Polygon ///////////////////////////////////////////////////////////////\n\n    if (obj.constructor === L.Polygon || obj.constructor === L.polygon) {\n        rings = [];\n        verts = [];\n        tmp = obj.getLatLngs();\n\n        // First, we deal with the boundary points\n        for (i = 0; i < obj._latlngs.length; i += 1) {\n            verts.push({ // Add the first coordinate again for closure\n                x: tmp[i].lng,\n                y: tmp[i].lat\n            });\n        }\n\n        verts.push({ // Add the first coordinate again for closure\n            x: tmp[0].lng,\n            y: tmp[0].lat\n        });\n\n        rings.push(verts);\n\n        // Now, any holes\n        if (obj._holes && obj._holes.length > 0) {\n            // Reworked to support holes properly\n            verts = coordsFromLatLngs(obj._holes);\n            for (i=0; i < verts.length;i++) {\n                verts[i].push(verts[i][0]); // Copy the beginning coords again for closure\n                rings.push(verts[i]);\n            }\n        }\n\n        return {\n            type: 'polygon',\n            components: rings\n        };\n\n    }\n\n    // L.MultiPolyline /////////////////////////////////////////////////////////\n    // L.MultiPolygon //////////////////////////////////////////////////////////\n    // L.LayerGroup ////////////////////////////////////////////////////////////\n    // L.FeatureGroup //////////////////////////////////////////////////////////\n    if (obj.constructor === L.MultiPolyline || obj.constructor === L.MultiPolygon\n            || obj.constructor === L.LayerGroup || obj.constructor === L.FeatureGroup) {\n\n        features = [];\n        tmp = obj._layers;\n\n        for (attr in tmp) {\n            if (tmp.hasOwnProperty(attr)) {\n                if (tmp[attr].getLatLngs || tmp[attr].getLatLng) {\n                    // Recursively deconstruct each layer\n                    features.push(this.deconstruct(tmp[attr]));\n                }\n            }\n        }\n\n        return {\n\n            type: (function () {\n                switch (obj.constructor) {\n                case L.MultiPolyline:\n                    return 'multilinestring';\n                case L.MultiPolygon:\n                    return 'multipolygon';\n                case L.FeatureGroup:\n                    return (function () {\n                        var i, mpgon, mpline, mpoint;\n\n                        // Assume that all layers are of one type (any one type)\n                        mpgon = true;\n                        mpline = true;\n                        mpoint = true;\n\n                        for (i in obj._layers) {\n                            if (obj._layers.hasOwnProperty(i)) {\n                                if (obj._layers[i].constructor !== L.Marker) {\n                                    mpoint = false;\n                                }\n                                if (obj._layers[i].constructor !== L.Polyline) {\n                                    mpline = false;\n                                }\n                                if (obj._layers[i].constructor !== L.Polygon) {\n                                    mpgon = false;\n                                }\n                            }\n                        }\n\n                        if (mpoint) {\n                            return 'multipoint';\n                        }\n                        if (mpline) {\n                            return 'multilinestring';\n                        }\n                        if (mpgon) {\n                            return 'multipolygon';\n                        }\n                        return 'geometrycollection';\n\n                    }());\n                default:\n                    return 'geometrycollection';\n                }\n            }()),\n\n            components: (function () {\n                // Pluck the components from each Wkt\n                var i, comps;\n\n                comps = [];\n                for (i = 0; i < features.length; i += 1) {\n                    if (features[i].components) {\n                        comps.push(features[i].components);\n                    }\n                }\n\n                return comps;\n            }())\n\n        };\n\n    }\n\n    // L.Circle ////////////////////////////////////////////////////////////////\n    if (obj.constructor === L.Circle || obj.constructor === L.circle) {\n        console.log('Deconstruction of L.Circle objects is not yet supported');\n\n    } else {\n        console.log('The passed object does not have any recognizable properties.');\n    }\n\n};\n\n},{}],152:[function(require,module,exports){\n/** @license\n *\n *  Copyright (C) 2012 K. Arthur Endsley (kaendsle@mtu.edu)\n *  Michigan Tech Research Institute (MTRI)\n *  3600 Green Court, Suite 100, Ann Arbor, MI, 48105\n *\n *  This program is free software: you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 3 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License\n *  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\n(function (root, factory) {\n\n    if (typeof define === \"function\" && define.amd) {\n        // AMD (+ global for extensions)\n        define(function () {\n            return factory();\n        });\n    } else if (typeof module !== 'undefined' && typeof exports === \"object\") {\n        // CommonJS\n        module.exports = factory();\n    } else {\n        // Browser\n        root.Wkt = factory();\n    }\n}(this, function () {\n\n\n    var beginsWith, endsWith, root, Wkt;\n\n    // Establish the root object, window in the browser, or exports on the server\n    root = this;\n\n    /**\n     * @desc The Wkt namespace.\n     * @property    {String}    delimiter   - The default delimiter for separating components of atomic geometry (coordinates)\n     * @namespace\n     * @global\n     */\n    Wkt = function (obj) {\n        if (obj instanceof Wkt) return obj;\n        if (!(this instanceof Wkt)) return new Wkt(obj);\n        this._wrapped = obj;\n    };\n\n\n\n    /**\n     * Returns true if the substring is found at the beginning of the string.\n     * @param   str {String}    The String to search\n     * @param   sub {String}    The substring of interest\n     * @return      {Boolean}\n     * @private\n     */\n    beginsWith = function (str, sub) {\n        return str.substring(0, sub.length) === sub;\n    };\n\n    /**\n     * Returns true if the substring is found at the end of the string.\n     * @param   str {String}    The String to search\n     * @param   sub {String}    The substring of interest\n     * @return      {Boolean}\n     * @private\n     */\n    endsWith = function (str, sub) {\n        return str.substring(str.length - sub.length) === sub;\n    };\n\n    /**\n     * The default delimiter for separating components of atomic geometry (coordinates)\n     * @ignore\n     */\n    Wkt.delimiter = ' ';\n\n    /**\n     * Determines whether or not the passed Object is an Array.\n     * @param   obj {Object}    The Object in question\n     * @return      {Boolean}\n     * @member Wkt.isArray\n     * @method\n     */\n    Wkt.isArray = function (obj) {\n        return !!(obj && obj.constructor === Array);\n    };\n\n    /**\n     * Removes given character String(s) from a String.\n     * @param   str {String}    The String to search\n     * @param   sub {String}    The String character(s) to trim\n     * @return      {String}    The trimmed string\n     * @member Wkt.trim\n     * @method\n     */\n    Wkt.trim = function (str, sub) {\n        sub = sub || ' '; // Defaults to trimming spaces\n        // Trim beginning spaces\n        while (beginsWith(str, sub)) {\n            str = str.substring(1);\n        }\n        // Trim ending spaces\n        while (endsWith(str, sub)) {\n            str = str.substring(0, str.length - 1);\n        }\n        return str;\n    };\n\n    /**\n     * An object for reading WKT strings and writing geographic features\n     * @constructor this.Wkt.Wkt\n     * @param   initializer {String}    An optional WKT string for immediate read\n     * @property            {Array}     components      - Holder for atomic geometry objects (internal representation of geometric components)\n     * @property            {String}    delimiter       - The default delimiter for separating components of atomic geometry (coordinates)\n     * @property            {Object}    regExes         - Some regular expressions copied from OpenLayers.Format.WKT.js\n     * @property            {String}    type            - The Well-Known Text name (e.g. 'point') of the geometry\n     * @property            {Boolean}   wrapVerticies   - True to wrap vertices in MULTIPOINT geometries; If true: MULTIPOINT((30 10),(10 30),(40 40)); If false: MULTIPOINT(30 10,10 30,40 40)\n     * @return              {this.Wkt.Wkt}\n     * @memberof Wkt\n     */\n    Wkt.Wkt = function (initializer) {\n\n        /**\n         * The default delimiter between X and Y coordinates.\n         * @ignore\n         */\n        this.delimiter = Wkt.delimiter || ' ';\n\n        /**\n         * Configuration parameter for controlling how Wicket seralizes\n         * MULTIPOINT strings. Examples; both are valid WKT:\n         * If true: MULTIPOINT((30 10),(10 30),(40 40))\n         * If false: MULTIPOINT(30 10,10 30,40 40)\n         * @ignore\n         */\n        this.wrapVertices = true;\n\n        /**\n         * Some regular expressions copied from OpenLayers.Format.WKT.js\n         * @ignore\n         */\n        this.regExes = {\n            'typeStr': /^\\s*(\\w+)\\s*\\(\\s*(.*)\\s*\\)\\s*$/,\n            'spaces': /\\s+|\\+/, // Matches the '+' or the empty space\n            'numeric': /-*\\d+(\\.*\\d+)?/,\n            'comma': /\\s*,\\s*/,\n            'parenComma': /\\)\\s*,\\s*\\(/,\n            'coord': /-*\\d+\\.*\\d+ -*\\d+\\.*\\d+/, // e.g. \"24 -14\"\n            'doubleParenComma': /\\)\\s*\\)\\s*,\\s*\\(\\s*\\(/,\n            'trimParens': /^\\s*\\(?(.*?)\\)?\\s*$/,\n            'ogcTypes': /^(multi)?(point|line|polygon|box)?(string)?$/i, // Captures e.g. \"Multi\",\"Line\",\"String\"\n            'crudeJson': /^{.*\"(type|coordinates|geometries|features)\":.*}$/ // Attempts to recognize JSON strings\n        };\n\n        /**\n         * The internal representation of geometry--the \"components\" of geometry.\n         * @ignore\n         */\n        this.components = undefined;\n\n        // An initial WKT string may be provided\n        if (initializer && typeof initializer === 'string') {\n            this.read(initializer);\n        } else if (initializer && typeof initializer !== undefined) {\n            this.fromObject(initializer);\n        }\n\n    };\n\n\n\n    /**\n     * Returns true if the internal geometry is a collection of geometries.\n     * @return  {Boolean}   Returns true when it is a collection\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.isCollection = function () {\n        switch (this.type.slice(0, 5)) {\n            case 'multi':\n                // Trivial; any multi-geometry is a collection\n                return true;\n            case 'polyg':\n                // Polygons with holes are \"collections\" of rings\n                return true;\n            default:\n                // Any other geometry is not a collection\n                return false;\n        }\n    };\n\n    /**\n     * Compares two x,y coordinates for equality.\n     * @param   a   {Object}    An object with x and y properties\n     * @param   b   {Object}    An object with x and y properties\n     * @return      {Boolean}\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.sameCoords = function (a, b) {\n        return (a.x === b.x && a.y === b.y);\n    };\n\n    /**\n     * Sets internal geometry (components) from framework geometry (e.g.\n     * Google Polygon objects or google.maps.Polygon).\n     * @param   obj {Object}    The framework-dependent geometry representation\n     * @return      {this.Wkt.Wkt}   The object itself\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.fromObject = function (obj) {\n        var result;\n\n        if (obj.hasOwnProperty('type') && obj.hasOwnProperty('coordinates')) {\n            result = this.fromJson(obj);\n        } else {\n            result = this.deconstruct.call(this, obj);\n        }\n\n        this.components = result.components;\n        this.isRectangle = result.isRectangle || false;\n        this.type = result.type;\n        return this;\n    };\n\n    /**\n     * Creates external geometry objects based on a plug-in framework's\n     * construction methods and available geometry classes.\n     * @param   config  {Object}    An optional framework-dependent properties specification\n     * @return          {Object}    The framework-dependent geometry representation\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.toObject = function (config) {\n        var obj = this.construct[this.type].call(this, config);\n        // Don't assign the \"properties\" property to an Array\n        if (typeof obj === 'object' && !Wkt.isArray(obj)) {\n            obj.properties = this.properties;\n        }\n        return obj;\n    };\n\n    /**\n     * Returns the WKT string representation; the same as the write() method.\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.toString = function (config) {\n        return this.write();\n    };\n\n    /**\n     * Parses a JSON representation as an Object.\n     * @param\tobj\t{Object}\tAn Object with the GeoJSON schema\n     * @return\t{this.Wkt.Wkt}\tThe object itself\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.fromJson = function (obj) {\n        var i, j, k, coords, iring, oring;\n\n        this.type = obj.type.toLowerCase();\n        this.components = [];\n        if (obj.hasOwnProperty('geometry')) { //Feature\n            this.fromJson(obj.geometry);\n            this.properties = obj.properties;\n            return this;\n        }\n        coords = obj.coordinates;\n\n        if (!Wkt.isArray(coords[0])) { // Point\n            this.components.push({\n                x: coords[0],\n                y: coords[1]\n            });\n\n        } else {\n\n            for (i in coords) {\n                if (coords.hasOwnProperty(i)) {\n\n                    if (!Wkt.isArray(coords[i][0])) { // LineString\n\n                        if (this.type === 'multipoint') { // MultiPoint\n                            this.components.push([{\n                                x: coords[i][0],\n                                y: coords[i][1]\n                            }]);\n\n                        } else {\n                            this.components.push({\n                                x: coords[i][0],\n                                y: coords[i][1]\n                            });\n\n                        }\n\n                    } else {\n\n                        oring = [];\n                        for (j in coords[i]) {\n                            if (coords[i].hasOwnProperty(j)) {\n\n                                if (!Wkt.isArray(coords[i][j][0])) {\n                                    oring.push({\n                                        x: coords[i][j][0],\n                                        y: coords[i][j][1]\n                                    });\n\n                                } else {\n\n                                    iring = [];\n                                    for (k in coords[i][j]) {\n                                        if (coords[i][j].hasOwnProperty(k)) {\n\n                                            iring.push({\n                                                x: coords[i][j][k][0],\n                                                y: coords[i][j][k][1]\n                                            });\n\n                                        }\n                                    }\n\n                                    oring.push(iring);\n\n                                }\n\n                            }\n                        }\n\n                        this.components.push(oring);\n                    }\n                }\n            }\n\n        }\n\n        return this;\n    };\n\n    /**\n     * Creates a JSON representation, with the GeoJSON schema, of the geometry.\n     * @return    {Object}    The corresponding GeoJSON representation\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.toJson = function () {\n        var cs, json, i, j, k, ring, rings;\n\n        cs = this.components;\n        json = {\n            coordinates: [],\n            type: (function () {\n                var i, type, s;\n\n                type = this.regExes.ogcTypes.exec(this.type).slice(1);\n                s = [];\n\n                for (i in type) {\n                    if (type.hasOwnProperty(i)) {\n                        if (type[i] !== undefined) {\n                            s.push(type[i].toLowerCase().slice(0, 1).toUpperCase() + type[i].toLowerCase().slice(1));\n                        }\n                    }\n                }\n\n                return s;\n            }.call(this)).join('')\n        }\n\n        // Wkt BOX type gets a special bbox property in GeoJSON\n        if (this.type.toLowerCase() === 'box') {\n            json.type = 'Polygon';\n            json.bbox = [];\n\n            for (i in cs) {\n                if (cs.hasOwnProperty(i)) {\n                    json.bbox = json.bbox.concat([cs[i].x, cs[i].y]);\n                }\n            }\n\n            json.coordinates = [\n                [\n                    [cs[0].x, cs[0].y],\n                    [cs[0].x, cs[1].y],\n                    [cs[1].x, cs[1].y],\n                    [cs[1].x, cs[0].y],\n                    [cs[0].x, cs[0].y]\n                ]\n            ];\n\n            return json;\n        }\n\n        // For the coordinates of most simple features\n        for (i in cs) {\n            if (cs.hasOwnProperty(i)) {\n\n                // For those nested structures\n                if (Wkt.isArray(cs[i])) {\n                    rings = [];\n\n                    for (j in cs[i]) {\n                        if (cs[i].hasOwnProperty(j)) {\n\n                            if (Wkt.isArray(cs[i][j])) { // MULTIPOLYGONS\n                                ring = [];\n\n                                for (k in cs[i][j]) {\n                                    if (cs[i][j].hasOwnProperty(k)) {\n                                        ring.push([cs[i][j][k].x, cs[i][j][k].y]);\n                                    }\n                                }\n\n                                rings.push(ring);\n\n                            } else { // POLYGONS and MULTILINESTRINGS\n\n                                if (cs[i].length > 1) {\n                                    rings.push([cs[i][j].x, cs[i][j].y]);\n\n                                } else { // MULTIPOINTS\n                                    rings = rings.concat([cs[i][j].x, cs[i][j].y]);\n                                }\n                            }\n                        }\n                    }\n\n                    json.coordinates.push(rings);\n\n                } else {\n                    if (cs.length > 1) { // For LINESTRING type\n                        json.coordinates.push([cs[i].x, cs[i].y]);\n\n                    } else { // For POINT type\n                        json.coordinates = json.coordinates.concat([cs[i].x, cs[i].y]);\n                    }\n                }\n\n            }\n        }\n\n        return json;\n    };\n\n    /**\n     * Absorbs the geometry of another this.Wkt.Wkt instance, merging it with its own,\n     * creating a collection (MULTI-geometry) based on their types, which must agree.\n     * For example, creates a MULTIPOLYGON from a POLYGON type merged with another\n     * POLYGON type, or adds a POLYGON instance to a MULTIPOLYGON instance.\n     * @param   wkt {String}    A Wkt.Wkt object\n     * @return\t{this.Wkt.Wkt}\tThe object itself\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.merge = function (wkt) {\n        var prefix = this.type.slice(0, 5);\n\n        if (this.type !== wkt.type) {\n            if (this.type.slice(5, this.type.length) !== wkt.type) {\n                throw TypeError('The input geometry types must agree or the calling this.Wkt.Wkt instance must be a multigeometry of the other');\n            }\n        }\n\n        switch (prefix) {\n\n            case 'point':\n                this.components = [this.components.concat(wkt.components)];\n                break;\n\n            case 'multi':\n                this.components = this.components.concat((wkt.type.slice(0, 5) === 'multi') ? wkt.components : [wkt.components]);\n                break;\n\n            default:\n                this.components = [\n                    this.components,\n                    wkt.components\n                ];\n                break;\n\n        }\n\n        if (prefix !== 'multi') {\n            this.type = 'multi' + this.type;\n        }\n        return this;\n    };\n\n    /**\n     * Reads a WKT string, validating and incorporating it.\n     * @param   str {String}    A WKT or GeoJSON string\n     * @return\t{this.Wkt.Wkt}\tThe object itself\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.read = function (str) {\n        var matches;\n        matches = this.regExes.typeStr.exec(str);\n        if (matches) {\n            this.type = matches[1].toLowerCase();\n            this.base = matches[2];\n            if (this.ingest[this.type]) {\n                this.components = this.ingest[this.type].apply(this, [this.base]);\n            }\n\n        } else {\n            if (this.regExes.crudeJson.test(str)) {\n                if (typeof JSON === 'object' && typeof JSON.parse === 'function') {\n                    this.fromJson(JSON.parse(str));\n\n                } else {\n                    console.log('JSON.parse() is not available; cannot parse GeoJSON strings');\n                    throw {\n                        name: 'JSONError',\n                        message: 'JSON.parse() is not available; cannot parse GeoJSON strings'\n                    };\n                }\n\n            } else {\n                console.log('Invalid WKT string provided to read()');\n                throw {\n                    name: 'WKTError',\n                    message: 'Invalid WKT string provided to read()'\n                };\n            }\n        }\n\n        return this;\n    }; // eo readWkt\n\n    /**\n     * Writes a WKT string.\n     * @param   components  {Array}     An Array of internal geometry objects\n     * @return              {String}    The corresponding WKT representation\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.write = function (components) {\n        var i, pieces, data;\n\n        components = components || this.components;\n\n        pieces = [];\n\n        pieces.push(this.type.toUpperCase() + '(');\n\n        for (i = 0; i < components.length; i += 1) {\n            if (this.isCollection() && i > 0) {\n                pieces.push(',');\n            }\n\n            // There should be an extract function for the named type\n            if (!this.extract[this.type]) {\n                return null;\n            }\n\n            data = this.extract[this.type].apply(this, [components[i]]);\n            if (this.isCollection() && this.type !== 'multipoint') {\n                pieces.push('(' + data + ')');\n\n            } else {\n                pieces.push(data);\n\n                // If not at the end of the components, add a comma\n                if (i !== (components.length - 1) && this.type !== 'multipoint') {\n                    pieces.push(',');\n                }\n\n            }\n        }\n\n        pieces.push(')');\n\n        return pieces.join('');\n    };\n\n    /**\n     * This object contains functions as property names that extract WKT\n     * strings from the internal representation.\n     * @memberof this.Wkt.Wkt\n     * @namespace this.Wkt.Wkt.extract\n     * @instance\n     */\n    Wkt.Wkt.prototype.extract = {\n        /**\n         * Return a WKT string representing atomic (point) geometry\n         * @param   point   {Object}    An object with x and y properties\n         * @return          {String}    The WKT representation\n         * @memberof this.Wkt.Wkt.extract\n         * @instance\n         */\n        point: function (point) {\n            return String(point.x) + this.delimiter + String(point.y);\n        },\n\n        /**\n         * Return a WKT string representing multiple atoms (points)\n         * @param   multipoint  {Array}     Multiple x-and-y objects\n         * @return              {String}    The WKT representation\n         * @memberof this.Wkt.Wkt.extract\n         * @instance\n         */\n        multipoint: function (multipoint) {\n            var i, parts = [],\n                s;\n\n            for (i = 0; i < multipoint.length; i += 1) {\n                s = this.extract.point.apply(this, [multipoint[i]]);\n\n                if (this.wrapVertices) {\n                    s = '(' + s + ')';\n                }\n\n                parts.push(s);\n            }\n\n            return parts.join(',');\n        },\n\n        /**\n         * Return a WKT string representing a chain (linestring) of atoms\n         * @param   linestring  {Array}     Multiple x-and-y objects\n         * @return              {String}    The WKT representation\n         * @memberof this.Wkt.Wkt.extract\n         * @instance\n         */\n        linestring: function (linestring) {\n            // Extraction of linestrings is the same as for points\n            return this.extract.point.apply(this, [linestring]);\n        },\n\n        /**\n         * Return a WKT string representing multiple chains (multilinestring) of atoms\n         * @param   multilinestring {Array}     Multiple of multiple x-and-y objects\n         * @return                  {String}    The WKT representation\n         * @memberof this.Wkt.Wkt.extract\n         * @instance\n         */\n        multilinestring: function (multilinestring) {\n            var i, parts = [];\n\n            if (multilinestring.length) {\n                for (i = 0; i < multilinestring.length; i += 1) {\n                    parts.push(this.extract.linestring.apply(this, [multilinestring[i]]));\n                }\n            } else {\n                parts.push(this.extract.point.apply(this, [multilinestring]));\n            }\n\n            return parts.join(',');\n        },\n\n        /**\n         * Return a WKT string representing multiple atoms in closed series (polygon)\n         * @param   polygon {Array}     Collection of ordered x-and-y objects\n         * @return          {String}    The WKT representation\n         * @memberof this.Wkt.Wkt.extract\n         * @instance\n         */\n        polygon: function (polygon) {\n            // Extraction of polygons is the same as for multilinestrings\n            return this.extract.multilinestring.apply(this, [polygon]);\n        },\n\n        /**\n         * Return a WKT string representing multiple closed series (multipolygons) of multiple atoms\n         * @param   multipolygon    {Array}     Collection of ordered x-and-y objects\n         * @return                  {String}    The WKT representation\n         * @memberof this.Wkt.Wkt.extract\n         * @instance\n         */\n        multipolygon: function (multipolygon) {\n            var i, parts = [];\n            for (i = 0; i < multipolygon.length; i += 1) {\n                parts.push('(' + this.extract.polygon.apply(this, [multipolygon[i]]) + ')');\n            }\n            return parts.join(',');\n        },\n\n        /**\n         * Return a WKT string representing a 2DBox\n         * @param   multipolygon    {Array}     Collection of ordered x-and-y objects\n         * @return                  {String}    The WKT representation\n         * @memberof this.Wkt.Wkt.extract\n         * @instance\n         */\n        box: function (box) {\n            return this.extract.linestring.apply(this, [box]);\n        },\n\n        geometrycollection: function (str) {\n            console.log('The geometrycollection WKT type is not yet supported.');\n        }\n    };\n\n    /**\n     * This object contains functions as property names that ingest WKT\n     * strings into the internal representation.\n     * @memberof this.Wkt.Wkt\n     * @namespace this.Wkt.Wkt.ingest\n     * @instance\n     */\n    Wkt.Wkt.prototype.ingest = {\n\n        /**\n         * Return point feature given a point WKT fragment.\n         * @param   str {String}    A WKT fragment representing the point\n         * @memberof this.Wkt.Wkt.ingest\n         * @instance\n         */\n        point: function (str) {\n            var coords = Wkt.trim(str).split(this.regExes.spaces);\n            // In case a parenthetical group of coordinates is passed...\n            return [{ // ...Search for numeric substrings\n                x: parseFloat(this.regExes.numeric.exec(coords[0])[0]),\n                y: parseFloat(this.regExes.numeric.exec(coords[1])[0])\n            }];\n        },\n\n        /**\n         * Return a multipoint feature given a multipoint WKT fragment.\n         * @param   str {String}    A WKT fragment representing the multipoint\n         * @memberof this.Wkt.Wkt.ingest\n         * @instance\n         */\n        multipoint: function (str) {\n            var i, components, points;\n            components = [];\n            points = Wkt.trim(str).split(this.regExes.comma);\n            for (i = 0; i < points.length; i += 1) {\n                components.push(this.ingest.point.apply(this, [points[i]]));\n            }\n            return components;\n        },\n\n        /**\n         * Return a linestring feature given a linestring WKT fragment.\n         * @param   str {String}    A WKT fragment representing the linestring\n         * @memberof this.Wkt.Wkt.ingest\n         * @instance\n         */\n        linestring: function (str) {\n            var i, multipoints, components;\n\n            // In our x-and-y representation of components, parsing\n            //  multipoints is the same as parsing linestrings\n            multipoints = this.ingest.multipoint.apply(this, [str]);\n\n            // However, the points need to be joined\n            components = [];\n            for (i = 0; i < multipoints.length; i += 1) {\n                components = components.concat(multipoints[i]);\n            }\n            return components;\n        },\n\n        /**\n         * Return a multilinestring feature given a multilinestring WKT fragment.\n         * @param   str {String}    A WKT fragment representing the multilinestring\n         * @memberof this.Wkt.Wkt.ingest\n         * @instance\n         */\n        multilinestring: function (str) {\n            var i, components, line, lines;\n            components = [];\n\n            lines = Wkt.trim(str).split(this.regExes.doubleParenComma);\n            if (lines.length === 1) { // If that didn't work...\n                lines = Wkt.trim(str).split(this.regExes.parenComma);\n            }\n\n            for (i = 0; i < lines.length; i += 1) {\n                line = lines[i].replace(this.regExes.trimParens, '$1');\n                components.push(this.ingest.linestring.apply(this, [line]));\n            }\n\n            return components;\n        },\n\n        /**\n         * Return a polygon feature given a polygon WKT fragment.\n         * @param   str {String}    A WKT fragment representing the polygon\n         * @memberof this.Wkt.Wkt.ingest\n         * @instance\n         */\n        polygon: function (str) {\n            var i, j, components, subcomponents, ring, rings;\n            rings = Wkt.trim(str).split(this.regExes.parenComma);\n            components = []; // Holds one or more rings\n            for (i = 0; i < rings.length; i += 1) {\n                ring = rings[i].replace(this.regExes.trimParens, '$1').split(this.regExes.comma);\n                subcomponents = []; // Holds the outer ring and any inner rings (holes)\n                for (j = 0; j < ring.length; j += 1) {\n                    // Split on the empty space or '+' character (between coordinates)\n                    var split = ring[j].split(this.regExes.spaces);\n                    if (split.length > 2) {\n                        //remove the elements which are blanks\n                        split = split.filter(function (n) {\n                            return n != \"\"\n                        });\n                    }\n                    if (split.length === 2) {\n                        var x_cord = split[0];\n                        var y_cord = split[1];\n\n                        //now push\n                        subcomponents.push({\n                            x: parseFloat(x_cord),\n                            y: parseFloat(y_cord)\n                        });\n                    }\n                }\n                components.push(subcomponents);\n            }\n            return components;\n        },\n\n        /**\n         * Return box vertices (which would become the Rectangle bounds) given a Box WKT fragment.\n         * @param   str {String}    A WKT fragment representing the box\n         * @memberof this.Wkt.Wkt.ingest\n         * @instance\n         */\n        box: function (str) {\n            var i, multipoints, components;\n\n            // In our x-and-y representation of components, parsing\n            //  multipoints is the same as parsing linestrings\n            multipoints = this.ingest.multipoint.apply(this, [str]);\n\n            // However, the points need to be joined\n            components = [];\n            for (i = 0; i < multipoints.length; i += 1) {\n                components = components.concat(multipoints[i]);\n            }\n\n            return components;\n        },\n\n        /**\n         * Return a multipolygon feature given a multipolygon WKT fragment.\n         * @param   str {String}    A WKT fragment representing the multipolygon\n         * @memberof this.Wkt.Wkt.ingest\n         * @instance\n         */\n        multipolygon: function (str) {\n            var i, components, polygon, polygons;\n            components = [];\n            polygons = Wkt.trim(str).split(this.regExes.doubleParenComma);\n            for (i = 0; i < polygons.length; i += 1) {\n                polygon = polygons[i].replace(this.regExes.trimParens, '$1');\n                components.push(this.ingest.polygon.apply(this, [polygon]));\n            }\n            return components;\n        },\n\n        /**\n         * Return an array of features given a geometrycollection WKT fragment.\n         * @param   str {String}    A WKT fragment representing the geometry collection\n         * @memberof this.Wkt.Wkt.ingest\n         * @instance\n         */\n        geometrycollection: function (str) {\n            console.log('The geometrycollection WKT type is not yet supported.');\n        }\n\n    }; // eo ingest\n\n    return Wkt;\n}));\n\n},{}],153:[function(require,module,exports){\nmodule.exports={\n  \"_from\": \"yasgui-utils@https://registry.npmjs.org/yasgui-utils/-/yasgui-utils-1.6.7.tgz\",\n  \"_id\": \"yasgui-utils@1.6.7\",\n  \"_inBundle\": false,\n  \"_integrity\": \"sha1-K8/FoxVojeOuYFeIPZrjQrIF8mc=\",\n  \"_location\": \"/yasgui-utils\",\n  \"_phantomChildren\": {},\n  \"_requested\": {\n    \"type\": \"remote\",\n    \"raw\": \"yasgui-utils@https://registry.npmjs.org/yasgui-utils/-/yasgui-utils-1.6.7.tgz\",\n    \"name\": \"yasgui-utils\",\n    \"escapedName\": \"yasgui-utils\",\n    \"rawSpec\": \"https://registry.npmjs.org/yasgui-utils/-/yasgui-utils-1.6.7.tgz\",\n    \"saveSpec\": \"https://registry.npmjs.org/yasgui-utils/-/yasgui-utils-1.6.7.tgz\",\n    \"fetchSpec\": \"https://registry.npmjs.org/yasgui-utils/-/yasgui-utils-1.6.7.tgz\"\n  },\n  \"_requiredBy\": [\n    \"/\",\n    \"/yasgui-yasqe\"\n  ],\n  \"_resolved\": \"https://registry.npmjs.org/yasgui-utils/-/yasgui-utils-1.6.7.tgz\",\n  \"_spec\": \"yasgui-utils@https://registry.npmjs.org/yasgui-utils/-/yasgui-utils-1.6.7.tgz\",\n  \"_where\": \"/home/lrd900/yasgui/yasr\",\n  \"author\": {\n    \"name\": \"Laurens Rietveld\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/YASGUI/Utils/issues\"\n  },\n  \"bundleDependencies\": false,\n  \"dependencies\": {\n    \"store\": \"^2.0.4\"\n  },\n  \"deprecated\": false,\n  \"description\": \"Utils for YASGUI libs\",\n  \"homepage\": \"https://github.com/YASGUI/Utils\",\n  \"licenses\": [\n    {\n      \"type\": \"MIT\",\n      \"url\": \"http://yasgui.github.io/license.txt\"\n    }\n  ],\n  \"main\": \"src/main.js\",\n  \"maintainers\": [\n    {\n      \"name\": \"Laurens Rietveld\",\n      \"email\": \"laurens.rietveld@gmail.com\",\n      \"url\": \"http://laurensrietveld.nl\"\n    }\n  ],\n  \"name\": \"yasgui-utils\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/YASGUI/Utils.git\"\n  },\n  \"version\": \"1.6.7\"\n}\n\n},{}],154:[function(require,module,exports){\nwindow.console = window.console || {\"log\":function(){}};//make sure any console statements don't break IE\nmodule.exports = {\n\tstorage: require(\"./storage.js\"),\n\tsvg: require(\"./svg.js\"),\n\tversion: {\n\t\t\"yasgui-utils\" : require(\"../package.json\").version,\n\t},\n\tnestedExists : function(obj) {\n\t\tvar args = Array.prototype.slice.call(arguments, 1);\n\n\t\tfor (var i = 0; i < args.length; i++) {\n\t\t\tif (!obj || !obj.hasOwnProperty(args[i])) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tobj = obj[args[i]];\n\t\t}\n\t\treturn true;\n\t}\n};\n\n},{\"../package.json\":153,\"./storage.js\":155,\"./svg.js\":156}],155:[function(require,module,exports){\nvar store = require(\"store\");\nvar times = {\n  day: function() {\n    return 1000 * 3600 * 24; //millis to day\n  },\n  month: function() {\n    times.day() * 30;\n  },\n  year: function() {\n    times.month() * 12;\n  }\n};\nfunction isQuotaExceeded(e) {\n  var quotaExceeded = false;\n  if (e) {\n    if (e.code) {\n      switch (e.code) {\n        case 22:\n          quotaExceeded = true;\n          break;\n        case 1014:\n          // Firefox\n          if (e.name === \"NS_ERROR_DOM_QUOTA_REACHED\") {\n            quotaExceeded = true;\n          }\n          break;\n      }\n    } else if (e.number === -2147024882) {\n      // Internet Explorer 8\n      quotaExceeded = true;\n    }\n  }\n  return quotaExceeded;\n}\nvar root = (module.exports = {\n  set: function(key, val, exp, onQuotaExceeded) {\n    if (!store.enabled) return; //this is probably in private mode. Don't run, as we might get Js errors\n    if (key && val !== undefined) {\n      if (typeof exp == \"string\") {\n        exp = times[exp]();\n      }\n      //try to store string for dom objects (e.g. XML result). Otherwise, we might get a circular reference error when stringifying this\n      if (val.documentElement) val = new XMLSerializer().serializeToString(val.documentElement);\n      try {\n        store.set(key, {\n          val: val,\n          exp: exp,\n          time: new Date().getTime()\n        });\n      } catch (e) {\n        e.quotaExceeded = isQuotaExceeded(e);\n        if (e.quotaExceeded && onQuotaExceeded) {\n          onQuotaExceeded(e);\n        } else {\n          throw e;\n        }\n      }\n    }\n  },\n  remove: function(key) {\n    if (!store.enabled) return; //this is probably in private mode. Don't run, as we might get Js errors\n    if (key) store.remove(key);\n  },\n  removeAll: function(filter) {\n    if (!store.enabled) return; //this is probably in private mode. Don't run, as we might get Js errors\n    if (!filter) {\n      store.clearAll();\n    } else if (typeof filter === \"function\") {\n      store.each(function(value, key) {\n        if (filter(key, value)) root.remove(key);\n      });\n    }\n  },\n  get: function(key) {\n    if (!store.enabled) return null; //this is probably in private mode. Don't run, as we might get Js errors\n    if (key) {\n      var info = store.get(key);\n      if (!info) {\n        return null;\n      }\n      if (info.exp && new Date().getTime() - info.time > info.exp) {\n        return null;\n      }\n      return info.val;\n    } else {\n      return null;\n    }\n  }\n});\n\n},{\"store\":139}],156:[function(require,module,exports){\nmodule.exports = {\n\tdraw: function(parent, svgString) {\n\t\tif (!parent) return;\n\t\tvar el = module.exports.getElement(svgString);\n\t\tif (el) {\n\t\t\tif (parent.append) {\n\t\t\t\tparent.append(el);\n\t\t\t} else {\n\t\t\t\t//regular dom doc\n\t\t\t\tparent.appendChild(el);\n\t\t\t}\n\t\t}\n\t},\n\tgetElement: function(svgString) {\n\t\tif (svgString && svgString.indexOf(\"<svg\") == 0) {\n\t\t\t//no style passed via config. guess own styles\n\t\t\tvar parser = new DOMParser();\n\t\t\tvar dom = parser.parseFromString(svgString, \"text/xml\");\n\t\t\tvar svg = dom.documentElement;\n\t\t\t\n\t\t\tvar svgContainer = document.createElement(\"div\");\n\t\t\tsvgContainer.className = 'svgImg';\n\t\t\tsvgContainer.appendChild(svg);\n\t\t\treturn svgContainer;\n\t\t}\n\t\treturn false;\n\t}\n};\n},{}],157:[function(require,module,exports){\nmodule.exports={\n  \"name\": \"yasgui-yasr\",\n  \"description\": \"Yet Another SPARQL Resultset GUI\",\n  \"version\": \"2.11.9\",\n  \"main\": \"src/main.js\",\n  \"license\": \"MIT\",\n  \"author\": \"Laurens Rietveld\",\n  \"homepage\": \"http://yasr.yasgui.org\",\n  \"devDependencies\": {\n    \"bootstrap-sass\": \"^3.3.7\",\n    \"browserify\": \"^13.1.0\",\n    \"browserify-transform-tools\": \"^1.6.0\",\n    \"exorcist\": \"^0.4.0\",\n    \"gulp\": \"^3.9.1\",\n    \"gulp-autoprefixer\": \"^3.1.0\",\n    \"gulp-bump\": \"^2.2.0\",\n    \"gulp-clean-css\": \"^2.0.12\",\n    \"gulp-concat\": \"^2.6.0\",\n    \"gulp-connect\": \"^4.2.0\",\n    \"gulp-cssimport\": \"^3.1.0\",\n    \"gulp-delete-lines\": \"0.0.7\",\n    \"gulp-embedlr\": \"^0.5.2\",\n    \"gulp-filter\": \"^4.0.0\",\n    \"gulp-git\": \"^2.4.1\",\n    \"gulp-html-replace\": \"^1.6.1\",\n    \"gulp-jsvalidate\": \"^2.1.0\",\n    \"gulp-livereload\": \"^3.8.1\",\n    \"gulp-minify-css\": \"1.2.4\",\n    \"gulp-notify\": \"^2.2.0\",\n    \"gulp-rename\": \"^1.2.2\",\n    \"gulp-sass\": \"^2.3.2\",\n    \"gulp-sourcemaps\": \"^1.6.0\",\n    \"gulp-streamify\": \"1.0.2\",\n    \"gulp-tag-version\": \"^1.3.0\",\n    \"gulp-uglify\": \"^1.5.4\",\n    \"node-sass\": \"^3.8.0\",\n    \"require-dir\": \"^0.3.2\",\n    \"run-sequence\": \"^1.2.2\",\n    \"vinyl-buffer\": \"^1.0.0\",\n    \"vinyl-source-stream\": \"~1.1.0\",\n    \"vinyl-transform\": \"1.0.0\",\n    \"watchify\": \"^3.7.0\",\n    \"yasgui-yasqe\": \"^2.10.1\"\n  },\n  \"bugs\": \"https://github.com/YASGUI/YASR/issues/\",\n  \"keywords\": [\n    \"JavaScript\",\n    \"SPARQL\",\n    \"Editor\",\n    \"Semantic Web\",\n    \"Linked Data\"\n  ],\n  \"scripts\": {\n    \"dev\": \"gulp serve\",\n    \"build\": \"gulp\",\n    \"patch\": \"gulp patch\",\n    \"minor\": \"gulp minor\",\n    \"major\": \"gulp major\"\n  },\n  \"maintainers\": [\n    {\n      \"name\": \"Laurens Rietveld\",\n      \"email\": \"laurens.rietveld@gmail.com\",\n      \"web\": \"http://laurensrietveld.nl\"\n    }\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/YASGUI/YASR.git\"\n  },\n  \"dependencies\": {\n    \"browserify-shim\": \"^3.8.12\",\n    \"codemirror\": \"^5.17.0\",\n    \"color\": \"^1.0.3\",\n    \"d3\": \"^4.1.1\",\n    \"datatables.net\": \"^1.10.15\",\n    \"datatables.net-dt\": \"^1.10.15\",\n    \"jquery\": \"^2.2.4\",\n    \"jquery-ui\": \"1.10.5\",\n    \"leaflet\": \"1.0.3\",\n    \"lodash\": \"^4.16.1\",\n    \"pivottable\": \"^2.1.0\",\n    \"proj4\": \"^2.4.3\",\n    \"proj4leaflet\": \"^1.0.1\",\n    \"wicket\": \"https://github.com/arthur-e/Wicket.git\",\n    \"yasgui-utils\": \"^1.6.7\"\n  },\n  \"browserify-shim\": {\n    \"google\": \"global:google\"\n  },\n  \"browserify\": {\n    \"transform\": [\n      \"browserify-shim\"\n    ]\n  },\n  \"optionalShim\": {\n    \"codemirror\": {\n      \"require\": \"codemirror\",\n      \"global\": \"CodeMirror\"\n    },\n    \"jquery\": {\n      \"require\": \"jquery\",\n      \"global\": \"jQuery\"\n    },\n    \"../../lib/codemirror\": {\n      \"require\": \"codemirror\",\n      \"global\": \"CodeMirror\"\n    },\n    \"datatables\": {\n      \"require\": \"datatables\",\n      \"global\": \"jQuery\"\n    },\n    \"d3\": {\n      \"require\": \"d3\",\n      \"global\": \"d3\"\n    },\n    \"jquery-ui/sortable\": {\n      \"require\": \"jquery-ui/sortable\",\n      \"global\": \"jQuery\"\n    },\n    \"pivottable\": {\n      \"require\": \"pivottable\",\n      \"global\": \"jQuery\"\n    }\n  }\n}\n\n},{}],158:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(result) {\n  var quote = '\"';\n  var delimiter = \",\";\n  var lineBreak = \"\\n\";\n\n  var variables = result.head.vars;\n\n  var querySolutions = result.results.bindings;\n\n  var createHeader = function() {\n    for (var i = 0; i < variables.length; i++) {\n      addValueToString(variables[i]);\n    }\n    csvString += lineBreak;\n  };\n\n  var createBody = function() {\n    for (var i = 0; i < querySolutions.length; i++) {\n      addQuerySolutionToString(querySolutions[i]);\n      csvString += lineBreak;\n    }\n  };\n\n  var addQuerySolutionToString = function(querySolution) {\n    for (var i = 0; i < variables.length; i++) {\n      var variable = variables[i];\n      if (querySolution.hasOwnProperty(variable)) {\n        addValueToString(querySolution[variable][\"value\"]);\n      } else {\n        addValueToString(\"\");\n      }\n    }\n  };\n  var addValueToString = function(value) {\n    //Quotes in the string need to be escaped\n    if (needToQuoteString(value)) {\n      if (value.indexOf(quote) >= 0) {\n        //use double quotes to escape these\n        value = value.replace(new RegExp(quote, \"g\"), quote + quote);\n      }\n      //and finally add quotes all around\n      value = quote + value + quote;\n    }\n    csvString += \" \" + value + \" \" + delimiter;\n  };\n\n  var needToQuoteString = function(value) {\n    //quote when it contains whitespace or the delimiter\n    var needQuoting = false;\n    if (value.match(\"[\\\\w|\" + delimiter + \"|\" + quote + \"]\")) {\n      needQuoting = true;\n    }\n    return needQuoting;\n  };\n\n  var csvString = \"\";\n  createHeader();\n  createBody();\n  return csvString;\n};\n\n},{}],159:[function(require,module,exports){\n\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\n\n/**\n * Constructor of plugin which displays boolean info\n * \n * @param yasr {object}\n * @param parent {DOM element}\n * @param options {object}\n * @class YASR.plugins.boolean\n * @return yasr-boolean (doc)\n * \n */\nvar root = module.exports = function(yasr) {\n  var container = $(\"<div class='booleanResult'></div>\");\n  var draw = function() {\n    container.empty().appendTo(yasr.resultsContainer);\n    var booleanVal = yasr.results.getBoolean();\n\n    var imgId = null;\n    var textVal = null;\n    if (booleanVal === true) {\n      imgId = \"check\";\n      textVal = \"True\";\n    } else if (booleanVal === false) {\n      imgId = \"cross\";\n      textVal = \"False\";\n    } else {\n      container.width(\"140\");\n      textVal = \"Could not find boolean value in response\";\n    }\n\n    //add icon\n    if (imgId) require(\"yasgui-utils\").svg.draw(container, require(\"./imgs.js\")[imgId]);\n\n    $(\"<span></span>\").text(textVal).appendTo(container);\n  };\n\n  var canHandleResults = function() {\n    return yasr.results.getBoolean && (yasr.results.getBoolean() === true || yasr.results.getBoolean() == false);\n  };\n\n  return {\n    name: null, //don't need to set this: we don't show it in the selection widget anyway, so don't need a human-friendly name\n    draw: draw,\n    hideFromSelection: true,\n    getPriority: 10,\n    canHandleResults: canHandleResults\n  };\n};\n\nroot.version = {\n  \"YASR-boolean\": require(\"../package.json\").version,\n  jquery: $.fn.jquery\n};\n\n},{\"../package.json\":157,\"./imgs.js\":166,\"jquery\":undefined,\"yasgui-utils\":154}],160:[function(require,module,exports){\n\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\nmodule.exports = {\n  /**\n\t * key of default plugin to use\n\t * @property output\n\t * @type string\n\t * @default \"table\"\n\t */\n  output: \"table\",\n  useGoogleCharts: true,\n  outputPlugins: [\"table\", \"error\", \"boolean\", \"rawResponse\", \"pivot\", \"gchart\", \"leaflet\"],\n\n  /**\n\t * Draw the output selector widget\n\t *\n\t * @property drawOutputSelector\n\t * @type boolean\n\t * @default true\n\t */\n  drawOutputSelector: true,\n\n  /**\n\t * Draw download icon. This issues html5 download functionality to 'download' files created on the client-side.\n\t *  This allows the user to download results already queried for, such as a CSV when a table is shown, or the original response when the raw response output is selected\n\t *\n\t * @property drawDownloadIcon\n\t * @type boolean\n\t * @default true\n\t */\n  drawDownloadIcon: true,\n  /**\n\t * Open links (anchor tags) of SPARQL results in a new browser tab/window (_blank), or the current one (_self)\n\t *\n\t * @property uriTarget\n\t * @type string ('_blank' | '_self')\n\t * @default '_blank'\n\t */\n  uriTarget: \"_blank\",\n  onQuotaExceeded: function(e) {\n    //fail silently\n    console.warn(\"Could not store in localstorage. Skipping..\", e);\n  },\n  getUsedPrefixes: null,\n  /**\n\t * Make certain settings and values of YASR persistent. Setting a key\n\t * to null, will disable persistancy: nothing is stored between browser\n\t * sessions Setting the values to a string (or a function which returns a\n\t * string), will store the query in localstorage using the specified string.\n\t * By default, the ID is dynamically generated by finding the nearest DOM element with an \"id\" set,\n\t * to avoid collissions when using multiple YASR items on one page\n\t *\n\t * @property persistency\n\t * @type object\n\t */\n  persistency: {\n    prefix: function(yasr) {\n      return \"yasr_\" + $(yasr.container).closest(\"[id]\").attr(\"id\") + \"_\";\n    },\n    /**\n\t\t * Persistency setting for the selected output\n\t\t *\n\t\t * @property persistency.outputSelector\n\t\t * @type string|function\n\t\t * @default function (determine unique id)\n\t\t */\n    outputSelector: function(yasr) {\n      return \"selector\";\n    },\n    /**\n\t\t * Persistency setting for query results.\n\t\t *\n\t\t * @property persistency.results\n\t\t * @type object\n\t\t */\n    results: {\n      /**\n\t\t\t * Get the key to store results in\n\t\t\t *\n\t\t\t * @property persistency.results.id\n\t\t\t * @type string|function\n\t\t\t * @default function (determine unique id)\n\t\t\t */\n      id: function(yasr) {\n        return \"results_\" + $(yasr.container).closest(\"[id]\").attr(\"id\");\n      },\n      key: \"results\",\n      /**\n\t\t\t * The result set might too large to fit in local storage.\n\t\t\t * It is impossible to detect how large the local storage is.\n\t\t\t * Therefore, we do not store all results in local storage, depending on a max number of characters in the SPARQL result serialization.\n\t\t\t * Set this function conservitavely. (especially when using multiple YASR instances on one page)\n\t\t\t *\n\t\t\t * @property persistency.results.maxSize\n\t\t\t * @type int\n\t\t\t * @default 100000\n\t\t\t */\n      maxSize: 100000 //char count\n    }\n  }\n};\n\n},{\"jquery\":undefined}],161:[function(require,module,exports){\n//this is the entry-point for browserify.\n//the current browserify version does not support require-ing js files which are used as entry-point\n//this way, we can still require our main.js file\nmodule.exports = require(\"./main.js\");\n\n},{\"./main.js\":170}],162:[function(require,module,exports){\n\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\n\n/**\n * Constructor of plugin which displays SPARQL errors\n * \n * @param yasr {object}\n * @param parent {DOM element}\n * @param options {object}\n * @class YASR.plugins.boolean\n * @return yasr-erro (doc)\n * \n */\nvar root = module.exports = function(yasr) {\n  var $container = $(\"<div class='errorResult'></div>\");\n  var options = $.extend(true, {}, root.defaults);\n\n  var getTryBtn = function() {\n    var $tryBtn = null;\n    if (options.tryQueryLink) {\n      var link = options.tryQueryLink();\n      $tryBtn = $(\"<button>\", {\n        class: \"yasr_btn yasr_tryQuery\"\n      })\n        .text(\"Try query in new browser window\")\n        .click(function() {\n          window.open(link, \"_blank\");\n          $(this).blur();\n        });\n    }\n    return $tryBtn;\n  };\n\n  var draw = function() {\n    var error = yasr.results.getException();\n    $container.empty().appendTo(yasr.resultsContainer);\n    var $header = $(\"<div>\", {\n      class: \"errorHeader\"\n    }).appendTo($container);\n\n    if (error.status !== 0) {\n      var statusText = \"Error\";\n      if (error.statusText && error.statusText.length < 100) {\n        //use a max: otherwise the alert span will look ugly\n        statusText = error.statusText;\n      }\n      statusText += \" (#\" + error.status + \")\";\n\n      $header\n        .append(\n          $(\"<span>\", {\n            class: \"exception\"\n          }).text(statusText)\n        )\n        .append(getTryBtn());\n\n      var responseText = null;\n      if (error.responseText) {\n        responseText = error.responseText;\n      } else if (typeof error == \"string\") {\n        //for backwards compatability (when creating the error string was done externally\n        responseText = error;\n      }\n      if (responseText) $container.append($(\"<pre>\").text(responseText));\n    } else {\n      $header.append(getTryBtn());\n      //cors disabled, wrong url, or endpoint down\n      $container.append(\n        $(\"<div>\", {\n          class: \"corsMessage\"\n        }).append(options.corsMessage)\n      );\n    }\n  };\n\n  var canHandleResults = function(yasr) {\n    return yasr.results.getException() || false;\n  };\n\n  return {\n    name: null, //don't need to set this: we don't show it in the selection widget anyway, so don't need a human-friendly name\n    draw: draw,\n    getPriority: 20,\n    hideFromSelection: true,\n    canHandleResults: canHandleResults\n  };\n};\n\n/**\n * Defaults for error plugin\n * \n * @type object\n * @attribute YASR.plugins.error.defaults\n */\nroot.defaults = {\n  corsMessage: \"Unable to get response from endpoint\",\n  tryQueryLink: null\n};\n\n},{\"jquery\":undefined}],163:[function(require,module,exports){\nmodule.exports = {\n  GoogleTypeException: function(foundTypes, varName) {\n    this.foundTypes = foundTypes;\n    this.varName = varName;\n    this.toString = function() {\n      var string = \"Conflicting data types found for variable \" +\n        this.varName +\n        '. Assuming all values of this variable are \"string\".';\n      string += \" To avoid this issue, cast the values in your SPARQL query to the intended xsd datatype\";\n\n      return string;\n    };\n    this.toHtml = function() {\n      var string = \"Conflicting data types found for variable <i>\" +\n        this.varName +\n        '</i>. Assuming all values of this variable are \"string\".';\n      string += \" As a result, several Google Charts will not render values of this particular variable.\";\n      string += \" To avoid this issue, cast the values in your SPARQL query to the intended xsd datatype\";\n\n      return string;\n    };\n  }\n};\n\n},{}],164:[function(require,module,exports){\n(function (global){\nvar EventEmitter = require(\"events\").EventEmitter, $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\n//cannot package google loader via browserify....\nvar loadingMain = false;\nvar loadingFailed = false;\n\nvar loader = function() {\n  EventEmitter.call(this);\n  var mod = this;\n  this.init = function() {\n    if (!loadingFailed && !(typeof window !== \"undefined\" ? window['google'] : typeof global !== \"undefined\" ? global['google'] : null) && !loadingMain) {\n      //not initiated yet, not currently loading, and has not failed the previous time\n      loadingMain = true;\n      /**\n\t\t\t * It is extremely difficult to catch script loader errors (see http://www.html5rocks.com/en/tutorials/speed/script-loading/)\n\t\t\t * Existing libraries either ignore several browsers (e.g. jquery 2.x), or use ugly hacks (timeouts or something)\n\t\t\t * So, we use our own custom ugly hack (yes, timeouts)\n\t\t\t */\n      //use protocol relative req when served via http. Otherwise, just use http:// (e.g. when yasr is served via file://)\n      loadScript((window.location.protocol.indexOf(\"http\") === 0 ? \"//\" : \"http://\") + \"google.com/jsapi\", function() {\n        loadingMain = false;\n        mod.emit(\"initDone\");\n      });\n\n      var timeout = 100; //ms\n      var maxTimeout = 6000; //so 6 sec max\n      var startTime = +new Date();\n      var checkAndWait = function() {\n        if (!(typeof window !== \"undefined\" ? window['google'] : typeof global !== \"undefined\" ? global['google'] : null)) {\n          if (+new Date() - startTime > maxTimeout) {\n            //ok, we've waited long enough. Obviously we could not load the googleloader...\n            loadingFailed = true;\n            loadingMain = false;\n            mod.emit(\"initError\");\n\n            //TODO: clear initDone callbacks. they won't fire anymore anyway\n          } else {\n            setTimeout(checkAndWait, timeout);\n          }\n        } else {\n          //TODO: clear initFailed callbacks. they won't fire anymore anyway\n        }\n      };\n      checkAndWait();\n    } else {\n      if ((typeof window !== \"undefined\" ? window['google'] : typeof global !== \"undefined\" ? global['google'] : null)) {\n        //already loaded! everything is fine\n        mod.emit(\"initDone\");\n      } else if (loadingFailed) {\n        mod.emit(\"initError\");\n      } else {\n        //hmmm, should never get here\n      }\n    }\n  };\n  this.googleLoad = function() {\n    var load = function() {\n      (typeof window !== \"undefined\" ? window['google'] : typeof global !== \"undefined\" ? global['google'] : null).load(\"visualization\", \"1\", {\n        packages: [\"corechart\", \"charteditor\"],\n        callback: function() {\n          mod.emit(\"done\");\n        }\n      });\n    };\n    if (loadingMain) {\n      mod.once(\"initDone\", load);\n      mod.once(\"initError\", function() {\n        mod.emit(\"error\", \"Could not load google loader\");\n      });\n    } else if ((typeof window !== \"undefined\" ? window['google'] : typeof global !== \"undefined\" ? global['google'] : null)) {\n      //google loader is there. use it\n      load();\n    } else if (loadingFailed) {\n      mod.emit(\"error\", \"Could not load google loader\");\n    } else {\n      //not loading, no loading error, and not loaded. it must not have been initialized yet. Do that\n      mod.once(\"initDone\", load);\n      mod.once(\"initError\", function() {\n        mod.emit(\"error\", \"Could not load google loader\");\n      });\n    }\n  };\n};\n\nvar loadScript = function(url, callback) {\n  var script = document.createElement(\"script\");\n  script.type = \"text/javascript\";\n\n  if (script.readyState) {\n    //IE\n    script.onreadystatechange = function() {\n      if (script.readyState == \"loaded\" || script.readyState == \"complete\") {\n        script.onreadystatechange = null;\n        callback();\n      }\n    };\n  } else {\n    //Others\n    script.onload = function() {\n      callback();\n    };\n  }\n\n  script.src = url;\n  document.body.appendChild(script);\n};\nloader.prototype = new EventEmitter();\nmodule.exports = new loader();\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"events\":17,\"jquery\":undefined}],165:[function(require,module,exports){\n(function (global){\n\"use strict\";\n/**\n * todo: chart height as option\n * \n */\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})(), utils = require(\"./utils.js\"), yUtils = require(\"yasgui-utils\");\n\nvar root = module.exports = function(yasr) {\n  var options = $.extend(true, {}, root.defaults);\n  var id = yasr.container.closest(\"[id]\").attr(\"id\");\n\n  var chartWrapper = null;\n  var editor = null;\n\n  var initEditor = function(callback) {\n    var google = (typeof window !== \"undefined\" ? window['google'] : typeof global !== \"undefined\" ? global['google'] : null);\n    editor = new google.visualization.ChartEditor();\n    google.visualization.events.addListener(editor, \"ok\", function() {\n      var tmp;\n      chartWrapper = editor.getChartWrapper();\n      tmp = chartWrapper.getDataTable();\n      chartWrapper.setDataTable(null);\n      //ugly: need to parse json string to json obj again, as google chart does not provide access to object directly\n      options.chartConfig = JSON.parse(chartWrapper.toJSON());\n      //remove container ID though, for portability\n      if (options.chartConfig.containerId) delete options.chartConfig[\"containerId\"];\n      yasr.store();\n      chartWrapper.setDataTable(tmp);\n      var wrapperId = id + \"_gchartWrapper\";\n      var $wrapper = $(\"#\" + wrapperId);\n      chartWrapper.setOption(\"width\", $wrapper.width());\n      chartWrapper.setOption(\"height\", $wrapper.height());\n      chartWrapper.draw();\n      yasr.updateHeader();\n    });\n    if (callback) callback();\n  };\n\n  return {\n    name: \"Google Chart\",\n    hideFromSelection: false,\n    priority: 7,\n    options: options,\n    getPersistentSettings: function() {\n      return {\n        chartConfig: options.chartConfig,\n        motionChartState: options.motionChartState\n      };\n    },\n    setPersistentSettings: function(persSettings) {\n      if (persSettings[\"chartConfig\"]) options.chartConfig = persSettings[\"chartConfig\"];\n      if (persSettings[\"motionChartState\"]) options.motionChartState = persSettings[\"motionChartState\"];\n    },\n    canHandleResults: function(yasr) {\n      var results, variables;\n      return (results = yasr.results) != null && (variables = results.getVariables()) && variables.length > 0;\n    },\n    getDownloadInfo: function() {\n      if (!yasr.results) return null;\n      var svgEl = yasr.resultsContainer.find(\"svg\");\n      if (svgEl.length > 0) {\n        return {\n          getContent: function() {\n            if (svgEl[0].outerHTML) {\n              return svgEl[0].outerHTML;\n            } else {\n              //outerHTML not supported. use workaround\n              return $(\"<div>\").append(svgEl.clone()).html();\n            }\n          },\n          filename: \"queryResults.svg\",\n          contentType: \"image/svg+xml\",\n          buttonTitle: \"Download SVG Image\"\n        };\n      }\n      //ok, not a svg. is it a table?\n      var $table = yasr.resultsContainer.find(\".google-visualization-table-table\");\n      if ($table.length > 0) {\n        return {\n          getContent: function() {\n            return $table.tableToCsv();\n          },\n          filename: \"queryResults.csv\",\n          contentType: \"text/csv\",\n          buttonTitle: \"Download as CSV\"\n        };\n      }\n    },\n    getEmbedHtml: function() {\n      if (!yasr.results) return null;\n\n      var svgEl = yasr.resultsContainer\n        .find(\"svg\")\n        .clone() //create clone, as we'd like to remove height/width attributes\n        .removeAttr(\"height\")\n        .removeAttr(\"width\")\n        .css(\"height\", \"\")\n        .css(\"width\", \"\");\n      if (svgEl.length == 0) return null;\n\n      var htmlString = svgEl[0].outerHTML;\n      if (!htmlString) {\n        //outerHTML not supported. use workaround\n        htmlString = $(\"<div>\").append(svgEl.clone()).html();\n      }\n      //wrap in div, so users can more easily tune width/height\n      //don't use jquery, so we can easily influence indentation\n      return '<div style=\"width: 800px; height: 600px;\">\\n' + htmlString + \"\\n</div>\";\n    },\n    draw: function() {\n      var doDraw = function() {\n        //clear previous results (if any)\n        yasr.resultsContainer.empty();\n        var wrapperId = id + \"_gchartWrapper\";\n\n        yasr.resultsContainer\n          .append(\n            $(\"<button>\", {\n              class: \"openGchartBtn yasr_btn\"\n            })\n              .text(\"Chart Config\")\n              .click(function() {\n                editor.openDialog(chartWrapper);\n              })\n          )\n          .append(\n            $(\"<div>\", {\n              id: wrapperId,\n              class: \"gchartWrapper\"\n            })\n          );\n        var dataTable = new google.visualization.DataTable();\n        //clone, because we'll be manipulating the literals types\n        var jsonResults = $.extend(true, {}, yasr.results.getAsJson());\n        jsonResults.head.vars.forEach(function(variable) {\n          var type = \"string\";\n          try {\n            type = utils.getGoogleTypeForBindings(jsonResults.results.bindings, variable);\n          } catch (e) {\n            if (e instanceof require(\"./exceptions.js\").GoogleTypeException) {\n              yasr.warn(e.toHtml());\n            } else {\n              throw e;\n            }\n          }\n          dataTable.addColumn(type, variable);\n        });\n        var usedPrefixes = null;\n        if (yasr.options.getUsedPrefixes) {\n          usedPrefixes = typeof yasr.options.getUsedPrefixes == \"function\"\n            ? yasr.options.getUsedPrefixes(yasr)\n            : yasr.options.getUsedPrefixes;\n        }\n        jsonResults.results.bindings.forEach(function(binding) {\n          var row = [];\n          jsonResults.head.vars.forEach(function(variable, columnId) {\n            row.push(utils.castGoogleType(binding[variable], usedPrefixes, dataTable.getColumnType(columnId)));\n          });\n          dataTable.addRow(row);\n        });\n\n        if (options.chartConfig && options.chartConfig.chartType) {\n          options.chartConfig.containerId = wrapperId;\n          chartWrapper = new google.visualization.ChartWrapper(options.chartConfig);\n          if (chartWrapper.getChartType() === \"MotionChart\" && options.motionChartState) {\n            chartWrapper.setOption(\"state\", options.motionChartState);\n            google.visualization.events.addListener(chartWrapper, \"ready\", function() {\n              var motionChart;\n              motionChart = chartWrapper.getChart();\n              google.visualization.events.addListener(motionChart, \"statechange\", function() {\n                options.motionChartState = motionChart.getState();\n                yasr.store();\n              });\n            });\n          }\n          chartWrapper.setDataTable(dataTable);\n        } else {\n          chartWrapper = new google.visualization.ChartWrapper({\n            chartType: \"Table\",\n            dataTable: dataTable,\n            containerId: wrapperId\n          });\n        }\n        var $wrapper = $(\"#\" + wrapperId);\n        chartWrapper.setOption(\"width\", $wrapper.width());\n        chartWrapper.setOption(\"height\", $wrapper.height());\n        chartWrapper.draw();\n        google.visualization.events.addListener(chartWrapper, \"ready\", yasr.updateHeader);\n      };\n\n      if (!(typeof window !== \"undefined\" ? window['google'] : typeof global !== \"undefined\" ? global['google'] : null) || !(typeof window !== \"undefined\" ? window['google'] : typeof global !== \"undefined\" ? global['google'] : null).visualization || !editor) {\n        require(\"./gChartLoader.js\")\n          .on(\"done\", function() {\n            initEditor();\n            doDraw();\n          })\n          .on(\"error\", function() {\n            //TODO: disable or something?\n          })\n          .googleLoad();\n      } else {\n        //everything (editor as well) is already initialized\n        doDraw();\n      }\n    }\n  };\n};\nroot.defaults = {\n  height: \"100%\",\n  width: \"100%\",\n  persistencyId: \"gchart\",\n  chartConfig: null,\n  motionChartState: null\n};\n\nfunction deepEq$(x, y, type) {\n  var toString = ({}).toString,\n    hasOwnProperty = ({}).hasOwnProperty,\n    has = function(obj, key) {\n      return hasOwnProperty.call(obj, key);\n    };\n  var first = true;\n  return eq(x, y, []);\n\n  function eq(a, b, stack) {\n    var className, length, size, result, alength, blength, r, key, ref, sizeB;\n    if (a == null || b == null) {\n      return a === b;\n    }\n    if (a.__placeholder__ || b.__placeholder__) {\n      return true;\n    }\n    if (a === b) {\n      return a !== 0 || 1 / a == 1 / b;\n    }\n    className = toString.call(a);\n    if (toString.call(b) != className) {\n      return false;\n    }\n    switch (className) {\n      case \"[object String]\":\n        return a == String(b);\n      case \"[object Number]\":\n        return a != +a ? b != +b : a == 0 ? 1 / a == 1 / b : a == +b;\n      case \"[object Date]\":\n      case \"[object Boolean]\":\n        return +a == +b;\n      case \"[object RegExp]\":\n        return a.source == b.source &&\n          a.global == b.global &&\n          a.multiline == b.multiline &&\n          a.ignoreCase == b.ignoreCase;\n    }\n    if (typeof a != \"object\" || typeof b != \"object\") {\n      return false;\n    }\n    length = stack.length;\n    while (length--) {\n      if (stack[length] == a) {\n        return true;\n      }\n    }\n    stack.push(a);\n    size = 0;\n    result = true;\n    if (className == \"[object Array]\") {\n      alength = a.length;\n      blength = b.length;\n      if (first) {\n        switch (type) {\n          case \"===\":\n            result = alength === blength;\n            break;\n          case \"<==\":\n            result = alength <= blength;\n            break;\n          case \"<<=\":\n            result = alength < blength;\n            break;\n        }\n        size = alength;\n        first = false;\n      } else {\n        result = alength === blength;\n        size = alength;\n      }\n      if (result) {\n        while (size--) {\n          if (!(result = size in a == size in b && eq(a[size], b[size], stack))) {\n            break;\n          }\n        }\n      }\n    } else {\n      if (\"constructor\" in a != \"constructor\" in b || a.constructor != b.constructor) {\n        return false;\n      }\n      for (key in a) {\n        if (has(a, key)) {\n          size++;\n          if (!(result = has(b, key) && eq(a[key], b[key], stack))) {\n            break;\n          }\n        }\n      }\n      if (result) {\n        sizeB = 0;\n        for (key in b) {\n          if (has(b, key)) {\n            ++sizeB;\n          }\n        }\n        if (first) {\n          if (type === \"<<=\") {\n            result = size < sizeB;\n          } else if (type === \"<==\") {\n            result = size <= sizeB;\n          } else {\n            result = size === sizeB;\n          }\n        } else {\n          first = false;\n          result = size === sizeB;\n        }\n      }\n    }\n    stack.pop();\n    return result;\n  }\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"./exceptions.js\":163,\"./gChartLoader.js\":164,\"./utils.js\":181,\"jquery\":undefined,\"yasgui-utils\":154}],166:[function(require,module,exports){\n\"use strict\";\nmodule.exports = {\n  cross: '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" x=\"0px\" y=\"0px\" width=\"30px\" height=\"30px\" viewBox=\"0 0 100 100\" enable-background=\"new 0 0 100 100\" xml:space=\"preserve\"><g>\t<path d=\"M83.288,88.13c-2.114,2.112-5.575,2.112-7.689,0L53.659,66.188c-2.114-2.112-5.573-2.112-7.687,0L24.251,87.907   c-2.113,2.114-5.571,2.114-7.686,0l-4.693-4.691c-2.114-2.114-2.114-5.573,0-7.688l21.719-21.721c2.113-2.114,2.113-5.573,0-7.686   L11.872,24.4c-2.114-2.113-2.114-5.571,0-7.686l4.842-4.842c2.113-2.114,5.571-2.114,7.686,0L46.12,33.591   c2.114,2.114,5.572,2.114,7.688,0l21.721-21.719c2.114-2.114,5.573-2.114,7.687,0l4.695,4.695c2.111,2.113,2.111,5.571-0.003,7.686   L66.188,45.973c-2.112,2.114-2.112,5.573,0,7.686L88.13,75.602c2.112,2.111,2.112,5.572,0,7.687L83.288,88.13z\"/></g></svg>',\n  check: '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" x=\"0px\" y=\"0px\" width=\"30px\" height=\"30px\" viewBox=\"0 0 100 100\" enable-background=\"new 0 0 100 100\" xml:space=\"preserve\"><path fill=\"#000000\" d=\"M14.301,49.982l22.606,17.047L84.361,4.903c2.614-3.733,7.76-4.64,11.493-2.026l0.627,0.462  c3.732,2.614,4.64,7.758,2.025,11.492l-51.783,79.77c-1.955,2.791-3.896,3.762-7.301,3.988c-3.405,0.225-5.464-1.039-7.508-3.084  L2.447,61.814c-3.263-3.262-3.263-8.553,0-11.814l0.041-0.019C5.75,46.718,11.039,46.718,14.301,49.982z\"/></svg>',\n  unsorted: '<svg   xmlns:dc=\"http://purl.org/dc/elements/1.1/\"   xmlns:cc=\"http://creativecommons.org/ns#\"   xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"   xmlns:svg=\"http://www.w3.org/2000/svg\"   xmlns=\"http://www.w3.org/2000/svg\"   xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\"   xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\"   version=\"1.1\"   id=\"Layer_1\"   x=\"0px\"   y=\"0px\"   width=\"100%\"   height=\"100%\"   viewBox=\"0 0 54.552711 113.78478\"   enable-background=\"new 0 0 100 100\"   xml:space=\"preserve\"><g     id=\"g5\"     transform=\"matrix(-0.70522156,-0.70898699,-0.70898699,0.70522156,97.988199,55.081205)\"><path       style=\"fill:#000000\"       inkscape:connector-curvature=\"0\"       id=\"path7\"       d=\"M 57.911,66.915 45.808,55.063 42.904,52.238 31.661,41.25 31.435,41.083 31.131,40.775 30.794,40.523 30.486,40.3 30.069,40.05 29.815,39.911 29.285,39.659 29.089,39.576 28.474,39.326 28.363,39.297 H 28.336 L 27.665,39.128 27.526,39.1 26.94,38.99 26.714,38.961 26.212,38.934 h -0.31 -0.444 l -0.339,0.027 c -1.45,0.139 -2.876,0.671 -4.11,1.564 l -0.223,0.141 -0.279,0.25 -0.335,0.308 -0.054,0.029 -0.171,0.194 -0.334,0.364 -0.224,0.279 -0.25,0.336 -0.225,0.362 -0.192,0.308 -0.197,0.421 -0.142,0.279 -0.193,0.477 -0.084,0.222 -12.441,38.414 c -0.814,2.458 -0.313,5.029 1.115,6.988 v 0.026 l 0.418,0.532 0.17,0.165 0.251,0.281 0.084,0.079 0.283,0.281 0.25,0.194 0.474,0.367 0.083,0.053 c 2.015,1.371 4.641,1.874 7.131,1.094 L 55.228,80.776 c 4.303,-1.342 6.679,-5.814 5.308,-10.006 -0.387,-1.259 -1.086,-2.35 -1.979,-3.215 l -0.368,-0.337 -0.278,-0.303 z m -6.318,5.896 0.079,0.114 -37.369,11.57 11.854,-36.538 10.565,10.317 2.876,2.825 11.995,11.712 z\" /></g><path     style=\"fill:#000000\"     inkscape:connector-curvature=\"0\"     id=\"path7-9\"     d=\"m 8.8748339,52.571766 16.9382111,-0.222584 4.050851,-0.06665 15.719154,-0.222166 0.27778,-0.04246 0.43276,0.0017 0.41632,-0.06121 0.37532,-0.0611 0.47132,-0.119342 0.27767,-0.08206 0.55244,-0.198047 0.19707,-0.08043 0.61095,-0.259721 0.0988,-0.05825 0.019,-0.01914 0.59303,-0.356548 0.11787,-0.0788 0.49125,-0.337892 0.17994,-0.139779 0.37317,-0.336871 0.21862,-0.219786 0.31311,-0.31479 0.21993,-0.259387 c 0.92402,-1.126057 1.55249,-2.512251 1.78961,-4.016904 l 0.0573,-0.25754 0.0195,-0.374113 0.0179,-0.454719 0.0175,-0.05874 -0.0169,-0.258049 -0.0225,-0.493503 -0.0398,-0.355569 -0.0619,-0.414201 -0.098,-0.414812 -0.083,-0.353334 L 53.23955,41.1484 53.14185,40.850967 52.93977,40.377742 52.84157,40.161628 34.38021,4.2507375 C 33.211567,1.9401875 31.035446,0.48226552 28.639484,0.11316952 l -0.01843,-0.01834 -0.671963,-0.07882 -0.236871,0.0042 L 27.335984,-4.7826577e-7 27.220736,0.00379952 l -0.398804,0.0025 -0.313848,0.04043 -0.594474,0.07724 -0.09611,0.02147 C 23.424549,0.60716252 21.216017,2.1142355 20.013025,4.4296865 L 0.93967491,40.894479 c -2.08310801,3.997178 -0.588125,8.835482 3.35080799,10.819749 1.165535,0.613495 2.43199,0.88731 3.675026,0.864202 l 0.49845,-0.02325 0.410875,0.01658 z M 9.1502369,43.934401 9.0136999,43.910011 27.164145,9.2564625 44.70942,43.42818 l -14.765289,0.214677 -4.031106,0.0468 -16.7627881,0.244744 z\" /></svg>',\n  sortDesc: '<svg   xmlns:dc=\"http://purl.org/dc/elements/1.1/\"   xmlns:cc=\"http://creativecommons.org/ns#\"   xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"   xmlns:svg=\"http://www.w3.org/2000/svg\"   xmlns=\"http://www.w3.org/2000/svg\"   xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\"   xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\"   version=\"1.1\"   id=\"Layer_1\"   x=\"0px\"   y=\"0px\"   width=\"100%\"   height=\"100%\"   viewBox=\"0 0 54.552711 113.78478\"   enable-background=\"new 0 0 100 100\"   xml:space=\"preserve\"><g     id=\"g5\"     transform=\"matrix(-0.70522156,-0.70898699,-0.70898699,0.70522156,97.988199,55.081205)\"><path       style=\"fill:#000000\"       inkscape:connector-curvature=\"0\"       id=\"path7\"       d=\"M 57.911,66.915 45.808,55.063 42.904,52.238 31.661,41.25 31.435,41.083 31.131,40.775 30.794,40.523 30.486,40.3 30.069,40.05 29.815,39.911 29.285,39.659 29.089,39.576 28.474,39.326 28.363,39.297 H 28.336 L 27.665,39.128 27.526,39.1 26.94,38.99 26.714,38.961 26.212,38.934 h -0.31 -0.444 l -0.339,0.027 c -1.45,0.139 -2.876,0.671 -4.11,1.564 l -0.223,0.141 -0.279,0.25 -0.335,0.308 -0.054,0.029 -0.171,0.194 -0.334,0.364 -0.224,0.279 -0.25,0.336 -0.225,0.362 -0.192,0.308 -0.197,0.421 -0.142,0.279 -0.193,0.477 -0.084,0.222 -12.441,38.414 c -0.814,2.458 -0.313,5.029 1.115,6.988 v 0.026 l 0.418,0.532 0.17,0.165 0.251,0.281 0.084,0.079 0.283,0.281 0.25,0.194 0.474,0.367 0.083,0.053 c 2.015,1.371 4.641,1.874 7.131,1.094 L 55.228,80.776 c 4.303,-1.342 6.679,-5.814 5.308,-10.006 -0.387,-1.259 -1.086,-2.35 -1.979,-3.215 l -0.368,-0.337 -0.278,-0.303 z m -6.318,5.896 0.079,0.114 -37.369,11.57 11.854,-36.538 10.565,10.317 2.876,2.825 11.995,11.712 z\" /></g><path     style=\"fill:#000000\"     inkscape:connector-curvature=\"0\"     id=\"path9\"     d=\"m 27.813273,0.12823506 0.09753,0.02006 c 2.39093,0.458209 4.599455,1.96811104 5.80244,4.28639004 L 52.785897,40.894525 c 2.088044,4.002139 0.590949,8.836902 -3.348692,10.821875 -1.329078,0.688721 -2.766603,0.943695 -4.133174,0.841768 l -0.454018,0.02 L 27.910392,52.354171 23.855313,52.281851 8.14393,52.061827 7.862608,52.021477 7.429856,52.021738 7.014241,51.959818 6.638216,51.900838 6.164776,51.779369 5.889216,51.699439 5.338907,51.500691 5.139719,51.419551 4.545064,51.145023 4.430618,51.105123 4.410168,51.084563 3.817138,50.730843 3.693615,50.647783 3.207314,50.310611 3.028071,50.174369 2.652795,49.833957 2.433471,49.613462 2.140099,49.318523 1.901127,49.041407 C 0.97781,47.916059 0.347935,46.528448 0.11153,45.021676 L 0.05352,44.766255 0.05172,44.371683 0.01894,43.936017 0,43.877277 0.01836,43.62206 0.03666,43.122889 0.0765,42.765905 0.13912,42.352413 0.23568,41.940425 0.32288,41.588517 0.481021,41.151945 0.579391,40.853806 0.77369,40.381268 0.876097,40.162336 19.338869,4.2542801 c 1.172169,-2.308419 3.34759,-3.76846504 5.740829,-4.17716604 l 0.01975,0.01985 0.69605,-0.09573 0.218437,0.0225 0.490791,-0.02132 0.39809,0.0046 0.315972,0.03973 0.594462,0.08149 z\" /></svg>',\n  sortAsc: '<svg   xmlns:dc=\"http://purl.org/dc/elements/1.1/\"   xmlns:cc=\"http://creativecommons.org/ns#\"   xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"   xmlns:svg=\"http://www.w3.org/2000/svg\"   xmlns=\"http://www.w3.org/2000/svg\"   xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\"   xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\"   version=\"1.1\"   id=\"Layer_1\"   x=\"0px\"   y=\"0px\"   width=\"100%\"   height=\"100%\"   viewBox=\"0 0 54.552711 113.78478\"   enable-background=\"new 0 0 100 100\"   xml:space=\"preserve\"><g     id=\"g5\"     transform=\"matrix(-0.70522156,0.70898699,-0.70898699,-0.70522156,97.988199,58.704807)\"><path       style=\"fill:#000000\"       inkscape:connector-curvature=\"0\"       id=\"path7\"       d=\"M 57.911,66.915 45.808,55.063 42.904,52.238 31.661,41.25 31.435,41.083 31.131,40.775 30.794,40.523 30.486,40.3 30.069,40.05 29.815,39.911 29.285,39.659 29.089,39.576 28.474,39.326 28.363,39.297 H 28.336 L 27.665,39.128 27.526,39.1 26.94,38.99 26.714,38.961 26.212,38.934 h -0.31 -0.444 l -0.339,0.027 c -1.45,0.139 -2.876,0.671 -4.11,1.564 l -0.223,0.141 -0.279,0.25 -0.335,0.308 -0.054,0.029 -0.171,0.194 -0.334,0.364 -0.224,0.279 -0.25,0.336 -0.225,0.362 -0.192,0.308 -0.197,0.421 -0.142,0.279 -0.193,0.477 -0.084,0.222 -12.441,38.414 c -0.814,2.458 -0.313,5.029 1.115,6.988 v 0.026 l 0.418,0.532 0.17,0.165 0.251,0.281 0.084,0.079 0.283,0.281 0.25,0.194 0.474,0.367 0.083,0.053 c 2.015,1.371 4.641,1.874 7.131,1.094 L 55.228,80.776 c 4.303,-1.342 6.679,-5.814 5.308,-10.006 -0.387,-1.259 -1.086,-2.35 -1.979,-3.215 l -0.368,-0.337 -0.278,-0.303 z m -6.318,5.896 0.079,0.114 -37.369,11.57 11.854,-36.538 10.565,10.317 2.876,2.825 11.995,11.712 z\" /></g><path     style=\"fill:#000000\"     inkscape:connector-curvature=\"0\"     id=\"path9\"     d=\"m 27.813273,113.65778 0.09753,-0.0201 c 2.39093,-0.45821 4.599455,-1.96811 5.80244,-4.28639 L 52.785897,72.891487 c 2.088044,-4.002139 0.590949,-8.836902 -3.348692,-10.821875 -1.329078,-0.688721 -2.766603,-0.943695 -4.133174,-0.841768 l -0.454018,-0.02 -16.939621,0.223997 -4.055079,0.07232 -15.711383,0.220024 -0.281322,0.04035 -0.432752,-2.61e-4 -0.415615,0.06192 -0.376025,0.05898 -0.47344,0.121469 -0.27556,0.07993 -0.550309,0.198748 -0.199188,0.08114 -0.594655,0.274528 -0.114446,0.0399 -0.02045,0.02056 -0.59303,0.35372 -0.123523,0.08306 -0.486301,0.337172 -0.179243,0.136242 -0.375276,0.340412 -0.219324,0.220495 -0.293372,0.294939 -0.238972,0.277116 C 0.97781,65.869953 0.347935,67.257564 0.11153,68.764336 L 0.05352,69.019757 0.05172,69.414329 0.01894,69.849995 0,69.908735 l 0.01836,0.255217 0.0183,0.499171 0.03984,0.356984 0.06262,0.413492 0.09656,0.411988 0.0872,0.351908 0.158141,0.436572 0.09837,0.298139 0.194299,0.472538 0.102407,0.218932 18.462772,35.908054 c 1.172169,2.30842 3.34759,3.76847 5.740829,4.17717 l 0.01975,-0.0199 0.69605,0.0957 0.218437,-0.0225 0.490791,0.0213 0.39809,-0.005 0.315972,-0.0397 0.594462,-0.0815 z\" /></svg>',\n  download: '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" baseProfile=\"tiny\" x=\"0px\" y=\"0px\" width=\"100%\" height=\"100%\" viewBox=\"0 0 100 100\" xml:space=\"preserve\"><g id=\"Captions\"></g><g id=\"Your_Icon\">\t<path fill-rule=\"evenodd\" fill=\"#000000\" d=\"M88,84v-2c0-2.961-0.859-4-4-4H16c-2.961,0-4,0.98-4,4v2c0,3.102,1.039,4,4,4h68   C87.02,88,88,87.039,88,84z M58,12H42c-5,0-6,0.941-6,6v22H16l34,34l34-34H64V18C64,12.941,62.939,12,58,12z\"/></g></svg>',\n  move: '<svg   xmlns:dc=\"http://purl.org/dc/elements/1.1/\"   xmlns:cc=\"http://creativecommons.org/ns#\"   xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"   xmlns:svg=\"http://www.w3.org/2000/svg\"   xmlns=\"http://www.w3.org/2000/svg\"   xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\"   xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\"   version=\"1.1\"   id=\"Layer_1\"   x=\"0px\"   y=\"0px\"   width=\"100%\"   height=\"100%\"   viewBox=\"5 -10 74.074074 100\"   enable-background=\"new 0 0 100 100\"   xml:space=\"preserve\"   inkscape:version=\"0.48.4 r9939\"   sodipodi:docname=\"noun_11656_cc.svg\"><metadata     ><rdf:RDF><cc:Work         rdf:about=\"\"><dc:format>image/svg+xml</dc:format><dc:type           rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" /></cc:Work></rdf:RDF></metadata><defs      /><sodipodi:namedview     pagecolor=\"#ffffff\"     bordercolor=\"#666666\"     borderopacity=\"1\"     objecttolerance=\"10\"     gridtolerance=\"10\"     guidetolerance=\"10\"     inkscape:pageopacity=\"0\"     inkscape:pageshadow=\"2\"     inkscape:window-width=\"753\"     inkscape:window-height=\"480\"          showgrid=\"false\"     fit-margin-top=\"0\"     fit-margin-left=\"0\"     fit-margin-right=\"0\"     fit-margin-bottom=\"0\"     inkscape:zoom=\"2.36\"     inkscape:cx=\"44.101509\"     inkscape:cy=\"31.481481\"     inkscape:window-x=\"287\"     inkscape:window-y=\"249\"     inkscape:window-maximized=\"0\"     inkscape:current-layer=\"Layer_1\" /><polygon     points=\"33,83 50,100 67,83 54,83 54,17 67,17 50,0 33,17 46,17 46,83 \"          transform=\"translate(-7.962963,-10)\" /><polygon     points=\"83,67 100,50 83,33 83,46 17,46 17,33 0,50 17,67 17,54 83,54 \"          transform=\"translate(-7.962963,-10)\" /></svg>',\n  fullscreen: '<svg   xmlns:dc=\"http://purl.org/dc/elements/1.1/\"   xmlns:cc=\"http://creativecommons.org/ns#\"   xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"   xmlns:svg=\"http://www.w3.org/2000/svg\"   xmlns=\"http://www.w3.org/2000/svg\"   xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\"   xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\"   version=\"1.1\"      x=\"0px\"   y=\"0px\"   width=\"100%\"   height=\"100%\"   viewBox=\"5 -10 74.074074 100\"   enable-background=\"new 0 0 100 100\"   xml:space=\"preserve\"   inkscape:version=\"0.48.4 r9939\"   sodipodi:docname=\"noun_2186_cc.svg\"><metadata     ><rdf:RDF><cc:Work         rdf:about=\"\"><dc:format>image/svg+xml</dc:format><dc:type           rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" /></cc:Work></rdf:RDF></metadata><defs      /><sodipodi:namedview     pagecolor=\"#ffffff\"     bordercolor=\"#666666\"     borderopacity=\"1\"     objecttolerance=\"10\"     gridtolerance=\"10\"     guidetolerance=\"10\"     inkscape:pageopacity=\"0\"     inkscape:pageshadow=\"2\"     inkscape:window-width=\"640\"     inkscape:window-height=\"480\"          showgrid=\"false\"     fit-margin-top=\"0\"     fit-margin-left=\"0\"     fit-margin-right=\"0\"     fit-margin-bottom=\"0\"     inkscape:zoom=\"2.36\"     inkscape:cx=\"44.101509\"     inkscape:cy=\"31.481481\"     inkscape:window-x=\"65\"     inkscape:window-y=\"24\"     inkscape:window-maximized=\"0\"     inkscape:current-layer=\"Layer_1\" /><path     d=\"m -7.962963,-10 v 38.889 l 16.667,-16.667 16.667,16.667 5.555,-5.555 -16.667,-16.667 16.667,-16.667 h -38.889 z\"          inkscape:connector-curvature=\"0\"     style=\"fill:#010101\" /><path     d=\"m 92.037037,-10 v 38.889 l -16.667,-16.667 -16.666,16.667 -5.556,-5.555 16.666,-16.667 -16.666,-16.667 h 38.889 z\"          inkscape:connector-curvature=\"0\"     style=\"fill:#010101\" /><path     d=\"M -7.962963,90 V 51.111 l 16.667,16.666 16.667,-16.666 5.555,5.556 -16.667,16.666 16.667,16.667 h -38.889 z\"          inkscape:connector-curvature=\"0\"     style=\"fill:#010101\" /><path     d=\"M 92.037037,90 V 51.111 l -16.667,16.666 -16.666,-16.666 -5.556,5.556 16.666,16.666 -16.666,16.667 h 38.889 z\"          inkscape:connector-curvature=\"0\"     style=\"fill:#010101\" /></svg>',\n  smallscreen: '<svg   xmlns:dc=\"http://purl.org/dc/elements/1.1/\"   xmlns:cc=\"http://creativecommons.org/ns#\"   xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"   xmlns:svg=\"http://www.w3.org/2000/svg\"   xmlns=\"http://www.w3.org/2000/svg\"   xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\"   xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\"   version=\"1.1\"      x=\"0px\"   y=\"0px\"   width=\"100%\"   height=\"100%\"   viewBox=\"5 -10 74.074074 100\"   enable-background=\"new 0 0 100 100\"   xml:space=\"preserve\"   inkscape:version=\"0.48.4 r9939\"   sodipodi:docname=\"noun_2186_cc.svg\"><metadata     ><rdf:RDF><cc:Work         rdf:about=\"\"><dc:format>image/svg+xml</dc:format><dc:type           rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" /></cc:Work></rdf:RDF></metadata><defs      /><sodipodi:namedview     pagecolor=\"#ffffff\"     bordercolor=\"#666666\"     borderopacity=\"1\"     objecttolerance=\"10\"     gridtolerance=\"10\"     guidetolerance=\"10\"     inkscape:pageopacity=\"0\"     inkscape:pageshadow=\"2\"     inkscape:window-width=\"1855\"     inkscape:window-height=\"1056\"          showgrid=\"false\"     fit-margin-top=\"0\"     fit-margin-left=\"0\"     fit-margin-right=\"0\"     fit-margin-bottom=\"0\"     inkscape:zoom=\"2.36\"     inkscape:cx=\"44.101509\"     inkscape:cy=\"31.481481\"     inkscape:window-x=\"65\"     inkscape:window-y=\"24\"     inkscape:window-maximized=\"1\"     inkscape:current-layer=\"Layer_1\" /><path     d=\"m 30.926037,28.889 0,-38.889 -16.667,16.667 -16.667,-16.667 -5.555,5.555 16.667,16.667 -16.667,16.667 38.889,0 z\"          inkscape:connector-curvature=\"0\"     style=\"fill:#010101\" /><path     d=\"m 53.148037,28.889 0,-38.889 16.667,16.667 16.666,-16.667 5.556,5.555 -16.666,16.667 16.666,16.667 -38.889,0 z\"          inkscape:connector-curvature=\"0\"     style=\"fill:#010101\" /><path     d=\"m 30.926037,51.111 0,38.889 -16.667,-16.666 -16.667,16.666 -5.555,-5.556 16.667,-16.666 -16.667,-16.667 38.889,0 z\"          inkscape:connector-curvature=\"0\"     style=\"fill:#010101\" /><path     d=\"m 53.148037,51.111 0,38.889 16.667,-16.666 16.666,16.666 5.556,-5.556 -16.666,-16.666 16.666,-16.667 -38.889,0 z\"          inkscape:connector-curvature=\"0\"     style=\"fill:#010101\" /></svg>'\n};\n\n},{}],167:[function(require,module,exports){\nrequire(\"./tableToCsv.js\");\n\n},{\"./tableToCsv.js\":168}],168:[function(require,module,exports){\n\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\n\n$.fn.tableToCsv = function(config) {\n  var csvString = \"\";\n  config = $.extend(\n    {\n      quote: '\"',\n      delimiter: \",\",\n      lineBreak: \"\\n\"\n    },\n    config\n  );\n\n  var needToQuoteString = function(value) {\n    //quote when it contains whitespace or the delimiter\n    var needQuoting = false;\n    if (value.match(\"[\\\\w|\" + config.delimiter + \"|\" + config.quote + \"]\")) {\n      needQuoting = true;\n    }\n    return needQuoting;\n  };\n  var addValueToString = function(value) {\n    //Quotes in the string need to be escaped\n    value.replace(config.quote, config.quote + config.quote);\n    if (needToQuoteString(value)) {\n      value = config.quote + value + config.quote;\n    }\n    csvString += \" \" + value + \" \" + config.delimiter;\n  };\n\n  var addRowToString = function(rowArray) {\n    rowArray.forEach(function(val) {\n      addValueToString(val);\n    });\n    csvString += config.lineBreak;\n  };\n\n  var tableArrays = [];\n  var $el = $(this);\n  var rowspans = {};\n\n  var totalColCount = 0;\n  $el.find(\"tr:first *\").each(function() {\n    if ($(this).attr(\"colspan\")) {\n      totalColCount += +$(this).attr(\"colspan\");\n    } else {\n      totalColCount++;\n    }\n  });\n\n  $el.find(\"tr\").each(function(rowId, tr) {\n    var $tr = $(tr);\n    var rowArray = [];\n\n    var htmlColId = 0;\n    var actualColId = 0;\n    while (actualColId < totalColCount) {\n      if (rowspans[actualColId]) {\n        rowArray.push(rowspans[actualColId].text);\n        rowspans[actualColId].rowSpan--;\n        if (!rowspans[actualColId].rowSpan) rowspans[actualColId] = null;\n        actualColId++;\n        continue;\n      }\n\n      var $cell = $tr.find(\":nth-child(\" + (htmlColId + 1) + \")\");\n      if (!$cell) break;\n      var colspan = $cell.attr(\"colspan\") || 1;\n      var rowspan = $cell.attr(\"rowspan\") || 1;\n\n      for (var i = 0; i < colspan; i++) {\n        rowArray.push($cell.text());\n        if (rowspan > 1) {\n          rowspans[actualColId] = {\n            rowSpan: rowspan - 1,\n            text: $cell.text()\n          };\n        }\n        actualColId++;\n      }\n      htmlColId++;\n    }\n    addRowToString(rowArray);\n  });\n\n  return csvString;\n};\n\n},{\"jquery\":undefined}],169:[function(require,module,exports){\n(function (global){\n\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\n\nvar Color = require(\"color\");\n\n\n\nvar root = (module.exports = function(yasr) {\n  var plugin = {};\n  var options = $.extend(true, {}, root.defaults);\n  var defaultColor = Color(options.defaultColor);\n  var defaultStyle = options.defaultStyle;\n\n  var cm = null;\n\n  var getOption = function(key) {\n    // if (!options[key]) return {};\n    if (options[key]) {\n      if (typeof options[key] === \"function\") {\n        return options[key](yasr, L);\n      } else {\n        return options[key];\n      }\n    } else {\n      return undefined;\n    }\n  };\n\n\n  var getSvgMarker = function(colors) {\n    var fillColor2 = colors.fill.lighten(0.3);\n    var borderColor2 = colors.border.lighten(0.3);\n    return (\n      '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"25\" height=\"40\"><defs><linearGradient id=\"c\"><stop offset=\"0\" stop-color=\"' +\n      colors.fill +\n      '\"/><stop offset=\"1\" stop-color=\"' +\n      fillColor2 +\n      '\"/></linearGradient><linearGradient id=\"d\"><stop offset=\"0\" stop-color=\"' +\n      colors.border +\n      '\"/><stop offset=\"1\" stop-color=\"' +\n      borderColor2 +\n      '\"/></linearGradient><linearGradient xlink:href=\"#a\" x1=\"351.1\" y1=\"551.6\" x2=\"351.1\" y2=\"512.9\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(-2.715)\"/><linearGradient xlink:href=\"#a\" x1=\"318.6\" y1=\"550.1\" x2=\"318.6\" y2=\"512.4\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(94.732,2.054)\"/><linearGradient xlink:href=\"#a\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"matrix(-1,0,0,1,731.268,2.054)\" x1=\"318.6\" y1=\"550.1\" x2=\"318.6\" y2=\"512.4\"/><linearGradient xlink:href=\"#a\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(94.232,2.054)\" x1=\"318.6\" y1=\"550.1\" x2=\"318.6\" y2=\"512.4\"/><linearGradient xlink:href=\"#a\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(-28.58,-0.437)\" x1=\"445.3\" y1=\"541.3\" x2=\"445.3\" y2=\"503.7\"/><linearGradient xlink:href=\"#b\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(63,-0.438)\" x1=\"351.7\" y1=\"522.8\" x2=\"351.7\" y2=\"503.7\"/><linearGradient xlink:href=\"#a\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(-28.58,-0.437)\" x1=\"445.3\" y1=\"541.3\" x2=\"445.3\" y2=\"503.7\"/><linearGradient xlink:href=\"#b\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(63,-0.438)\" x1=\"351.7\" y1=\"522.8\" x2=\"351.7\" y2=\"503.7\"/><linearGradient xlink:href=\"#a\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(-28.58,-0.437)\" x1=\"445.3\" y1=\"541.3\" x2=\"445.3\" y2=\"503.7\"/><linearGradient xlink:href=\"#b\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(63,-0.438)\" x1=\"351.7\" y1=\"522.8\" x2=\"351.7\" y2=\"503.7\"/><linearGradient xlink:href=\"#a\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(-432.796,-503.349)\" x1=\"445.3\" y1=\"541.3\" x2=\"445.3\" y2=\"503.7\"/><linearGradient xlink:href=\"#b\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(-341.216,-503.35)\" x1=\"351.7\" y1=\"522.8\" x2=\"351.7\" y2=\"503.7\"/><linearGradient xlink:href=\"#a\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(-28.846,-0.287)\" x1=\"445.3\" y1=\"541.3\" x2=\"445.3\" y2=\"503.7\"/><linearGradient xlink:href=\"#b\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(62.734,-0.288)\" x1=\"351.7\" y1=\"522.8\" x2=\"351.7\" y2=\"503.7\"/></defs><rect y=\"4.5\" x=\"6.3\" height=\"14.5\" width=\"12.6\" fill=\"#fff\"/><path d=\"M12.6 0.6C6 0.6 0.6 6.2 0.6 12.4c0 2.8 1.6 6.3 2.7 8.7l9.3 17.9 9.3-17.9c1.1-2.4 2.7-5.8 2.7-8.7 0-6.2-5.4-11.9-12-11.9zm0 7.2c2.6 0 4.7 2.1 4.7 4.7 0 2.6-2.1 4.7-4.7 4.7-2.6 0-4.7-2.1-4.7-4.7 0-2.6 2.1-4.7 4.7-4.7z\" style=\"fill:url(#c);stroke:url(#d)\"/><path d=\"m12.6 1.7c-5.9 0-10.9 5.2-10.9 10.8 0 2.4 1.4 5.8 2.6 8.3l0 0 8.3 16 8.3-16 0 0c1.1-2.4 2.6-5.7 2.6-8.2 0-5.5-4.9-10.7-10.9-10.7zm0 5c3.2 0 5.8 2.6 5.8 5.8 0 3.2-2.6 5.8-5.8 5.8-3.2 0-5.7-2.6-5.7-5.8 0-3.2 2.6-5.8 5.8-5.8z\" style=\"fill:none;stroke-opacity:0.1;stroke:#fff\"/></svg>'\n    );\n  };\n  var draw = function() {\n    var _L = options.L;\n    require(\"proj4\");\n    require(\"proj4leaflet\");\n    //Ugly... need to set this global, as wicket-leaflet tries to access this global variable\n    global.Wkt = require(\"wicket/wicket\");\n    require(\"wicket/wicket-leaflet\");\n    var zoomToEl = function(e) {\n      map.setView(e.latlng, 15);\n    };\n    var plotVariables = getGeoVariables();\n    if (plotVariables.length === 0)\n      return $('<div class=\"leaflet\">Nothing to draw</div>').appendTo(yasr.resultsContainer);\n    var mapWrapper = $('<div class=\"leaflet\"/>').appendTo(yasr.resultsContainer);\n    var mapConstructor = options.map;\n    if (!mapConstructor) mapConstructor = options.maps[options.defaultMap || \"osm\"];\n    if (!mapConstructor) {\n      console.error('Could not find leaflet configuration for map ' + options.defaultMap);\n      return;\n    }\n    var map = new _L.Map(mapWrapper.get()[0], mapConstructor(yasr, L));\n\n    var mapLayers = options.defaultOverlay;\n    if(mapLayers) _L.control.layers(null, mapLayers).addTo(map);\n\n\n    var features = [];\n    var bindings = yasr.results.getBindings();\n    var hasLabel = false;\n    for (var varId = 0; varId < plotVariables.length; varId++) {\n      var plotVariable = plotVariables[varId];\n\n      for (var i = 0; i < bindings.length; i++) {\n        var binding = bindings[i];\n        if (!binding[plotVariable].value) continue;\n\n        var getColor = function() {\n          var colorBinding = binding[plotVariable + \"Color\"];\n          if (colorBinding) return Color(colorBinding.value);\n          return defaultColor;\n        };\n\n        var colors = {\n          fill: getColor()\n        };\n        colors.border = colors.fill.saturate(0.2);\n\n        var wicket = new Wkt.Wkt();\n        var mySVGIcon = _L.divIcon({\n          iconSize: [25, 41],\n          // shadowSize: [25, 45],\n          iconAnchor: [12, 41],\n          popupAnchor: [0, -41],\n          html: getSvgMarker(colors)\n        });\n\n\n        var style = $.extend(true, defaultStyle, { icon: mySVGIcon, color: colors.fill})\n        var feature = wicket.read(binding[plotVariable].value).toObject(style);\n\n        var popupContent = options.formatPopup && options.formatPopup(yasr, L, plotVariable, binding);\n        if (popupContent) {\n          function addPopupAndEventsToMarker(el) {\n            el.on(\"dblclick\", zoomToEl);\n            var popupContent = options.formatPopup && options.formatPopup(yasr, L, plotVariable, binding);\n            if (popupContent) {\n              hasLabel = true;\n              el.bindPopup(popupContent);\n            }\n          }\n\n          var markerPos;\n          if (feature.getBounds) {\n            //get center of polygon or something\n            markerPos = feature.getBounds().getCenter();\n          } else if (feature.getLatLng) {\n            //its a point, just get the lat/lng\n            markerPos = feature.getLatLng();\n          }\n          if (markerPos) {\n            var shouldDrawSeparateMarker = !!feature.getBounds; //a lat/lng is already a marker\n            if (shouldDrawSeparateMarker) {\n              addPopupAndEventsToMarker(_L.marker(markerPos, { icon: mySVGIcon }).addTo(map));\n            } else {\n              addPopupAndEventsToMarker(feature);\n            }\n          }\n        }\n        features.push(feature);\n      }\n    }\n    if (features.length) {\n      try {\n        var group = new _L.featureGroup(features).addTo(map);\n        map.fitBounds(group.getBounds());\n      } catch(e) {\n        //This is a strange issue. Depending on which leaflet instance was used (i.e. the window.L one, or the required one)\n\t//we might run into issues where the returned bounds are undefined...\n\t//solved it by simply preferring the global instance (though this can be turned off)\n        throw e;\n      }\n    }\n\n    // missingPopupMsg: function(yasr, L, geoVariables, bindings) {\n    if (!hasLabel && options.missingPopupMsg) {\n      var msg = null;\n      if (typeof options.missingPopupMsg === \"string\") {\n        msg = options.missingPopupMsg;\n      } else if (typeof options.missingPopupMsg === \"function\") {\n        msg = options.missingPopupMsg(yasr, L, plotVariables);\n      }\n      if (msg) yasr.resultsContainer.prepend(msg);\n    }\n  };\n\n  var geoKeywords = [\"POINT\", \"POLYGON\", \"LINESTRING\", \"MULTIPOINT\", \"MULTILINESTRING\", \"MULTIPOLYGON\"];\n  var valueIsGeometric = function(val) {\n    val = val.trim().toUpperCase();\n    for (var i = 0; i < geoKeywords.length; i++) {\n      if (val.indexOf(geoKeywords[i]) === 0) {\n        return true;\n      }\n    }\n    return false;\n  };\n  var getGeoVariables = function() {\n    if (!yasr.results) return [];\n    var bindings = yasr.results.getBindings();\n    if (!bindings || bindings.length === 0) {\n      return [];\n    }\n    var geoVars = [];\n    var checkedVars = [];\n    for (var i = 0; i < bindings.length; i++) {\n      //we'd like to have checked at least 1 value for all variables. So keep looping\n      //in case the first row does not contain values for all bound vars (e.g. optional)\n      var binding = bindings[i];\n      for (var bindingVar in binding) {\n        if (checkedVars.indexOf(bindingVar) === -1 && binding[bindingVar].value) {\n          checkedVars.push(bindingVar);\n          if (valueIsGeometric(binding[bindingVar].value)) geoVars.push(bindingVar);\n        }\n      }\n      if (checkedVars.length === yasr.results.getVariables().length) {\n        //checked all vars. can break now\n        break;\n      }\n    }\n    return geoVars;\n  };\n  var canHandleResults = function() {\n    return getGeoVariables().length > 0;\n  };\n\n  return {\n    draw: draw,\n    name: \"Geo\",\n    canHandleResults: canHandleResults,\n    getPriority: 2\n  };\n});\n\nvar maps = {\n  osm: function(yasr, L) {\n    return {\n      layers: [\n        new L.tileLayer(\"http://{s}.tile.osm.org/{z}/{x}/{y}.png\", {\n          attribution: '&copy; <a href=\"http://osm.org/copyright\">OpenStreetMap</a> contributors'\n        })\n      ]\n    };\n  },\n  nlmaps: function(yasr, L) {\n    var res = [3440.64, 1720.32, 860.16, 430.08, 215.04, 107.52, 53.76, 26.88, 13.44, 6.72, 3.36, 1.68, 0.84, 0.42];\n    var scales = [];\n    res.forEach(function(res) {\n      scales.push(1 / res);\n    });\n\n    var k = new L.Proj\n      .CRS(\n      \"EPSG:28992\",\n      \"+proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +towgs84=565.2369,50.0087,465.658,-0.406857330322398,0.350732676542563,-1.8703473836068,4.0812 +no_defs\",\n      {\n        transformation: new L.Transformation(1, 285401.92, -1, 903401.92),\n        scales: scales,\n        bounds: new L.bounds([-285401.92, 22598.08], [595401.9199999999, 903401.9199999999])\n      }\n    );\n    return {\n      crs: k,\n      layers: [\n        new L.tileLayer.wms(\"http://geodata.nationaalgeoregister.nl/tms/1.0.0/brtachtergrondkaart/{z}/{x}/{y}.png\", {\n          minZoom: 1,\n          maxZoom: 13,\n          tms: true\n        })\n      ]\n    };\n  },\n  /* free only up to 25'000 megapixels/year see https://shop.swisstopo.admin.ch/en/products/geoservice/swisstopo_geoservices/WMTS_info for further informations */\n  chmaps: function(yasr, L) {\n    var url = 'https://wmts10.geo.admin.ch/1.0.0/ch.swisstopo.pixelkarte-farbe/default/current/3857/{z}/{x}/{y}.jpeg';\n    var stopoAttr = 'Map data &copy; <a href=\"https://www.swisstopo.admin.ch/\">swisstopo</a> , ';\n    var tilelayer = new L.tileLayer(url,{id: 'stopo.light', attribution: stopoAttr, minZoom: 4, maxZoom: 19});\n\n    return {\n      layers: [tilelayer] ,\n      crs: L.CRS.EPSG3857,\n          continuousWorld: true,\n          worldCopyJump: false\n    };\n  }\n};\nroot.defaults = {\n  maps: maps,\n  L: window.L || require('leaflet'),\n  formatPopup: function(yasr, L, forVariable, bindings) {\n    if (bindings[forVariable + \"Label\"] && bindings[forVariable + \"Label\"].value) {\n      return bindings[forVariable + \"Label\"].value;\n    }\n  },\n  missingPopupMsg: function(yasr, L, geoVariables) {\n    if (geoVariables && geoVariables.length) {\n      return (\n        \"<small>Tip: Add a label variable prefixed with the geo variable name to show popups on the map. E.g. <code>\" +\n        geoVariables[0] +\n        \"Label</code>. Or, append <code>Color</code> to change the color of the shape or marker.</small>\"\n      );\n    }\n  },\n  disabledTitle: \"Query for geo variables in WKT format to plot them on a map\",\n  defaultColor: \"#2e6c97\",\n  defaultStyle: {},\n  defaultOverlay: null,\n  defaultMap: \"osm\" //or nlmaps\n};\n\nroot.version = {\n  leaflet: root.defaults.L.version\n};\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"color\":15,\"jquery\":undefined,\"leaflet\":18,\"proj4\":135,\"proj4leaflet\":136,\"wicket/wicket\":152,\"wicket/wicket-leaflet\":151}],170:[function(require,module,exports){\n\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})(), EventEmitter = require(\"events\").EventEmitter, utils = require(\"yasgui-utils\");\nconsole = console || {\n  log: function() {}\n}; //make sure any console statements don't break in IE\n\nrequire(\"./jquery/extendJquery.js\");\n\n/**\n * Main YASR constructor\n *\n * @constructor\n * @param {DOM-Element} parent element to append editor to.\n * @param {object} settings\n * @class YASR\n * @return {doc} YASR document\n */\nvar YASR = function(parent, options, queryResults) {\n  EventEmitter.call(this);\n  var yasr = this;\n  // console.log(EventEmitter.call(this));\n\n  // var yasr = {};\n  // EventEmitter.call(yasr);\n  yasr.options = $.extend(true, {}, module.exports.defaults, options);\n  //the recursive copy does merge (overwrite) array values how we want it to. Do this manually\n  if (options && options.outputPlugins) yasr.options.outputPlugins = options.outputPlugins;\n\n  yasr.container = $(\"<div class='yasr'></div>\").appendTo(parent);\n  yasr.header = $(\"<div class='yasr_header'></div>\").appendTo(yasr.container);\n  yasr.resultsContainer = $(\"<div class='yasr_results'></div>\").appendTo(yasr.container);\n  yasr.storage = utils.storage;\n\n  var prefix = null;\n  yasr.getPersistencyId = function(postfix) {\n    if (prefix === null) {\n      //instantiate prefix\n      if (yasr.options.persistency && yasr.options.persistency.prefix) {\n        prefix = typeof yasr.options.persistency.prefix == \"string\"\n          ? yasr.options.persistency.prefix\n          : yasr.options.persistency.prefix(yasr);\n      } else {\n        prefix = false;\n      }\n    }\n    if (prefix && postfix != null) {\n      return prefix + (typeof postfix == \"string\" ? postfix : postfix(yasr));\n    } else {\n      return null;\n    }\n  };\n\n  if (yasr.options.useGoogleCharts) {\n    //pre-load google-loader\n    require(\"./gChartLoader.js\")\n      .once(\"initError\", function() {\n        yasr.options.useGoogleCharts = false;\n      })\n      .init();\n  }\n\n  //first initialize plugins\n  yasr.plugins = {};\n  for (var pluginName in module.exports.plugins) {\n    if (!yasr.options.useGoogleCharts && pluginName == \"gchart\") continue;\n    yasr.plugins[pluginName] = new module.exports.plugins[pluginName](yasr);\n  }\n\n  yasr.updateHeader = function() {\n    var downloadIcon = yasr.header.find(\".yasr_downloadIcon\").removeAttr(\"title\"); //and remove previous titles\n    var embedButton = yasr.header.find(\".yasr_embedBtn\");\n    var outputPlugin = yasr.plugins[yasr.options.output];\n    if (outputPlugin) {\n      //Manage download link\n      var info = outputPlugin.getDownloadInfo ? outputPlugin.getDownloadInfo() : null;\n      if (info) {\n        if (info.buttonTitle) downloadIcon.attr(\"title\", info.buttonTitle);\n        downloadIcon.prop(\"disabled\", false);\n        downloadIcon.find(\"path\").each(function() {\n          this.style.fill = \"black\";\n        });\n      } else {\n        downloadIcon.prop(\"disabled\", true).prop(\"title\", \"Download not supported for this result representation\");\n        downloadIcon.find(\"path\").each(function() {\n          this.style.fill = \"gray\";\n        });\n      }\n\n      //Manage embed button\n      var link = null;\n      if (outputPlugin.getEmbedHtml) link = outputPlugin.getEmbedHtml();\n      if (link && link.length > 0) {\n        embedButton.show();\n      } else {\n        embedButton.hide();\n      }\n    }\n  };\n  yasr.draw = function(output) {\n    if (!yasr.results) return false;\n    if (!output) output = yasr.options.output;\n\n    //ah, our default output does not take our current results. Try to autodetect\n    var selectedOutput = null;\n    var selectedOutputPriority = -1;\n    var unsupportedOutputs = [];\n    for (var tryOutput in yasr.plugins) {\n      if (yasr.plugins[tryOutput].canHandleResults(yasr)) {\n        var priority = yasr.plugins[tryOutput].getPriority;\n        if (typeof priority == \"function\") priority = priority(yasr);\n        if (priority != null && priority != undefined && priority > selectedOutputPriority) {\n          selectedOutputPriority = priority;\n          selectedOutput = tryOutput;\n        }\n      } else {\n        unsupportedOutputs.push(tryOutput);\n      }\n    }\n    disableOutputs(unsupportedOutputs);\n    var outputToDraw = null;\n    if (output in yasr.plugins && yasr.plugins[output].canHandleResults(yasr)) {\n      outputToDraw = output;\n    } else if (selectedOutput) {\n      outputToDraw = selectedOutput;\n    }\n\n    if (outputToDraw) {\n      $(yasr.resultsContainer).empty();\n      yasr.emit(\"draw\", yasr, yasr.plugins[outputToDraw]);\n      yasr.plugins[outputToDraw].draw();\n      yasr.emit(\"drawn\", yasr, yasr.plugins[outputToDraw]);\n      yasr.updateHeader();\n      return true;\n    } else {\n      yasr.updateHeader();\n      return false;\n    }\n  };\n\n  var disableOutputs = function(outputs) {\n    //first enable everything.\n    yasr.header.find(\".yasr_btnGroup .yasr_btn\").removeClass(\"disabled\");\n\n    //now disable the outputs passed as param\n    outputs.forEach(function(outputName) {\n      var disabledTitle, disabledMsg;\n      if (module.exports.plugins[outputName] && module.exports.plugins[outputName].defaults) {\n        disabledTitle = module.exports.plugins[outputName].defaults.disabledTitle;\n      }\n      yasr.header.find(\".yasr_btnGroup .select_\" + outputName).addClass(\"disabled\").attr(\"title\", disabledTitle || \"\");\n    });\n  };\n  yasr.somethingDrawn = function() {\n    return !yasr.resultsContainer.is(\":empty\");\n  };\n\n  yasr.setResponse = function(dataOrJqXhr, textStatus, jqXhrOrErrorString) {\n    try {\n      yasr.results = require(\"./parsers/wrapper.js\")(dataOrJqXhr, textStatus, jqXhrOrErrorString);\n    } catch (exception) {\n      console.log(exception);\n      yasr.results = {\n        getException: function() {\n          return exception;\n        }\n      };\n    }\n    yasr.draw();\n\n    //store if needed\n    var resultsId = yasr.getPersistencyId(yasr.options.persistency.results.key);\n    if (resultsId) {\n      if (\n        !yasr.results.getException() &&\n        yasr.results.getOriginalResponseAsString &&\n        yasr.results.getOriginalResponseAsString().length < yasr.options.persistency.results.maxSize\n      ) {\n        utils.storage.set(resultsId, yasr.results.getAsStoreObject(), \"month\", yasr.options.onQuotaExceeded);\n      } else {\n        //remove old string\n        utils.storage.remove(resultsId);\n      }\n    }\n  };\n  var $toggableWarning = null;\n  var $toggableWarningClose = null;\n  var $toggableWarningMsg = null;\n  yasr.warn = function(warning) {\n    if (!$toggableWarning) {\n      //first time instantiation\n      $toggableWarning = $(\"<div>\", {\n        class: \"toggableWarning\"\n      })\n        .prependTo(yasr.container)\n        .hide();\n      $toggableWarningClose = $(\"<span>\", {\n        class: \"toggleWarning\"\n      })\n        .html(\"&times;\")\n        .click(function() {\n          $toggableWarning.hide(400);\n        })\n        .appendTo($toggableWarning);\n      $toggableWarningMsg = $(\"<span>\", {\n        class: \"toggableMsg\"\n      }).appendTo($toggableWarning);\n    }\n    $toggableWarningMsg.empty();\n    if (warning instanceof $) {\n      $toggableWarningMsg.append(warning);\n    } else {\n      $toggableWarningMsg.html(warning);\n    }\n    $toggableWarning.show(400);\n  };\n\n  var blobDownloadSupported = null;\n  var checkBlobDownloadSupported = function() {\n    if (blobDownloadSupported === null) {\n      var windowUrl = window.URL || window.webkitURL || window.mozURL || window.msURL;\n      blobDownloadSupported = windowUrl && Blob;\n    }\n    return blobDownloadSupported;\n  };\n  var embedBtn = null;\n  var drawHeader = function(yasr) {\n    var drawOutputSelector = function() {\n      var btnGroup = $('<div class=\"yasr_btnGroup\"></div>');\n      $.each(yasr.options.outputPlugins, function(i, pluginName) {\n        var plugin = yasr.plugins[pluginName];\n        if (!plugin) return; //plugin not loaded\n\n        if (plugin.hideFromSelection) return;\n        var name = plugin.name || pluginName;\n        var button = $(\"<button class='yasr_btn'></button>\")\n          .text(name)\n          .addClass(\"select_\" + pluginName)\n          .click(function() {\n            //update buttons\n            btnGroup.find(\"button.selected\").removeClass(\"selected\");\n            $(this).addClass(\"selected\");\n            //set and draw output\n            yasr.options.output = pluginName;\n\n            //store if needed\n            yasr.store();\n\n            //close warning if there is any\n            if ($toggableWarning) $toggableWarning.hide(400);\n\n            yasr.draw();\n          })\n          .appendTo(btnGroup);\n        if (yasr.options.output == pluginName) button.addClass(\"selected\");\n      });\n\n      if (btnGroup.children().length > 1) yasr.header.append(btnGroup);\n    };\n    var drawDownloadIcon = function() {\n      var stringToUrl = function(string, contentType) {\n        var url = null;\n        var windowUrl = window.URL || window.webkitURL || window.mozURL || window.msURL;\n        if (windowUrl && Blob) {\n          var blob = new Blob([string], {\n            type: contentType\n          });\n          url = windowUrl.createObjectURL(blob);\n        }\n        return url;\n      };\n      var button = $(\"<button class='yasr_btn yasr_downloadIcon btn_icon'></button>\")\n        .append(require(\"yasgui-utils\").svg.getElement(require(\"./imgs.js\").download))\n        .click(function() {\n          var currentPlugin = yasr.plugins[yasr.options.output];\n          if (currentPlugin && currentPlugin.getDownloadInfo) {\n            var downloadInfo = currentPlugin.getDownloadInfo();\n            var downloadUrl = stringToUrl(\n              downloadInfo.getContent(),\n              downloadInfo.contentType ? downloadInfo.contentType : \"text/plain\"\n            );\n            var downloadMockLink = $(\"<a></a>\", {\n              href: downloadUrl,\n              download: downloadInfo.filename\n            });\n            require(\"./utils.js\").fireClick(downloadMockLink);\n            //\t\t\t\t\t\tdownloadMockLink[0].click();\n          }\n        });\n      yasr.header.append(button);\n    };\n    var drawFullscreenButton = function() {\n      var button = $(\"<button class='yasr_btn btn_fullscreen btn_icon'></button>\")\n        .append(require(\"yasgui-utils\").svg.getElement(require(\"./imgs.js\").fullscreen))\n        .click(function() {\n          yasr.container.addClass(\"yasr_fullscreen\");\n        });\n      yasr.header.append(button);\n    };\n    var drawSmallscreenButton = function() {\n      var button = $(\"<button class='yasr_btn btn_smallscreen btn_icon'></button>\")\n        .append(require(\"yasgui-utils\").svg.getElement(require(\"./imgs.js\").smallscreen))\n        .click(function() {\n          yasr.container.removeClass(\"yasr_fullscreen\");\n        });\n      yasr.header.append(button);\n    };\n    var drawEmbedButton = function() {\n      embedBtn = $(\"<button>\", {\n        class: \"yasr_btn yasr_embedBtn\",\n        title: \"Get HTML snippet to embed results on a web page\"\n      })\n        .text(\"</>\")\n        .click(function(event) {\n          var currentPlugin = yasr.plugins[yasr.options.output];\n          if (currentPlugin && currentPlugin.getEmbedHtml) {\n            var embedLink = currentPlugin.getEmbedHtml();\n\n            event.stopPropagation();\n            var popup = $(\"<div class='yasr_embedPopup'></div>\").appendTo(yasr.header);\n            $(\"html\").click(function() {\n              if (popup) popup.remove();\n            });\n\n            popup.click(function(event) {\n              event.stopPropagation();\n              //dont close when clicking on popup\n            });\n            var prePopup = $(\"<textarea>\").val(embedLink);\n            prePopup.focus(function() {\n              var $this = $(this);\n              $this.select();\n\n              // Work around Chrome's little problem\n              $this.mouseup(function() {\n                // Prevent further mouseup intervention\n                $this.unbind(\"mouseup\");\n                return false;\n              });\n            });\n\n            popup.empty().append(prePopup);\n            var positions = embedBtn.position();\n            var top = positions.top + embedBtn.outerHeight() + \"px\";\n            var left = Math.max(positions.left + embedBtn.outerWidth() - popup.outerWidth(), 0) + \"px\";\n\n            popup.css(\"top\", top).css(\"left\", left);\n          }\n        });\n      yasr.header.append(embedBtn);\n    };\n    drawFullscreenButton();\n    drawSmallscreenButton();\n    if (yasr.options.drawOutputSelector) drawOutputSelector();\n    if (yasr.options.drawDownloadIcon && checkBlobDownloadSupported()) drawDownloadIcon(); //only draw when it's supported\n    drawEmbedButton();\n  };\n\n  var persistentId = null;\n  //store persistent options (not results though. store these separately, as they are too large)\n  yasr.store = function() {\n    if (!persistentId) persistentId = yasr.getPersistencyId(\"main\");\n    if (persistentId) {\n      utils.storage.set(persistentId, yasr.getPersistentSettings(), null, yasr.options.onQuotaExceeded);\n    }\n  };\n\n  yasr.load = function() {\n    if (!persistentId) persistentId = yasr.getPersistencyId(\"main\");\n    yasr.setPersistentSettings(utils.storage.get(persistentId));\n  };\n\n  yasr.setPersistentSettings = function(settings) {\n    if (settings) {\n      if (settings.output) {\n        yasr.options.output = settings.output;\n      }\n      for (var pluginName in settings.plugins) {\n        if (yasr.plugins[pluginName] && yasr.plugins[pluginName].setPersistentSettings) {\n          yasr.plugins[pluginName].setPersistentSettings(settings.plugins[pluginName]);\n        }\n      }\n    }\n  };\n\n  yasr.getPersistentSettings = function() {\n    var settings = {\n      output: yasr.options.output,\n      plugins: {}\n    };\n    for (var pluginName in yasr.plugins) {\n      if (yasr.plugins[pluginName].getPersistentSettings) {\n        settings.plugins[pluginName] = yasr.plugins[pluginName].getPersistentSettings();\n      }\n    }\n    return settings;\n  };\n\n  /**\n\t * postprocess\n\t */\n  yasr.load();\n  drawHeader(yasr);\n  if (!queryResults && yasr.options.persistency && yasr.options.persistency.results) {\n    var resultsId = yasr.getPersistencyId(yasr.options.persistency.results.key);\n    var fromStorage;\n    if (resultsId) {\n      fromStorage = utils.storage.get(resultsId);\n    }\n\n    if (!fromStorage && yasr.options.persistency.results.id) {\n      //deprecated! But keep for backwards compatability\n      //if results are stored under old ID. Fetch the results, and delete that key (results can be large, and clutter space)\n      //setting the results, will automatically store it under the new key, so we don't have to worry about that here\n      var deprId = typeof yasr.options.persistency.results.id == \"string\"\n        ? yasr.options.persistency.results.id\n        : yasr.options.persistency.results.id(yasr);\n      if (deprId) {\n        fromStorage = utils.storage.get(deprId);\n        if (fromStorage) utils.storage.remove(deprId);\n      }\n    }\n    if (fromStorage) {\n      if ($.isArray(fromStorage)) {\n        yasr.setResponse.apply(this, fromStorage);\n      } else {\n        yasr.setResponse(fromStorage);\n      }\n    }\n  }\n\n  if (queryResults) {\n    yasr.setResponse(queryResults);\n  }\n  yasr.updateHeader();\n\n  return yasr;\n};\n\nYASR.prototype = new EventEmitter();\nmodule.exports = function(parent, options, queryResults) {\n  return new YASR(parent, options, queryResults);\n};\n\nmodule.exports.plugins = {};\nmodule.exports.registerOutput = function(name, constructor) {\n  module.exports.plugins[name] = constructor;\n};\n\n/**\n * The default options of YASR. Either change the default options by setting YASR.defaults, or by\n * passing your own options as second argument to the YASR constructor\n *\n * @attribute YASR.defaults\n */\nmodule.exports.defaults = require(\"./defaults.js\");\nmodule.exports.version = {\n  YASR: require(\"../package.json\").version,\n  jquery: $.fn.jquery,\n  \"yasgui-utils\": require(\"yasgui-utils\").version\n};\nmodule.exports.$ = $;\n\n//put these in a try-catch. When using the unbundled version, and when some dependencies are missing, then YASR as a whole will still function\ntry {\n  module.exports.registerOutput(\"boolean\", require(\"./boolean.js\"));\n} catch (e) {\n  console.warn(e);\n}\ntry {\n  module.exports.registerOutput(\"rawResponse\", require(\"./rawResponse.js\"));\n} catch (e) {\n  console.warn(e);\n}\ntry {\n  module.exports.registerOutput(\"leaflet\", require(\"./leaflet.js\"));\n} catch (e) {\n  console.warn(e);\n}\ntry {\n  module.exports.registerOutput(\"table\", require(\"./table.js\"));\n} catch (e) {\n  console.warn(e);\n}\ntry {\n  module.exports.registerOutput(\"error\", require(\"./error.js\"));\n} catch (e) {\n  console.warn(e);\n}\ntry {\n  module.exports.registerOutput(\"pivot\", require(\"./pivot.js\"));\n} catch (e) {\n  console.warn(e);\n}\ntry {\n  module.exports.registerOutput(\"gchart\", require(\"./gchart.js\"));\n} catch (e) {\n  console.warn(e);\n}\n\n},{\"../package.json\":157,\"./boolean.js\":159,\"./defaults.js\":160,\"./error.js\":162,\"./gChartLoader.js\":164,\"./gchart.js\":165,\"./imgs.js\":166,\"./jquery/extendJquery.js\":167,\"./leaflet.js\":169,\"./parsers/wrapper.js\":176,\"./pivot.js\":178,\"./rawResponse.js\":179,\"./table.js\":180,\"./utils.js\":181,\"events\":17,\"jquery\":undefined,\"yasgui-utils\":154}],171:[function(require,module,exports){\n\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\nvar root = module.exports = function(queryResponse) {\n  return require(\"./dlv.js\")(queryResponse, \",\");\n};\n\n},{\"./dlv.js\":172,\"jquery\":undefined}],172:[function(require,module,exports){\n\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\nrequire(\"../../lib/jquery.csv-0.71.js\");\nvar root = (module.exports = function(queryResponse, separator, opts) {\n  opts = opts || {};\n\n  var json = {};\n  var arrays = $.csv.toArrays(queryResponse, {\n    separator: separator\n  });\n  var detectType = function(value) {\n    if (value.indexOf(\"http\") == 0) {\n      return \"uri\";\n    } else {\n      return null;\n    }\n  };\n\n  var getBoolean = function() {\n    if (\n      arrays.length == 2 &&\n      arrays[0].length == 1 &&\n      arrays[1].length == 1 &&\n      arrays[0][0] == \"boolean\" &&\n      (arrays[1][0] == \"1\" || arrays[1][0] == \"0\")\n    ) {\n      json.boolean = arrays[1][0] == \"1\" ? true : false;\n      return true;\n    }\n    return false;\n  };\n\n  var getVariables = function() {\n    if (arrays.length > 0 && arrays[0].length > 0) {\n      json.head = {\n        vars: arrays[0].map(function(v) {\n          if (opts.mapVariable) return opts.mapVariable(v);\n          return v;\n        })\n      };\n      return true;\n    }\n    return false;\n  };\n\n  var getBindings = function() {\n    if (arrays.length > 1) {\n      json.results = {\n        bindings: []\n      };\n      for (var rowIt = 1; rowIt < arrays.length; rowIt++) {\n        var binding = {};\n        for (var colIt = 0; colIt < arrays[rowIt].length; colIt++) {\n          var varName = json.head.vars[colIt];\n          if (varName) {\n            var value = opts.mapValue ? opts.mapValue(arrays[rowIt][colIt]) : arrays[rowIt][colIt];\n            var detectedType = detectType(value);\n            binding[varName] = {\n              value: value\n            };\n            if (detectedType) binding[varName].type = detectedType;\n          }\n        }\n\n        json.results.bindings.push(binding);\n      }\n      return true;\n    }\n    return false;\n  };\n  var isBoolean = getBoolean();\n  if (!isBoolean) {\n    var varsFetched = getVariables();\n    if (varsFetched) getBindings();\n  }\n\n  return json;\n});\n\n},{\"../../lib/jquery.csv-0.71.js\":2,\"jquery\":undefined}],173:[function(require,module,exports){\n\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\nvar map = require(\"lodash/map\");\nvar reduce = require(\"lodash/reduce\");\n\nvar getAsObject = function(entity) {\n  if (typeof entity == \"object\") {\n    if (\"bnode\" == entity.type) {\n      entity.value = entity.value.slice(2);\n    }\n    return entity;\n  }\n  if (entity.indexOf(\"_:\") == 0) {\n    return {\n      type: \"bnode\",\n      value: entity.slice(2)\n    };\n  }\n  return {\n    type: \"uri\",\n    value: entity\n  };\n};\nvar root = module.exports = function(responseJson) {\n  if (responseJson) {\n    var hasContext = false;\n    var mapped = map(responseJson, function(value, subject) {\n      return map(value, function(value1, predicate) {\n        return map(value1, function(object) {\n          if (object.graphs) {\n            hasContext = true;\n            return map(object.graphs, function(context) {\n              return [getAsObject(subject), getAsObject(predicate), getAsObject(object), getAsObject(context)];\n            });\n          } else {\n            return [getAsObject(subject), getAsObject(predicate), getAsObject(object)];\n          }\n        });\n      });\n    });\n    var reduced = reduce(\n      mapped,\n      function(memo, el) {\n        return memo.concat(el);\n      },\n      []\n    );\n    reduced = reduce(\n      reduced,\n      function(memo, el) {\n        return memo.concat(el);\n      },\n      []\n    );\n    var bindings;\n    if (!hasContext) {\n      bindings = reduced.map(function(triple) {\n        return { subject: triple[0], predicate: triple[1], object: triple[2] };\n      });\n    } else {\n      reduced = reduce(\n        reduced,\n        function(memo, el) {\n          return memo.concat(el);\n        },\n        []\n      );\n      bindings = reduced.map(function(triple) {\n        return { subject: triple[0], predicate: triple[1], object: triple[2], context: triple[3] };\n      });\n    }\n    var variables = hasContext ? [\"subject\", \"predicate\", \"object\", \"context\"] : [\"subject\", \"predicate\", \"object\"];\n    return {\n      head: {\n        vars: variables\n      },\n      results: {\n        bindings: bindings\n      }\n    };\n  }\n  return false;\n};\n\n},{\"jquery\":undefined,\"lodash/map\":128,\"lodash/reduce\":131}],174:[function(require,module,exports){\n\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\nvar root = module.exports = function(queryResponse) {\n  if (typeof queryResponse == \"string\") {\n    try {\n      return JSON.parse(queryResponse);\n    } catch (e) {\n      return false;\n    }\n  }\n  if (typeof queryResponse == \"object\" && queryResponse.constructor === ({}).constructor) {\n    return queryResponse;\n  }\n  return false;\n};\n\n},{\"jquery\":undefined}],175:[function(require,module,exports){\n\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\nvar root = (module.exports = function(queryResponse) {\n  return require(\"./dlv.js\")(queryResponse, \"\\t\", {\n    mapVariable: function(variable) {\n      if (variable[0] === \"?\") return variable.substring(1);\n      return variable;\n    },\n    mapValue: function(val) {\n      if (val[0] === \"<\" && val[val.length - 1] === \">\") return val.substring(1, val.length - 1);\n      return val;\n    }\n  });\n});\n\n},{\"./dlv.js\":172,\"jquery\":undefined}],176:[function(require,module,exports){\n\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\n\n/**\n * arg1 can be:\n * - a string (an exception, or e.g. a csv result string)\n * - an object (e.g. xml or json object)\n * - an object with exception key (contains solely a string to display)\n * - a jqXHR object (when this function is used as 'fail' callback for jquery)\n * arg2 can be:\n * - the textstatus of the response\n * arg3 can be:\n * - a jqXHR object (when this function is used as 'done/success' callback for jquery)\n * - an 'errorThrown' string (\n */\nvar root = (module.exports = function(dataOrJqXhr, textStatus, jqXhrOrErrorString) {\n  var parsers = {\n    xml: require(\"./xml.js\"),\n    json: require(\"./json.js\"),\n    tsv: require(\"./tsv.js\"),\n    csv: require(\"./csv.js\"),\n    graphJson: require(\"./graphJson.js\")\n  };\n  var contentType = null;\n  var origResponse = null;\n  var json = null;\n  var type = null; //json, xml, csv, or tsv\n  var exception = null;\n\n  var init = function() {\n    if (typeof dataOrJqXhr == \"object\") {\n      /**\n\t\t\t * Extract exception info (if there is any)\n\t\t\t */\n      if (dataOrJqXhr.exception) {\n        //this object just has this exception string, nothing more. (here for backwards compatability)\n        exception = dataOrJqXhr.exception;\n      } else if (dataOrJqXhr.status != undefined && (dataOrJqXhr.status >= 300 || dataOrJqXhr.status === 0)) {\n        //this is an exception, and jquery response\n        exception = {\n          status: dataOrJqXhr.status\n        };\n        if (typeof jqXhrOrErrorString == \"string\") exception.errorString = jqXhrOrErrorString;\n        if (dataOrJqXhr.responseText) exception.responseText = dataOrJqXhr.responseText;\n        if (dataOrJqXhr.statusText) exception.statusText = dataOrJqXhr.statusText;\n      }\n\n      /**\n\t\t\t * Extract content type info (if there is any)\n\t\t\t */\n      if (dataOrJqXhr.contentType) {\n        //this is not a jqXhr object, but a manually generated object (mostly for backwards compatability)\n        contentType = dataOrJqXhr.contentType.toLowerCase();\n      } else if (dataOrJqXhr.getResponseHeader && dataOrJqXhr.getResponseHeader(\"content-type\")) {\n        var ct = dataOrJqXhr.getResponseHeader(\"content-type\").trim().toLowerCase();\n        if (ct.length > 0) contentType = ct;\n      }\n\n      /**\n\t\t\t * extract original response\n\t\t\t */\n      if (dataOrJqXhr.response) {\n        //this is not a jqXhr object, but a manually generated object (mostly for backwards compatability)\n        origResponse = dataOrJqXhr.response;\n      } else if (!textStatus && !jqXhrOrErrorString) {\n        //not called from jquery, as these other arguments are undefined.\n        //so, we can only assume the current object is a proper response (e.g. xml or json) object\n        origResponse = dataOrJqXhr;\n      }\n    }\n    if (!exception && !origResponse) {\n      //if this is called via a jquery complete callback, we should fetch the result for the jqXHR object\n      if (dataOrJqXhr.responseText) {\n        origResponse = dataOrJqXhr.responseText;\n      } else {\n        //if all else fails, assume first arg to be data object\n        //(which should be the case for most situations)\n        origResponse = dataOrJqXhr;\n      }\n    }\n  };\n\n  var getAsJson = function() {\n    if (json) return json;\n    if (json === false || exception) return false; //already tried parsing this, and failed. do not try again...\n    var getParserFromContentType = function() {\n      if (contentType) {\n        if (contentType.indexOf(\"json\") > -1) {\n          try {\n            if (contentType.indexOf(\"sparql-results+json\") > -1) {\n              json = parsers.json(origResponse);\n            } else if (contentType.indexOf(\"application/rdf+json\") > -1) {\n              json = parsers.graphJson(parsers.json(origResponse));\n            }\n          } catch (e) {\n            exception = e;\n          }\n          type = \"json\";\n        } else if (contentType.indexOf(\"xml\") > -1) {\n          try {\n            json = parsers.xml(origResponse);\n          } catch (e) {\n            exception = e;\n          }\n          type = \"xml\";\n        } else if (contentType.indexOf(\"csv\") > -1) {\n          try {\n            json = parsers.csv(origResponse);\n          } catch (e) {\n            exception = e;\n          }\n          type = \"csv\";\n        } else if (contentType.indexOf(\"tab-separated\") > -1) {\n          try {\n            json = parsers.tsv(origResponse);\n          } catch (e) {\n            exception = e;\n          }\n          type = \"tsv\";\n        }\n      }\n    };\n\n    var doLuckyGuess = function() {\n      json = parsers.json(origResponse);\n      if (json) {\n        type = \"json\";\n      } else {\n        try {\n          json = parsers.xml(origResponse);\n          if (json) type = \"xml\";\n        } catch (err) {}\n      }\n    };\n\n    getParserFromContentType();\n    if (!json) {\n      doLuckyGuess();\n    }\n    if (!json) json = false; //explicitly set to false, so we don't try to parse this thing again..\n    return json;\n  };\n\n  var getVariables = function() {\n    var json = getAsJson();\n    if (json && \"head\" in json) {\n      return json.head.vars;\n    } else {\n      return null;\n    }\n  };\n\n  var getBindings = function() {\n    var json = getAsJson();\n    if (json && \"results\" in json) {\n      return json.results.bindings;\n    } else {\n      return null;\n    }\n  };\n\n  var getBoolean = function() {\n    var json = getAsJson();\n    if (json && \"boolean\" in json) {\n      return json.boolean;\n    } else {\n      return null;\n    }\n  };\n  var getOriginalResponse = function() {\n    return origResponse;\n  };\n  var getOriginalResponseAsString = function() {\n    var responseString = \"\";\n    if (typeof origResponse == \"string\") {\n      responseString = origResponse;\n    } else if (type == \"json\") {\n      responseString = JSON.stringify(origResponse, undefined, 2); //prettifies as well\n    } else if (type == \"xml\") {\n      responseString = new XMLSerializer().serializeToString(origResponse);\n    }\n    return responseString;\n  };\n  var getException = function() {\n    return exception;\n  };\n  var getType = function() {\n    if (type == null) getAsJson(); //detects type as well\n    return type;\n  };\n\n  //process the input parameters in such a way that we can store it in local storage (i.e., no function)\n  //and, make sure we can easily pass it on back to this wrapper function when loading it again from storage\n  var getAsStoreObject = function() {\n    var storeArray = [];\n    var arg1 = {};\n    if (dataOrJqXhr.status) {\n      //jqXhr object\n      arg1.status = dataOrJqXhr.status;\n      arg1.responseText = dataOrJqXhr.responseText;\n      arg1.statusText = dataOrJqXhr.statusText;\n      arg1.contentType = contentType; //this is a function in a jqXhr object (problem for storing). but this wrapper will read it as string as well\n    } else {\n      //the other instances of this param (whether it is a json, xml, or exception object), we can normally store\n      arg1 = dataOrJqXhr;\n    }\n\n    var arg2 = textStatus;\n    var arg3 = undefined;\n    if (typeof jqXhrOrErrorString == \"string\") arg3 = jqXhrOrErrorString;\n\n    return [arg1, arg2, arg3];\n  };\n\n  init();\n  json = getAsJson();\n\n  return {\n    getAsStoreObject: getAsStoreObject,\n    getAsJson: getAsJson,\n    getOriginalResponse: getOriginalResponse,\n    getOriginalResponseAsString: getOriginalResponseAsString,\n    getOriginalContentType: function() {\n      return contentType;\n    },\n    getVariables: getVariables,\n    getBindings: getBindings,\n    getBoolean: getBoolean,\n    getType: getType,\n    getException: getException\n  };\n});\n\n},{\"./csv.js\":171,\"./graphJson.js\":173,\"./json.js\":174,\"./tsv.js\":175,\"./xml.js\":177,\"jquery\":undefined}],177:[function(require,module,exports){\n\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\nvar root = module.exports = function(xml) {\n  /**\n\t * head\n\t */\n  var parseHead = function(node) {\n    json.head = {};\n    for (var headNodeIt = 0; headNodeIt < node.childNodes.length; headNodeIt++) {\n      var headNode = node.childNodes[headNodeIt];\n      if (headNode.nodeName == \"variable\") {\n        if (!json.head.vars) json.head.vars = [];\n        var name = headNode.getAttribute(\"name\");\n        if (name) json.head.vars.push(name);\n      }\n    }\n  };\n\n  var parseResults = function(node) {\n    json.results = {};\n    json.results.bindings = [];\n    for (var resultIt = 0; resultIt < node.childNodes.length; resultIt++) {\n      var resultNode = node.childNodes[resultIt];\n      var jsonResult = null;\n\n      for (var bindingIt = 0; bindingIt < resultNode.childNodes.length; bindingIt++) {\n        var bindingNode = resultNode.childNodes[bindingIt];\n        if (bindingNode.nodeName == \"binding\") {\n          var varName = bindingNode.getAttribute(\"name\");\n          if (varName) {\n            jsonResult = jsonResult || {};\n            jsonResult[varName] = {};\n            for (var bindingInfIt = 0; bindingInfIt < bindingNode.childNodes.length; bindingInfIt++) {\n              var bindingInf = bindingNode.childNodes[bindingInfIt];\n              var type = bindingInf.nodeName;\n              if (type == \"#text\") continue;\n              jsonResult[varName].type = type;\n              jsonResult[varName].value = bindingInf.innerHTML;\n              var dataType = bindingInf.getAttribute(\"datatype\");\n              if (dataType) jsonResult[varName].datatype = dataType;\n            }\n          }\n        }\n      }\n      if (jsonResult) json.results.bindings.push(jsonResult);\n    }\n  };\n\n  var parseBoolean = function(node) {\n    if (node.innerHTML == \"true\") {\n      json.boolean = true;\n    } else {\n      json.boolean = false;\n    }\n  };\n  var mainXml = null;\n  if (typeof xml == \"string\") {\n    mainXml = $.parseXML(xml);\n  } else if ($.isXMLDoc(xml)) {\n    mainXml = xml;\n  }\n  var xml = null;\n  if (mainXml.childNodes.length > 0) {\n    //enter the main 'sparql' node\n    xml = mainXml.childNodes[0];\n  } else {\n    return null;\n  }\n  var json = {};\n\n  for (var i = 0; i < xml.childNodes.length; i++) {\n    var node = xml.childNodes[i];\n    if (node.nodeName == \"head\") parseHead(node);\n    if (node.nodeName == \"results\") parseResults(node);\n    if (node.nodeName == \"boolean\") parseBoolean(node);\n  }\n\n  return json;\n};\n\n},{\"jquery\":undefined}],178:[function(require,module,exports){\n\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})(), utils = require(\"./utils.js\"), yUtils = require(\"yasgui-utils\"), imgs = require(\"./imgs.js\");\n(function(){try{return require('jquery-ui/sortable')}catch(e){return window.jQuery}})();\n(function(){try{return require('pivottable')}catch(e){return window.jQuery}})();\n\nif (!$.fn.pivotUI) throw new Error(\"Pivot lib not loaded\");\nvar root = module.exports = function(yasr) {\n  var plugin = {};\n  var options = $.extend(true, {}, root.defaults);\n\n  if (options.useD3Chart) {\n    try {\n      var d3 = (function(){try{return require('d3')}catch(e){return window.d3}})();\n      if (d3) require(\"pivottable/dist/d3_renderers.js\");\n    } catch (e) {\n      //do nothing. just make sure we don't use this renderer\n    }\n    if ($.pivotUtilities.d3_renderers) $.extend(true, $.pivotUtilities.renderers, $.pivotUtilities.d3_renderers);\n  }\n\n  var $pivotWrapper;\n  var mergeLabelPostfix = null;\n  var getShownVariables = function() {\n    var variables = yasr.results.getVariables();\n    if (!options.mergeLabelsWithUris) return variables;\n    var shownVariables = [];\n\n    mergeLabelPostfix = typeof options.mergeLabelsWithUris == \"string\" ? options.mergeLabelsWithUris : \"Label\";\n    variables.forEach(function(variable) {\n      if (variable.indexOf(mergeLabelPostfix, variable.length - mergeLabelPostfix.length) !== -1) {\n        //this one ends with a postfix\n        if (variables.indexOf(variable.substring(0, variable.length - mergeLabelPostfix.length)) >= 0) {\n          //we have a shorter version of this variable. So, do not include the ..<postfix> variable in the table\n          return;\n        }\n      }\n      shownVariables.push(variable);\n    });\n    return shownVariables;\n  };\n\n  var formatForPivot = function(callback) {\n    var vars = getShownVariables();\n    var usedPrefixes = null;\n    if (yasr.options.getUsedPrefixes) {\n      usedPrefixes = typeof yasr.options.getUsedPrefixes == \"function\"\n        ? yasr.options.getUsedPrefixes(yasr)\n        : yasr.options.getUsedPrefixes;\n    }\n    yasr.results.getBindings().forEach(function(binding) {\n      var rowObj = {};\n      vars.forEach(function(variable) {\n        if (variable in binding) {\n          var val = binding[variable].value;\n          if (mergeLabelPostfix && binding[variable + mergeLabelPostfix]) {\n            val = binding[variable + mergeLabelPostfix].value;\n          } else if (binding[variable].type == \"uri\") {\n            val = utils.uriToPrefixed(usedPrefixes, val);\n          }\n          rowObj[variable] = val;\n        } else {\n          rowObj[variable] = null;\n        }\n      });\n      callback(rowObj);\n    });\n  };\n\n  var validatePivotTableOptions = function(pivotOptions) {\n    //validate settings. we may have different variables, or renderers might be gone\n    if (pivotOptions) {\n      if (yasr.results) {\n        var vars = yasr.results.getVariables();\n        var keepColsAndRows = true;\n        pivotOptions.cols.forEach(function(variable) {\n          if (vars.indexOf(variable) < 0) keepColsAndRows = false;\n        });\n        if (keepColsAndRows) {\n          pivotOptionse.rows.forEach(function(variable) {\n            if (vars.indexOf(variable) < 0) keepColsAndRows = false;\n          });\n        }\n        if (!keepColsAndRows) {\n          pivotOptions.cols = [];\n          pivotOptions.rows = [];\n        }\n        if (!$.pivotUtilities.renderers[settings.rendererName]) delete pivotOptions.rendererName;\n      }\n    } else {\n      pivotOptions = {};\n    }\n    return pivotOptions;\n  };\n  var draw = function() {\n    var doDraw = function() {\n      var onRefresh = function(pivotObj) {\n        options.pivotTable.cols = pivotObj.cols;\n        options.pivotTable.rows = pivotObj.rows;\n        options.pivotTable.rendererName = pivotObj.rendererName;\n        options.pivotTable.aggregatorName = pivotObj.aggregatorName;\n        options.pivotTable.vals = pivotObj.vals;\n        yasr.store();\n\n        if (pivotObj.rendererName.toLowerCase().indexOf(\" chart\") >= 0) {\n          openGchartBtn.show();\n        } else {\n          openGchartBtn.hide();\n        }\n        yasr.updateHeader();\n      };\n\n      var openGchartBtn = $(\"<button>\", {\n        class: \"openPivotGchart yasr_btn\"\n      })\n        .text(\"Chart Config\")\n        .click(function() {\n          $pivotWrapper.find('div[dir=\"ltr\"]').dblclick();\n        })\n        .appendTo(yasr.resultsContainer);\n      $pivotWrapper = $(\"<div>\", {\n        class: \"pivotTable\"\n      }).appendTo($(yasr.resultsContainer));\n\n      options.pivotTable.onRefresh = (function() {\n        var originalRefresh = options.pivotTable.onRefresh;\n        return function(pivotObj) {\n          onRefresh(pivotObj);\n          if (originalRefresh) originalRefresh(pivotObj);\n        };\n      })();\n\n      window.pivot = $pivotWrapper.pivotUI(formatForPivot, options.pivotTable);\n\n      /**\n\t\t\t * post process\n\t\t\t */\n      //use 'move' handler for variables. This removes the 'filter' button though. Might want to re-enable this in the future\n      var icon = $(yUtils.svg.getElement(imgs.move));\n      $pivotWrapper.find(\".pvtTriangle\").replaceWith(icon);\n\n      //add headers to selector rows\n      $(\".pvtCols\").prepend(\n        $(\"<div>\", {\n          class: \"containerHeader\"\n        }).text(\"Columns\")\n      );\n      $(\".pvtRows\").prepend(\n        $(\"<div>\", {\n          class: \"containerHeader\"\n        }).text(\"Rows\")\n      );\n      $(\".pvtUnused\").prepend(\n        $(\"<div>\", {\n          class: \"containerHeader\"\n        }).text(\"Available Variables\")\n      );\n      $(\".pvtVals\").prepend(\n        $(\"<div>\", {\n          class: \"containerHeader\"\n        }).text(\"Cells\")\n      );\n\n      //hmmm, directly after the callback finishes (i.e., directly after this line), the svg is draw.\n      //just use a short timeout to update the header\n      setTimeout(yasr.updateHeader, 400);\n    };\n\n    if (yasr.options.useGoogleCharts && options.useGoogleCharts && !$.pivotUtilities.gchart_renderers) {\n      require(\"./gChartLoader.js\")\n        .on(\"done\", function() {\n          try {\n            require(\"pivottable/dist/gchart_renderers.js\");\n            $.extend(true, $.pivotUtilities.renderers, $.pivotUtilities.gchart_renderers);\n          } catch (e) {\n            //hmm, still something went wrong. forget about it;\n            options.useGoogleCharts = false;\n          }\n          doDraw();\n        })\n        .on(\"error\", function() {\n          console.log(\"could not load gchart\");\n          options.useGoogleCharts = false;\n          doDraw();\n        })\n        .googleLoad();\n    } else {\n      //everything is already loaded. just draw\n      doDraw();\n    }\n  };\n  var canHandleResults = function() {\n    return yasr.results &&\n      yasr.results.getVariables &&\n      yasr.results.getVariables() &&\n      yasr.results.getVariables().length > 0;\n  };\n\n  var getDownloadInfo = function() {\n    if (!yasr.results) return null;\n    var svgEl = yasr.resultsContainer.find(\".pvtRendererArea svg\");\n    if (svgEl.length > 0) {\n      return {\n        getContent: function() {\n          if (svgEl[0].outerHTML) {\n            return svgEl[0].outerHTML;\n          } else {\n            //outerHTML not supported. use workaround\n            return $(\"<div>\").append(svgEl.clone()).html();\n          }\n        },\n\n        filename: \"queryResults.svg\",\n        contentType: \"image/svg+xml\",\n        buttonTitle: \"Download SVG Image\"\n      };\n    }\n\n    //ok, not a svg. is it a table?\n    var $table = yasr.resultsContainer.find(\".pvtRendererArea table\");\n    if ($table.length > 0) {\n      return {\n        getContent: function() {\n          return $table.tableToCsv();\n        },\n        filename: \"queryResults.csv\",\n        contentType: \"text/csv\",\n        buttonTitle: \"Download as CSV\"\n      };\n    }\n  };\n  var getEmbedHtml = function() {\n    if (!yasr.results) return null;\n\n    var svgEl = yasr.resultsContainer\n      .find(\".pvtRendererArea svg\")\n      .clone() //create clone, as we'd like to remove height/width attributes\n      .removeAttr(\"height\")\n      .removeAttr(\"width\")\n      .css(\"height\", \"\")\n      .css(\"width\", \"\");\n    if (svgEl.length == 0) return null;\n\n    var htmlString = svgEl[0].outerHTML;\n    if (!htmlString) {\n      //outerHTML not supported. use workaround\n      htmlString = $(\"<div>\").append(svgEl.clone()).html();\n    }\n    //wrap in div, so users can more easily tune width/height\n    //don't use jquery, so we can easily influence indentation\n    return '<div style=\"width: 800px; height: 600px;\">\\n' + htmlString + \"\\n</div>\";\n  };\n  return {\n    getPersistentSettings: function() {\n      return {\n        pivotTable: options.pivotTable\n      };\n    },\n    setPersistentSettings: function(newSettings) {\n      if (newSettings.pivotTable) {\n        options.pivotTable = validatePivotTableOptions(newSettings.pivotTable);\n      }\n    },\n    getDownloadInfo: getDownloadInfo,\n    getEmbedHtml: getEmbedHtml,\n    options: options,\n    draw: draw,\n    name: \"Pivot Table\",\n    canHandleResults: canHandleResults,\n    getPriority: 4\n  };\n};\n\nroot.defaults = {\n  mergeLabelsWithUris: false,\n  useGoogleCharts: true,\n  useD3Chart: true,\n  persistencyId: \"pivot\",\n  pivotTable: {}\n};\n\nroot.version = {\n  \"YASR-rawResponse\": require(\"../package.json\").version,\n  jquery: $.fn.jquery\n};\n\n},{\"../package.json\":157,\"./gChartLoader.js\":164,\"./imgs.js\":166,\"./utils.js\":181,\"d3\":undefined,\"jquery\":undefined,\"jquery-ui/sortable\":undefined,\"pivottable\":undefined,\"pivottable/dist/d3_renderers.js\":133,\"pivottable/dist/gchart_renderers.js\":134,\"yasgui-utils\":154}],179:[function(require,module,exports){\n\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})(), CodeMirror = (function(){try{return require('codemirror')}catch(e){return window.CodeMirror}})();\n\nrequire(\"codemirror/addon/fold/foldcode.js\");\nrequire(\"codemirror/addon/fold/foldgutter.js\");\nrequire(\"codemirror/addon/fold/xml-fold.js\");\nrequire(\"codemirror/addon/fold/brace-fold.js\");\n\nrequire(\"codemirror/addon/edit/matchbrackets.js\");\nrequire(\"codemirror/mode/xml/xml.js\");\nrequire(\"codemirror/mode/javascript/javascript.js\");\n\nvar root = module.exports = function(yasr) {\n  var plugin = {};\n  var options = $.extend(true, {}, root.defaults);\n  var cm = null;\n  var draw = function() {\n    var cmOptions = options.CodeMirror;\n    cmOptions.value = yasr.results.getOriginalResponseAsString();\n\n    var mode = yasr.results.getType();\n    if (mode) {\n      if (mode == \"json\") {\n        mode = {\n          name: \"javascript\",\n          json: true\n        };\n      }\n      cmOptions.mode = mode;\n    }\n\n    cm = CodeMirror(yasr.resultsContainer.get()[0], cmOptions);\n\n    //CM has some issues with folding and unfolding (blank parts in the codemirror area, which are only filled after clicking it)\n    //so, refresh cm after folding/unfolding\n    cm.on(\"fold\", function() {\n      cm.refresh();\n    });\n    cm.on(\"unfold\", function() {\n      cm.refresh();\n    });\n  };\n  var canHandleResults = function() {\n    if (!yasr.results) return false;\n    if (!yasr.results.getOriginalResponseAsString) return false;\n    var response = yasr.results.getOriginalResponseAsString();\n    if ((!response || response.length == 0) && yasr.results.getException()) return false; //in this case, show exception instead, as we have nothing to show anyway\n    return true;\n  };\n\n  var getDownloadInfo = function() {\n    if (!yasr.results) return null;\n    var contentType = yasr.results.getOriginalContentType();\n    var type = yasr.results.getType();\n    return {\n      getContent: function() {\n        return yasr.results.getOriginalResponse();\n      },\n      filename: \"queryResults\" + (type ? \".\" + type : \"\"),\n      contentType: contentType ? contentType : \"text/plain\",\n      buttonTitle: \"Download raw response\"\n    };\n  };\n\n  return {\n    draw: draw,\n    name: \"Raw Response\",\n    canHandleResults: canHandleResults,\n    getPriority: 2,\n    getDownloadInfo: getDownloadInfo\n  };\n};\n\nroot.defaults = {\n  CodeMirror: {\n    readOnly: true,\n    lineNumbers: true,\n    lineWrapping: true,\n    foldGutter: true,\n    gutters: [\"CodeMirror-linenumbers\", \"CodeMirror-foldgutter\"]\n  }\n};\n\nroot.version = {\n  \"YASR-rawResponse\": require(\"../package.json\").version,\n  jquery: $.fn.jquery,\n  CodeMirror: CodeMirror.version\n};\n\n},{\"../package.json\":157,\"codemirror\":undefined,\"codemirror/addon/edit/matchbrackets.js\":3,\"codemirror/addon/fold/brace-fold.js\":4,\"codemirror/addon/fold/foldcode.js\":5,\"codemirror/addon/fold/foldgutter.js\":6,\"codemirror/addon/fold/xml-fold.js\":7,\"codemirror/mode/javascript/javascript.js\":8,\"codemirror/mode/xml/xml.js\":9,\"jquery\":undefined}],180:[function(require,module,exports){\n\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})(), yutils = require(\"yasgui-utils\"), utils = require(\"./utils.js\"), imgs = require(\"./imgs.js\");\nrequire(\"datatables.net\")();\nrequire(\"../lib/colResizable-1.4.js\");\n\n/**\n * Constructor of plugin which displays results as a table\n *\n * @param yasr {object}\n * @param parent {DOM element}\n * @param options {object}\n * @class YASR.plugins.table\n * @return yasr-table (doc)\n *\n */\nvar root = (module.exports = function(yasr) {\n  var table = null;\n  var plugin = {\n    name: \"Table\",\n    getPriority: 10\n  };\n  var options = (plugin.options = $.extend(true, {}, root.defaults));\n  var tableLengthPersistencyId = options.persistency ? yasr.getPersistencyId(options.persistency.tableLength) : null;\n\n  var getRows = function() {\n    var rows = [];\n    var bindings = yasr.results.getBindings();\n    var vars = yasr.results.getVariables();\n    var usedPrefixes = null;\n    if (yasr.options.getUsedPrefixes) {\n      usedPrefixes = typeof yasr.options.getUsedPrefixes == \"function\"\n        ? yasr.options.getUsedPrefixes(yasr)\n        : yasr.options.getUsedPrefixes;\n    }\n    for (var rowId = 0; rowId < bindings.length; rowId++) {\n      var row = [];\n      row.push(\"\"); //row numbers\n      var binding = bindings[rowId];\n      for (var colId = 0; colId < vars.length; colId++) {\n        var sparqlVar = vars[colId];\n        if (sparqlVar in binding) {\n          if (options.getCellContent) {\n            row.push(\n              options.getCellContent(yasr, plugin, binding, sparqlVar, {\n                rowId: rowId,\n                colId: colId,\n                usedPrefixes: usedPrefixes\n              })\n            );\n          } else {\n            row.push(\"\");\n          }\n        } else {\n          row.push(\"\");\n        }\n      }\n      rows.push(row);\n    }\n    return rows;\n  };\n\n  var eventId = yasr.getPersistencyId(\"eventId\") || \"yasr_\" + $(yasr.container).closest(\"[id]\").attr(\"id\");\n  var addEvents = function() {\n    table.on(\"order.dt\", function() {\n      drawSvgIcons();\n    });\n    if (tableLengthPersistencyId) {\n      table.on(\"length.dt\", function(e, settings, len) {\n        yutils.storage.set(tableLengthPersistencyId, len, \"month\", yasr.options.onQuotaExceeded);\n      });\n    }\n    $.extend(true, options.callbacks, options.handlers);\n    table\n      .delegate(\"td\", \"click\", function(event) {\n        if (options.callbacks && options.callbacks.onCellClick) {\n          var result = options.callbacks.onCellClick(this, event);\n          if (result === false) return false;\n        }\n      })\n      .delegate(\"td\", \"mouseenter\", function(event) {\n        if (options.callbacks && options.callbacks.onCellMouseEnter) {\n          options.callbacks.onCellMouseEnter(this, event);\n        }\n        var tdEl = $(this);\n        if (\n          options.fetchTitlesFromPreflabel &&\n          tdEl.attr(\"title\") === undefined &&\n          tdEl.text().trim().indexOf(\"http\") == 0\n        ) {\n          addPrefLabel(tdEl);\n        }\n      })\n      .delegate(\"td\", \"mouseleave\", function(event) {\n        if (options.callbacks && options.callbacks.onCellMouseLeave) {\n          options.callbacks.onCellMouseLeave(this, event);\n        }\n      });\n  };\n\n  plugin.draw = function() {\n    table = $('<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"resultsTable\"></table>');\n    $(yasr.resultsContainer).html(table);\n\n    var dataTableConfig = options.datatable;\n    dataTableConfig.data = getRows();\n    dataTableConfig.columns = options.getColumns(yasr, plugin);\n\n    //fetch stored datatables length value\n    var pLength = yutils.storage.get(tableLengthPersistencyId);\n    if (pLength) dataTableConfig.pageLength = pLength;\n\n    table.DataTable($.extend(true, {}, dataTableConfig)); //make copy. datatables adds properties for backwards compatability reasons, and don't want this cluttering our own\n\n    drawSvgIcons();\n\n    addEvents();\n\n    //finally, make the columns dragable:\n    table.colResizable();\n  };\n\n  var drawSvgIcons = function() {\n    var sortings = {\n      sorting: \"unsorted\",\n      sorting_asc: \"sortAsc\",\n      sorting_desc: \"sortDesc\"\n    };\n    table.find(\".sortIcons\").remove();\n    for (var sorting in sortings) {\n      var svgDiv = $(\"<div class='sortIcons'></div>\");\n      yutils.svg.draw(svgDiv, imgs[sortings[sorting]]);\n      table.find(\"th.\" + sorting).append(svgDiv);\n    }\n  };\n  /**\n\t * Check whether this plugin can handler the current results\n\t *\n\t * @property canHandleResults\n\t * @type function\n\t * @default If resultset contains variables in the resultset, return true\n\t */\n  plugin.canHandleResults = function() {\n    return (\n      yasr.results && yasr.results.getVariables && yasr.results.getVariables() && yasr.results.getVariables().length > 0\n    );\n  };\n\n  plugin.getDownloadInfo = function() {\n    if (!yasr.results) return null;\n    return {\n      getContent: function() {\n        return require(\"./bindingsToCsv.js\")(yasr.results.getAsJson());\n      },\n      filename: \"queryResults.csv\",\n      contentType: \"text/csv\",\n      buttonTitle: \"Download as CSV\"\n    };\n  };\n\n  return plugin;\n});\n\nvar formatLiteral = function(yasr, plugin, literalBinding) {\n  var stringRepresentation = utils.escapeHtmlEntities(literalBinding.value);\n  if (literalBinding[\"xml:lang\"]) {\n    stringRepresentation = '\"' + stringRepresentation + '\"<sup>@' + literalBinding[\"xml:lang\"] + \"</sup>\";\n  } else if (literalBinding.datatype) {\n    var xmlSchemaNs = \"http://www.w3.org/2001/XMLSchema#\";\n    var dataType = literalBinding.datatype;\n    if (dataType.indexOf(xmlSchemaNs) === 0) {\n      dataType = \"xsd:\" + dataType.substring(xmlSchemaNs.length);\n    } else {\n      dataType = \"&lt;\" + dataType + \"&gt;\";\n    }\n\n    stringRepresentation = '\"' + stringRepresentation + '\"<sup>^^' + dataType + \"</sup>\";\n  }\n  return stringRepresentation;\n};\nvar getCellContent = function(yasr, plugin, bindings, sparqlVar, context) {\n  var binding = bindings[sparqlVar];\n  var value = null;\n  if (binding.type == \"uri\") {\n    var title = null;\n    var href = binding.value;\n    var visibleString = href;\n    if (context.usedPrefixes) {\n      for (var prefix in context.usedPrefixes) {\n        if (visibleString.indexOf(context.usedPrefixes[prefix]) == 0) {\n          visibleString = prefix + \":\" + href.substring(context.usedPrefixes[prefix].length);\n          break;\n        }\n      }\n    }\n    if (plugin.options.mergeLabelsWithUris) {\n      var postFix = typeof plugin.options.mergeLabelsWithUris == \"string\"\n        ? plugin.options.mergeLabelsWithUris\n        : \"Label\";\n      if (bindings[sparqlVar + postFix]) {\n        visibleString = formatLiteral(yasr, plugin, bindings[sparqlVar + postFix]);\n        title = href;\n      }\n    }\n    value =\n      \"<a \" +\n      (title ? \"title='\" + href + \"' \" : \"\") +\n      \"class='uri' target='\" +\n      yasr.options.uriTarget +\n      \"' href='\" +\n      href +\n      \"'>\" +\n      visibleString +\n      \"</a>\";\n  } else {\n    value = \"<span class='nonUri'>\" + formatLiteral(yasr, plugin, binding) + \"</span>\";\n  }\n  return \"<div>\" + value + \"</div>\";\n};\n\nvar addPrefLabel = function(td) {\n  var addEmptyTitle = function() {\n    td.attr(\"title\", \"\"); //this avoids trying to fetch the label again on next hover\n  };\n  $.get(\"//preflabel.org/api/v1/label/\" + encodeURIComponent(td.text()) + \"?silent=true\")\n    .success(function(data) {\n      if (typeof data == \"object\" && data.label) {\n        td.attr(\"title\", data.label);\n      } else if (typeof data == \"string\" && data.length > 0) {\n        td.attr(\"title\", data);\n      } else {\n        addEmptyTitle();\n      }\n    })\n    .fail(addEmptyTitle);\n};\n\nvar openCellUriInNewWindow = function(cell) {\n  if (cell.className.indexOf(\"uri\") >= 0) {\n    window.open(this.innerHTML);\n  }\n};\n\n/**\n * Defaults for table plugin\n *\n * @type object\n * @attribute YASR.plugins.table.defaults\n */\nroot.defaults = {\n  /**\n\t * Draw the cell content, from a given binding\n\t *\n\t * @property drawCellContent\n\t * @param binding {object}\n\t * @type function\n\t * @return string\n\t * @default YASR.plugins.table.getFormattedValueFromBinding\n\t */\n  getCellContent: getCellContent,\n\n  persistency: {\n    tableLength: \"tableLength\"\n  },\n\n  getColumns: function(yasr, plugin) {\n    var includeVariable = function(variableToCheck) {\n      if (!plugin.options.mergeLabelsWithUris) return true;\n      var postFix = typeof plugin.options.mergeLabelsWithUris == \"string\"\n        ? plugin.options.mergeLabelsWithUris\n        : \"Label\";\n      if (variableToCheck.indexOf(postFix, variableToCheck.length - postFix.length) !== -1) {\n        //this one ends with a postfix\n        if (\n          yasr.results.getVariables().indexOf(variableToCheck.substring(0, variableToCheck.length - postFix.length)) >=\n          0\n        ) {\n          //we have a shorter version of this variable. So, do not include the ..<postfix> variable in the table\n          return false;\n        }\n      }\n      return true;\n    };\n\n    var cols = [];\n    cols.push({\n      title: \"\"\n    }); //row numbers column\n    yasr.results.getVariables().forEach(function(variable) {\n      cols.push({\n        title: \"<span>\" + variable + \"</span>\",\n        visible: includeVariable(variable)\n      });\n    });\n    return cols;\n  },\n  /**\n\t * Try to fetch the label representation for each URI, using the preflabel.org services. (fetching occurs when hovering over the cell)\n\t *\n\t * @property fetchTitlesFromPreflabel\n\t * @type boolean\n\t * @default false, if YASR is served via https\n\t */\n  //important to keep supporting serving yasr via file:// protocol\n  fetchTitlesFromPreflabel: window.location.protocol === \"https:\" ? false : true,\n\n  mergeLabelsWithUris: false,\n  /**\n\t * Set a number of handlers for the table\n\t *\n\t * @property handlers\n\t * @type object\n\t */\n  callbacks: {\n    /**\n\t\t * Mouse-enter-cell event\n\t\t *\n\t\t * @property handlers.onCellMouseEnter\n\t\t * @type function\n\t\t * @param td-element\n\t\t * @default null\n\t\t */\n    onCellMouseEnter: null,\n    /**\n\t\t * Mouse-leave-cell event\n\t\t *\n\t\t * @property handlers.onCellMouseLeave\n\t\t * @type function\n\t\t * @param td-element\n\t\t * @default null\n\t\t */\n    onCellMouseLeave: null,\n    /**\n\t\t * Cell clicked event\n\t\t *\n\t\t * @property handlers.onCellClick\n\t\t * @type function\n\t\t * @param td-element\n\t\t * @default null\n\t\t */\n    onCellClick: null\n  },\n  /**\n\t * This plugin uses the datatables jquery plugin (See datatables.net). For any datatables specific defaults, change this object.\n\t * See the datatables reference for more information\n\t *\n\t * @property datatable\n\t * @type object\n\t */\n  datatable: {\n    autoWidth: true,\n    dom: '<\"dtTopHeader\"ilf>rtip',\n    order: [], //disable initial sorting\n    pageLength: 50, //default page length\n    lengthMenu: [[10, 50, 100, 1000, -1], [10, 50, 100, 1000, \"All\"]], //possible page lengths\n    lengthChange: true, //allow changing page length\n    pagingType: \"full_numbers\", //how to show the pagination options\n    drawCallback: function(oSettings) {\n      //trick to show row numbers\n      for (var i = 0; i < oSettings.aiDisplay.length; i++) {\n        $(\"td:eq(0)\", oSettings.aoData[oSettings.aiDisplay[i]].nTr).html(i + 1);\n      }\n\n      //Hide pagination when we have a single page\n      var activePaginateButton = false;\n      $(oSettings.nTableWrapper).find(\".paginate_button\").each(function() {\n        if ($(this).attr(\"class\").indexOf(\"current\") == -1 && $(this).attr(\"class\").indexOf(\"disabled\") == -1) {\n          activePaginateButton = true;\n        }\n      });\n      if (activePaginateButton) {\n        $(oSettings.nTableWrapper).find(\".dataTables_paginate\").show();\n      } else {\n        $(oSettings.nTableWrapper).find(\".dataTables_paginate\").hide();\n      }\n    },\n    columnDefs: [\n      {\n        width: \"32px\",\n        orderable: false,\n        targets: 0\n      } //disable row sorting for first col\n    ]\n  }\n};\nroot.version = {\n  \"YASR-table\": require(\"../package.json\").version,\n  jquery: $.fn.jquery,\n  \"jquery-datatables\": $.fn.DataTable.version\n};\n\n},{\"../lib/colResizable-1.4.js\":1,\"../package.json\":157,\"./bindingsToCsv.js\":158,\"./imgs.js\":166,\"./utils.js\":181,\"datatables.net\":16,\"jquery\":undefined,\"yasgui-utils\":154}],181:[function(require,module,exports){\n\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})(), GoogleTypeException = require(\"./exceptions.js\").GoogleTypeException;\n\nmodule.exports = {\n  escapeHtmlEntities: function(unescaped) {\n    //taken from http://stackoverflow.com/questions/5499078/fastest-method-to-escape-html-tags-as-html-entities\n    //cast to string first, to avoid problems with e.g. integers\n    return (\"\" + unescaped).replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n  },\n  uriToPrefixed: function(prefixes, uri) {\n    if (prefixes) {\n      for (var prefix in prefixes) {\n        if (uri.indexOf(prefixes[prefix]) == 0) {\n          uri = prefix + \":\" + uri.substring(prefixes[prefix].length);\n          break;\n        }\n      }\n    }\n    return uri;\n  },\n  getGoogleTypeForBinding: function(binding) {\n    if (binding == null) return null;\n    if (binding.type != null && (binding.type === \"typed-literal\" || binding.type === \"literal\")) {\n      switch (binding.datatype) {\n        case \"http://www.w3.org/2001/XMLSchema#double\":\n        case \"http://www.w3.org/2001/XMLSchema#float\":\n        case \"http://www.w3.org/2001/XMLSchema#decimal\":\n        case \"http://www.w3.org/2001/XMLSchema#int\":\n        case \"http://www.w3.org/2001/XMLSchema#integer\":\n        case \"http://www.w3.org/2001/XMLSchema#long\":\n        case \"http://www.w3.org/2001/XMLSchema#gYearMonth\":\n        case \"http://www.w3.org/2001/XMLSchema#gYear\":\n        case \"http://www.w3.org/2001/XMLSchema#gMonthDay\":\n        case \"http://www.w3.org/2001/XMLSchema#gDay\":\n        case \"http://www.w3.org/2001/XMLSchema#gMonth\":\n          return \"number\";\n        case \"http://www.w3.org/2001/XMLSchema#date\":\n          return \"date\";\n        case \"http://www.w3.org/2001/XMLSchema#dateTime\":\n          return \"datetime\";\n        case \"http://www.w3.org/2001/XMLSchema#time\":\n          return \"timeofday\";\n        default:\n          return \"string\";\n      }\n    } else {\n      return \"string\";\n    }\n  },\n  getGoogleTypeForBindings: function(bindings, varName) {\n    var types = {};\n    var typeCount = 0;\n    bindings.forEach(function(binding) {\n      var type = module.exports.getGoogleTypeForBinding(binding[varName]);\n      if (type != null) {\n        if (!(type in types)) {\n          types[type] = 0;\n          typeCount++;\n        }\n        types[type]++;\n      }\n    });\n    if (typeCount == 0) {\n      return \"string\";\n    } else if (typeCount == 1) {\n      for (var type in types) {\n        return type; //just return this one\n      }\n    } else {\n      //we have conflicting types. Throw error\n      throw new GoogleTypeException(types, varName);\n    }\n  },\n\n  castGoogleType: function(binding, prefixes, googleType) {\n    if (binding == null) {\n      return null;\n    }\n\n    if (\n      googleType != \"string\" && binding.type != null && (binding.type === \"typed-literal\" || binding.type === \"literal\")\n    ) {\n      switch (binding.datatype) {\n        case \"http://www.w3.org/2001/XMLSchema#float\":\n        case \"http://www.w3.org/2001/XMLSchema#decimal\":\n        case \"http://www.w3.org/2001/XMLSchema#int\":\n        case \"http://www.w3.org/2001/XMLSchema#integer\":\n        case \"http://www.w3.org/2001/XMLSchema#long\":\n        case \"http://www.w3.org/2001/XMLSchema#gYearMonth\":\n        case \"http://www.w3.org/2001/XMLSchema#gYear\":\n        case \"http://www.w3.org/2001/XMLSchema#gMonthDay\":\n        case \"http://www.w3.org/2001/XMLSchema#gDay\":\n        case \"http://www.w3.org/2001/XMLSchema#gMonth\":\n          return Number(binding.value);\n        case \"http://www.w3.org/2001/XMLSchema#double\":\n          return Number(parseFloat(binding.value));\n        case \"http://www.w3.org/2001/XMLSchema#date\":\n          //grrr, the date function does not parse -any- date (including most xsd dates!)\n          //datetime and time seem to be fine though.\n          //so, first try our custom parser. if that does not work, try the regular date parser anyway\n          var date = parseXmlSchemaDate(binding.value);\n          if (date) return date;\n        case \"http://www.w3.org/2001/XMLSchema#dateTime\":\n        case \"http://www.w3.org/2001/XMLSchema#time\":\n          return new Date(binding.value);\n        default:\n          return binding.value;\n      }\n    } else {\n      if (binding.type = \"uri\") {\n        return module.exports.uriToPrefixed(prefixes, binding.value);\n      } else {\n        return binding.value;\n      }\n    }\n  },\n  fireClick: function($els) {\n    if (!$els) return;\n    $els.each(function(i, el) {\n      var $el = $(el);\n      if (document.dispatchEvent) {\n        // W3C\n        var oEvent = document.createEvent(\"MouseEvents\");\n        oEvent.initMouseEvent(\"click\", true, true, window, 1, 1, 1, 1, 1, false, false, false, false, 0, $el[0]);\n        $el[0].dispatchEvent(oEvent);\n      } else if (document.fireEvent) {\n        // IE\n        $el[0].click();\n      }\n    });\n  }\n};\n//There are no PROPER xml schema to js date parsers\n//A few libraries exist: moment, jsdate, Xdate, but none of them parse valid xml schema dates (e.g. 1999-11-05+02:00).\n//And: I'm not going to write one myself\n//There are other hacky solutions (regular expressions based on trial/error) such as http://stackoverflow.com/questions/2731579/convert-an-xml-schema-date-string-to-a-javascript-date\n//But if we're doing hacky stuff, I at least want to do it MYSELF!\nvar parseXmlSchemaDate = function(dateString) {\n  //change +02:00 to Z+02:00 (something which is parseable by js date)\n  var date = new Date(dateString.replace(/(\\d)([\\+-]\\d{2}:\\d{2})/, \"$1Z$2\"));\n  if (isNaN(date)) return null;\n  return date;\n};\n\n},{\"./exceptions.js\":163,\"jquery\":undefined}]},{},[161])(161)\n});\n\n","/**\n * jQuery-csv (jQuery Plugin)\n * version: 0.71 (2012-11-19)\n *\n * This document is licensed as free software under the terms of the\n * MIT License: http://www.opensource.org/licenses/mit-license.php\n *\n * Acknowledgements:\n * The original design and influence to implement this library as a jquery\n * plugin is influenced by jquery-json (http://code.google.com/p/jquery-json/).\n * If you're looking to use native JSON.Stringify but want additional backwards\n * compatibility for browsers that don't support it, I highly recommend you\n * check it out.\n *\n * A special thanks goes out to rwk@acm.org for providing a lot of valuable\n * feedback to the project including the core for the new FSM\n * (Finite State Machine) parsers. If you're looking for a stable TSV parser\n * be sure to take a look at jquery-tsv (http://code.google.com/p/jquery-tsv/).\n\n * For legal purposes I'll include the \"NO WARRANTY EXPRESSED OR IMPLIED.\n * USE AT YOUR OWN RISK.\". Which, in 'layman's terms' means, by using this\n * library you are accepting responsibility if it breaks your code.\n *\n * Legal jargon aside, I will do my best to provide a useful and stable core\n * that can effectively be built on.\n *\n * Copyrighted 2012 by Evan Plaice.\n */\n\nRegExp.escape= function(s) {\n    return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n};\n\n  'use strict'\n  var $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\n  /**\n   * jQuery.csv.defaults\n   * Encapsulates the method paramater defaults for the CSV plugin module.\n   */\n\n  $.csv = {\n    defaults: {\n      separator:',',\n      delimiter:'\"',\n      headers:true\n    },\n\n    hooks: {\n      castToScalar: function(value, state) {\n        var hasDot = /\\./;\n        if (isNaN(value)) {\n          return value;\n        } else {\n          if (hasDot.test(value)) {\n            return parseFloat(value);\n          } else {\n            var integer = parseInt(value);\n            if(isNaN(integer)) {\n              return null;\n            } else {\n              return integer;\n            }\n          }\n        }\n      }\n    },\n\n    parsers: {\n      parse: function(csv, options) {\n        // cache settings\n        var separator = options.separator;\n        var delimiter = options.delimiter;\n\n        // set initial state if it's missing\n        if(!options.state.rowNum) {\n          options.state.rowNum = 1;\n        }\n        if(!options.state.colNum) {\n          options.state.colNum = 1;\n        }\n\n        // clear initial state\n        var data = [];\n        var entry = [];\n        var state = 0;\n        var value = ''\n        var exit = false;\n\n        function endOfEntry() {\n          // reset the state\n          state = 0;\n          value = '';\n\n          // if 'start' hasn't been met, don't output\n          if(options.start && options.state.rowNum < options.start) {\n            // update global state\n            entry = [];\n            options.state.rowNum++;\n            options.state.colNum = 1;\n            return;\n          }\n          \n          if(options.onParseEntry === undefined) {\n            // onParseEntry hook not set\n            data.push(entry);\n          } else {\n            var hookVal = options.onParseEntry(entry, options.state); // onParseEntry Hook\n            // false skips the row, configurable through a hook\n            if(hookVal !== false) {\n              data.push(hookVal);\n            }\n          }\n          //console.log('entry:' + entry);\n          \n          // cleanup\n          entry = [];\n\n          // if 'end' is met, stop parsing\n          if(options.end && options.state.rowNum >= options.end) {\n            exit = true;\n          }\n          \n          // update global state\n          options.state.rowNum++;\n          options.state.colNum = 1;\n        }\n\n        function endOfValue() {\n          if(options.onParseValue === undefined) {\n            // onParseValue hook not set\n            entry.push(value);\n          } else {\n            var hook = options.onParseValue(value, options.state); // onParseValue Hook\n            // false skips the row, configurable through a hook\n            if(hook !== false) {\n              entry.push(hook);\n            }\n          }\n          //console.log('value:' + value);\n          // reset the state\n          value = '';\n          state = 0;\n          // update global state\n          options.state.colNum++;\n        }\n\n        // escape regex-specific control chars\n        var escSeparator = RegExp.escape(separator);\n        var escDelimiter = RegExp.escape(delimiter);\n\n        // compile the regEx str using the custom delimiter/separator\n        var match = /(D|S|\\n|\\r|[^DS\\r\\n]+)/;\n        var matchSrc = match.source;\n        matchSrc = matchSrc.replace(/S/g, escSeparator);\n        matchSrc = matchSrc.replace(/D/g, escDelimiter);\n        match = RegExp(matchSrc, 'gm');\n\n        // put on your fancy pants...\n        // process control chars individually, use look-ahead on non-control chars\n        csv.replace(match, function (m0) {\n          if(exit) {\n            return;\n          }\n          switch (state) {\n            // the start of a value\n            case 0:\n              // null last value\n              if (m0 === separator) {\n                value += '';\n                endOfValue();\n                break;\n              }\n              // opening delimiter\n              if (m0 === delimiter) {\n                state = 1;\n                break;\n              }\n              // null last value\n              if (m0 === '\\n') {\n                endOfValue();\n                endOfEntry();\n                break;\n              }\n              // phantom carriage return\n              if (/^\\r$/.test(m0)) {\n                break;\n              }\n              // un-delimited value\n              value += m0;\n              state = 3;\n              break;\n\n            // delimited input\n            case 1:\n              // second delimiter? check further\n              if (m0 === delimiter) {\n                state = 2;\n                break;\n              }\n              // delimited data\n              value += m0;\n              state = 1;\n              break;\n\n            // delimiter found in delimited input\n            case 2:\n              // escaped delimiter?\n              if (m0 === delimiter) {\n                value += m0;\n                state = 1;\n                break;\n              }\n              // null value\n              if (m0 === separator) {\n                endOfValue();\n                break;\n              }\n              // end of entry\n              if (m0 === '\\n') {\n                endOfValue();\n                endOfEntry();\n                break;\n              }\n              // phantom carriage return\n              if (/^\\r$/.test(m0)) {\n                break;\n              }\n              // broken paser?\n              throw new Error('CSVDataError: Illegal State [Row:' + options.state.rowNum + '][Col:' + options.state.colNum + ']');\n\n            // un-delimited input\n            case 3:\n              // null last value\n              if (m0 === separator) {\n                endOfValue();\n                break;\n              }\n              // end of entry\n              if (m0 === '\\n') {\n                endOfValue();\n                endOfEntry();\n                break;\n              }\n              // phantom carriage return\n              if (/^\\r$/.test(m0)) {\n                break;\n              }\n              if (m0 === delimiter) {\n              // non-compliant data\n                throw new Error('CSVDataError: Illegal Quote [Row:' + options.state.rowNum + '][Col:' + options.state.colNum + ']');\n              }\n              // broken parser?\n              throw new Error('CSVDataError: Illegal Data [Row:' + options.state.rowNum + '][Col:' + options.state.colNum + ']');\n            default:\n              // shenanigans\n              throw new Error('CSVDataError: Unknown State [Row:' + options.state.rowNum + '][Col:' + options.state.colNum + ']');\n          }\n          //console.log('val:' + m0 + ' state:' + state);\n        });\n\n        // submit the last entry\n        // ignore null last line\n        if(entry.length !== 0) {\n          endOfValue();\n          endOfEntry();\n        }\n\n        return data;\n      },\n\n      // a csv-specific line splitter\n      splitLines: function(csv, options) {\n        // cache settings\n        var separator = options.separator;\n        var delimiter = options.delimiter;\n\n        // set initial state if it's missing\n        if(!options.state.rowNum) {\n          options.state.rowNum = 1;\n        }\n\n        // clear initial state\n        var entries = [];\n        var state = 0;\n        var entry = '';\n        var exit = false;\n\n        function endOfLine() {          \n          // reset the state\n          state = 0;\n          \n          // if 'start' hasn't been met, don't output\n          if(options.start && options.state.rowNum < options.start) {\n            // update global state\n            entry = '';\n            options.state.rowNum++;\n            return;\n          }\n          \n          if(options.onParseEntry === undefined) {\n            // onParseEntry hook not set\n            entries.push(entry);\n          } else {\n            var hookVal = options.onParseEntry(entry, options.state); // onParseEntry Hook\n            // false skips the row, configurable through a hook\n            if(hookVal !== false) {\n              entries.push(hookVal);\n            }\n          }\n\n          // cleanup\n          entry = '';\n\n          // if 'end' is met, stop parsing\n          if(options.end && options.state.rowNum >= options.end) {\n            exit = true;\n          }\n          \n          // update global state\n          options.state.rowNum++;\n        }\n\n        // escape regex-specific control chars\n        var escSeparator = RegExp.escape(separator);\n        var escDelimiter = RegExp.escape(delimiter);\n\n        // compile the regEx str using the custom delimiter/separator\n        var match = /(D|S|\\n|\\r|[^DS\\r\\n]+)/;\n        var matchSrc = match.source;\n        matchSrc = matchSrc.replace(/S/g, escSeparator);\n        matchSrc = matchSrc.replace(/D/g, escDelimiter);\n        match = RegExp(matchSrc, 'gm');\n        \n        // put on your fancy pants...\n        // process control chars individually, use look-ahead on non-control chars\n        csv.replace(match, function (m0) {\n          if(exit) {\n            return;\n          }\n          switch (state) {\n            // the start of a value/entry\n            case 0:\n              // null value\n              if (m0 === separator) {\n                entry += m0;\n                state = 0;\n                break;\n              }\n              // opening delimiter\n              if (m0 === delimiter) {\n                entry += m0;\n                state = 1;\n                break;\n              }\n              // end of line\n              if (m0 === '\\n') {\n                endOfLine();\n                break;\n              }\n              // phantom carriage return\n              if (/^\\r$/.test(m0)) {\n                break;\n              }\n              // un-delimit value\n              entry += m0;\n              state = 3;\n              break;\n\n            // delimited input\n            case 1:\n              // second delimiter? check further\n              if (m0 === delimiter) {\n                entry += m0;\n                state = 2;\n                break;\n              }\n              // delimited data\n              entry += m0;\n              state = 1;\n              break;\n\n            // delimiter found in delimited input\n            case 2:\n              // escaped delimiter?\n              var prevChar = entry.substr(entry.length - 1);\n              if (m0 === delimiter && prevChar === delimiter) {\n                entry += m0;\n                state = 1;\n                break;\n              }\n              // end of value\n              if (m0 === separator) {\n                entry += m0;\n                state = 0;\n                break;\n              }\n              // end of line\n              if (m0 === '\\n') {\n                endOfLine();\n                break;\n              }\n              // phantom carriage return\n              if (m0 === '\\r') {\n                break;\n              }\n              // broken paser?\n              throw new Error('CSVDataError: Illegal state [Row:' + options.state.rowNum + ']');\n\n            // un-delimited input\n            case 3:\n              // null value\n              if (m0 === separator) {\n                entry += m0;\n                state = 0;\n                break;\n              }\n              // end of line\n              if (m0 === '\\n') {\n                endOfLine();\n                break;\n              }\n              // phantom carriage return\n              if (m0 === '\\r') {\n                break;\n              }\n              // non-compliant data\n              if (m0 === delimiter) {\n                throw new Error('CSVDataError: Illegal quote [Row:' + options.state.rowNum + ']');\n              }\n              // broken parser?\n              throw new Error('CSVDataError: Illegal state [Row:' + options.state.rowNum + ']');\n            default:\n              // shenanigans\n              throw new Error('CSVDataError: Unknown state [Row:' + options.state.rowNum + ']');\n          }\n          //console.log('val:' + m0 + ' state:' + state);\n        });\n\n        // submit the last entry\n        // ignore null last line\n        if(entry !== '') {\n          endOfLine();\n        }\n\n        return entries;\n      },\n\n      // a csv entry parser\n      parseEntry: function(csv, options) {\n        // cache settings\n        var separator = options.separator;\n        var delimiter = options.delimiter;\n        \n        // set initial state if it's missing\n        if(!options.state.rowNum) {\n          options.state.rowNum = 1;\n        }\n        if(!options.state.colNum) {\n          options.state.colNum = 1;\n        }\n\n        // clear initial state\n        var entry = [];\n        var state = 0;\n        var value = '';\n\n        function endOfValue() {\n          if(options.onParseValue === undefined) {\n            // onParseValue hook not set\n            entry.push(value);\n          } else {\n            var hook = options.onParseValue(value, options.state); // onParseValue Hook\n            // false skips the value, configurable through a hook\n            if(hook !== false) {\n              entry.push(hook);\n            }\n          }\n          // reset the state\n          value = '';\n          state = 0;\n          // update global state\n          options.state.colNum++;\n        }\n\n        // checked for a cached regEx first\n        if(!options.match) {\n          // escape regex-specific control chars\n          var escSeparator = RegExp.escape(separator);\n          var escDelimiter = RegExp.escape(delimiter);\n          \n          // compile the regEx str using the custom delimiter/separator\n          var match = /(D|S|\\n|\\r|[^DS\\r\\n]+)/;\n          var matchSrc = match.source;\n          matchSrc = matchSrc.replace(/S/g, escSeparator);\n          matchSrc = matchSrc.replace(/D/g, escDelimiter);\n          options.match = RegExp(matchSrc, 'gm');\n        }\n\n        // put on your fancy pants...\n        // process control chars individually, use look-ahead on non-control chars\n        csv.replace(options.match, function (m0) {\n          switch (state) {\n            // the start of a value\n            case 0:\n              // null last value\n              if (m0 === separator) {\n                value += '';\n                endOfValue();\n                break;\n              }\n              // opening delimiter\n              if (m0 === delimiter) {\n                state = 1;\n                break;\n              }\n              // skip un-delimited new-lines\n              if (m0 === '\\n' || m0 === '\\r') {\n                break;\n              }\n              // un-delimited value\n              value += m0;\n              state = 3;\n              break;\n\n            // delimited input\n            case 1:\n              // second delimiter? check further\n              if (m0 === delimiter) {\n                state = 2;\n                break;\n              }\n              // delimited data\n              value += m0;\n              state = 1;\n              break;\n\n            // delimiter found in delimited input\n            case 2:\n              // escaped delimiter?\n              if (m0 === delimiter) {\n                value += m0;\n                state = 1;\n                break;\n              }\n              // null value\n              if (m0 === separator) {\n                endOfValue();\n                break;\n              }\n              // skip un-delimited new-lines\n              if (m0 === '\\n' || m0 === '\\r') {\n                break;\n              }\n              // broken paser?\n              throw new Error('CSVDataError: Illegal State [Row:' + options.state.rowNum + '][Col:' + options.state.colNum + ']');\n\n            // un-delimited input\n            case 3:\n              // null last value\n              if (m0 === separator) {\n                endOfValue();\n                break;\n              }\n              // skip un-delimited new-lines\n              if (m0 === '\\n' || m0 === '\\r') {\n                break;\n              }\n              // non-compliant data\n              if (m0 === delimiter) {\n                throw new Error('CSVDataError: Illegal Quote [Row:' + options.state.rowNum + '][Col:' + options.state.colNum + ']');\n              }\n              // broken parser?\n              throw new Error('CSVDataError: Illegal Data [Row:' + options.state.rowNum + '][Col:' + options.state.colNum + ']');\n            default:\n              // shenanigans\n              throw new Error('CSVDataError: Unknown State [Row:' + options.state.rowNum + '][Col:' + options.state.colNum + ']');\n          }\n          //console.log('val:' + m0 + ' state:' + state);\n        });\n\n        // submit the last value\n        endOfValue();\n\n        return entry;\n      }\n    },\n\n    /**\n     * $.csv.toArray(csv)\n     * Converts a CSV entry string to a javascript array.\n     *\n     * @param {Array} csv The string containing the CSV data.\n     * @param {Object} [options] An object containing user-defined options.\n     * @param {Character} [separator] An override for the separator character. Defaults to a comma(,).\n     * @param {Character} [delimiter] An override for the delimiter character. Defaults to a double-quote(\").\n     *\n     * This method deals with simple CSV strings only. It's useful if you only\n     * need to parse a single entry. If you need to parse more than one line,\n     * use $.csv2Array instead.\n     */\n    toArray: function(csv, options, callback) {\n      var options = (options !== undefined ? options : {});\n      var config = {};\n      config.callback = ((callback !== undefined && typeof(callback) === 'function') ? callback : false);\n      config.separator = 'separator' in options ? options.separator : $.csv.defaults.separator;\n      config.delimiter = 'delimiter' in options ? options.delimiter : $.csv.defaults.delimiter;\n      var state = (options.state !== undefined ? options.state : {});\n\n      // setup\n      var options = {\n        delimiter: config.delimiter,\n        separator: config.separator,\n        onParseEntry: options.onParseEntry,\n        onParseValue: options.onParseValue,\n        state: state\n      }\n\n      var entry = $.csv.parsers.parseEntry(csv, options);\n\n      // push the value to a callback if one is defined\n      if(!config.callback) {\n        return entry;\n      } else {\n        config.callback('', entry);\n      }\n    },\n\n    /**\n     * $.csv.toArrays(csv)\n     * Converts a CSV string to a javascript array.\n     *\n     * @param {String} csv The string containing the raw CSV data.\n     * @param {Object} [options] An object containing user-defined options.\n     * @param {Character} [separator] An override for the separator character. Defaults to a comma(,).\n     * @param {Character} [delimiter] An override for the delimiter character. Defaults to a double-quote(\").\n     *\n     * This method deals with multi-line CSV. The breakdown is simple. The first\n     * dimension of the array represents the line (or entry/row) while the second\n     * dimension contains the values (or values/columns).\n     */\n    toArrays: function(csv, options, callback) {\n      var options = (options !== undefined ? options : {});\n      var config = {};\n      config.callback = ((callback !== undefined && typeof(callback) === 'function') ? callback : false);\n      config.separator = 'separator' in options ? options.separator : $.csv.defaults.separator;\n      config.delimiter = 'delimiter' in options ? options.delimiter : $.csv.defaults.delimiter;\n      \n      // setup\n      var data = [];\n      var options = {\n        delimiter: config.delimiter,\n        separator: config.separator,\n        onParseEntry: options.onParseEntry,\n        onParseValue: options.onParseValue,\n        start: options.start,\n        end: options.end,\n        state: {\n          rowNum: 1,\n          colNum: 1\n        }\n      };\n\n      // break the data down to lines\n      data = $.csv.parsers.parse(csv, options);\n\n      // push the value to a callback if one is defined\n      if(!config.callback) {\n        return data;\n      } else {\n        config.callback('', data);\n      }\n    },\n\n    /**\n     * $.csv.toObjects(csv)\n     * Converts a CSV string to a javascript object.\n     * @param {String} csv The string containing the raw CSV data.\n     * @param {Object} [options] An object containing user-defined options.\n     * @param {Character} [separator] An override for the separator character. Defaults to a comma(,).\n     * @param {Character} [delimiter] An override for the delimiter character. Defaults to a double-quote(\").\n     * @param {Boolean} [headers] Indicates whether the data contains a header line. Defaults to true.\n     *\n     * This method deals with multi-line CSV strings. Where the headers line is\n     * used as the key for each value per entry.\n     */\n    toObjects: function(csv, options, callback) {\n      var options = (options !== undefined ? options : {});\n      var config = {};\n      config.callback = ((callback !== undefined && typeof(callback) === 'function') ? callback : false);\n      config.separator = 'separator' in options ? options.separator : $.csv.defaults.separator;\n      config.delimiter = 'delimiter' in options ? options.delimiter : $.csv.defaults.delimiter;\n      config.headers = 'headers' in options ? options.headers : $.csv.defaults.headers;\n      options.start = 'start' in options ? options.start : 1;\n      \n      // account for headers\n      if(config.headers) {\n        options.start++;\n      }\n      if(options.end && config.headers) {\n        options.end++;\n      }\n      \n      // setup\n      var lines = [];\n      var data = [];\n      \n      var options = {\n        delimiter: config.delimiter,\n        separator: config.separator,\n        onParseEntry: options.onParseEntry,\n        onParseValue: options.onParseValue,\n        start: options.start,\n        end: options.end,\n        state: {\n          rowNum: 1,\n          colNum: 1\n        },\n        match: false\n      };\n\n      // fetch the headers\n      var headerOptions = {\n        delimiter: config.delimiter,\n        separator: config.separator,\n        start: 1,\n        end: 1,\n        state: {\n          rowNum:1,\n          colNum:1\n        }\n      }\n      var headerLine = $.csv.parsers.splitLines(csv, headerOptions);\n      var headers = $.csv.toArray(headerLine[0], options);\n\n      // fetch the data\n      var lines = $.csv.parsers.splitLines(csv, options);\n      \n      // reset the state for re-use\n      options.state.colNum = 1;\n      if(headers){\n        options.state.rowNum = 2;\n      } else {\n        options.state.rowNum = 1;\n      }\n      \n      // convert data to objects\n      for(var i=0, len=lines.length; i<len; i++) {\n        var entry = $.csv.toArray(lines[i], options);\n        var object = {};\n        for(var j in headers) {\n          object[headers[j]] = entry[j];\n        }\n        data.push(object);\n        \n        // update row state\n        options.state.rowNum++;\n      }\n\n      // push the value to a callback if one is defined\n      if(!config.callback) {\n        return data;\n      } else {\n        config.callback('', data);\n      }\n    },\n\n     /**\n     * $.csv.fromArrays(arrays)\n     * Converts a javascript array to a CSV String.\n     *\n     * @param {Array} array An array containing an array of CSV entries.\n     * @param {Object} [options] An object containing user-defined options.\n     * @param {Character} [separator] An override for the separator character. Defaults to a comma(,).\n     * @param {Character} [delimiter] An override for the delimiter character. Defaults to a double-quote(\").\n     *\n     * This method generates a CSV file from an array of arrays (representing entries).\n     */\n    fromArrays: function(arrays, options, callback) {\n      var options = (options !== undefined ? options : {});\n      var config = {};\n      config.callback = ((callback !== undefined && typeof(callback) === 'function') ? callback : false);\n      config.separator = 'separator' in options ? options.separator : $.csv.defaults.separator;\n      config.delimiter = 'delimiter' in options ? options.delimiter : $.csv.defaults.delimiter;\n      config.escaper = 'escaper' in options ? options.escaper : $.csv.defaults.escaper;\n      config.experimental = 'experimental' in options ? options.experimental : false;\n\n      if(!config.experimental) {\n        throw new Error('not implemented');\n      }\n\n      var output = [];\n      for(i in arrays) {\n        output.push(arrays[i]);\n      }\n\n      // push the value to a callback if one is defined\n      if(!config.callback) {\n        return output;\n      } else {\n        config.callback('', output);\n      }\n    },\n\n    /**\n     * $.csv.fromObjects(objects)\n     * Converts a javascript dictionary to a CSV string.\n     * @param {Object} objects An array of objects containing the data.\n     * @param {Object} [options] An object containing user-defined options.\n     * @param {Character} [separator] An override for the separator character. Defaults to a comma(,).\n     * @param {Character} [delimiter] An override for the delimiter character. Defaults to a double-quote(\").\n     *\n     * This method generates a CSV file from an array of objects (name:value pairs).\n     * It starts by detecting the headers and adding them as the first line of\n     * the CSV file, followed by a structured dump of the data.\n     */\n    fromObjects2CSV: function(objects, options, callback) {\n      var options = (options !== undefined ? options : {});\n      var config = {};\n      config.callback = ((callback !== undefined && typeof(callback) === 'function') ? callback : false);\n      config.separator = 'separator' in options ? options.separator : $.csv.defaults.separator;\n      config.delimiter = 'delimiter' in options ? options.delimiter : $.csv.defaults.delimiter;\n      config.experimental = 'experimental' in options ? options.experimental : false;\n\n      if(!config.experimental) {\n        throw new Error('not implemented');\n      }\n\n      var output = [];\n      for(i in objects) {\n        output.push(arrays[i]);\n      }\n\n      // push the value to a callback if one is defined\n      if(!config.callback) {\n        return output;\n      } else {\n        config.callback('', output);\n      }\n    }\n  };\n\n  // Maintenance code to maintain backward-compatibility\n  // Will be removed in release 1.0\n  $.csvEntry2Array = $.csv.toArray;\n  $.csv2Array = $.csv.toArrays;\n  $.csv2Dictionary = $.csv.toObjects;\n\n\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod((function(){try{return require('codemirror')}catch(e){return window.CodeMirror}})());\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  var ie_lt8 = /MSIE \\d/.test(navigator.userAgent) &&\n    (document.documentMode == null || document.documentMode < 8);\n\n  var Pos = CodeMirror.Pos;\n\n  var matching = {\"(\": \")>\", \")\": \"(<\", \"[\": \"]>\", \"]\": \"[<\", \"{\": \"}>\", \"}\": \"{<\"};\n\n  function findMatchingBracket(cm, where, strict, config) {\n    var line = cm.getLineHandle(where.line), pos = where.ch - 1;\n    var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)];\n    if (!match) return null;\n    var dir = match.charAt(1) == \">\" ? 1 : -1;\n    if (strict && (dir > 0) != (pos == where.ch)) return null;\n    var style = cm.getTokenTypeAt(Pos(where.line, pos + 1));\n\n    var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style || null, config);\n    if (found == null) return null;\n    return {from: Pos(where.line, pos), to: found && found.pos,\n            match: found && found.ch == match.charAt(0), forward: dir > 0};\n  }\n\n  // bracketRegex is used to specify which type of bracket to scan\n  // should be a regexp, e.g. /[[\\]]/\n  //\n  // Note: If \"where\" is on an open bracket, then this bracket is ignored.\n  //\n  // Returns false when no bracket was found, null when it reached\n  // maxScanLines and gave up\n  function scanForBracket(cm, where, dir, style, config) {\n    var maxScanLen = (config && config.maxScanLineLength) || 10000;\n    var maxScanLines = (config && config.maxScanLines) || 1000;\n\n    var stack = [];\n    var re = config && config.bracketRegex ? config.bracketRegex : /[(){}[\\]]/;\n    var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1)\n                          : Math.max(cm.firstLine() - 1, where.line - maxScanLines);\n    for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) {\n      var line = cm.getLine(lineNo);\n      if (!line) continue;\n      var pos = dir > 0 ? 0 : line.length - 1, end = dir > 0 ? line.length : -1;\n      if (line.length > maxScanLen) continue;\n      if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0);\n      for (; pos != end; pos += dir) {\n        var ch = line.charAt(pos);\n        if (re.test(ch) && (style === undefined || cm.getTokenTypeAt(Pos(lineNo, pos + 1)) == style)) {\n          var match = matching[ch];\n          if ((match.charAt(1) == \">\") == (dir > 0)) stack.push(ch);\n          else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch};\n          else stack.pop();\n        }\n      }\n    }\n    return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null;\n  }\n\n  function matchBrackets(cm, autoclear, config) {\n    // Disable brace matching in long lines, since it'll cause hugely slow updates\n    var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000;\n    var marks = [], ranges = cm.listSelections();\n    for (var i = 0; i < ranges.length; i++) {\n      var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, false, config);\n      if (match && cm.getLine(match.from.line).length <= maxHighlightLen) {\n        var style = match.match ? \"CodeMirror-matchingbracket\" : \"CodeMirror-nonmatchingbracket\";\n        marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), {className: style}));\n        if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen)\n          marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), {className: style}));\n      }\n    }\n\n    if (marks.length) {\n      // Kludge to work around the IE bug from issue #1193, where text\n      // input stops going to the textare whever this fires.\n      if (ie_lt8 && cm.state.focused) cm.focus();\n\n      var clear = function() {\n        cm.operation(function() {\n          for (var i = 0; i < marks.length; i++) marks[i].clear();\n        });\n      };\n      if (autoclear) setTimeout(clear, 800);\n      else return clear;\n    }\n  }\n\n  var currentlyHighlighted = null;\n  function doMatchBrackets(cm) {\n    cm.operation(function() {\n      if (currentlyHighlighted) {currentlyHighlighted(); currentlyHighlighted = null;}\n      currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets);\n    });\n  }\n\n  CodeMirror.defineOption(\"matchBrackets\", false, function(cm, val, old) {\n    if (old && old != CodeMirror.Init) {\n      cm.off(\"cursorActivity\", doMatchBrackets);\n      if (currentlyHighlighted) {currentlyHighlighted(); currentlyHighlighted = null;}\n    }\n    if (val) {\n      cm.state.matchBrackets = typeof val == \"object\" ? val : {};\n      cm.on(\"cursorActivity\", doMatchBrackets);\n    }\n  });\n\n  CodeMirror.defineExtension(\"matchBrackets\", function() {matchBrackets(this, true);});\n  CodeMirror.defineExtension(\"findMatchingBracket\", function(pos, strict, config){\n    return findMatchingBracket(this, pos, strict, config);\n  });\n  CodeMirror.defineExtension(\"scanForBracket\", function(pos, dir, style, config){\n    return scanForBracket(this, pos, dir, style, config);\n  });\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod((function(){try{return require('codemirror')}catch(e){return window.CodeMirror}})());\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.registerHelper(\"fold\", \"brace\", function(cm, start) {\n  var line = start.line, lineText = cm.getLine(line);\n  var tokenType;\n\n  function findOpening(openCh) {\n    for (var at = start.ch, pass = 0;;) {\n      var found = at <= 0 ? -1 : lineText.lastIndexOf(openCh, at - 1);\n      if (found == -1) {\n        if (pass == 1) break;\n        pass = 1;\n        at = lineText.length;\n        continue;\n      }\n      if (pass == 1 && found < start.ch) break;\n      tokenType = cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1));\n      if (!/^(comment|string)/.test(tokenType)) return found + 1;\n      at = found - 1;\n    }\n  }\n\n  var startToken = \"{\", endToken = \"}\", startCh = findOpening(\"{\");\n  if (startCh == null) {\n    startToken = \"[\", endToken = \"]\";\n    startCh = findOpening(\"[\");\n  }\n\n  if (startCh == null) return;\n  var count = 1, lastLine = cm.lastLine(), end, endCh;\n  outer: for (var i = line; i <= lastLine; ++i) {\n    var text = cm.getLine(i), pos = i == line ? startCh : 0;\n    for (;;) {\n      var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos);\n      if (nextOpen < 0) nextOpen = text.length;\n      if (nextClose < 0) nextClose = text.length;\n      pos = Math.min(nextOpen, nextClose);\n      if (pos == text.length) break;\n      if (cm.getTokenTypeAt(CodeMirror.Pos(i, pos + 1)) == tokenType) {\n        if (pos == nextOpen) ++count;\n        else if (!--count) { end = i; endCh = pos; break outer; }\n      }\n      ++pos;\n    }\n  }\n  if (end == null || line == end && endCh == startCh) return;\n  return {from: CodeMirror.Pos(line, startCh),\n          to: CodeMirror.Pos(end, endCh)};\n});\n\nCodeMirror.registerHelper(\"fold\", \"import\", function(cm, start) {\n  function hasImport(line) {\n    if (line < cm.firstLine() || line > cm.lastLine()) return null;\n    var start = cm.getTokenAt(CodeMirror.Pos(line, 1));\n    if (!/\\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));\n    if (start.type != \"keyword\" || start.string != \"import\") return null;\n    // Now find closing semicolon, return its position\n    for (var i = line, e = Math.min(cm.lastLine(), line + 10); i <= e; ++i) {\n      var text = cm.getLine(i), semi = text.indexOf(\";\");\n      if (semi != -1) return {startCh: start.end, end: CodeMirror.Pos(i, semi)};\n    }\n  }\n\n  var startLine = start.line, has = hasImport(startLine), prev;\n  if (!has || hasImport(startLine - 1) || ((prev = hasImport(startLine - 2)) && prev.end.line == startLine - 1))\n    return null;\n  for (var end = has.end;;) {\n    var next = hasImport(end.line + 1);\n    if (next == null) break;\n    end = next.end;\n  }\n  return {from: cm.clipPos(CodeMirror.Pos(startLine, has.startCh + 1)), to: end};\n});\n\nCodeMirror.registerHelper(\"fold\", \"include\", function(cm, start) {\n  function hasInclude(line) {\n    if (line < cm.firstLine() || line > cm.lastLine()) return null;\n    var start = cm.getTokenAt(CodeMirror.Pos(line, 1));\n    if (!/\\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));\n    if (start.type == \"meta\" && start.string.slice(0, 8) == \"#include\") return start.start + 8;\n  }\n\n  var startLine = start.line, has = hasInclude(startLine);\n  if (has == null || hasInclude(startLine - 1) != null) return null;\n  for (var end = startLine;;) {\n    var next = hasInclude(end + 1);\n    if (next == null) break;\n    ++end;\n  }\n  return {from: CodeMirror.Pos(startLine, has + 1),\n          to: cm.clipPos(CodeMirror.Pos(end))};\n});\n\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod((function(){try{return require('codemirror')}catch(e){return window.CodeMirror}})());\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  function doFold(cm, pos, options, force) {\n    if (options && options.call) {\n      var finder = options;\n      options = null;\n    } else {\n      var finder = getOption(cm, options, \"rangeFinder\");\n    }\n    if (typeof pos == \"number\") pos = CodeMirror.Pos(pos, 0);\n    var minSize = getOption(cm, options, \"minFoldSize\");\n\n    function getRange(allowFolded) {\n      var range = finder(cm, pos);\n      if (!range || range.to.line - range.from.line < minSize) return null;\n      var marks = cm.findMarksAt(range.from);\n      for (var i = 0; i < marks.length; ++i) {\n        if (marks[i].__isFold && force !== \"fold\") {\n          if (!allowFolded) return null;\n          range.cleared = true;\n          marks[i].clear();\n        }\n      }\n      return range;\n    }\n\n    var range = getRange(true);\n    if (getOption(cm, options, \"scanUp\")) while (!range && pos.line > cm.firstLine()) {\n      pos = CodeMirror.Pos(pos.line - 1, 0);\n      range = getRange(false);\n    }\n    if (!range || range.cleared || force === \"unfold\") return;\n\n    var myWidget = makeWidget(cm, options);\n    CodeMirror.on(myWidget, \"mousedown\", function(e) {\n      myRange.clear();\n      CodeMirror.e_preventDefault(e);\n    });\n    var myRange = cm.markText(range.from, range.to, {\n      replacedWith: myWidget,\n      clearOnEnter: getOption(cm, options, \"clearOnEnter\"),\n      __isFold: true\n    });\n    myRange.on(\"clear\", function(from, to) {\n      CodeMirror.signal(cm, \"unfold\", cm, from, to);\n    });\n    CodeMirror.signal(cm, \"fold\", cm, range.from, range.to);\n  }\n\n  function makeWidget(cm, options) {\n    var widget = getOption(cm, options, \"widget\");\n    if (typeof widget == \"string\") {\n      var text = document.createTextNode(widget);\n      widget = document.createElement(\"span\");\n      widget.appendChild(text);\n      widget.className = \"CodeMirror-foldmarker\";\n    }\n    return widget;\n  }\n\n  // Clumsy backwards-compatible interface\n  CodeMirror.newFoldFunction = function(rangeFinder, widget) {\n    return function(cm, pos) { doFold(cm, pos, {rangeFinder: rangeFinder, widget: widget}); };\n  };\n\n  // New-style interface\n  CodeMirror.defineExtension(\"foldCode\", function(pos, options, force) {\n    doFold(this, pos, options, force);\n  });\n\n  CodeMirror.defineExtension(\"isFolded\", function(pos) {\n    var marks = this.findMarksAt(pos);\n    for (var i = 0; i < marks.length; ++i)\n      if (marks[i].__isFold) return true;\n  });\n\n  CodeMirror.commands.toggleFold = function(cm) {\n    cm.foldCode(cm.getCursor());\n  };\n  CodeMirror.commands.fold = function(cm) {\n    cm.foldCode(cm.getCursor(), null, \"fold\");\n  };\n  CodeMirror.commands.unfold = function(cm) {\n    cm.foldCode(cm.getCursor(), null, \"unfold\");\n  };\n  CodeMirror.commands.foldAll = function(cm) {\n    cm.operation(function() {\n      for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++)\n        cm.foldCode(CodeMirror.Pos(i, 0), null, \"fold\");\n    });\n  };\n  CodeMirror.commands.unfoldAll = function(cm) {\n    cm.operation(function() {\n      for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++)\n        cm.foldCode(CodeMirror.Pos(i, 0), null, \"unfold\");\n    });\n  };\n\n  CodeMirror.registerHelper(\"fold\", \"combine\", function() {\n    var funcs = Array.prototype.slice.call(arguments, 0);\n    return function(cm, start) {\n      for (var i = 0; i < funcs.length; ++i) {\n        var found = funcs[i](cm, start);\n        if (found) return found;\n      }\n    };\n  });\n\n  CodeMirror.registerHelper(\"fold\", \"auto\", function(cm, start) {\n    var helpers = cm.getHelpers(start, \"fold\");\n    for (var i = 0; i < helpers.length; i++) {\n      var cur = helpers[i](cm, start);\n      if (cur) return cur;\n    }\n  });\n\n  var defaultOptions = {\n    rangeFinder: CodeMirror.fold.auto,\n    widget: \"\\u2194\",\n    minFoldSize: 0,\n    scanUp: false,\n    clearOnEnter: true\n  };\n\n  CodeMirror.defineOption(\"foldOptions\", null);\n\n  function getOption(cm, options, name) {\n    if (options && options[name] !== undefined)\n      return options[name];\n    var editorOptions = cm.options.foldOptions;\n    if (editorOptions && editorOptions[name] !== undefined)\n      return editorOptions[name];\n    return defaultOptions[name];\n  }\n\n  CodeMirror.defineExtension(\"foldOption\", function(options, name) {\n    return getOption(this, options, name);\n  });\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod((function(){try{return require('codemirror')}catch(e){return window.CodeMirror}})(), require(\"./foldcode\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"./foldcode\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineOption(\"foldGutter\", false, function(cm, val, old) {\n    if (old && old != CodeMirror.Init) {\n      cm.clearGutter(cm.state.foldGutter.options.gutter);\n      cm.state.foldGutter = null;\n      cm.off(\"gutterClick\", onGutterClick);\n      cm.off(\"change\", onChange);\n      cm.off(\"viewportChange\", onViewportChange);\n      cm.off(\"fold\", onFold);\n      cm.off(\"unfold\", onFold);\n      cm.off(\"swapDoc\", onChange);\n    }\n    if (val) {\n      cm.state.foldGutter = new State(parseOptions(val));\n      updateInViewport(cm);\n      cm.on(\"gutterClick\", onGutterClick);\n      cm.on(\"change\", onChange);\n      cm.on(\"viewportChange\", onViewportChange);\n      cm.on(\"fold\", onFold);\n      cm.on(\"unfold\", onFold);\n      cm.on(\"swapDoc\", onChange);\n    }\n  });\n\n  var Pos = CodeMirror.Pos;\n\n  function State(options) {\n    this.options = options;\n    this.from = this.to = 0;\n  }\n\n  function parseOptions(opts) {\n    if (opts === true) opts = {};\n    if (opts.gutter == null) opts.gutter = \"CodeMirror-foldgutter\";\n    if (opts.indicatorOpen == null) opts.indicatorOpen = \"CodeMirror-foldgutter-open\";\n    if (opts.indicatorFolded == null) opts.indicatorFolded = \"CodeMirror-foldgutter-folded\";\n    return opts;\n  }\n\n  function isFolded(cm, line) {\n    var marks = cm.findMarks(Pos(line, 0), Pos(line + 1, 0));\n    for (var i = 0; i < marks.length; ++i)\n      if (marks[i].__isFold && marks[i].find().from.line == line) return marks[i];\n  }\n\n  function marker(spec) {\n    if (typeof spec == \"string\") {\n      var elt = document.createElement(\"div\");\n      elt.className = spec + \" CodeMirror-guttermarker-subtle\";\n      return elt;\n    } else {\n      return spec.cloneNode(true);\n    }\n  }\n\n  function updateFoldInfo(cm, from, to) {\n    var opts = cm.state.foldGutter.options, cur = from;\n    var minSize = cm.foldOption(opts, \"minFoldSize\");\n    var func = cm.foldOption(opts, \"rangeFinder\");\n    cm.eachLine(from, to, function(line) {\n      var mark = null;\n      if (isFolded(cm, cur)) {\n        mark = marker(opts.indicatorFolded);\n      } else {\n        var pos = Pos(cur, 0);\n        var range = func && func(cm, pos);\n        if (range && range.to.line - range.from.line >= minSize)\n          mark = marker(opts.indicatorOpen);\n      }\n      cm.setGutterMarker(line, opts.gutter, mark);\n      ++cur;\n    });\n  }\n\n  function updateInViewport(cm) {\n    var vp = cm.getViewport(), state = cm.state.foldGutter;\n    if (!state) return;\n    cm.operation(function() {\n      updateFoldInfo(cm, vp.from, vp.to);\n    });\n    state.from = vp.from; state.to = vp.to;\n  }\n\n  function onGutterClick(cm, line, gutter) {\n    var state = cm.state.foldGutter;\n    if (!state) return;\n    var opts = state.options;\n    if (gutter != opts.gutter) return;\n    var folded = isFolded(cm, line);\n    if (folded) folded.clear();\n    else cm.foldCode(Pos(line, 0), opts.rangeFinder);\n  }\n\n  function onChange(cm) {\n    var state = cm.state.foldGutter;\n    if (!state) return;\n    var opts = state.options;\n    state.from = state.to = 0;\n    clearTimeout(state.changeUpdate);\n    state.changeUpdate = setTimeout(function() { updateInViewport(cm); }, opts.foldOnChangeTimeSpan || 600);\n  }\n\n  function onViewportChange(cm) {\n    var state = cm.state.foldGutter;\n    if (!state) return;\n    var opts = state.options;\n    clearTimeout(state.changeUpdate);\n    state.changeUpdate = setTimeout(function() {\n      var vp = cm.getViewport();\n      if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) {\n        updateInViewport(cm);\n      } else {\n        cm.operation(function() {\n          if (vp.from < state.from) {\n            updateFoldInfo(cm, vp.from, state.from);\n            state.from = vp.from;\n          }\n          if (vp.to > state.to) {\n            updateFoldInfo(cm, state.to, vp.to);\n            state.to = vp.to;\n          }\n        });\n      }\n    }, opts.updateViewportTimeSpan || 400);\n  }\n\n  function onFold(cm, from) {\n    var state = cm.state.foldGutter;\n    if (!state) return;\n    var line = from.line;\n    if (line >= state.from && line < state.to)\n      updateFoldInfo(cm, line, line + 1);\n  }\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod((function(){try{return require('codemirror')}catch(e){return window.CodeMirror}})());\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var Pos = CodeMirror.Pos;\n  function cmp(a, b) { return a.line - b.line || a.ch - b.ch; }\n\n  var nameStartChar = \"A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\";\n  var nameChar = nameStartChar + \"\\-\\:\\.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040\";\n  var xmlTagStart = new RegExp(\"<(/?)([\" + nameStartChar + \"][\" + nameChar + \"]*)\", \"g\");\n\n  function Iter(cm, line, ch, range) {\n    this.line = line; this.ch = ch;\n    this.cm = cm; this.text = cm.getLine(line);\n    this.min = range ? Math.max(range.from, cm.firstLine()) : cm.firstLine();\n    this.max = range ? Math.min(range.to - 1, cm.lastLine()) : cm.lastLine();\n  }\n\n  function tagAt(iter, ch) {\n    var type = iter.cm.getTokenTypeAt(Pos(iter.line, ch));\n    return type && /\\btag\\b/.test(type);\n  }\n\n  function nextLine(iter) {\n    if (iter.line >= iter.max) return;\n    iter.ch = 0;\n    iter.text = iter.cm.getLine(++iter.line);\n    return true;\n  }\n  function prevLine(iter) {\n    if (iter.line <= iter.min) return;\n    iter.text = iter.cm.getLine(--iter.line);\n    iter.ch = iter.text.length;\n    return true;\n  }\n\n  function toTagEnd(iter) {\n    for (;;) {\n      var gt = iter.text.indexOf(\">\", iter.ch);\n      if (gt == -1) { if (nextLine(iter)) continue; else return; }\n      if (!tagAt(iter, gt + 1)) { iter.ch = gt + 1; continue; }\n      var lastSlash = iter.text.lastIndexOf(\"/\", gt);\n      var selfClose = lastSlash > -1 && !/\\S/.test(iter.text.slice(lastSlash + 1, gt));\n      iter.ch = gt + 1;\n      return selfClose ? \"selfClose\" : \"regular\";\n    }\n  }\n  function toTagStart(iter) {\n    for (;;) {\n      var lt = iter.ch ? iter.text.lastIndexOf(\"<\", iter.ch - 1) : -1;\n      if (lt == -1) { if (prevLine(iter)) continue; else return; }\n      if (!tagAt(iter, lt + 1)) { iter.ch = lt; continue; }\n      xmlTagStart.lastIndex = lt;\n      iter.ch = lt;\n      var match = xmlTagStart.exec(iter.text);\n      if (match && match.index == lt) return match;\n    }\n  }\n\n  function toNextTag(iter) {\n    for (;;) {\n      xmlTagStart.lastIndex = iter.ch;\n      var found = xmlTagStart.exec(iter.text);\n      if (!found) { if (nextLine(iter)) continue; else return; }\n      if (!tagAt(iter, found.index + 1)) { iter.ch = found.index + 1; continue; }\n      iter.ch = found.index + found[0].length;\n      return found;\n    }\n  }\n  function toPrevTag(iter) {\n    for (;;) {\n      var gt = iter.ch ? iter.text.lastIndexOf(\">\", iter.ch - 1) : -1;\n      if (gt == -1) { if (prevLine(iter)) continue; else return; }\n      if (!tagAt(iter, gt + 1)) { iter.ch = gt; continue; }\n      var lastSlash = iter.text.lastIndexOf(\"/\", gt);\n      var selfClose = lastSlash > -1 && !/\\S/.test(iter.text.slice(lastSlash + 1, gt));\n      iter.ch = gt + 1;\n      return selfClose ? \"selfClose\" : \"regular\";\n    }\n  }\n\n  function findMatchingClose(iter, tag) {\n    var stack = [];\n    for (;;) {\n      var next = toNextTag(iter), end, startLine = iter.line, startCh = iter.ch - (next ? next[0].length : 0);\n      if (!next || !(end = toTagEnd(iter))) return;\n      if (end == \"selfClose\") continue;\n      if (next[1]) { // closing tag\n        for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == next[2]) {\n          stack.length = i;\n          break;\n        }\n        if (i < 0 && (!tag || tag == next[2])) return {\n          tag: next[2],\n          from: Pos(startLine, startCh),\n          to: Pos(iter.line, iter.ch)\n        };\n      } else { // opening tag\n        stack.push(next[2]);\n      }\n    }\n  }\n  function findMatchingOpen(iter, tag) {\n    var stack = [];\n    for (;;) {\n      var prev = toPrevTag(iter);\n      if (!prev) return;\n      if (prev == \"selfClose\") { toTagStart(iter); continue; }\n      var endLine = iter.line, endCh = iter.ch;\n      var start = toTagStart(iter);\n      if (!start) return;\n      if (start[1]) { // closing tag\n        stack.push(start[2]);\n      } else { // opening tag\n        for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == start[2]) {\n          stack.length = i;\n          break;\n        }\n        if (i < 0 && (!tag || tag == start[2])) return {\n          tag: start[2],\n          from: Pos(iter.line, iter.ch),\n          to: Pos(endLine, endCh)\n        };\n      }\n    }\n  }\n\n  CodeMirror.registerHelper(\"fold\", \"xml\", function(cm, start) {\n    var iter = new Iter(cm, start.line, 0);\n    for (;;) {\n      var openTag = toNextTag(iter), end;\n      if (!openTag || iter.line != start.line || !(end = toTagEnd(iter))) return;\n      if (!openTag[1] && end != \"selfClose\") {\n        var startPos = Pos(iter.line, iter.ch);\n        var endPos = findMatchingClose(iter, openTag[2]);\n        return endPos && {from: startPos, to: endPos.from};\n      }\n    }\n  });\n  CodeMirror.findMatchingTag = function(cm, pos, range) {\n    var iter = new Iter(cm, pos.line, pos.ch, range);\n    if (iter.text.indexOf(\">\") == -1 && iter.text.indexOf(\"<\") == -1) return;\n    var end = toTagEnd(iter), to = end && Pos(iter.line, iter.ch);\n    var start = end && toTagStart(iter);\n    if (!end || !start || cmp(iter, pos) > 0) return;\n    var here = {from: Pos(iter.line, iter.ch), to: to, tag: start[2]};\n    if (end == \"selfClose\") return {open: here, close: null, at: \"open\"};\n\n    if (start[1]) { // closing tag\n      return {open: findMatchingOpen(iter, start[2]), close: here, at: \"close\"};\n    } else { // opening tag\n      iter = new Iter(cm, to.line, to.ch, range);\n      return {open: here, close: findMatchingClose(iter, start[2]), at: \"open\"};\n    }\n  };\n\n  CodeMirror.findEnclosingTag = function(cm, pos, range) {\n    var iter = new Iter(cm, pos.line, pos.ch, range);\n    for (;;) {\n      var open = findMatchingOpen(iter);\n      if (!open) break;\n      var forward = new Iter(cm, pos.line, pos.ch, range);\n      var close = findMatchingClose(forward, open.tag);\n      if (close) return {open: open, close: close};\n    }\n  };\n\n  // Used by addon/edit/closetag.js\n  CodeMirror.scanForClosingTag = function(cm, pos, name, end) {\n    var iter = new Iter(cm, pos.line, pos.ch, end ? {from: 0, to: end} : null);\n    return findMatchingClose(iter, name);\n  };\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod((function(){try{return require('codemirror')}catch(e){return window.CodeMirror}})());\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nfunction expressionAllowed(stream, state, backUp) {\n  return /^(?:operator|sof|keyword c|case|new|[\\[{}\\(,;:]|=>)$/.test(state.lastType) ||\n    (state.lastType == \"quasi\" && /\\{\\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0))))\n}\n\nCodeMirror.defineMode(\"javascript\", function(config, parserConfig) {\n  var indentUnit = config.indentUnit;\n  var statementIndent = parserConfig.statementIndent;\n  var jsonldMode = parserConfig.jsonld;\n  var jsonMode = parserConfig.json || jsonldMode;\n  var isTS = parserConfig.typescript;\n  var wordRE = parserConfig.wordCharacters || /[\\w$\\xa1-\\uffff]/;\n\n  // Tokenizer\n\n  var keywords = function(){\n    function kw(type) {return {type: type, style: \"keyword\"};}\n    var A = kw(\"keyword a\"), B = kw(\"keyword b\"), C = kw(\"keyword c\");\n    var operator = kw(\"operator\"), atom = {type: \"atom\", style: \"atom\"};\n\n    var jsKeywords = {\n      \"if\": kw(\"if\"), \"while\": A, \"with\": A, \"else\": B, \"do\": B, \"try\": B, \"finally\": B,\n      \"return\": C, \"break\": C, \"continue\": C, \"new\": kw(\"new\"), \"delete\": C, \"throw\": C, \"debugger\": C,\n      \"var\": kw(\"var\"), \"const\": kw(\"var\"), \"let\": kw(\"var\"),\n      \"function\": kw(\"function\"), \"catch\": kw(\"catch\"),\n      \"for\": kw(\"for\"), \"switch\": kw(\"switch\"), \"case\": kw(\"case\"), \"default\": kw(\"default\"),\n      \"in\": operator, \"typeof\": operator, \"instanceof\": operator,\n      \"true\": atom, \"false\": atom, \"null\": atom, \"undefined\": atom, \"NaN\": atom, \"Infinity\": atom,\n      \"this\": kw(\"this\"), \"class\": kw(\"class\"), \"super\": kw(\"atom\"),\n      \"yield\": C, \"export\": kw(\"export\"), \"import\": kw(\"import\"), \"extends\": C,\n      \"await\": C, \"async\": kw(\"async\")\n    };\n\n    // Extend the 'normal' keywords with the TypeScript language extensions\n    if (isTS) {\n      var type = {type: \"variable\", style: \"variable-3\"};\n      var tsKeywords = {\n        // object-like things\n        \"interface\": kw(\"class\"),\n        \"implements\": C,\n        \"namespace\": C,\n        \"module\": kw(\"module\"),\n        \"enum\": kw(\"module\"),\n        \"type\": kw(\"type\"),\n\n        // scope modifiers\n        \"public\": kw(\"modifier\"),\n        \"private\": kw(\"modifier\"),\n        \"protected\": kw(\"modifier\"),\n        \"abstract\": kw(\"modifier\"),\n\n        // operators\n        \"as\": operator,\n\n        // types\n        \"string\": type, \"number\": type, \"boolean\": type, \"any\": type\n      };\n\n      for (var attr in tsKeywords) {\n        jsKeywords[attr] = tsKeywords[attr];\n      }\n    }\n\n    return jsKeywords;\n  }();\n\n  var isOperatorChar = /[+\\-*&%=<>!?|~^]/;\n  var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)\"/;\n\n  function readRegexp(stream) {\n    var escaped = false, next, inSet = false;\n    while ((next = stream.next()) != null) {\n      if (!escaped) {\n        if (next == \"/\" && !inSet) return;\n        if (next == \"[\") inSet = true;\n        else if (inSet && next == \"]\") inSet = false;\n      }\n      escaped = !escaped && next == \"\\\\\";\n    }\n  }\n\n  // Used as scratch variables to communicate multiple values without\n  // consing up tons of objects.\n  var type, content;\n  function ret(tp, style, cont) {\n    type = tp; content = cont;\n    return style;\n  }\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (ch == '\"' || ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    } else if (ch == \".\" && stream.match(/^\\d+(?:[eE][+\\-]?\\d+)?/)) {\n      return ret(\"number\", \"number\");\n    } else if (ch == \".\" && stream.match(\"..\")) {\n      return ret(\"spread\", \"meta\");\n    } else if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch)) {\n      return ret(ch);\n    } else if (ch == \"=\" && stream.eat(\">\")) {\n      return ret(\"=>\", \"operator\");\n    } else if (ch == \"0\" && stream.eat(/x/i)) {\n      stream.eatWhile(/[\\da-f]/i);\n      return ret(\"number\", \"number\");\n    } else if (ch == \"0\" && stream.eat(/o/i)) {\n      stream.eatWhile(/[0-7]/i);\n      return ret(\"number\", \"number\");\n    } else if (ch == \"0\" && stream.eat(/b/i)) {\n      stream.eatWhile(/[01]/i);\n      return ret(\"number\", \"number\");\n    } else if (/\\d/.test(ch)) {\n      stream.match(/^\\d*(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/);\n      return ret(\"number\", \"number\");\n    } else if (ch == \"/\") {\n      if (stream.eat(\"*\")) {\n        state.tokenize = tokenComment;\n        return tokenComment(stream, state);\n      } else if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return ret(\"comment\", \"comment\");\n      } else if (expressionAllowed(stream, state, 1)) {\n        readRegexp(stream);\n        stream.match(/^\\b(([gimyu])(?![gimyu]*\\2))+\\b/);\n        return ret(\"regexp\", \"string-2\");\n      } else {\n        stream.eatWhile(isOperatorChar);\n        return ret(\"operator\", \"operator\", stream.current());\n      }\n    } else if (ch == \"`\") {\n      state.tokenize = tokenQuasi;\n      return tokenQuasi(stream, state);\n    } else if (ch == \"#\") {\n      stream.skipToEnd();\n      return ret(\"error\", \"error\");\n    } else if (isOperatorChar.test(ch)) {\n      stream.eatWhile(isOperatorChar);\n      return ret(\"operator\", \"operator\", stream.current());\n    } else if (wordRE.test(ch)) {\n      stream.eatWhile(wordRE);\n      var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];\n      return (known && state.lastType != \".\") ? ret(known.type, known.style, word) :\n                     ret(\"variable\", \"variable\", word);\n    }\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next;\n      if (jsonldMode && stream.peek() == \"@\" && stream.match(isJsonldKeyword)){\n        state.tokenize = tokenBase;\n        return ret(\"jsonld-keyword\", \"meta\");\n      }\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) break;\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (!escaped) state.tokenize = tokenBase;\n      return ret(\"string\", \"string\");\n    };\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return ret(\"comment\", \"comment\");\n  }\n\n  function tokenQuasi(stream, state) {\n    var escaped = false, next;\n    while ((next = stream.next()) != null) {\n      if (!escaped && (next == \"`\" || next == \"$\" && stream.eat(\"{\"))) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      escaped = !escaped && next == \"\\\\\";\n    }\n    return ret(\"quasi\", \"string-2\", stream.current());\n  }\n\n  var brackets = \"([{}])\";\n  // This is a crude lookahead trick to try and notice that we're\n  // parsing the argument patterns for a fat-arrow function before we\n  // actually hit the arrow token. It only works if the arrow is on\n  // the same line as the arguments and there's no strange noise\n  // (comments) in between. Fallback is to only notice when we hit the\n  // arrow, and not declare the arguments as locals for the arrow\n  // body.\n  function findFatArrow(stream, state) {\n    if (state.fatArrowAt) state.fatArrowAt = null;\n    var arrow = stream.string.indexOf(\"=>\", stream.start);\n    if (arrow < 0) return;\n\n    var depth = 0, sawSomething = false;\n    for (var pos = arrow - 1; pos >= 0; --pos) {\n      var ch = stream.string.charAt(pos);\n      var bracket = brackets.indexOf(ch);\n      if (bracket >= 0 && bracket < 3) {\n        if (!depth) { ++pos; break; }\n        if (--depth == 0) { if (ch == \"(\") sawSomething = true; break; }\n      } else if (bracket >= 3 && bracket < 6) {\n        ++depth;\n      } else if (wordRE.test(ch)) {\n        sawSomething = true;\n      } else if (/[\"'\\/]/.test(ch)) {\n        return;\n      } else if (sawSomething && !depth) {\n        ++pos;\n        break;\n      }\n    }\n    if (sawSomething && !depth) state.fatArrowAt = pos;\n  }\n\n  // Parser\n\n  var atomicTypes = {\"atom\": true, \"number\": true, \"variable\": true, \"string\": true, \"regexp\": true, \"this\": true, \"jsonld-keyword\": true};\n\n  function JSLexical(indented, column, type, align, prev, info) {\n    this.indented = indented;\n    this.column = column;\n    this.type = type;\n    this.prev = prev;\n    this.info = info;\n    if (align != null) this.align = align;\n  }\n\n  function inScope(state, varname) {\n    for (var v = state.localVars; v; v = v.next)\n      if (v.name == varname) return true;\n    for (var cx = state.context; cx; cx = cx.prev) {\n      for (var v = cx.vars; v; v = v.next)\n        if (v.name == varname) return true;\n    }\n  }\n\n  function parseJS(state, style, type, content, stream) {\n    var cc = state.cc;\n    // Communicate our context to the combinators.\n    // (Less wasteful than consing up a hundred closures on every call.)\n    cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style;\n\n    if (!state.lexical.hasOwnProperty(\"align\"))\n      state.lexical.align = true;\n\n    while(true) {\n      var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;\n      if (combinator(type, content)) {\n        while(cc.length && cc[cc.length - 1].lex)\n          cc.pop()();\n        if (cx.marked) return cx.marked;\n        if (type == \"variable\" && inScope(state, content)) return \"variable-2\";\n        return style;\n      }\n    }\n  }\n\n  // Combinator utils\n\n  var cx = {state: null, column: null, marked: null, cc: null};\n  function pass() {\n    for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);\n  }\n  function cont() {\n    pass.apply(null, arguments);\n    return true;\n  }\n  function register(varname) {\n    function inList(list) {\n      for (var v = list; v; v = v.next)\n        if (v.name == varname) return true;\n      return false;\n    }\n    var state = cx.state;\n    cx.marked = \"def\";\n    if (state.context) {\n      if (inList(state.localVars)) return;\n      state.localVars = {name: varname, next: state.localVars};\n    } else {\n      if (inList(state.globalVars)) return;\n      if (parserConfig.globalVars)\n        state.globalVars = {name: varname, next: state.globalVars};\n    }\n  }\n\n  // Combinators\n\n  var defaultVars = {name: \"this\", next: {name: \"arguments\"}};\n  function pushcontext() {\n    cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};\n    cx.state.localVars = defaultVars;\n  }\n  function popcontext() {\n    cx.state.localVars = cx.state.context.vars;\n    cx.state.context = cx.state.context.prev;\n  }\n  function pushlex(type, info) {\n    var result = function() {\n      var state = cx.state, indent = state.indented;\n      if (state.lexical.type == \"stat\") indent = state.lexical.indented;\n      else for (var outer = state.lexical; outer && outer.type == \")\" && outer.align; outer = outer.prev)\n        indent = outer.indented;\n      state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info);\n    };\n    result.lex = true;\n    return result;\n  }\n  function poplex() {\n    var state = cx.state;\n    if (state.lexical.prev) {\n      if (state.lexical.type == \")\")\n        state.indented = state.lexical.indented;\n      state.lexical = state.lexical.prev;\n    }\n  }\n  poplex.lex = true;\n\n  function expect(wanted) {\n    function exp(type) {\n      if (type == wanted) return cont();\n      else if (wanted == \";\") return pass();\n      else return cont(exp);\n    };\n    return exp;\n  }\n\n  function statement(type, value) {\n    if (type == \"var\") return cont(pushlex(\"vardef\", value.length), vardef, expect(\";\"), poplex);\n    if (type == \"keyword a\") return cont(pushlex(\"form\"), parenExpr, statement, poplex);\n    if (type == \"keyword b\") return cont(pushlex(\"form\"), statement, poplex);\n    if (type == \"{\") return cont(pushlex(\"}\"), block, poplex);\n    if (type == \";\") return cont();\n    if (type == \"if\") {\n      if (cx.state.lexical.info == \"else\" && cx.state.cc[cx.state.cc.length - 1] == poplex)\n        cx.state.cc.pop()();\n      return cont(pushlex(\"form\"), parenExpr, statement, poplex, maybeelse);\n    }\n    if (type == \"function\") return cont(functiondef);\n    if (type == \"for\") return cont(pushlex(\"form\"), forspec, statement, poplex);\n    if (type == \"variable\") return cont(pushlex(\"stat\"), maybelabel);\n    if (type == \"switch\") return cont(pushlex(\"form\"), parenExpr, pushlex(\"}\", \"switch\"), expect(\"{\"),\n                                      block, poplex, poplex);\n    if (type == \"case\") return cont(expression, expect(\":\"));\n    if (type == \"default\") return cont(expect(\":\"));\n    if (type == \"catch\") return cont(pushlex(\"form\"), pushcontext, expect(\"(\"), funarg, expect(\")\"),\n                                     statement, poplex, popcontext);\n    if (type == \"class\") return cont(pushlex(\"form\"), className, poplex);\n    if (type == \"export\") return cont(pushlex(\"stat\"), afterExport, poplex);\n    if (type == \"import\") return cont(pushlex(\"stat\"), afterImport, poplex);\n    if (type == \"module\") return cont(pushlex(\"form\"), pattern, pushlex(\"}\"), expect(\"{\"), block, poplex, poplex)\n    if (type == \"type\") return cont(typeexpr, expect(\"operator\"), typeexpr, expect(\";\"));\n    if (type == \"async\") return cont(statement)\n    return pass(pushlex(\"stat\"), expression, expect(\";\"), poplex);\n  }\n  function expression(type) {\n    return expressionInner(type, false);\n  }\n  function expressionNoComma(type) {\n    return expressionInner(type, true);\n  }\n  function parenExpr(type) {\n    if (type != \"(\") return pass()\n    return cont(pushlex(\")\"), expression, expect(\")\"), poplex)\n  }\n  function expressionInner(type, noComma) {\n    if (cx.state.fatArrowAt == cx.stream.start) {\n      var body = noComma ? arrowBodyNoComma : arrowBody;\n      if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(pattern, \")\"), poplex, expect(\"=>\"), body, popcontext);\n      else if (type == \"variable\") return pass(pushcontext, pattern, expect(\"=>\"), body, popcontext);\n    }\n\n    var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma;\n    if (atomicTypes.hasOwnProperty(type)) return cont(maybeop);\n    if (type == \"function\") return cont(functiondef, maybeop);\n    if (type == \"keyword c\" || type == \"async\") return cont(noComma ? maybeexpressionNoComma : maybeexpression);\n    if (type == \"(\") return cont(pushlex(\")\"), maybeexpression, expect(\")\"), poplex, maybeop);\n    if (type == \"operator\" || type == \"spread\") return cont(noComma ? expressionNoComma : expression);\n    if (type == \"[\") return cont(pushlex(\"]\"), arrayLiteral, poplex, maybeop);\n    if (type == \"{\") return contCommasep(objprop, \"}\", null, maybeop);\n    if (type == \"quasi\") return pass(quasi, maybeop);\n    if (type == \"new\") return cont(maybeTarget(noComma));\n    return cont();\n  }\n  function maybeexpression(type) {\n    if (type.match(/[;\\}\\)\\],]/)) return pass();\n    return pass(expression);\n  }\n  function maybeexpressionNoComma(type) {\n    if (type.match(/[;\\}\\)\\],]/)) return pass();\n    return pass(expressionNoComma);\n  }\n\n  function maybeoperatorComma(type, value) {\n    if (type == \",\") return cont(expression);\n    return maybeoperatorNoComma(type, value, false);\n  }\n  function maybeoperatorNoComma(type, value, noComma) {\n    var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma;\n    var expr = noComma == false ? expression : expressionNoComma;\n    if (type == \"=>\") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);\n    if (type == \"operator\") {\n      if (/\\+\\+|--/.test(value)) return cont(me);\n      if (value == \"?\") return cont(expression, expect(\":\"), expr);\n      return cont(expr);\n    }\n    if (type == \"quasi\") { return pass(quasi, me); }\n    if (type == \";\") return;\n    if (type == \"(\") return contCommasep(expressionNoComma, \")\", \"call\", me);\n    if (type == \".\") return cont(property, me);\n    if (type == \"[\") return cont(pushlex(\"]\"), maybeexpression, expect(\"]\"), poplex, me);\n  }\n  function quasi(type, value) {\n    if (type != \"quasi\") return pass();\n    if (value.slice(value.length - 2) != \"${\") return cont(quasi);\n    return cont(expression, continueQuasi);\n  }\n  function continueQuasi(type) {\n    if (type == \"}\") {\n      cx.marked = \"string-2\";\n      cx.state.tokenize = tokenQuasi;\n      return cont(quasi);\n    }\n  }\n  function arrowBody(type) {\n    findFatArrow(cx.stream, cx.state);\n    return pass(type == \"{\" ? statement : expression);\n  }\n  function arrowBodyNoComma(type) {\n    findFatArrow(cx.stream, cx.state);\n    return pass(type == \"{\" ? statement : expressionNoComma);\n  }\n  function maybeTarget(noComma) {\n    return function(type) {\n      if (type == \".\") return cont(noComma ? targetNoComma : target);\n      else return pass(noComma ? expressionNoComma : expression);\n    };\n  }\n  function target(_, value) {\n    if (value == \"target\") { cx.marked = \"keyword\"; return cont(maybeoperatorComma); }\n  }\n  function targetNoComma(_, value) {\n    if (value == \"target\") { cx.marked = \"keyword\"; return cont(maybeoperatorNoComma); }\n  }\n  function maybelabel(type) {\n    if (type == \":\") return cont(poplex, statement);\n    return pass(maybeoperatorComma, expect(\";\"), poplex);\n  }\n  function property(type) {\n    if (type == \"variable\") {cx.marked = \"property\"; return cont();}\n  }\n  function objprop(type, value) {\n    if (type == \"async\") {\n      cx.marked = \"property\";\n      return cont(objprop);\n    } else if (type == \"variable\" || cx.style == \"keyword\") {\n      cx.marked = \"property\";\n      if (value == \"get\" || value == \"set\") return cont(getterSetter);\n      return cont(afterprop);\n    } else if (type == \"number\" || type == \"string\") {\n      cx.marked = jsonldMode ? \"property\" : (cx.style + \" property\");\n      return cont(afterprop);\n    } else if (type == \"jsonld-keyword\") {\n      return cont(afterprop);\n    } else if (type == \"modifier\") {\n      return cont(objprop)\n    } else if (type == \"[\") {\n      return cont(expression, expect(\"]\"), afterprop);\n    } else if (type == \"spread\") {\n      return cont(expression);\n    } else if (type == \":\") {\n      return pass(afterprop)\n    }\n  }\n  function getterSetter(type) {\n    if (type != \"variable\") return pass(afterprop);\n    cx.marked = \"property\";\n    return cont(functiondef);\n  }\n  function afterprop(type) {\n    if (type == \":\") return cont(expressionNoComma);\n    if (type == \"(\") return pass(functiondef);\n  }\n  function commasep(what, end) {\n    function proceed(type, value) {\n      if (type == \",\") {\n        var lex = cx.state.lexical;\n        if (lex.info == \"call\") lex.pos = (lex.pos || 0) + 1;\n        return cont(function(type, value) {\n          if (type == end || value == end) return pass()\n          return pass(what)\n        }, proceed);\n      }\n      if (type == end || value == end) return cont();\n      return cont(expect(end));\n    }\n    return function(type, value) {\n      if (type == end || value == end) return cont();\n      return pass(what, proceed);\n    };\n  }\n  function contCommasep(what, end, info) {\n    for (var i = 3; i < arguments.length; i++)\n      cx.cc.push(arguments[i]);\n    return cont(pushlex(end, info), commasep(what, end), poplex);\n  }\n  function block(type) {\n    if (type == \"}\") return cont();\n    return pass(statement, block);\n  }\n  function maybetype(type, value) {\n    if (isTS) {\n      if (type == \":\") return cont(typeexpr);\n      if (value == \"?\") return cont(maybetype);\n    }\n  }\n  function maybedefault(_, value) {\n    if (value == \"=\") return cont(expressionNoComma);\n  }\n  function typeexpr(type) {\n    if (type == \"variable\") {cx.marked = \"variable-3\"; return cont(afterType);}\n    if (type == \"{\") return cont(commasep(typeprop, \"}\"))\n    if (type == \"(\") return cont(commasep(typearg, \")\"), maybeReturnType)\n  }\n  function maybeReturnType(type) {\n    if (type == \"=>\") return cont(typeexpr)\n  }\n  function typeprop(type) {\n    if (type == \"variable\" || cx.style == \"keyword\") {\n      cx.marked = \"property\"\n      return cont(typeprop)\n    } else if (type == \":\") {\n      return cont(typeexpr)\n    }\n  }\n  function typearg(type) {\n    if (type == \"variable\") return cont(typearg)\n    else if (type == \":\") return cont(typeexpr)\n  }\n  function afterType(type, value) {\n    if (value == \"<\") return cont(commasep(typeexpr, \">\"), afterType)\n    if (type == \"[\") return cont(expect(\"]\"), afterType)\n  }\n  function vardef() {\n    return pass(pattern, maybetype, maybeAssign, vardefCont);\n  }\n  function pattern(type, value) {\n    if (type == \"modifier\") return cont(pattern)\n    if (type == \"variable\") { register(value); return cont(); }\n    if (type == \"spread\") return cont(pattern);\n    if (type == \"[\") return contCommasep(pattern, \"]\");\n    if (type == \"{\") return contCommasep(proppattern, \"}\");\n  }\n  function proppattern(type, value) {\n    if (type == \"variable\" && !cx.stream.match(/^\\s*:/, false)) {\n      register(value);\n      return cont(maybeAssign);\n    }\n    if (type == \"variable\") cx.marked = \"property\";\n    if (type == \"spread\") return cont(pattern);\n    if (type == \"}\") return pass();\n    return cont(expect(\":\"), pattern, maybeAssign);\n  }\n  function maybeAssign(_type, value) {\n    if (value == \"=\") return cont(expressionNoComma);\n  }\n  function vardefCont(type) {\n    if (type == \",\") return cont(vardef);\n  }\n  function maybeelse(type, value) {\n    if (type == \"keyword b\" && value == \"else\") return cont(pushlex(\"form\", \"else\"), statement, poplex);\n  }\n  function forspec(type) {\n    if (type == \"(\") return cont(pushlex(\")\"), forspec1, expect(\")\"), poplex);\n  }\n  function forspec1(type) {\n    if (type == \"var\") return cont(vardef, expect(\";\"), forspec2);\n    if (type == \";\") return cont(forspec2);\n    if (type == \"variable\") return cont(formaybeinof);\n    return pass(expression, expect(\";\"), forspec2);\n  }\n  function formaybeinof(_type, value) {\n    if (value == \"in\" || value == \"of\") { cx.marked = \"keyword\"; return cont(expression); }\n    return cont(maybeoperatorComma, forspec2);\n  }\n  function forspec2(type, value) {\n    if (type == \";\") return cont(forspec3);\n    if (value == \"in\" || value == \"of\") { cx.marked = \"keyword\"; return cont(expression); }\n    return pass(expression, expect(\";\"), forspec3);\n  }\n  function forspec3(type) {\n    if (type != \")\") cont(expression);\n  }\n  function functiondef(type, value) {\n    if (value == \"*\") {cx.marked = \"keyword\"; return cont(functiondef);}\n    if (type == \"variable\") {register(value); return cont(functiondef);}\n    if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(funarg, \")\"), poplex, maybetype, statement, popcontext);\n  }\n  function funarg(type) {\n    if (type == \"spread\") return cont(funarg);\n    return pass(pattern, maybetype, maybedefault);\n  }\n  function className(type, value) {\n    if (type == \"variable\") {register(value); return cont(classNameAfter);}\n  }\n  function classNameAfter(type, value) {\n    if (value == \"extends\") return cont(isTS ? typeexpr : expression, classNameAfter);\n    if (type == \"{\") return cont(pushlex(\"}\"), classBody, poplex);\n  }\n  function classBody(type, value) {\n    if (type == \"variable\" || cx.style == \"keyword\") {\n      if ((value == \"static\" || value == \"get\" || value == \"set\" ||\n           (isTS && (value == \"public\" || value == \"private\" || value == \"protected\"))) &&\n          cx.stream.match(/^\\s+[\\w$\\xa1-\\uffff]/, false)) {\n        cx.marked = \"keyword\";\n        return cont(classBody);\n      }\n      cx.marked = \"property\";\n      return cont(isTS ? classfield : functiondef, classBody);\n    }\n    if (value == \"*\") {\n      cx.marked = \"keyword\";\n      return cont(classBody);\n    }\n    if (type == \";\") return cont(classBody);\n    if (type == \"}\") return cont();\n  }\n  function classfield(type) {\n    if (type == \":\") return cont(typeexpr)\n    return pass(functiondef)\n  }\n  function afterExport(_type, value) {\n    if (value == \"*\") { cx.marked = \"keyword\"; return cont(maybeFrom, expect(\";\")); }\n    if (value == \"default\") { cx.marked = \"keyword\"; return cont(expression, expect(\";\")); }\n    return pass(statement);\n  }\n  function afterImport(type) {\n    if (type == \"string\") return cont();\n    return pass(importSpec, maybeFrom);\n  }\n  function importSpec(type, value) {\n    if (type == \"{\") return contCommasep(importSpec, \"}\");\n    if (type == \"variable\") register(value);\n    if (value == \"*\") cx.marked = \"keyword\";\n    return cont(maybeAs);\n  }\n  function maybeAs(_type, value) {\n    if (value == \"as\") { cx.marked = \"keyword\"; return cont(importSpec); }\n  }\n  function maybeFrom(_type, value) {\n    if (value == \"from\") { cx.marked = \"keyword\"; return cont(expression); }\n  }\n  function arrayLiteral(type) {\n    if (type == \"]\") return cont();\n    return pass(commasep(expressionNoComma, \"]\"));\n  }\n\n  function isContinuedStatement(state, textAfter) {\n    return state.lastType == \"operator\" || state.lastType == \",\" ||\n      isOperatorChar.test(textAfter.charAt(0)) ||\n      /[,.]/.test(textAfter.charAt(0));\n  }\n\n  // Interface\n\n  return {\n    startState: function(basecolumn) {\n      var state = {\n        tokenize: tokenBase,\n        lastType: \"sof\",\n        cc: [],\n        lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, \"block\", false),\n        localVars: parserConfig.localVars,\n        context: parserConfig.localVars && {vars: parserConfig.localVars},\n        indented: basecolumn || 0\n      };\n      if (parserConfig.globalVars && typeof parserConfig.globalVars == \"object\")\n        state.globalVars = parserConfig.globalVars;\n      return state;\n    },\n\n    token: function(stream, state) {\n      if (stream.sol()) {\n        if (!state.lexical.hasOwnProperty(\"align\"))\n          state.lexical.align = false;\n        state.indented = stream.indentation();\n        findFatArrow(stream, state);\n      }\n      if (state.tokenize != tokenComment && stream.eatSpace()) return null;\n      var style = state.tokenize(stream, state);\n      if (type == \"comment\") return style;\n      state.lastType = type == \"operator\" && (content == \"++\" || content == \"--\") ? \"incdec\" : type;\n      return parseJS(state, style, type, content, stream);\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize == tokenComment) return CodeMirror.Pass;\n      if (state.tokenize != tokenBase) return 0;\n      var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical, top\n      // Kludge to prevent 'maybelse' from blocking lexical scope pops\n      if (!/^\\s*else\\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) {\n        var c = state.cc[i];\n        if (c == poplex) lexical = lexical.prev;\n        else if (c != maybeelse) break;\n      }\n      while ((lexical.type == \"stat\" || lexical.type == \"form\") &&\n             (firstChar == \"}\" || ((top = state.cc[state.cc.length - 1]) &&\n                                   (top == maybeoperatorComma || top == maybeoperatorNoComma) &&\n                                   !/^[,\\.=+\\-*:?[\\(]/.test(textAfter))))\n        lexical = lexical.prev;\n      if (statementIndent && lexical.type == \")\" && lexical.prev.type == \"stat\")\n        lexical = lexical.prev;\n      var type = lexical.type, closing = firstChar == type;\n\n      if (type == \"vardef\") return lexical.indented + (state.lastType == \"operator\" || state.lastType == \",\" ? lexical.info + 1 : 0);\n      else if (type == \"form\" && firstChar == \"{\") return lexical.indented;\n      else if (type == \"form\") return lexical.indented + indentUnit;\n      else if (type == \"stat\")\n        return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0);\n      else if (lexical.info == \"switch\" && !closing && parserConfig.doubleIndentSwitch != false)\n        return lexical.indented + (/^(?:case|default)\\b/.test(textAfter) ? indentUnit : 2 * indentUnit);\n      else if (lexical.align) return lexical.column + (closing ? 0 : 1);\n      else return lexical.indented + (closing ? 0 : indentUnit);\n    },\n\n    electricInput: /^\\s*(?:case .*?:|default:|\\{|\\})$/,\n    blockCommentStart: jsonMode ? null : \"/*\",\n    blockCommentEnd: jsonMode ? null : \"*/\",\n    lineComment: jsonMode ? null : \"//\",\n    fold: \"brace\",\n    closeBrackets: \"()[]{}''\\\"\\\"``\",\n\n    helperType: jsonMode ? \"json\" : \"javascript\",\n    jsonldMode: jsonldMode,\n    jsonMode: jsonMode,\n\n    expressionAllowed: expressionAllowed,\n    skipExpression: function(state) {\n      var top = state.cc[state.cc.length - 1]\n      if (top == expression || top == expressionNoComma) state.cc.pop()\n    }\n  };\n});\n\nCodeMirror.registerHelper(\"wordChars\", \"javascript\", /[\\w$]/);\n\nCodeMirror.defineMIME(\"text/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"text/ecmascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/x-javascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/ecmascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/json\", {name: \"javascript\", json: true});\nCodeMirror.defineMIME(\"application/x-json\", {name: \"javascript\", json: true});\nCodeMirror.defineMIME(\"application/ld+json\", {name: \"javascript\", jsonld: true});\nCodeMirror.defineMIME(\"text/typescript\", { name: \"javascript\", typescript: true });\nCodeMirror.defineMIME(\"application/typescript\", { name: \"javascript\", typescript: true });\n\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod((function(){try{return require('codemirror')}catch(e){return window.CodeMirror}})());\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nvar htmlConfig = {\n  autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true,\n                    'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true,\n                    'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true,\n                    'track': true, 'wbr': true, 'menuitem': true},\n  implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true,\n                     'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true,\n                     'th': true, 'tr': true},\n  contextGrabbers: {\n    'dd': {'dd': true, 'dt': true},\n    'dt': {'dd': true, 'dt': true},\n    'li': {'li': true},\n    'option': {'option': true, 'optgroup': true},\n    'optgroup': {'optgroup': true},\n    'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true,\n          'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true,\n          'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true,\n          'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true,\n          'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true},\n    'rp': {'rp': true, 'rt': true},\n    'rt': {'rp': true, 'rt': true},\n    'tbody': {'tbody': true, 'tfoot': true},\n    'td': {'td': true, 'th': true},\n    'tfoot': {'tbody': true},\n    'th': {'td': true, 'th': true},\n    'thead': {'tbody': true, 'tfoot': true},\n    'tr': {'tr': true}\n  },\n  doNotIndent: {\"pre\": true},\n  allowUnquoted: true,\n  allowMissing: true,\n  caseFold: true\n}\n\nvar xmlConfig = {\n  autoSelfClosers: {},\n  implicitlyClosed: {},\n  contextGrabbers: {},\n  doNotIndent: {},\n  allowUnquoted: false,\n  allowMissing: false,\n  caseFold: false\n}\n\nCodeMirror.defineMode(\"xml\", function(editorConf, config_) {\n  var indentUnit = editorConf.indentUnit\n  var config = {}\n  var defaults = config_.htmlMode ? htmlConfig : xmlConfig\n  for (var prop in defaults) config[prop] = defaults[prop]\n  for (var prop in config_) config[prop] = config_[prop]\n\n  // Return variables for tokenizers\n  var type, setStyle;\n\n  function inText(stream, state) {\n    function chain(parser) {\n      state.tokenize = parser;\n      return parser(stream, state);\n    }\n\n    var ch = stream.next();\n    if (ch == \"<\") {\n      if (stream.eat(\"!\")) {\n        if (stream.eat(\"[\")) {\n          if (stream.match(\"CDATA[\")) return chain(inBlock(\"atom\", \"]]>\"));\n          else return null;\n        } else if (stream.match(\"--\")) {\n          return chain(inBlock(\"comment\", \"-->\"));\n        } else if (stream.match(\"DOCTYPE\", true, true)) {\n          stream.eatWhile(/[\\w\\._\\-]/);\n          return chain(doctype(1));\n        } else {\n          return null;\n        }\n      } else if (stream.eat(\"?\")) {\n        stream.eatWhile(/[\\w\\._\\-]/);\n        state.tokenize = inBlock(\"meta\", \"?>\");\n        return \"meta\";\n      } else {\n        type = stream.eat(\"/\") ? \"closeTag\" : \"openTag\";\n        state.tokenize = inTag;\n        return \"tag bracket\";\n      }\n    } else if (ch == \"&\") {\n      var ok;\n      if (stream.eat(\"#\")) {\n        if (stream.eat(\"x\")) {\n          ok = stream.eatWhile(/[a-fA-F\\d]/) && stream.eat(\";\");\n        } else {\n          ok = stream.eatWhile(/[\\d]/) && stream.eat(\";\");\n        }\n      } else {\n        ok = stream.eatWhile(/[\\w\\.\\-:]/) && stream.eat(\";\");\n      }\n      return ok ? \"atom\" : \"error\";\n    } else {\n      stream.eatWhile(/[^&<]/);\n      return null;\n    }\n  }\n  inText.isInText = true;\n\n  function inTag(stream, state) {\n    var ch = stream.next();\n    if (ch == \">\" || (ch == \"/\" && stream.eat(\">\"))) {\n      state.tokenize = inText;\n      type = ch == \">\" ? \"endTag\" : \"selfcloseTag\";\n      return \"tag bracket\";\n    } else if (ch == \"=\") {\n      type = \"equals\";\n      return null;\n    } else if (ch == \"<\") {\n      state.tokenize = inText;\n      state.state = baseState;\n      state.tagName = state.tagStart = null;\n      var next = state.tokenize(stream, state);\n      return next ? next + \" tag error\" : \"tag error\";\n    } else if (/[\\'\\\"]/.test(ch)) {\n      state.tokenize = inAttribute(ch);\n      state.stringStartCol = stream.column();\n      return state.tokenize(stream, state);\n    } else {\n      stream.match(/^[^\\s\\u00a0=<>\\\"\\']*[^\\s\\u00a0=<>\\\"\\'\\/]/);\n      return \"word\";\n    }\n  }\n\n  function inAttribute(quote) {\n    var closure = function(stream, state) {\n      while (!stream.eol()) {\n        if (stream.next() == quote) {\n          state.tokenize = inTag;\n          break;\n        }\n      }\n      return \"string\";\n    };\n    closure.isInAttribute = true;\n    return closure;\n  }\n\n  function inBlock(style, terminator) {\n    return function(stream, state) {\n      while (!stream.eol()) {\n        if (stream.match(terminator)) {\n          state.tokenize = inText;\n          break;\n        }\n        stream.next();\n      }\n      return style;\n    };\n  }\n  function doctype(depth) {\n    return function(stream, state) {\n      var ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == \"<\") {\n          state.tokenize = doctype(depth + 1);\n          return state.tokenize(stream, state);\n        } else if (ch == \">\") {\n          if (depth == 1) {\n            state.tokenize = inText;\n            break;\n          } else {\n            state.tokenize = doctype(depth - 1);\n            return state.tokenize(stream, state);\n          }\n        }\n      }\n      return \"meta\";\n    };\n  }\n\n  function Context(state, tagName, startOfLine) {\n    this.prev = state.context;\n    this.tagName = tagName;\n    this.indent = state.indented;\n    this.startOfLine = startOfLine;\n    if (config.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent))\n      this.noIndent = true;\n  }\n  function popContext(state) {\n    if (state.context) state.context = state.context.prev;\n  }\n  function maybePopContext(state, nextTagName) {\n    var parentTagName;\n    while (true) {\n      if (!state.context) {\n        return;\n      }\n      parentTagName = state.context.tagName;\n      if (!config.contextGrabbers.hasOwnProperty(parentTagName) ||\n          !config.contextGrabbers[parentTagName].hasOwnProperty(nextTagName)) {\n        return;\n      }\n      popContext(state);\n    }\n  }\n\n  function baseState(type, stream, state) {\n    if (type == \"openTag\") {\n      state.tagStart = stream.column();\n      return tagNameState;\n    } else if (type == \"closeTag\") {\n      return closeTagNameState;\n    } else {\n      return baseState;\n    }\n  }\n  function tagNameState(type, stream, state) {\n    if (type == \"word\") {\n      state.tagName = stream.current();\n      setStyle = \"tag\";\n      return attrState;\n    } else {\n      setStyle = \"error\";\n      return tagNameState;\n    }\n  }\n  function closeTagNameState(type, stream, state) {\n    if (type == \"word\") {\n      var tagName = stream.current();\n      if (state.context && state.context.tagName != tagName &&\n          config.implicitlyClosed.hasOwnProperty(state.context.tagName))\n        popContext(state);\n      if ((state.context && state.context.tagName == tagName) || config.matchClosing === false) {\n        setStyle = \"tag\";\n        return closeState;\n      } else {\n        setStyle = \"tag error\";\n        return closeStateErr;\n      }\n    } else {\n      setStyle = \"error\";\n      return closeStateErr;\n    }\n  }\n\n  function closeState(type, _stream, state) {\n    if (type != \"endTag\") {\n      setStyle = \"error\";\n      return closeState;\n    }\n    popContext(state);\n    return baseState;\n  }\n  function closeStateErr(type, stream, state) {\n    setStyle = \"error\";\n    return closeState(type, stream, state);\n  }\n\n  function attrState(type, _stream, state) {\n    if (type == \"word\") {\n      setStyle = \"attribute\";\n      return attrEqState;\n    } else if (type == \"endTag\" || type == \"selfcloseTag\") {\n      var tagName = state.tagName, tagStart = state.tagStart;\n      state.tagName = state.tagStart = null;\n      if (type == \"selfcloseTag\" ||\n          config.autoSelfClosers.hasOwnProperty(tagName)) {\n        maybePopContext(state, tagName);\n      } else {\n        maybePopContext(state, tagName);\n        state.context = new Context(state, tagName, tagStart == state.indented);\n      }\n      return baseState;\n    }\n    setStyle = \"error\";\n    return attrState;\n  }\n  function attrEqState(type, stream, state) {\n    if (type == \"equals\") return attrValueState;\n    if (!config.allowMissing) setStyle = \"error\";\n    return attrState(type, stream, state);\n  }\n  function attrValueState(type, stream, state) {\n    if (type == \"string\") return attrContinuedState;\n    if (type == \"word\" && config.allowUnquoted) {setStyle = \"string\"; return attrState;}\n    setStyle = \"error\";\n    return attrState(type, stream, state);\n  }\n  function attrContinuedState(type, stream, state) {\n    if (type == \"string\") return attrContinuedState;\n    return attrState(type, stream, state);\n  }\n\n  return {\n    startState: function(baseIndent) {\n      var state = {tokenize: inText,\n                   state: baseState,\n                   indented: baseIndent || 0,\n                   tagName: null, tagStart: null,\n                   context: null}\n      if (baseIndent != null) state.baseIndent = baseIndent\n      return state\n    },\n\n    token: function(stream, state) {\n      if (!state.tagName && stream.sol())\n        state.indented = stream.indentation();\n\n      if (stream.eatSpace()) return null;\n      type = null;\n      var style = state.tokenize(stream, state);\n      if ((style || type) && style != \"comment\") {\n        setStyle = null;\n        state.state = state.state(type || style, stream, state);\n        if (setStyle)\n          style = setStyle == \"error\" ? style + \" error\" : setStyle;\n      }\n      return style;\n    },\n\n    indent: function(state, textAfter, fullLine) {\n      var context = state.context;\n      // Indent multi-line strings (e.g. css).\n      if (state.tokenize.isInAttribute) {\n        if (state.tagStart == state.indented)\n          return state.stringStartCol + 1;\n        else\n          return state.indented + indentUnit;\n      }\n      if (context && context.noIndent) return CodeMirror.Pass;\n      if (state.tokenize != inTag && state.tokenize != inText)\n        return fullLine ? fullLine.match(/^(\\s*)/)[0].length : 0;\n      // Indent the starts of attribute names.\n      if (state.tagName) {\n        if (config.multilineTagIndentPastTag !== false)\n          return state.tagStart + state.tagName.length + 2;\n        else\n          return state.tagStart + indentUnit * (config.multilineTagIndentFactor || 1);\n      }\n      if (config.alignCDATA && /<!\\[CDATA\\[/.test(textAfter)) return 0;\n      var tagAfter = textAfter && /^<(\\/)?([\\w_:\\.-]*)/.exec(textAfter);\n      if (tagAfter && tagAfter[1]) { // Closing tag spotted\n        while (context) {\n          if (context.tagName == tagAfter[2]) {\n            context = context.prev;\n            break;\n          } else if (config.implicitlyClosed.hasOwnProperty(context.tagName)) {\n            context = context.prev;\n          } else {\n            break;\n          }\n        }\n      } else if (tagAfter) { // Opening tag spotted\n        while (context) {\n          var grabbers = config.contextGrabbers[context.tagName];\n          if (grabbers && grabbers.hasOwnProperty(tagAfter[2]))\n            context = context.prev;\n          else\n            break;\n        }\n      }\n      while (context && context.prev && !context.startOfLine)\n        context = context.prev;\n      if (context) return context.indent + indentUnit;\n      else return state.baseIndent || 0;\n    },\n\n    electricInput: /<\\/[\\s\\w:]+>$/,\n    blockCommentStart: \"<!--\",\n    blockCommentEnd: \"-->\",\n\n    configuration: config.htmlMode ? \"html\" : \"xml\",\n    helperType: config.htmlMode ? \"html\" : \"xml\",\n\n    skipAttribute: function(state) {\n      if (state.state == attrValueState)\n        state.state = attrState\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/xml\", \"xml\");\nCodeMirror.defineMIME(\"application/xml\", \"xml\");\nif (!CodeMirror.mimeModes.hasOwnProperty(\"text/html\"))\n  CodeMirror.defineMIME(\"text/html\", {name: \"xml\", htmlMode: true});\n\n});\n","/* MIT license */\nvar cssKeywords = require('color-name');\n\n// NOTE: conversions should only return primitive values (i.e. arrays, or\n//       values that give correct `typeof` results).\n//       do not use box values types (i.e. Number(), String(), etc.)\n\nvar reverseKeywords = {};\nfor (var key in cssKeywords) {\n\tif (cssKeywords.hasOwnProperty(key)) {\n\t\treverseKeywords[cssKeywords[key]] = key;\n\t}\n}\n\nvar convert = module.exports = {\n\trgb: {channels: 3, labels: 'rgb'},\n\thsl: {channels: 3, labels: 'hsl'},\n\thsv: {channels: 3, labels: 'hsv'},\n\thwb: {channels: 3, labels: 'hwb'},\n\tcmyk: {channels: 4, labels: 'cmyk'},\n\txyz: {channels: 3, labels: 'xyz'},\n\tlab: {channels: 3, labels: 'lab'},\n\tlch: {channels: 3, labels: 'lch'},\n\thex: {channels: 1, labels: ['hex']},\n\tkeyword: {channels: 1, labels: ['keyword']},\n\tansi16: {channels: 1, labels: ['ansi16']},\n\tansi256: {channels: 1, labels: ['ansi256']},\n\thcg: {channels: 3, labels: ['h', 'c', 'g']},\n\tapple: {channels: 3, labels: ['r16', 'g16', 'b16']},\n\tgray: {channels: 1, labels: ['gray']}\n};\n\n// hide .channels and .labels properties\nfor (var model in convert) {\n\tif (convert.hasOwnProperty(model)) {\n\t\tif (!('channels' in convert[model])) {\n\t\t\tthrow new Error('missing channels property: ' + model);\n\t\t}\n\n\t\tif (!('labels' in convert[model])) {\n\t\t\tthrow new Error('missing channel labels property: ' + model);\n\t\t}\n\n\t\tif (convert[model].labels.length !== convert[model].channels) {\n\t\t\tthrow new Error('channel and label counts mismatch: ' + model);\n\t\t}\n\n\t\tvar channels = convert[model].channels;\n\t\tvar labels = convert[model].labels;\n\t\tdelete convert[model].channels;\n\t\tdelete convert[model].labels;\n\t\tObject.defineProperty(convert[model], 'channels', {value: channels});\n\t\tObject.defineProperty(convert[model], 'labels', {value: labels});\n\t}\n}\n\nconvert.rgb.hsl = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar min = Math.min(r, g, b);\n\tvar max = Math.max(r, g, b);\n\tvar delta = max - min;\n\tvar h;\n\tvar s;\n\tvar l;\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tl = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t} else if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t} else {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n\nconvert.rgb.hsv = function (rgb) {\n\tvar r = rgb[0];\n\tvar g = rgb[1];\n\tvar b = rgb[2];\n\tvar min = Math.min(r, g, b);\n\tvar max = Math.max(r, g, b);\n\tvar delta = max - min;\n\tvar h;\n\tvar s;\n\tvar v;\n\n\tif (max === 0) {\n\t\ts = 0;\n\t} else {\n\t\ts = (delta / max * 1000) / 10;\n\t}\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tv = ((max / 255) * 1000) / 10;\n\n\treturn [h, s, v];\n};\n\nconvert.rgb.hwb = function (rgb) {\n\tvar r = rgb[0];\n\tvar g = rgb[1];\n\tvar b = rgb[2];\n\tvar h = convert.rgb.hsl(rgb)[0];\n\tvar w = 1 / 255 * Math.min(r, Math.min(g, b));\n\n\tb = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\treturn [h, w * 100, b * 100];\n};\n\nconvert.rgb.cmyk = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar c;\n\tvar m;\n\tvar y;\n\tvar k;\n\n\tk = Math.min(1 - r, 1 - g, 1 - b);\n\tc = (1 - r - k) / (1 - k) || 0;\n\tm = (1 - g - k) / (1 - k) || 0;\n\ty = (1 - b - k) / (1 - k) || 0;\n\n\treturn [c * 100, m * 100, y * 100, k * 100];\n};\n\n/**\n * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance\n * */\nfunction comparativeDistance(x, y) {\n\treturn (\n\t\tMath.pow(x[0] - y[0], 2) +\n\t\tMath.pow(x[1] - y[1], 2) +\n\t\tMath.pow(x[2] - y[2], 2)\n\t);\n}\n\nconvert.rgb.keyword = function (rgb) {\n\tvar reversed = reverseKeywords[rgb];\n\tif (reversed) {\n\t\treturn reversed;\n\t}\n\n\tvar currentClosestDistance = Infinity;\n\tvar currentClosestKeyword;\n\n\tfor (var keyword in cssKeywords) {\n\t\tif (cssKeywords.hasOwnProperty(keyword)) {\n\t\t\tvar value = cssKeywords[keyword];\n\n\t\t\t// Compute comparative distance\n\t\t\tvar distance = comparativeDistance(rgb, value);\n\n\t\t\t// Check if its less, if so set as closest\n\t\t\tif (distance < currentClosestDistance) {\n\t\t\t\tcurrentClosestDistance = distance;\n\t\t\t\tcurrentClosestKeyword = keyword;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn currentClosestKeyword;\n};\n\nconvert.keyword.rgb = function (keyword) {\n\treturn cssKeywords[keyword];\n};\n\nconvert.rgb.xyz = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\n\t// assume sRGB\n\tr = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\n\tvar x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n\tvar y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n\tvar z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n\treturn [x * 100, y * 100, z * 100];\n};\n\nconvert.rgb.lab = function (rgb) {\n\tvar xyz = convert.rgb.xyz(rgb);\n\tvar x = xyz[0];\n\tvar y = xyz[1];\n\tvar z = xyz[2];\n\tvar l;\n\tvar a;\n\tvar b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.hsl.rgb = function (hsl) {\n\tvar h = hsl[0] / 360;\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar t1;\n\tvar t2;\n\tvar t3;\n\tvar rgb;\n\tvar val;\n\n\tif (s === 0) {\n\t\tval = l * 255;\n\t\treturn [val, val, val];\n\t}\n\n\tif (l < 0.5) {\n\t\tt2 = l * (1 + s);\n\t} else {\n\t\tt2 = l + s - l * s;\n\t}\n\n\tt1 = 2 * l - t2;\n\n\trgb = [0, 0, 0];\n\tfor (var i = 0; i < 3; i++) {\n\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\tif (t3 < 0) {\n\t\t\tt3++;\n\t\t}\n\t\tif (t3 > 1) {\n\t\t\tt3--;\n\t\t}\n\n\t\tif (6 * t3 < 1) {\n\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t} else if (2 * t3 < 1) {\n\t\t\tval = t2;\n\t\t} else if (3 * t3 < 2) {\n\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t} else {\n\t\t\tval = t1;\n\t\t}\n\n\t\trgb[i] = val * 255;\n\t}\n\n\treturn rgb;\n};\n\nconvert.hsl.hsv = function (hsl) {\n\tvar h = hsl[0];\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar smin = s;\n\tvar lmin = Math.max(l, 0.01);\n\tvar sv;\n\tvar v;\n\n\tl *= 2;\n\ts *= (l <= 1) ? l : 2 - l;\n\tsmin *= lmin <= 1 ? lmin : 2 - lmin;\n\tv = (l + s) / 2;\n\tsv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);\n\n\treturn [h, sv * 100, v * 100];\n};\n\nconvert.hsv.rgb = function (hsv) {\n\tvar h = hsv[0] / 60;\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\tvar hi = Math.floor(h) % 6;\n\n\tvar f = h - Math.floor(h);\n\tvar p = 255 * v * (1 - s);\n\tvar q = 255 * v * (1 - (s * f));\n\tvar t = 255 * v * (1 - (s * (1 - f)));\n\tv *= 255;\n\n\tswitch (hi) {\n\t\tcase 0:\n\t\t\treturn [v, t, p];\n\t\tcase 1:\n\t\t\treturn [q, v, p];\n\t\tcase 2:\n\t\t\treturn [p, v, t];\n\t\tcase 3:\n\t\t\treturn [p, q, v];\n\t\tcase 4:\n\t\t\treturn [t, p, v];\n\t\tcase 5:\n\t\t\treturn [v, p, q];\n\t}\n};\n\nconvert.hsv.hsl = function (hsv) {\n\tvar h = hsv[0];\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\tvar vmin = Math.max(v, 0.01);\n\tvar lmin;\n\tvar sl;\n\tvar l;\n\n\tl = (2 - s) * v;\n\tlmin = (2 - s) * vmin;\n\tsl = s * vmin;\n\tsl /= (lmin <= 1) ? lmin : 2 - lmin;\n\tsl = sl || 0;\n\tl /= 2;\n\n\treturn [h, sl * 100, l * 100];\n};\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nconvert.hwb.rgb = function (hwb) {\n\tvar h = hwb[0] / 360;\n\tvar wh = hwb[1] / 100;\n\tvar bl = hwb[2] / 100;\n\tvar ratio = wh + bl;\n\tvar i;\n\tvar v;\n\tvar f;\n\tvar n;\n\n\t// wh + bl cant be > 1\n\tif (ratio > 1) {\n\t\twh /= ratio;\n\t\tbl /= ratio;\n\t}\n\n\ti = Math.floor(6 * h);\n\tv = 1 - bl;\n\tf = 6 * h - i;\n\n\tif ((i & 0x01) !== 0) {\n\t\tf = 1 - f;\n\t}\n\n\tn = wh + f * (v - wh); // linear interpolation\n\n\tvar r;\n\tvar g;\n\tvar b;\n\tswitch (i) {\n\t\tdefault:\n\t\tcase 6:\n\t\tcase 0: r = v; g = n; b = wh; break;\n\t\tcase 1: r = n; g = v; b = wh; break;\n\t\tcase 2: r = wh; g = v; b = n; break;\n\t\tcase 3: r = wh; g = n; b = v; break;\n\t\tcase 4: r = n; g = wh; b = v; break;\n\t\tcase 5: r = v; g = wh; b = n; break;\n\t}\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.cmyk.rgb = function (cmyk) {\n\tvar c = cmyk[0] / 100;\n\tvar m = cmyk[1] / 100;\n\tvar y = cmyk[2] / 100;\n\tvar k = cmyk[3] / 100;\n\tvar r;\n\tvar g;\n\tvar b;\n\n\tr = 1 - Math.min(1, c * (1 - k) + k);\n\tg = 1 - Math.min(1, m * (1 - k) + k);\n\tb = 1 - Math.min(1, y * (1 - k) + k);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.rgb = function (xyz) {\n\tvar x = xyz[0] / 100;\n\tvar y = xyz[1] / 100;\n\tvar z = xyz[2] / 100;\n\tvar r;\n\tvar g;\n\tvar b;\n\n\tr = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n\tg = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n\tb = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n\t// assume sRGB\n\tr = r > 0.0031308\n\t\t? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n\t\t: r * 12.92;\n\n\tg = g > 0.0031308\n\t\t? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n\t\t: g * 12.92;\n\n\tb = b > 0.0031308\n\t\t? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n\t\t: b * 12.92;\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.lab = function (xyz) {\n\tvar x = xyz[0];\n\tvar y = xyz[1];\n\tvar z = xyz[2];\n\tvar l;\n\tvar a;\n\tvar b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.lab.xyz = function (lab) {\n\tvar l = lab[0];\n\tvar a = lab[1];\n\tvar b = lab[2];\n\tvar x;\n\tvar y;\n\tvar z;\n\n\ty = (l + 16) / 116;\n\tx = a / 500 + y;\n\tz = y - b / 200;\n\n\tvar y2 = Math.pow(y, 3);\n\tvar x2 = Math.pow(x, 3);\n\tvar z2 = Math.pow(z, 3);\n\ty = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;\n\tx = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;\n\tz = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;\n\n\tx *= 95.047;\n\ty *= 100;\n\tz *= 108.883;\n\n\treturn [x, y, z];\n};\n\nconvert.lab.lch = function (lab) {\n\tvar l = lab[0];\n\tvar a = lab[1];\n\tvar b = lab[2];\n\tvar hr;\n\tvar h;\n\tvar c;\n\n\thr = Math.atan2(b, a);\n\th = hr * 360 / 2 / Math.PI;\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tc = Math.sqrt(a * a + b * b);\n\n\treturn [l, c, h];\n};\n\nconvert.lch.lab = function (lch) {\n\tvar l = lch[0];\n\tvar c = lch[1];\n\tvar h = lch[2];\n\tvar a;\n\tvar b;\n\tvar hr;\n\n\thr = h / 360 * 2 * Math.PI;\n\ta = c * Math.cos(hr);\n\tb = c * Math.sin(hr);\n\n\treturn [l, a, b];\n};\n\nconvert.rgb.ansi16 = function (args) {\n\tvar r = args[0];\n\tvar g = args[1];\n\tvar b = args[2];\n\tvar value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization\n\n\tvalue = Math.round(value / 50);\n\n\tif (value === 0) {\n\t\treturn 30;\n\t}\n\n\tvar ansi = 30\n\t\t+ ((Math.round(b / 255) << 2)\n\t\t| (Math.round(g / 255) << 1)\n\t\t| Math.round(r / 255));\n\n\tif (value === 2) {\n\t\tansi += 60;\n\t}\n\n\treturn ansi;\n};\n\nconvert.hsv.ansi16 = function (args) {\n\t// optimization here; we already know the value and don't need to get\n\t// it converted for us.\n\treturn convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n};\n\nconvert.rgb.ansi256 = function (args) {\n\tvar r = args[0];\n\tvar g = args[1];\n\tvar b = args[2];\n\n\t// we use the extended greyscale palette here, with the exception of\n\t// black and white. normal palette only has 4 greyscale shades.\n\tif (r === g && g === b) {\n\t\tif (r < 8) {\n\t\t\treturn 16;\n\t\t}\n\n\t\tif (r > 248) {\n\t\t\treturn 231;\n\t\t}\n\n\t\treturn Math.round(((r - 8) / 247) * 24) + 232;\n\t}\n\n\tvar ansi = 16\n\t\t+ (36 * Math.round(r / 255 * 5))\n\t\t+ (6 * Math.round(g / 255 * 5))\n\t\t+ Math.round(b / 255 * 5);\n\n\treturn ansi;\n};\n\nconvert.ansi16.rgb = function (args) {\n\tvar color = args % 10;\n\n\t// handle greyscale\n\tif (color === 0 || color === 7) {\n\t\tif (args > 50) {\n\t\t\tcolor += 3.5;\n\t\t}\n\n\t\tcolor = color / 10.5 * 255;\n\n\t\treturn [color, color, color];\n\t}\n\n\tvar mult = (~~(args > 50) + 1) * 0.5;\n\tvar r = ((color & 1) * mult) * 255;\n\tvar g = (((color >> 1) & 1) * mult) * 255;\n\tvar b = (((color >> 2) & 1) * mult) * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.ansi256.rgb = function (args) {\n\t// handle greyscale\n\tif (args >= 232) {\n\t\tvar c = (args - 232) * 10 + 8;\n\t\treturn [c, c, c];\n\t}\n\n\targs -= 16;\n\n\tvar rem;\n\tvar r = Math.floor(args / 36) / 5 * 255;\n\tvar g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n\tvar b = (rem % 6) / 5 * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hex = function (args) {\n\tvar integer = ((Math.round(args[0]) & 0xFF) << 16)\n\t\t+ ((Math.round(args[1]) & 0xFF) << 8)\n\t\t+ (Math.round(args[2]) & 0xFF);\n\n\tvar string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.hex.rgb = function (args) {\n\tvar match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);\n\tif (!match) {\n\t\treturn [0, 0, 0];\n\t}\n\n\tvar colorString = match[0];\n\n\tif (match[0].length === 3) {\n\t\tcolorString = colorString.split('').map(function (char) {\n\t\t\treturn char + char;\n\t\t}).join('');\n\t}\n\n\tvar integer = parseInt(colorString, 16);\n\tvar r = (integer >> 16) & 0xFF;\n\tvar g = (integer >> 8) & 0xFF;\n\tvar b = integer & 0xFF;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hcg = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar max = Math.max(Math.max(r, g), b);\n\tvar min = Math.min(Math.min(r, g), b);\n\tvar chroma = (max - min);\n\tvar grayscale;\n\tvar hue;\n\n\tif (chroma < 1) {\n\t\tgrayscale = min / (1 - chroma);\n\t} else {\n\t\tgrayscale = 0;\n\t}\n\n\tif (chroma <= 0) {\n\t\thue = 0;\n\t} else\n\tif (max === r) {\n\t\thue = ((g - b) / chroma) % 6;\n\t} else\n\tif (max === g) {\n\t\thue = 2 + (b - r) / chroma;\n\t} else {\n\t\thue = 4 + (r - g) / chroma + 4;\n\t}\n\n\thue /= 6;\n\thue %= 1;\n\n\treturn [hue * 360, chroma * 100, grayscale * 100];\n};\n\nconvert.hsl.hcg = function (hsl) {\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar c = 1;\n\tvar f = 0;\n\n\tif (l < 0.5) {\n\t\tc = 2.0 * s * l;\n\t} else {\n\t\tc = 2.0 * s * (1.0 - l);\n\t}\n\n\tif (c < 1.0) {\n\t\tf = (l - 0.5 * c) / (1.0 - c);\n\t}\n\n\treturn [hsl[0], c * 100, f * 100];\n};\n\nconvert.hsv.hcg = function (hsv) {\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\n\tvar c = s * v;\n\tvar f = 0;\n\n\tif (c < 1.0) {\n\t\tf = (v - c) / (1 - c);\n\t}\n\n\treturn [hsv[0], c * 100, f * 100];\n};\n\nconvert.hcg.rgb = function (hcg) {\n\tvar h = hcg[0] / 360;\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tif (c === 0.0) {\n\t\treturn [g * 255, g * 255, g * 255];\n\t}\n\n\tvar pure = [0, 0, 0];\n\tvar hi = (h % 1) * 6;\n\tvar v = hi % 1;\n\tvar w = 1 - v;\n\tvar mg = 0;\n\n\tswitch (Math.floor(hi)) {\n\t\tcase 0:\n\t\t\tpure[0] = 1; pure[1] = v; pure[2] = 0; break;\n\t\tcase 1:\n\t\t\tpure[0] = w; pure[1] = 1; pure[2] = 0; break;\n\t\tcase 2:\n\t\t\tpure[0] = 0; pure[1] = 1; pure[2] = v; break;\n\t\tcase 3:\n\t\t\tpure[0] = 0; pure[1] = w; pure[2] = 1; break;\n\t\tcase 4:\n\t\t\tpure[0] = v; pure[1] = 0; pure[2] = 1; break;\n\t\tdefault:\n\t\t\tpure[0] = 1; pure[1] = 0; pure[2] = w;\n\t}\n\n\tmg = (1.0 - c) * g;\n\n\treturn [\n\t\t(c * pure[0] + mg) * 255,\n\t\t(c * pure[1] + mg) * 255,\n\t\t(c * pure[2] + mg) * 255\n\t];\n};\n\nconvert.hcg.hsv = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tvar v = c + g * (1.0 - c);\n\tvar f = 0;\n\n\tif (v > 0.0) {\n\t\tf = c / v;\n\t}\n\n\treturn [hcg[0], f * 100, v * 100];\n};\n\nconvert.hcg.hsl = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tvar l = g * (1.0 - c) + 0.5 * c;\n\tvar s = 0;\n\n\tif (l > 0.0 && l < 0.5) {\n\t\ts = c / (2 * l);\n\t} else\n\tif (l >= 0.5 && l < 1.0) {\n\t\ts = c / (2 * (1 - l));\n\t}\n\n\treturn [hcg[0], s * 100, l * 100];\n};\n\nconvert.hcg.hwb = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\tvar v = c + g * (1.0 - c);\n\treturn [hcg[0], (v - c) * 100, (1 - v) * 100];\n};\n\nconvert.hwb.hcg = function (hwb) {\n\tvar w = hwb[1] / 100;\n\tvar b = hwb[2] / 100;\n\tvar v = 1 - b;\n\tvar c = v - w;\n\tvar g = 0;\n\n\tif (c < 1) {\n\t\tg = (v - c) / (1 - c);\n\t}\n\n\treturn [hwb[0], c * 100, g * 100];\n};\n\nconvert.apple.rgb = function (apple) {\n\treturn [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];\n};\n\nconvert.rgb.apple = function (rgb) {\n\treturn [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];\n};\n\nconvert.gray.rgb = function (args) {\n\treturn [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];\n};\n\nconvert.gray.hsl = convert.gray.hsv = function (args) {\n\treturn [0, 0, args[0]];\n};\n\nconvert.gray.hwb = function (gray) {\n\treturn [0, 100, gray[0]];\n};\n\nconvert.gray.cmyk = function (gray) {\n\treturn [0, 0, 0, gray[0]];\n};\n\nconvert.gray.lab = function (gray) {\n\treturn [gray[0], 0, 0];\n};\n\nconvert.gray.hex = function (gray) {\n\tvar val = Math.round(gray[0] / 100 * 255) & 0xFF;\n\tvar integer = (val << 16) + (val << 8) + val;\n\n\tvar string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.rgb.gray = function (rgb) {\n\tvar val = (rgb[0] + rgb[1] + rgb[2]) / 3;\n\treturn [val / 255 * 100];\n};\n","var conversions = require('./conversions');\nvar route = require('./route');\n\nvar convert = {};\n\nvar models = Object.keys(conversions);\n\nfunction wrapRaw(fn) {\n\tvar wrappedFn = function (args) {\n\t\tif (args === undefined || args === null) {\n\t\t\treturn args;\n\t\t}\n\n\t\tif (arguments.length > 1) {\n\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t}\n\n\t\treturn fn(args);\n\t};\n\n\t// preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nfunction wrapRounded(fn) {\n\tvar wrappedFn = function (args) {\n\t\tif (args === undefined || args === null) {\n\t\t\treturn args;\n\t\t}\n\n\t\tif (arguments.length > 1) {\n\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t}\n\n\t\tvar result = fn(args);\n\n\t\t// we're assuming the result is an array here.\n\t\t// see notice in conversions.js; don't use box types\n\t\t// in conversion functions.\n\t\tif (typeof result === 'object') {\n\t\t\tfor (var len = result.length, i = 0; i < len; i++) {\n\t\t\t\tresult[i] = Math.round(result[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t// preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nmodels.forEach(function (fromModel) {\n\tconvert[fromModel] = {};\n\n\tObject.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});\n\tObject.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});\n\n\tvar routes = route(fromModel);\n\tvar routeModels = Object.keys(routes);\n\n\trouteModels.forEach(function (toModel) {\n\t\tvar fn = routes[toModel];\n\n\t\tconvert[fromModel][toModel] = wrapRounded(fn);\n\t\tconvert[fromModel][toModel].raw = wrapRaw(fn);\n\t});\n});\n\nmodule.exports = convert;\n","var conversions = require('./conversions');\n\n/*\n\tthis function routes a model to all other models.\n\n\tall functions that are routed have a property `.conversion` attached\n\tto the returned synthetic function. This property is an array\n\tof strings, each with the steps in between the 'from' and 'to'\n\tcolor models (inclusive).\n\n\tconversions that are not possible simply are not included.\n*/\n\n// https://jsperf.com/object-keys-vs-for-in-with-closure/3\nvar models = Object.keys(conversions);\n\nfunction buildGraph() {\n\tvar graph = {};\n\n\tfor (var len = models.length, i = 0; i < len; i++) {\n\t\tgraph[models[i]] = {\n\t\t\t// http://jsperf.com/1-vs-infinity\n\t\t\t// micro-opt, but this is simple.\n\t\t\tdistance: -1,\n\t\t\tparent: null\n\t\t};\n\t}\n\n\treturn graph;\n}\n\n// https://en.wikipedia.org/wiki/Breadth-first_search\nfunction deriveBFS(fromModel) {\n\tvar graph = buildGraph();\n\tvar queue = [fromModel]; // unshift -> queue -> pop\n\n\tgraph[fromModel].distance = 0;\n\n\twhile (queue.length) {\n\t\tvar current = queue.pop();\n\t\tvar adjacents = Object.keys(conversions[current]);\n\n\t\tfor (var len = adjacents.length, i = 0; i < len; i++) {\n\t\t\tvar adjacent = adjacents[i];\n\t\t\tvar node = graph[adjacent];\n\n\t\t\tif (node.distance === -1) {\n\t\t\t\tnode.distance = graph[current].distance + 1;\n\t\t\t\tnode.parent = current;\n\t\t\t\tqueue.unshift(adjacent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn graph;\n}\n\nfunction link(from, to) {\n\treturn function (args) {\n\t\treturn to(from(args));\n\t};\n}\n\nfunction wrapConversion(toModel, graph) {\n\tvar path = [graph[toModel].parent, toModel];\n\tvar fn = conversions[graph[toModel].parent][toModel];\n\n\tvar cur = graph[toModel].parent;\n\twhile (graph[cur].parent) {\n\t\tpath.unshift(graph[cur].parent);\n\t\tfn = link(conversions[graph[cur].parent][cur], fn);\n\t\tcur = graph[cur].parent;\n\t}\n\n\tfn.conversion = path;\n\treturn fn;\n}\n\nmodule.exports = function (fromModel) {\n\tvar graph = deriveBFS(fromModel);\n\tvar conversion = {};\n\n\tvar models = Object.keys(graph);\n\tfor (var len = models.length, i = 0; i < len; i++) {\n\t\tvar toModel = models[i];\n\t\tvar node = graph[toModel];\n\n\t\tif (node.parent === null) {\n\t\t\t// no possible conversion, or this node is the source model.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconversion[toModel] = wrapConversion(toModel, graph);\n\t}\n\n\treturn conversion;\n};\n\n","module.exports = {\r\n\t\"aliceblue\": [240, 248, 255],\r\n\t\"antiquewhite\": [250, 235, 215],\r\n\t\"aqua\": [0, 255, 255],\r\n\t\"aquamarine\": [127, 255, 212],\r\n\t\"azure\": [240, 255, 255],\r\n\t\"beige\": [245, 245, 220],\r\n\t\"bisque\": [255, 228, 196],\r\n\t\"black\": [0, 0, 0],\r\n\t\"blanchedalmond\": [255, 235, 205],\r\n\t\"blue\": [0, 0, 255],\r\n\t\"blueviolet\": [138, 43, 226],\r\n\t\"brown\": [165, 42, 42],\r\n\t\"burlywood\": [222, 184, 135],\r\n\t\"cadetblue\": [95, 158, 160],\r\n\t\"chartreuse\": [127, 255, 0],\r\n\t\"chocolate\": [210, 105, 30],\r\n\t\"coral\": [255, 127, 80],\r\n\t\"cornflowerblue\": [100, 149, 237],\r\n\t\"cornsilk\": [255, 248, 220],\r\n\t\"crimson\": [220, 20, 60],\r\n\t\"cyan\": [0, 255, 255],\r\n\t\"darkblue\": [0, 0, 139],\r\n\t\"darkcyan\": [0, 139, 139],\r\n\t\"darkgoldenrod\": [184, 134, 11],\r\n\t\"darkgray\": [169, 169, 169],\r\n\t\"darkgreen\": [0, 100, 0],\r\n\t\"darkgrey\": [169, 169, 169],\r\n\t\"darkkhaki\": [189, 183, 107],\r\n\t\"darkmagenta\": [139, 0, 139],\r\n\t\"darkolivegreen\": [85, 107, 47],\r\n\t\"darkorange\": [255, 140, 0],\r\n\t\"darkorchid\": [153, 50, 204],\r\n\t\"darkred\": [139, 0, 0],\r\n\t\"darksalmon\": [233, 150, 122],\r\n\t\"darkseagreen\": [143, 188, 143],\r\n\t\"darkslateblue\": [72, 61, 139],\r\n\t\"darkslategray\": [47, 79, 79],\r\n\t\"darkslategrey\": [47, 79, 79],\r\n\t\"darkturquoise\": [0, 206, 209],\r\n\t\"darkviolet\": [148, 0, 211],\r\n\t\"deeppink\": [255, 20, 147],\r\n\t\"deepskyblue\": [0, 191, 255],\r\n\t\"dimgray\": [105, 105, 105],\r\n\t\"dimgrey\": [105, 105, 105],\r\n\t\"dodgerblue\": [30, 144, 255],\r\n\t\"firebrick\": [178, 34, 34],\r\n\t\"floralwhite\": [255, 250, 240],\r\n\t\"forestgreen\": [34, 139, 34],\r\n\t\"fuchsia\": [255, 0, 255],\r\n\t\"gainsboro\": [220, 220, 220],\r\n\t\"ghostwhite\": [248, 248, 255],\r\n\t\"gold\": [255, 215, 0],\r\n\t\"goldenrod\": [218, 165, 32],\r\n\t\"gray\": [128, 128, 128],\r\n\t\"green\": [0, 128, 0],\r\n\t\"greenyellow\": [173, 255, 47],\r\n\t\"grey\": [128, 128, 128],\r\n\t\"honeydew\": [240, 255, 240],\r\n\t\"hotpink\": [255, 105, 180],\r\n\t\"indianred\": [205, 92, 92],\r\n\t\"indigo\": [75, 0, 130],\r\n\t\"ivory\": [255, 255, 240],\r\n\t\"khaki\": [240, 230, 140],\r\n\t\"lavender\": [230, 230, 250],\r\n\t\"lavenderblush\": [255, 240, 245],\r\n\t\"lawngreen\": [124, 252, 0],\r\n\t\"lemonchiffon\": [255, 250, 205],\r\n\t\"lightblue\": [173, 216, 230],\r\n\t\"lightcoral\": [240, 128, 128],\r\n\t\"lightcyan\": [224, 255, 255],\r\n\t\"lightgoldenrodyellow\": [250, 250, 210],\r\n\t\"lightgray\": [211, 211, 211],\r\n\t\"lightgreen\": [144, 238, 144],\r\n\t\"lightgrey\": [211, 211, 211],\r\n\t\"lightpink\": [255, 182, 193],\r\n\t\"lightsalmon\": [255, 160, 122],\r\n\t\"lightseagreen\": [32, 178, 170],\r\n\t\"lightskyblue\": [135, 206, 250],\r\n\t\"lightslategray\": [119, 136, 153],\r\n\t\"lightslategrey\": [119, 136, 153],\r\n\t\"lightsteelblue\": [176, 196, 222],\r\n\t\"lightyellow\": [255, 255, 224],\r\n\t\"lime\": [0, 255, 0],\r\n\t\"limegreen\": [50, 205, 50],\r\n\t\"linen\": [250, 240, 230],\r\n\t\"magenta\": [255, 0, 255],\r\n\t\"maroon\": [128, 0, 0],\r\n\t\"mediumaquamarine\": [102, 205, 170],\r\n\t\"mediumblue\": [0, 0, 205],\r\n\t\"mediumorchid\": [186, 85, 211],\r\n\t\"mediumpurple\": [147, 112, 219],\r\n\t\"mediumseagreen\": [60, 179, 113],\r\n\t\"mediumslateblue\": [123, 104, 238],\r\n\t\"mediumspringgreen\": [0, 250, 154],\r\n\t\"mediumturquoise\": [72, 209, 204],\r\n\t\"mediumvioletred\": [199, 21, 133],\r\n\t\"midnightblue\": [25, 25, 112],\r\n\t\"mintcream\": [245, 255, 250],\r\n\t\"mistyrose\": [255, 228, 225],\r\n\t\"moccasin\": [255, 228, 181],\r\n\t\"navajowhite\": [255, 222, 173],\r\n\t\"navy\": [0, 0, 128],\r\n\t\"oldlace\": [253, 245, 230],\r\n\t\"olive\": [128, 128, 0],\r\n\t\"olivedrab\": [107, 142, 35],\r\n\t\"orange\": [255, 165, 0],\r\n\t\"orangered\": [255, 69, 0],\r\n\t\"orchid\": [218, 112, 214],\r\n\t\"palegoldenrod\": [238, 232, 170],\r\n\t\"palegreen\": [152, 251, 152],\r\n\t\"paleturquoise\": [175, 238, 238],\r\n\t\"palevioletred\": [219, 112, 147],\r\n\t\"papayawhip\": [255, 239, 213],\r\n\t\"peachpuff\": [255, 218, 185],\r\n\t\"peru\": [205, 133, 63],\r\n\t\"pink\": [255, 192, 203],\r\n\t\"plum\": [221, 160, 221],\r\n\t\"powderblue\": [176, 224, 230],\r\n\t\"purple\": [128, 0, 128],\r\n\t\"rebeccapurple\": [102, 51, 153],\r\n\t\"red\": [255, 0, 0],\r\n\t\"rosybrown\": [188, 143, 143],\r\n\t\"royalblue\": [65, 105, 225],\r\n\t\"saddlebrown\": [139, 69, 19],\r\n\t\"salmon\": [250, 128, 114],\r\n\t\"sandybrown\": [244, 164, 96],\r\n\t\"seagreen\": [46, 139, 87],\r\n\t\"seashell\": [255, 245, 238],\r\n\t\"sienna\": [160, 82, 45],\r\n\t\"silver\": [192, 192, 192],\r\n\t\"skyblue\": [135, 206, 235],\r\n\t\"slateblue\": [106, 90, 205],\r\n\t\"slategray\": [112, 128, 144],\r\n\t\"slategrey\": [112, 128, 144],\r\n\t\"snow\": [255, 250, 250],\r\n\t\"springgreen\": [0, 255, 127],\r\n\t\"steelblue\": [70, 130, 180],\r\n\t\"tan\": [210, 180, 140],\r\n\t\"teal\": [0, 128, 128],\r\n\t\"thistle\": [216, 191, 216],\r\n\t\"tomato\": [255, 99, 71],\r\n\t\"turquoise\": [64, 224, 208],\r\n\t\"violet\": [238, 130, 238],\r\n\t\"wheat\": [245, 222, 179],\r\n\t\"white\": [255, 255, 255],\r\n\t\"whitesmoke\": [245, 245, 245],\r\n\t\"yellow\": [255, 255, 0],\r\n\t\"yellowgreen\": [154, 205, 50]\r\n};","/* MIT license */\nvar colorNames = require('color-name');\nvar swizzle = require('simple-swizzle');\n\nvar reverseNames = {};\n\n// create a list of reverse color names\nfor (var name in colorNames) {\n\tif (colorNames.hasOwnProperty(name)) {\n\t\treverseNames[colorNames[name]] = name;\n\t}\n}\n\nvar cs = module.exports = {\n\tto: {}\n};\n\ncs.get = function (string) {\n\tvar prefix = string.substring(0, 3).toLowerCase();\n\tvar val;\n\tvar model;\n\tswitch (prefix) {\n\t\tcase 'hsl':\n\t\t\tval = cs.get.hsl(string);\n\t\t\tmodel = 'hsl';\n\t\t\tbreak;\n\t\tcase 'hwb':\n\t\t\tval = cs.get.hwb(string);\n\t\t\tmodel = 'hwb';\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tval = cs.get.rgb(string);\n\t\t\tmodel = 'rgb';\n\t\t\tbreak;\n\t}\n\n\tif (!val) {\n\t\treturn null;\n\t}\n\n\treturn {model: model, value: val};\n};\n\ncs.get.rgb = function (string) {\n\tif (!string) {\n\t\treturn null;\n\t}\n\n\tvar abbr = /^#([a-f0-9]{3,4})$/i;\n\tvar hex = /^#([a-f0-9]{6})([a-f0-9]{2})?$/i;\n\tvar rgba = /^rgba?\\(\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/;\n\tvar per = /^rgba?\\(\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/;\n\tvar keyword = /(\\D+)/;\n\n\tvar rgb = [0, 0, 0, 1];\n\tvar match;\n\tvar i;\n\tvar hexAlpha;\n\n\tif (match = string.match(hex)) {\n\t\thexAlpha = match[2];\n\t\tmatch = match[1];\n\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\t// https://jsperf.com/slice-vs-substr-vs-substring-methods-long-string/19\n\t\t\tvar i2 = i * 2;\n\t\t\trgb[i] = parseInt(match.slice(i2, i2 + 2), 16);\n\t\t}\n\n\t\tif (hexAlpha) {\n\t\t\trgb[3] = Math.round((parseInt(hexAlpha, 16) / 255) * 100) / 100;\n\t\t}\n\t} else if (match = string.match(abbr)) {\n\t\tmatch = match[1];\n\t\thexAlpha = match[3];\n\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\trgb[i] = parseInt(match[i] + match[i], 16);\n\t\t}\n\n\t\tif (hexAlpha) {\n\t\t\trgb[3] = Math.round((parseInt(hexAlpha + hexAlpha, 16) / 255) * 100) / 100;\n\t\t}\n\t} else if (match = string.match(rgba)) {\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\trgb[i] = parseInt(match[i + 1], 0);\n\t\t}\n\n\t\tif (match[4]) {\n\t\t\trgb[3] = parseFloat(match[4]);\n\t\t}\n\t} else if (match = string.match(per)) {\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\trgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);\n\t\t}\n\n\t\tif (match[4]) {\n\t\t\trgb[3] = parseFloat(match[4]);\n\t\t}\n\t} else if (match = string.match(keyword)) {\n\t\tif (match[1] === 'transparent') {\n\t\t\treturn [0, 0, 0, 0];\n\t\t}\n\n\t\trgb = colorNames[match[1]];\n\n\t\tif (!rgb) {\n\t\t\treturn null;\n\t\t}\n\n\t\trgb[3] = 1;\n\n\t\treturn rgb;\n\t} else {\n\t\treturn null;\n\t}\n\n\tfor (i = 0; i < 3; i++) {\n\t\trgb[i] = clamp(rgb[i], 0, 255);\n\t}\n\trgb[3] = clamp(rgb[3], 0, 1);\n\n\treturn rgb;\n};\n\ncs.get.hsl = function (string) {\n\tif (!string) {\n\t\treturn null;\n\t}\n\n\tvar hsl = /^hsla?\\(\\s*([+-]?\\d*[\\.]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/;\n\tvar match = string.match(hsl);\n\n\tif (match) {\n\t\tvar alpha = parseFloat(match[4]);\n\t\tvar h = ((parseFloat(match[1]) % 360) + 360) % 360;\n\t\tvar s = clamp(parseFloat(match[2]), 0, 100);\n\t\tvar l = clamp(parseFloat(match[3]), 0, 100);\n\t\tvar a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);\n\n\t\treturn [h, s, l, a];\n\t}\n\n\treturn null;\n};\n\ncs.get.hwb = function (string) {\n\tif (!string) {\n\t\treturn null;\n\t}\n\n\tvar hwb = /^hwb\\(\\s*([+-]?\\d*[\\.]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/;\n\tvar match = string.match(hwb);\n\n\tif (match) {\n\t\tvar alpha = parseFloat(match[4]);\n\t\tvar h = ((parseFloat(match[1]) % 360) + 360) % 360;\n\t\tvar w = clamp(parseFloat(match[2]), 0, 100);\n\t\tvar b = clamp(parseFloat(match[3]), 0, 100);\n\t\tvar a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);\n\t\treturn [h, w, b, a];\n\t}\n\n\treturn null;\n};\n\ncs.to.hex = function () {\n\tvar rgba = swizzle(arguments);\n\n\treturn (\n\t\t'#' +\n\t\thexDouble(rgba[0]) +\n\t\thexDouble(rgba[1]) +\n\t\thexDouble(rgba[2]) +\n\t\t(rgba[3] < 1\n\t\t\t? (hexDouble(Math.round(rgba[3] * 255)))\n\t\t\t: '')\n\t);\n};\n\ncs.to.rgb = function () {\n\tvar rgba = swizzle(arguments);\n\n\treturn rgba.length < 4 || rgba[3] === 1\n\t\t? 'rgb(' + Math.round(rgba[0]) + ', ' + Math.round(rgba[1]) + ', ' + Math.round(rgba[2]) + ')'\n\t\t: 'rgba(' + Math.round(rgba[0]) + ', ' + Math.round(rgba[1]) + ', ' + Math.round(rgba[2]) + ', ' + rgba[3] + ')';\n};\n\ncs.to.rgb.percent = function () {\n\tvar rgba = swizzle(arguments);\n\n\tvar r = Math.round(rgba[0] / 255 * 100);\n\tvar g = Math.round(rgba[1] / 255 * 100);\n\tvar b = Math.round(rgba[2] / 255 * 100);\n\n\treturn rgba.length < 4 || rgba[3] === 1\n\t\t? 'rgb(' + r + '%, ' + g + '%, ' + b + '%)'\n\t\t: 'rgba(' + r + '%, ' + g + '%, ' + b + '%, ' + rgba[3] + ')';\n};\n\ncs.to.hsl = function () {\n\tvar hsla = swizzle(arguments);\n\treturn hsla.length < 4 || hsla[3] === 1\n\t\t? 'hsl(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%)'\n\t\t: 'hsla(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%, ' + hsla[3] + ')';\n};\n\n// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax\n// (hwb have alpha optional & 1 is default value)\ncs.to.hwb = function () {\n\tvar hwba = swizzle(arguments);\n\n\tvar a = '';\n\tif (hwba.length >= 4 && hwba[3] !== 1) {\n\t\ta = ', ' + hwba[3];\n\t}\n\n\treturn 'hwb(' + hwba[0] + ', ' + hwba[1] + '%, ' + hwba[2] + '%' + a + ')';\n};\n\ncs.to.keyword = function (rgb) {\n\treturn reverseNames[rgb.slice(0, 3)];\n};\n\n// helpers\nfunction clamp(num, min, max) {\n\treturn Math.min(Math.max(min, num), max);\n}\n\nfunction hexDouble(num) {\n\tvar str = num.toString(16).toUpperCase();\n\treturn (str.length < 2) ? '0' + str : str;\n}\n","'use strict';\n\nvar colorString = require('color-string');\nvar convert = require('color-convert');\n\nvar _slice = [].slice;\n\nvar skippedModels = [\n\t// to be honest, I don't really feel like keyword belongs in color convert, but eh.\n\t'keyword',\n\n\t// gray conflicts with some method names, and has its own method defined.\n\t'gray',\n\n\t// shouldn't really be in color-convert either...\n\t'hex'\n];\n\nvar hashedModelKeys = {};\nObject.keys(convert).forEach(function (model) {\n\thashedModelKeys[_slice.call(convert[model].labels).sort().join('')] = model;\n});\n\nvar limiters = {};\n\nfunction Color(obj, model) {\n\tif (!(this instanceof Color)) {\n\t\treturn new Color(obj, model);\n\t}\n\n\tif (model && model in skippedModels) {\n\t\tmodel = null;\n\t}\n\n\tif (model && !(model in convert)) {\n\t\tthrow new Error('Unknown model: ' + model);\n\t}\n\n\tvar i;\n\tvar channels;\n\n\tif (!obj) {\n\t\tthis.model = 'rgb';\n\t\tthis.color = [0, 0, 0];\n\t\tthis.valpha = 1;\n\t} else if (obj instanceof Color) {\n\t\tthis.model = obj.model;\n\t\tthis.color = obj.color.slice();\n\t\tthis.valpha = obj.valpha;\n\t} else if (typeof obj === 'string') {\n\t\tvar result = colorString.get(obj);\n\t\tif (result === null) {\n\t\t\tthrow new Error('Unable to parse color from string: ' + obj);\n\t\t}\n\n\t\tthis.model = result.model;\n\t\tchannels = convert[this.model].channels;\n\t\tthis.color = result.value.slice(0, channels);\n\t\tthis.valpha = typeof result.value[channels] === 'number' ? result.value[channels] : 1;\n\t} else if (obj.length) {\n\t\tthis.model = model || 'rgb';\n\t\tchannels = convert[this.model].channels;\n\t\tvar newArr = _slice.call(obj, 0, channels);\n\t\tthis.color = zeroArray(newArr, channels);\n\t\tthis.valpha = typeof obj[channels] === 'number' ? obj[channels] : 1;\n\t} else if (typeof obj === 'number') {\n\t\t// this is always RGB - can be converted later on.\n\t\tobj &= 0xFFFFFF;\n\t\tthis.model = 'rgb';\n\t\tthis.color = [\n\t\t\t(obj >> 16) & 0xFF,\n\t\t\t(obj >> 8) & 0xFF,\n\t\t\tobj & 0xFF\n\t\t];\n\t\tthis.valpha = 1;\n\t} else {\n\t\tthis.valpha = 1;\n\n\t\tvar keys = Object.keys(obj);\n\t\tif ('alpha' in obj) {\n\t\t\tkeys.splice(keys.indexOf('alpha'), 1);\n\t\t\tthis.valpha = typeof obj.alpha === 'number' ? obj.alpha : 0;\n\t\t}\n\n\t\tvar hashedKeys = keys.sort().join('');\n\t\tif (!(hashedKeys in hashedModelKeys)) {\n\t\t\tthrow new Error('Unable to parse color from object: ' + JSON.stringify(obj));\n\t\t}\n\n\t\tthis.model = hashedModelKeys[hashedKeys];\n\n\t\tvar labels = convert[this.model].labels;\n\t\tvar color = [];\n\t\tfor (i = 0; i < labels.length; i++) {\n\t\t\tcolor.push(obj[labels[i]]);\n\t\t}\n\n\t\tthis.color = zeroArray(color);\n\t}\n\n\t// perform limitations (clamping, etc.)\n\tif (limiters[this.model]) {\n\t\tchannels = convert[this.model].channels;\n\t\tfor (i = 0; i < channels; i++) {\n\t\t\tvar limit = limiters[this.model][i];\n\t\t\tif (limit) {\n\t\t\t\tthis.color[i] = limit(this.color[i]);\n\t\t\t}\n\t\t}\n\t}\n\n\tthis.valpha = Math.max(0, Math.min(1, this.valpha));\n\n\tif (Object.freeze) {\n\t\tObject.freeze(this);\n\t}\n}\n\nColor.prototype = {\n\ttoString: function () {\n\t\treturn this.string();\n\t},\n\n\ttoJSON: function () {\n\t\treturn this[this.model]();\n\t},\n\n\tstring: function (places) {\n\t\tvar self = this.model in colorString.to ? this : this.rgb();\n\t\tself = self.round(typeof places === 'number' ? places : 1);\n\t\tvar args = self.valpha === 1 ? self.color : self.color.concat(this.valpha);\n\t\treturn colorString.to[self.model](args);\n\t},\n\n\tpercentString: function (places) {\n\t\tvar self = this.rgb().round(typeof places === 'number' ? places : 1);\n\t\tvar args = self.valpha === 1 ? self.color : self.color.concat(this.valpha);\n\t\treturn colorString.to.rgb.percent(args);\n\t},\n\n\tarray: function () {\n\t\treturn this.valpha === 1 ? this.color.slice() : this.color.concat(this.valpha);\n\t},\n\n\tobject: function () {\n\t\tvar result = {};\n\t\tvar channels = convert[this.model].channels;\n\t\tvar labels = convert[this.model].labels;\n\n\t\tfor (var i = 0; i < channels; i++) {\n\t\t\tresult[labels[i]] = this.color[i];\n\t\t}\n\n\t\tif (this.valpha !== 1) {\n\t\t\tresult.alpha = this.valpha;\n\t\t}\n\n\t\treturn result;\n\t},\n\n\tunitArray: function () {\n\t\tvar rgb = this.rgb().color;\n\t\trgb[0] /= 255;\n\t\trgb[1] /= 255;\n\t\trgb[2] /= 255;\n\n\t\tif (this.valpha !== 1) {\n\t\t\trgb.push(this.valpha);\n\t\t}\n\n\t\treturn rgb;\n\t},\n\n\tunitObject: function () {\n\t\tvar rgb = this.rgb().object();\n\t\trgb.r /= 255;\n\t\trgb.g /= 255;\n\t\trgb.b /= 255;\n\n\t\tif (this.valpha !== 1) {\n\t\t\trgb.alpha = this.valpha;\n\t\t}\n\n\t\treturn rgb;\n\t},\n\n\tround: function (places) {\n\t\tplaces = Math.max(places || 0, 0);\n\t\treturn new Color(this.color.map(roundToPlace(places)).concat(this.valpha), this.model);\n\t},\n\n\talpha: function (val) {\n\t\tif (arguments.length) {\n\t\t\treturn new Color(this.color.concat(Math.max(0, Math.min(1, val))), this.model);\n\t\t}\n\n\t\treturn this.valpha;\n\t},\n\n\t// rgb\n\tred: getset('rgb', 0, maxfn(255)),\n\tgreen: getset('rgb', 1, maxfn(255)),\n\tblue: getset('rgb', 2, maxfn(255)),\n\n\thue: getset(['hsl', 'hsv', 'hsl', 'hwb', 'hcg'], 0, function (val) { return ((val % 360) + 360) % 360; }), // eslint-disable-line brace-style\n\n\tsaturationl: getset('hsl', 1, maxfn(100)),\n\tlightness: getset('hsl', 2, maxfn(100)),\n\n\tsaturationv: getset('hsv', 1, maxfn(100)),\n\tvalue: getset('hsv', 2, maxfn(100)),\n\n\tchroma: getset('hcg', 1, maxfn(100)),\n\tgray: getset('hcg', 2, maxfn(100)),\n\n\twhite: getset('hwb', 1, maxfn(100)),\n\twblack: getset('hwb', 2, maxfn(100)),\n\n\tcyan: getset('cmyk', 0, maxfn(100)),\n\tmagenta: getset('cmyk', 1, maxfn(100)),\n\tyellow: getset('cmyk', 2, maxfn(100)),\n\tblack: getset('cmyk', 3, maxfn(100)),\n\n\tx: getset('xyz', 0, maxfn(100)),\n\ty: getset('xyz', 1, maxfn(100)),\n\tz: getset('xyz', 2, maxfn(100)),\n\n\tl: getset('lab', 0, maxfn(100)),\n\ta: getset('lab', 1),\n\tb: getset('lab', 2),\n\n\tkeyword: function (val) {\n\t\tif (arguments.length) {\n\t\t\treturn new Color(val);\n\t\t}\n\n\t\treturn convert[this.model].keyword(this.color);\n\t},\n\n\thex: function (val) {\n\t\tif (arguments.length) {\n\t\t\treturn new Color(val);\n\t\t}\n\n\t\treturn colorString.to.hex(this.rgb().round().color);\n\t},\n\n\trgbNumber: function () {\n\t\tvar rgb = this.rgb().color;\n\t\treturn ((rgb[0] & 0xFF) << 16) | ((rgb[1] & 0xFF) << 8) | (rgb[2] & 0xFF);\n\t},\n\n\tluminosity: function () {\n\t\t// http://www.w3.org/TR/WCAG20/#relativeluminancedef\n\t\tvar rgb = this.rgb().color;\n\n\t\tvar lum = [];\n\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\tvar chan = rgb[i] / 255;\n\t\t\tlum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4);\n\t\t}\n\n\t\treturn 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];\n\t},\n\n\tcontrast: function (color2) {\n\t\t// http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n\t\tvar lum1 = this.luminosity();\n\t\tvar lum2 = color2.luminosity();\n\n\t\tif (lum1 > lum2) {\n\t\t\treturn (lum1 + 0.05) / (lum2 + 0.05);\n\t\t}\n\n\t\treturn (lum2 + 0.05) / (lum1 + 0.05);\n\t},\n\n\tlevel: function (color2) {\n\t\tvar contrastRatio = this.contrast(color2);\n\t\tif (contrastRatio >= 7.1) {\n\t\t\treturn 'AAA';\n\t\t}\n\n\t\treturn (contrastRatio >= 4.5) ? 'AA' : '';\n\t},\n\n\tdark: function () {\n\t\t// YIQ equation from http://24ways.org/2010/calculating-color-contrast\n\t\tvar rgb = this.rgb().color;\n\t\tvar yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;\n\t\treturn yiq < 128;\n\t},\n\n\tlight: function () {\n\t\treturn !this.dark();\n\t},\n\n\tnegate: function () {\n\t\tvar rgb = this.rgb();\n\t\tfor (var i = 0; i < 3; i++) {\n\t\t\trgb.color[i] = 255 - rgb.color[i];\n\t\t}\n\t\treturn rgb;\n\t},\n\n\tlighten: function (ratio) {\n\t\tvar hsl = this.hsl();\n\t\thsl.color[2] += hsl.color[2] * ratio;\n\t\treturn hsl;\n\t},\n\n\tdarken: function (ratio) {\n\t\tvar hsl = this.hsl();\n\t\thsl.color[2] -= hsl.color[2] * ratio;\n\t\treturn hsl;\n\t},\n\n\tsaturate: function (ratio) {\n\t\tvar hsl = this.hsl();\n\t\thsl.color[1] += hsl.color[1] * ratio;\n\t\treturn hsl;\n\t},\n\n\tdesaturate: function (ratio) {\n\t\tvar hsl = this.hsl();\n\t\thsl.color[1] -= hsl.color[1] * ratio;\n\t\treturn hsl;\n\t},\n\n\twhiten: function (ratio) {\n\t\tvar hwb = this.hwb();\n\t\thwb.color[1] += hwb.color[1] * ratio;\n\t\treturn hwb;\n\t},\n\n\tblacken: function (ratio) {\n\t\tvar hwb = this.hwb();\n\t\thwb.color[2] += hwb.color[2] * ratio;\n\t\treturn hwb;\n\t},\n\n\tgrayscale: function () {\n\t\t// http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale\n\t\tvar rgb = this.rgb().color;\n\t\tvar val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;\n\t\treturn Color.rgb(val, val, val);\n\t},\n\n\tfade: function (ratio) {\n\t\treturn this.alpha(this.valpha - (this.valpha * ratio));\n\t},\n\n\topaquer: function (ratio) {\n\t\treturn this.alpha(this.valpha + (this.valpha * ratio));\n\t},\n\n\trotate: function (degrees) {\n\t\tvar hsl = this.hsl();\n\t\tvar hue = hsl.color[0];\n\t\thue = (hue + degrees) % 360;\n\t\thue = hue < 0 ? 360 + hue : hue;\n\t\thsl.color[0] = hue;\n\t\treturn hsl;\n\t},\n\n\tmix: function (mixinColor, weight) {\n\t\t// ported from sass implementation in C\n\t\t// https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209\n\t\tvar color1 = this.rgb();\n\t\tvar color2 = mixinColor.rgb();\n\t\tvar p = weight === undefined ? 0.5 : weight;\n\n\t\tvar w = 2 * p - 1;\n\t\tvar a = color1.alpha() - color2.alpha();\n\n\t\tvar w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n\t\tvar w2 = 1 - w1;\n\n\t\treturn Color.rgb(\n\t\t\t\tw1 * color1.red() + w2 * color2.red(),\n\t\t\t\tw1 * color1.green() + w2 * color2.green(),\n\t\t\t\tw1 * color1.blue() + w2 * color2.blue(),\n\t\t\t\tcolor1.alpha() * p + color2.alpha() * (1 - p));\n\t}\n};\n\n// model conversion methods and static constructors\nObject.keys(convert).forEach(function (model) {\n\tif (skippedModels.indexOf(model) !== -1) {\n\t\treturn;\n\t}\n\n\tvar channels = convert[model].channels;\n\n\t// conversion methods\n\tColor.prototype[model] = function () {\n\t\tif (this.model === model) {\n\t\t\treturn new Color(this);\n\t\t}\n\n\t\tif (arguments.length) {\n\t\t\treturn new Color(arguments, model);\n\t\t}\n\n\t\tvar newAlpha = typeof arguments[channels] === 'number' ? channels : this.valpha;\n\t\treturn new Color(assertArray(convert[this.model][model].raw(this.color)).concat(newAlpha), model);\n\t};\n\n\t// 'static' construction methods\n\tColor[model] = function (color) {\n\t\tif (typeof color === 'number') {\n\t\t\tcolor = zeroArray(_slice.call(arguments), channels);\n\t\t}\n\t\treturn new Color(color, model);\n\t};\n});\n\nfunction roundTo(num, places) {\n\treturn Number(num.toFixed(places));\n}\n\nfunction roundToPlace(places) {\n\treturn function (num) {\n\t\treturn roundTo(num, places);\n\t};\n}\n\nfunction getset(model, channel, modifier) {\n\tmodel = Array.isArray(model) ? model : [model];\n\n\tmodel.forEach(function (m) {\n\t\t(limiters[m] || (limiters[m] = []))[channel] = modifier;\n\t});\n\n\tmodel = model[0];\n\n\treturn function (val) {\n\t\tvar result;\n\n\t\tif (arguments.length) {\n\t\t\tif (modifier) {\n\t\t\t\tval = modifier(val);\n\t\t\t}\n\n\t\t\tresult = this[model]();\n\t\t\tresult.color[channel] = val;\n\t\t\treturn result;\n\t\t}\n\n\t\tresult = this[model]().color[channel];\n\t\tif (modifier) {\n\t\t\tresult = modifier(result);\n\t\t}\n\n\t\treturn result;\n\t};\n}\n\nfunction maxfn(max) {\n\treturn function (v) {\n\t\treturn Math.max(0, Math.min(max, v));\n\t};\n}\n\nfunction assertArray(val) {\n\treturn Array.isArray(val) ? val : [val];\n}\n\nfunction zeroArray(arr, length) {\n\tfor (var i = 0; i < length; i++) {\n\t\tif (typeof arr[i] !== 'number') {\n\t\t\tarr[i] = 0;\n\t\t}\n\t}\n\n\treturn arr;\n}\n\nmodule.exports = Color;\n","/*! DataTables 1.10.15\n * ©2008-2017 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * @summary     DataTables\n * @description Paginate, search and order HTML tables\n * @version     1.10.15\n * @file        jquery.dataTables.js\n * @author      SpryMedia Ltd\n * @contact     www.datatables.net\n * @copyright   Copyright 2008-2017 SpryMedia Ltd.\n *\n * This source file is free software, available under the following license:\n *   MIT license - http://datatables.net/license\n *\n * This source file is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.\n *\n * For details please refer to: http://www.datatables.net\n */\n\n/*jslint evil: true, undef: true, browser: true */\n/*globals $,require,jQuery,define,_selector_run,_selector_opts,_selector_first,_selector_row_indexes,_ext,_Api,_api_register,_api_registerPlural,_re_new_lines,_re_html,_re_formatted_numeric,_re_escape_regex,_empty,_intVal,_numToDecimal,_isNumber,_isHtml,_htmlNumeric,_pluck,_pluck_order,_range,_stripHtml,_unique,_fnBuildAjax,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnAjaxDataSrc,_fnAddColumn,_fnColumnOptions,_fnAdjustColumnSizing,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnVisbleColumns,_fnGetColumns,_fnColumnTypes,_fnApplyColumnDefs,_fnHungarianMap,_fnCamelToHungarian,_fnLanguageCompat,_fnBrowserDetect,_fnAddData,_fnAddTr,_fnNodeToDataIndex,_fnNodeToColumnIndex,_fnGetCellData,_fnSetCellData,_fnSplitObjNotation,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnGetDataMaster,_fnClearTable,_fnDeleteIndex,_fnInvalidate,_fnGetRowElements,_fnCreateTr,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAddOptionsHtml,_fnDetectHeader,_fnGetUniqueThs,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnFilterCreateSearch,_fnEscapeRegex,_fnFilterData,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnInfoMacros,_fnInitialise,_fnInitComplete,_fnLengthChange,_fnFeatureHtmlLength,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnFeatureHtmlTable,_fnScrollDraw,_fnApplyToChildren,_fnCalculateColumnWidths,_fnThrottle,_fnConvertToWidth,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnSortFlatten,_fnSort,_fnSortAria,_fnSortListener,_fnSortAttachListener,_fnSortingClasses,_fnSortData,_fnSaveState,_fnLoadState,_fnSettingsFromNode,_fnLog,_fnMap,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnLengthOverflow,_fnRenderer,_fnDataSource,_fnRowAttributes*/\n\n(function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === 'function' && define.amd ) {\n\t\t// AMD\n\t\tdefine( ['jquery'], function ( $ ) {\n\t\t\treturn factory( $, window, document );\n\t\t} );\n\t}\n\telse if ( typeof exports === 'object' ) {\n\t\t// CommonJS\n\t\tmodule.exports = function (root, $) {\n\t\t\tif ( ! root ) {\n\t\t\t\t// CommonJS environments without a window global must pass a\n\t\t\t\t// root. This will give an error otherwise\n\t\t\t\troot = window;\n\t\t\t}\n\n\t\t\tif ( ! $ ) {\n\t\t\t\t$ = typeof window !== 'undefined' ? // jQuery's factory checks for a global window\n\t\t\t\t\t(function(){try{return require('jquery')}catch(e){return window.jQuery}})() :\n\t\t\t\t\t(function(){try{return require('jquery')}catch(e){return window.jQuery}})()( root );\n\t\t\t}\n\n\t\t\treturn factory( $, root, root.document );\n\t\t};\n\t}\n\telse {\n\t\t// Browser\n\t\tfactory( jQuery, window, document );\n\t}\n}\n(function( $, window, document, undefined ) {\n\t\"use strict\";\n\n\t/**\n\t * DataTables is a plug-in for the jQuery Javascript library. It is a highly\n\t * flexible tool, based upon the foundations of progressive enhancement,\n\t * which will add advanced interaction controls to any HTML table. For a\n\t * full list of features please refer to\n\t * [DataTables.net](href=\"http://datatables.net).\n\t *\n\t * Note that the `DataTable` object is not a global variable but is aliased\n\t * to `jQuery.fn.DataTable` and `jQuery.fn.dataTable` through which it may\n\t * be  accessed.\n\t *\n\t *  @class\n\t *  @param {object} [init={}] Configuration object for DataTables. Options\n\t *    are defined by {@link DataTable.defaults}\n\t *  @requires jQuery 1.7+\n\t *\n\t *  @example\n\t *    // Basic initialisation\n\t *    $(document).ready( function {\n\t *      $('#example').dataTable();\n\t *    } );\n\t *\n\t *  @example\n\t *    // Initialisation with configuration options - in this case, disable\n\t *    // pagination and sorting.\n\t *    $(document).ready( function {\n\t *      $('#example').dataTable( {\n\t *        \"paginate\": false,\n\t *        \"sort\": false\n\t *      } );\n\t *    } );\n\t */\n\tvar DataTable = function ( options )\n\t{\n\t\t/**\n\t\t * Perform a jQuery selector action on the table's TR elements (from the tbody) and\n\t\t * return the resulting jQuery object.\n\t\t *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on\n\t\t *  @param {object} [oOpts] Optional parameters for modifying the rows to be included\n\t\t *  @param {string} [oOpts.filter=none] Select TR elements that meet the current filter\n\t\t *    criterion (\"applied\") or all TR elements (i.e. no filter).\n\t\t *  @param {string} [oOpts.order=current] Order of the TR elements in the processed array.\n\t\t *    Can be either 'current', whereby the current sorting of the table is used, or\n\t\t *    'original' whereby the original order the data was read into the table is used.\n\t\t *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page\n\t\t *    (\"current\") or not (\"all\"). If 'current' is given, then order is assumed to be\n\t\t *    'current' and filter is 'applied', regardless of what they might be given as.\n\t\t *  @returns {object} jQuery object, filtered by the given selector.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Highlight every second row\n\t\t *      oTable.$('tr:odd').css('backgroundColor', 'blue');\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Filter to rows with 'Webkit' in them, add a background colour and then\n\t\t *      // remove the filter, thus highlighting the 'Webkit' rows only.\n\t\t *      oTable.fnFilter('Webkit');\n\t\t *      oTable.$('tr', {\"search\": \"applied\"}).css('backgroundColor', 'blue');\n\t\t *      oTable.fnFilter('');\n\t\t *    } );\n\t\t */\n\t\tthis.$ = function ( sSelector, oOpts )\n\t\t{\n\t\t\treturn this.api(true).$( sSelector, oOpts );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Almost identical to $ in operation, but in this case returns the data for the matched\n\t\t * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes\n\t\t * rather than any descendants, so the data can be obtained for the row/cell. If matching\n\t\t * rows are found, the data returned is the original data array/object that was used to\n\t\t * create the row (or a generated array if from a DOM source).\n\t\t *\n\t\t * This method is often useful in-combination with $ where both functions are given the\n\t\t * same parameters and the array indexes will match identically.\n\t\t *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on\n\t\t *  @param {object} [oOpts] Optional parameters for modifying the rows to be included\n\t\t *  @param {string} [oOpts.filter=none] Select elements that meet the current filter\n\t\t *    criterion (\"applied\") or all elements (i.e. no filter).\n\t\t *  @param {string} [oOpts.order=current] Order of the data in the processed array.\n\t\t *    Can be either 'current', whereby the current sorting of the table is used, or\n\t\t *    'original' whereby the original order the data was read into the table is used.\n\t\t *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page\n\t\t *    (\"current\") or not (\"all\"). If 'current' is given, then order is assumed to be\n\t\t *    'current' and filter is 'applied', regardless of what they might be given as.\n\t\t *  @returns {array} Data for the matched elements. If any elements, as a result of the\n\t\t *    selector, were not TR, TD or TH elements in the DataTable, they will have a null\n\t\t *    entry in the array.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Get the data from the first row in the table\n\t\t *      var data = oTable._('tr:first');\n\t\t *\n\t\t *      // Do something useful with the data\n\t\t *      alert( \"First cell is: \"+data[0] );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Filter to 'Webkit' and get all data for\n\t\t *      oTable.fnFilter('Webkit');\n\t\t *      var data = oTable._('tr', {\"search\": \"applied\"});\n\t\t *\n\t\t *      // Do something with the data\n\t\t *      alert( data.length+\" rows matched the search\" );\n\t\t *    } );\n\t\t */\n\t\tthis._ = function ( sSelector, oOpts )\n\t\t{\n\t\t\treturn this.api(true).rows( sSelector, oOpts ).data();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Create a DataTables Api instance, with the currently selected tables for\n\t\t * the Api's context.\n\t\t * @param {boolean} [traditional=false] Set the API instance's context to be\n\t\t *   only the table referred to by the `DataTable.ext.iApiIndex` option, as was\n\t\t *   used in the API presented by DataTables 1.9- (i.e. the traditional mode),\n\t\t *   or if all tables captured in the jQuery object should be used.\n\t\t * @return {DataTables.Api}\n\t\t */\n\t\tthis.api = function ( traditional )\n\t\t{\n\t\t\treturn traditional ?\n\t\t\t\tnew _Api(\n\t\t\t\t\t_fnSettingsFromNode( this[ _ext.iApiIndex ] )\n\t\t\t\t) :\n\t\t\t\tnew _Api( this );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Add a single new row or multiple rows of data to the table. Please note\n\t\t * that this is suitable for client-side processing only - if you are using\n\t\t * server-side processing (i.e. \"bServerSide\": true), then to add data, you\n\t\t * must add it to the data source, i.e. the server-side, through an Ajax call.\n\t\t *  @param {array|object} data The data to be added to the table. This can be:\n\t\t *    <ul>\n\t\t *      <li>1D array of data - add a single row with the data provided</li>\n\t\t *      <li>2D array of arrays - add multiple rows in a single call</li>\n\t\t *      <li>object - data object when using <i>mData</i></li>\n\t\t *      <li>array of objects - multiple data objects when using <i>mData</i></li>\n\t\t *    </ul>\n\t\t *  @param {bool} [redraw=true] redraw the table or not\n\t\t *  @returns {array} An array of integers, representing the list of indexes in\n\t\t *    <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to\n\t\t *    the table.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    // Global var for counter\n\t\t *    var giCount = 2;\n\t\t *\n\t\t *    $(document).ready(function() {\n\t\t *      $('#example').dataTable();\n\t\t *    } );\n\t\t *\n\t\t *    function fnClickAddRow() {\n\t\t *      $('#example').dataTable().fnAddData( [\n\t\t *        giCount+\".1\",\n\t\t *        giCount+\".2\",\n\t\t *        giCount+\".3\",\n\t\t *        giCount+\".4\" ]\n\t\t *      );\n\t\t *\n\t\t *      giCount++;\n\t\t *    }\n\t\t */\n\t\tthis.fnAddData = function( data, redraw )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\n\t\t\t/* Check if we want to add multiple rows or not */\n\t\t\tvar rows = $.isArray(data) && ( $.isArray(data[0]) || $.isPlainObject(data[0]) ) ?\n\t\t\t\tapi.rows.add( data ) :\n\t\t\t\tapi.row.add( data );\n\t\t\n\t\t\tif ( redraw === undefined || redraw ) {\n\t\t\t\tapi.draw();\n\t\t\t}\n\t\t\n\t\t\treturn rows.flatten().toArray();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * This function will make DataTables recalculate the column sizes, based on the data\n\t\t * contained in the table and the sizes applied to the columns (in the DOM, CSS or\n\t\t * through the sWidth parameter). This can be useful when the width of the table's\n\t\t * parent element changes (for example a window resize).\n\t\t *  @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable( {\n\t\t *        \"sScrollY\": \"200px\",\n\t\t *        \"bPaginate\": false\n\t\t *      } );\n\t\t *\n\t\t *      $(window).on('resize', function () {\n\t\t *        oTable.fnAdjustColumnSizing();\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\tthis.fnAdjustColumnSizing = function ( bRedraw )\n\t\t{\n\t\t\tvar api = this.api( true ).columns.adjust();\n\t\t\tvar settings = api.settings()[0];\n\t\t\tvar scroll = settings.oScroll;\n\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.draw( false );\n\t\t\t}\n\t\t\telse if ( scroll.sX !== \"\" || scroll.sY !== \"\" ) {\n\t\t\t\t/* If not redrawing, but scrolling, we want to apply the new column sizes anyway */\n\t\t\t\t_fnScrollDraw( settings );\n\t\t\t}\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Quickly and simply clear a table\n\t\t *  @param {bool} [bRedraw=true] redraw the table or not\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)\n\t\t *      oTable.fnClearTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnClearTable = function( bRedraw )\n\t\t{\n\t\t\tvar api = this.api( true ).clear();\n\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.draw();\n\t\t\t}\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * The exact opposite of 'opening' a row, this function will close any rows which\n\t\t * are currently 'open'.\n\t\t *  @param {node} nTr the table row to 'close'\n\t\t *  @returns {int} 0 on success, or 1 if failed (can't find the row)\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable;\n\t\t *\n\t\t *      // 'open' an information row when a row is clicked on\n\t\t *      $('#example tbody tr').click( function () {\n\t\t *        if ( oTable.fnIsOpen(this) ) {\n\t\t *          oTable.fnClose( this );\n\t\t *        } else {\n\t\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t\t *        }\n\t\t *      } );\n\t\t *\n\t\t *      oTable = $('#example').dataTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnClose = function( nTr )\n\t\t{\n\t\t\tthis.api( true ).row( nTr ).child.hide();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Remove a row for the table\n\t\t *  @param {mixed} target The index of the row from aoData to be deleted, or\n\t\t *    the TR element you want to delete\n\t\t *  @param {function|null} [callBack] Callback function\n\t\t *  @param {bool} [redraw=true] Redraw the table or not\n\t\t *  @returns {array} The row that was deleted\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Immediately remove the first row\n\t\t *      oTable.fnDeleteRow( 0 );\n\t\t *    } );\n\t\t */\n\t\tthis.fnDeleteRow = function( target, callback, redraw )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\tvar rows = api.rows( target );\n\t\t\tvar settings = rows.settings()[0];\n\t\t\tvar data = settings.aoData[ rows[0][0] ];\n\t\t\n\t\t\trows.remove();\n\t\t\n\t\t\tif ( callback ) {\n\t\t\t\tcallback.call( this, settings, data );\n\t\t\t}\n\t\t\n\t\t\tif ( redraw === undefined || redraw ) {\n\t\t\t\tapi.draw();\n\t\t\t}\n\t\t\n\t\t\treturn data;\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Restore the table to it's original state in the DOM by removing all of DataTables\n\t\t * enhancements, alterations to the DOM structure of the table and event listeners.\n\t\t *  @param {boolean} [remove=false] Completely remove the table from the DOM\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      // This example is fairly pointless in reality, but shows how fnDestroy can be used\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      oTable.fnDestroy();\n\t\t *    } );\n\t\t */\n\t\tthis.fnDestroy = function ( remove )\n\t\t{\n\t\t\tthis.api( true ).destroy( remove );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Redraw the table\n\t\t *  @param {bool} [complete=true] Re-filter and resort (if enabled) the table before the draw.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Re-draw the table - you wouldn't want to do it here, but it's an example :-)\n\t\t *      oTable.fnDraw();\n\t\t *    } );\n\t\t */\n\t\tthis.fnDraw = function( complete )\n\t\t{\n\t\t\t// Note that this isn't an exact match to the old call to _fnDraw - it takes\n\t\t\t// into account the new data, but can hold position.\n\t\t\tthis.api( true ).draw( complete );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Filter the input based on data\n\t\t *  @param {string} sInput String to filter the table on\n\t\t *  @param {int|null} [iColumn] Column to limit filtering to\n\t\t *  @param {bool} [bRegex=false] Treat as regular expression or not\n\t\t *  @param {bool} [bSmart=true] Perform smart filtering or not\n\t\t *  @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)\n\t\t *  @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Sometime later - filter...\n\t\t *      oTable.fnFilter( 'test string' );\n\t\t *    } );\n\t\t */\n\t\tthis.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\n\t\t\tif ( iColumn === null || iColumn === undefined ) {\n\t\t\t\tapi.search( sInput, bRegex, bSmart, bCaseInsensitive );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tapi.column( iColumn ).search( sInput, bRegex, bSmart, bCaseInsensitive );\n\t\t\t}\n\t\t\n\t\t\tapi.draw();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Get the data for the whole table, an individual row or an individual cell based on the\n\t\t * provided parameters.\n\t\t *  @param {int|node} [src] A TR row node, TD/TH cell node or an integer. If given as\n\t\t *    a TR node then the data source for the whole row will be returned. If given as a\n\t\t *    TD/TH cell node then iCol will be automatically calculated and the data for the\n\t\t *    cell returned. If given as an integer, then this is treated as the aoData internal\n\t\t *    data index for the row (see fnGetPosition) and the data for that row used.\n\t\t *  @param {int} [col] Optional column index that you want the data of.\n\t\t *  @returns {array|object|string} If mRow is undefined, then the data for all rows is\n\t\t *    returned. If mRow is defined, just data for that row, and is iCol is\n\t\t *    defined, only data for the designated cell is returned.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    // Row data\n\t\t *    $(document).ready(function() {\n\t\t *      oTable = $('#example').dataTable();\n\t\t *\n\t\t *      oTable.$('tr').click( function () {\n\t\t *        var data = oTable.fnGetData( this );\n\t\t *        // ... do something with the array / object of data for the row\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Individual cell data\n\t\t *    $(document).ready(function() {\n\t\t *      oTable = $('#example').dataTable();\n\t\t *\n\t\t *      oTable.$('td').click( function () {\n\t\t *        var sData = oTable.fnGetData( this );\n\t\t *        alert( 'The cell clicked on had the value of '+sData );\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\tthis.fnGetData = function( src, col )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\n\t\t\tif ( src !== undefined ) {\n\t\t\t\tvar type = src.nodeName ? src.nodeName.toLowerCase() : '';\n\t\t\n\t\t\t\treturn col !== undefined || type == 'td' || type == 'th' ?\n\t\t\t\t\tapi.cell( src, col ).data() :\n\t\t\t\t\tapi.row( src ).data() || null;\n\t\t\t}\n\t\t\n\t\t\treturn api.data().toArray();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Get an array of the TR nodes that are used in the table's body. Note that you will\n\t\t * typically want to use the '$' API method in preference to this as it is more\n\t\t * flexible.\n\t\t *  @param {int} [iRow] Optional row index for the TR element you want\n\t\t *  @returns {array|node} If iRow is undefined, returns an array of all TR elements\n\t\t *    in the table's body, or iRow is defined, just the TR element requested.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Get the nodes from the table\n\t\t *      var nNodes = oTable.fnGetNodes( );\n\t\t *    } );\n\t\t */\n\t\tthis.fnGetNodes = function( iRow )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\n\t\t\treturn iRow !== undefined ?\n\t\t\t\tapi.row( iRow ).node() :\n\t\t\t\tapi.rows().nodes().flatten().toArray();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Get the array indexes of a particular cell from it's DOM element\n\t\t * and column index including hidden columns\n\t\t *  @param {node} node this can either be a TR, TD or TH in the table's body\n\t\t *  @returns {int} If nNode is given as a TR, then a single index is returned, or\n\t\t *    if given as a cell, an array of [row index, column index (visible),\n\t\t *    column index (all)] is given.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      $('#example tbody td').click( function () {\n\t\t *        // Get the position of the current data from the node\n\t\t *        var aPos = oTable.fnGetPosition( this );\n\t\t *\n\t\t *        // Get the data array for this row\n\t\t *        var aData = oTable.fnGetData( aPos[0] );\n\t\t *\n\t\t *        // Update the data array and return the value\n\t\t *        aData[ aPos[1] ] = 'clicked';\n\t\t *        this.innerHTML = 'clicked';\n\t\t *      } );\n\t\t *\n\t\t *      // Init DataTables\n\t\t *      oTable = $('#example').dataTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnGetPosition = function( node )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\tvar nodeName = node.nodeName.toUpperCase();\n\t\t\n\t\t\tif ( nodeName == 'TR' ) {\n\t\t\t\treturn api.row( node ).index();\n\t\t\t}\n\t\t\telse if ( nodeName == 'TD' || nodeName == 'TH' ) {\n\t\t\t\tvar cell = api.cell( node ).index();\n\t\t\n\t\t\t\treturn [\n\t\t\t\t\tcell.row,\n\t\t\t\t\tcell.columnVisible,\n\t\t\t\t\tcell.column\n\t\t\t\t];\n\t\t\t}\n\t\t\treturn null;\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Check to see if a row is 'open' or not.\n\t\t *  @param {node} nTr the table row to check\n\t\t *  @returns {boolean} true if the row is currently open, false otherwise\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable;\n\t\t *\n\t\t *      // 'open' an information row when a row is clicked on\n\t\t *      $('#example tbody tr').click( function () {\n\t\t *        if ( oTable.fnIsOpen(this) ) {\n\t\t *          oTable.fnClose( this );\n\t\t *        } else {\n\t\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t\t *        }\n\t\t *      } );\n\t\t *\n\t\t *      oTable = $('#example').dataTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnIsOpen = function( nTr )\n\t\t{\n\t\t\treturn this.api( true ).row( nTr ).child.isShown();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * This function will place a new row directly after a row which is currently\n\t\t * on display on the page, with the HTML contents that is passed into the\n\t\t * function. This can be used, for example, to ask for confirmation that a\n\t\t * particular record should be deleted.\n\t\t *  @param {node} nTr The table row to 'open'\n\t\t *  @param {string|node|jQuery} mHtml The HTML to put into the row\n\t\t *  @param {string} sClass Class to give the new TD cell\n\t\t *  @returns {node} The row opened. Note that if the table row passed in as the\n\t\t *    first parameter, is not found in the table, this method will silently\n\t\t *    return.\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable;\n\t\t *\n\t\t *      // 'open' an information row when a row is clicked on\n\t\t *      $('#example tbody tr').click( function () {\n\t\t *        if ( oTable.fnIsOpen(this) ) {\n\t\t *          oTable.fnClose( this );\n\t\t *        } else {\n\t\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t\t *        }\n\t\t *      } );\n\t\t *\n\t\t *      oTable = $('#example').dataTable();\n\t\t *    } );\n\t\t */\n\t\tthis.fnOpen = function( nTr, mHtml, sClass )\n\t\t{\n\t\t\treturn this.api( true )\n\t\t\t\t.row( nTr )\n\t\t\t\t.child( mHtml, sClass )\n\t\t\t\t.show()\n\t\t\t\t.child()[0];\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Change the pagination - provides the internal logic for pagination in a simple API\n\t\t * function. With this function you can have a DataTables table go to the next,\n\t\t * previous, first or last pages.\n\t\t *  @param {string|int} mAction Paging action to take: \"first\", \"previous\", \"next\" or \"last\"\n\t\t *    or page number to jump to (integer), note that page 0 is the first page.\n\t\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      oTable.fnPageChange( 'next' );\n\t\t *    } );\n\t\t */\n\t\tthis.fnPageChange = function ( mAction, bRedraw )\n\t\t{\n\t\t\tvar api = this.api( true ).page( mAction );\n\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.draw(false);\n\t\t\t}\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Show a particular column\n\t\t *  @param {int} iCol The column whose display should be changed\n\t\t *  @param {bool} bShow Show (true) or hide (false) the column\n\t\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Hide the second column after initialisation\n\t\t *      oTable.fnSetColumnVis( 1, false );\n\t\t *    } );\n\t\t */\n\t\tthis.fnSetColumnVis = function ( iCol, bShow, bRedraw )\n\t\t{\n\t\t\tvar api = this.api( true ).column( iCol ).visible( bShow );\n\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.columns.adjust().draw();\n\t\t\t}\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Get the settings for a particular table for external manipulation\n\t\t *  @returns {object} DataTables settings object. See\n\t\t *    {@link DataTable.models.oSettings}\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      var oSettings = oTable.fnSettings();\n\t\t *\n\t\t *      // Show an example parameter from the settings\n\t\t *      alert( oSettings._iDisplayStart );\n\t\t *    } );\n\t\t */\n\t\tthis.fnSettings = function()\n\t\t{\n\t\t\treturn _fnSettingsFromNode( this[_ext.iApiIndex] );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Sort the table by a particular column\n\t\t *  @param {int} iCol the data index to sort on. Note that this will not match the\n\t\t *    'display index' if you have hidden data entries\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Sort immediately with columns 0 and 1\n\t\t *      oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );\n\t\t *    } );\n\t\t */\n\t\tthis.fnSort = function( aaSort )\n\t\t{\n\t\t\tthis.api( true ).order( aaSort ).draw();\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Attach a sort listener to an element for a given column\n\t\t *  @param {node} nNode the element to attach the sort listener to\n\t\t *  @param {int} iColumn the column that a click on this node will sort on\n\t\t *  @param {function} [fnCallback] callback function when sort is run\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *\n\t\t *      // Sort on column 1, when 'sorter' is clicked on\n\t\t *      oTable.fnSortListener( document.getElementById('sorter'), 1 );\n\t\t *    } );\n\t\t */\n\t\tthis.fnSortListener = function( nNode, iColumn, fnCallback )\n\t\t{\n\t\t\tthis.api( true ).order.listener( nNode, iColumn, fnCallback );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Update a table cell or row - this method will accept either a single value to\n\t\t * update the cell with, an array of values with one element for each column or\n\t\t * an object in the same format as the original data source. The function is\n\t\t * self-referencing in order to make the multi column updates easier.\n\t\t *  @param {object|array|string} mData Data to update the cell/row with\n\t\t *  @param {node|int} mRow TR element you want to update or the aoData index\n\t\t *  @param {int} [iColumn] The column to update, give as null or undefined to\n\t\t *    update a whole row.\n\t\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t\t *  @param {bool} [bAction=true] Perform pre-draw actions or not\n\t\t *  @returns {int} 0 on success, 1 on error\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell\n\t\t *      oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], $('tbody tr')[0] ); // Row\n\t\t *    } );\n\t\t */\n\t\tthis.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )\n\t\t{\n\t\t\tvar api = this.api( true );\n\t\t\n\t\t\tif ( iColumn === undefined || iColumn === null ) {\n\t\t\t\tapi.row( mRow ).data( mData );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tapi.cell( mRow, iColumn ).data( mData );\n\t\t\t}\n\t\t\n\t\t\tif ( bAction === undefined || bAction ) {\n\t\t\t\tapi.columns.adjust();\n\t\t\t}\n\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\t\tapi.draw();\n\t\t\t}\n\t\t\treturn 0;\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Provide a common method for plug-ins to check the version of DataTables being used, in order\n\t\t * to ensure compatibility.\n\t\t *  @param {string} sVersion Version string to check for, in the format \"X.Y.Z\". Note that the\n\t\t *    formats \"X\" and \"X.Y\" are also acceptable.\n\t\t *  @returns {boolean} true if this version of DataTables is greater or equal to the required\n\t\t *    version, or false if this version of DataTales is not suitable\n\t\t *  @method\n\t\t *  @dtopt API\n\t\t *  @deprecated Since v1.10\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready(function() {\n\t\t *      var oTable = $('#example').dataTable();\n\t\t *      alert( oTable.fnVersionCheck( '1.9.0' ) );\n\t\t *    } );\n\t\t */\n\t\tthis.fnVersionCheck = _ext.fnVersionCheck;\n\t\t\n\n\t\tvar _that = this;\n\t\tvar emptyInit = options === undefined;\n\t\tvar len = this.length;\n\n\t\tif ( emptyInit ) {\n\t\t\toptions = {};\n\t\t}\n\n\t\tthis.oApi = this.internal = _ext.internal;\n\n\t\t// Extend with old style plug-in API methods\n\t\tfor ( var fn in DataTable.ext.internal ) {\n\t\t\tif ( fn ) {\n\t\t\t\tthis[fn] = _fnExternApiFunc(fn);\n\t\t\t}\n\t\t}\n\n\t\tthis.each(function() {\n\t\t\t// For each initialisation we want to give it a clean initialisation\n\t\t\t// object that can be bashed around\n\t\t\tvar o = {};\n\t\t\tvar oInit = len > 1 ? // optimisation for single table case\n\t\t\t\t_fnExtend( o, options, true ) :\n\t\t\t\toptions;\n\n\t\t\t/*global oInit,_that,emptyInit*/\n\t\t\tvar i=0, iLen, j, jLen, k, kLen;\n\t\t\tvar sId = this.getAttribute( 'id' );\n\t\t\tvar bInitHandedOff = false;\n\t\t\tvar defaults = DataTable.defaults;\n\t\t\tvar $this = $(this);\n\t\t\t\n\t\t\t\n\t\t\t/* Sanity check */\n\t\t\tif ( this.nodeName.toLowerCase() != 'table' )\n\t\t\t{\n\t\t\t\t_fnLog( null, 0, 'Non-table node initialisation ('+this.nodeName+')', 2 );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t/* Backwards compatibility for the defaults */\n\t\t\t_fnCompatOpts( defaults );\n\t\t\t_fnCompatCols( defaults.column );\n\t\t\t\n\t\t\t/* Convert the camel-case defaults to Hungarian */\n\t\t\t_fnCamelToHungarian( defaults, defaults, true );\n\t\t\t_fnCamelToHungarian( defaults.column, defaults.column, true );\n\t\t\t\n\t\t\t/* Setting up the initialisation object */\n\t\t\t_fnCamelToHungarian( defaults, $.extend( oInit, $this.data() ) );\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t/* Check to see if we are re-initialising a table */\n\t\t\tvar allSettings = DataTable.settings;\n\t\t\tfor ( i=0, iLen=allSettings.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tvar s = allSettings[i];\n\t\t\t\n\t\t\t\t/* Base check on table node */\n\t\t\t\tif ( s.nTable == this || s.nTHead.parentNode == this || (s.nTFoot && s.nTFoot.parentNode == this) )\n\t\t\t\t{\n\t\t\t\t\tvar bRetrieve = oInit.bRetrieve !== undefined ? oInit.bRetrieve : defaults.bRetrieve;\n\t\t\t\t\tvar bDestroy = oInit.bDestroy !== undefined ? oInit.bDestroy : defaults.bDestroy;\n\t\t\t\n\t\t\t\t\tif ( emptyInit || bRetrieve )\n\t\t\t\t\t{\n\t\t\t\t\t\treturn s.oInstance;\n\t\t\t\t\t}\n\t\t\t\t\telse if ( bDestroy )\n\t\t\t\t\t{\n\t\t\t\t\t\ts.oInstance.fnDestroy();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t_fnLog( s, 0, 'Cannot reinitialise DataTable', 3 );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\t\t/* If the element we are initialising has the same ID as a table which was previously\n\t\t\t\t * initialised, but the table nodes don't match (from before) then we destroy the old\n\t\t\t\t * instance by simply deleting it. This is under the assumption that the table has been\n\t\t\t\t * destroyed by other methods. Anyone using non-id selectors will need to do this manually\n\t\t\t\t */\n\t\t\t\tif ( s.sTableId == this.id )\n\t\t\t\t{\n\t\t\t\t\tallSettings.splice( i, 1 );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* Ensure the table has an ID - required for accessibility */\n\t\t\tif ( sId === null || sId === \"\" )\n\t\t\t{\n\t\t\t\tsId = \"DataTables_Table_\"+(DataTable.ext._unique++);\n\t\t\t\tthis.id = sId;\n\t\t\t}\n\t\t\t\n\t\t\t/* Create the settings object for this table and set some of the default parameters */\n\t\t\tvar oSettings = $.extend( true, {}, DataTable.models.oSettings, {\n\t\t\t\t\"sDestroyWidth\": $this[0].style.width,\n\t\t\t\t\"sInstance\":     sId,\n\t\t\t\t\"sTableId\":      sId\n\t\t\t} );\n\t\t\toSettings.nTable = this;\n\t\t\toSettings.oApi   = _that.internal;\n\t\t\toSettings.oInit  = oInit;\n\t\t\t\n\t\t\tallSettings.push( oSettings );\n\t\t\t\n\t\t\t// Need to add the instance after the instance after the settings object has been added\n\t\t\t// to the settings array, so we can self reference the table instance if more than one\n\t\t\toSettings.oInstance = (_that.length===1) ? _that : $this.dataTable();\n\t\t\t\n\t\t\t// Backwards compatibility, before we apply all the defaults\n\t\t\t_fnCompatOpts( oInit );\n\t\t\t\n\t\t\tif ( oInit.oLanguage )\n\t\t\t{\n\t\t\t\t_fnLanguageCompat( oInit.oLanguage );\n\t\t\t}\n\t\t\t\n\t\t\t// If the length menu is given, but the init display length is not, use the length menu\n\t\t\tif ( oInit.aLengthMenu && ! oInit.iDisplayLength )\n\t\t\t{\n\t\t\t\toInit.iDisplayLength = $.isArray( oInit.aLengthMenu[0] ) ?\n\t\t\t\t\toInit.aLengthMenu[0][0] : oInit.aLengthMenu[0];\n\t\t\t}\n\t\t\t\n\t\t\t// Apply the defaults and init options to make a single init object will all\n\t\t\t// options defined from defaults and instance options.\n\t\t\toInit = _fnExtend( $.extend( true, {}, defaults ), oInit );\n\t\t\t\n\t\t\t\n\t\t\t// Map the initialisation options onto the settings object\n\t\t\t_fnMap( oSettings.oFeatures, oInit, [\n\t\t\t\t\"bPaginate\",\n\t\t\t\t\"bLengthChange\",\n\t\t\t\t\"bFilter\",\n\t\t\t\t\"bSort\",\n\t\t\t\t\"bSortMulti\",\n\t\t\t\t\"bInfo\",\n\t\t\t\t\"bProcessing\",\n\t\t\t\t\"bAutoWidth\",\n\t\t\t\t\"bSortClasses\",\n\t\t\t\t\"bServerSide\",\n\t\t\t\t\"bDeferRender\"\n\t\t\t] );\n\t\t\t_fnMap( oSettings, oInit, [\n\t\t\t\t\"asStripeClasses\",\n\t\t\t\t\"ajax\",\n\t\t\t\t\"fnServerData\",\n\t\t\t\t\"fnFormatNumber\",\n\t\t\t\t\"sServerMethod\",\n\t\t\t\t\"aaSorting\",\n\t\t\t\t\"aaSortingFixed\",\n\t\t\t\t\"aLengthMenu\",\n\t\t\t\t\"sPaginationType\",\n\t\t\t\t\"sAjaxSource\",\n\t\t\t\t\"sAjaxDataProp\",\n\t\t\t\t\"iStateDuration\",\n\t\t\t\t\"sDom\",\n\t\t\t\t\"bSortCellsTop\",\n\t\t\t\t\"iTabIndex\",\n\t\t\t\t\"fnStateLoadCallback\",\n\t\t\t\t\"fnStateSaveCallback\",\n\t\t\t\t\"renderer\",\n\t\t\t\t\"searchDelay\",\n\t\t\t\t\"rowId\",\n\t\t\t\t[ \"iCookieDuration\", \"iStateDuration\" ], // backwards compat\n\t\t\t\t[ \"oSearch\", \"oPreviousSearch\" ],\n\t\t\t\t[ \"aoSearchCols\", \"aoPreSearchCols\" ],\n\t\t\t\t[ \"iDisplayLength\", \"_iDisplayLength\" ],\n\t\t\t\t[ \"bJQueryUI\", \"bJUI\" ]\n\t\t\t] );\n\t\t\t_fnMap( oSettings.oScroll, oInit, [\n\t\t\t\t[ \"sScrollX\", \"sX\" ],\n\t\t\t\t[ \"sScrollXInner\", \"sXInner\" ],\n\t\t\t\t[ \"sScrollY\", \"sY\" ],\n\t\t\t\t[ \"bScrollCollapse\", \"bCollapse\" ]\n\t\t\t] );\n\t\t\t_fnMap( oSettings.oLanguage, oInit, \"fnInfoCallback\" );\n\t\t\t\n\t\t\t/* Callback functions which are array driven */\n\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback',       oInit.fnDrawCallback,      'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoServerParams',       oInit.fnServerParams,      'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoStateSaveParams',    oInit.fnStateSaveParams,   'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoStateLoadParams',    oInit.fnStateLoadParams,   'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoStateLoaded',        oInit.fnStateLoaded,       'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoRowCallback',        oInit.fnRowCallback,       'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow,        'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoHeaderCallback',     oInit.fnHeaderCallback,    'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoFooterCallback',     oInit.fnFooterCallback,    'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoInitComplete',       oInit.fnInitComplete,      'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoPreDrawCallback',    oInit.fnPreDrawCallback,   'user' );\n\t\t\t\n\t\t\toSettings.rowIdFn = _fnGetObjectDataFn( oInit.rowId );\n\t\t\t\n\t\t\t/* Browser support detection */\n\t\t\t_fnBrowserDetect( oSettings );\n\t\t\t\n\t\t\tvar oClasses = oSettings.oClasses;\n\t\t\t\n\t\t\t// @todo Remove in 1.11\n\t\t\tif ( oInit.bJQueryUI )\n\t\t\t{\n\t\t\t\t/* Use the JUI classes object for display. You could clone the oStdClasses object if\n\t\t\t\t * you want to have multiple tables with multiple independent classes\n\t\t\t\t */\n\t\t\t\t$.extend( oClasses, DataTable.ext.oJUIClasses, oInit.oClasses );\n\t\t\t\n\t\t\t\tif ( oInit.sDom === defaults.sDom && defaults.sDom === \"lfrtip\" )\n\t\t\t\t{\n\t\t\t\t\t/* Set the DOM to use a layout suitable for jQuery UI's theming */\n\t\t\t\t\toSettings.sDom = '<\"H\"lfr>t<\"F\"ip>';\n\t\t\t\t}\n\t\t\t\n\t\t\t\tif ( ! oSettings.renderer ) {\n\t\t\t\t\toSettings.renderer = 'jqueryui';\n\t\t\t\t}\n\t\t\t\telse if ( $.isPlainObject( oSettings.renderer ) && ! oSettings.renderer.header ) {\n\t\t\t\t\toSettings.renderer.header = 'jqueryui';\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$.extend( oClasses, DataTable.ext.classes, oInit.oClasses );\n\t\t\t}\n\t\t\t$this.addClass( oClasses.sTable );\n\t\t\t\n\t\t\t\n\t\t\tif ( oSettings.iInitDisplayStart === undefined )\n\t\t\t{\n\t\t\t\t/* Display start point, taking into account the save saving */\n\t\t\t\toSettings.iInitDisplayStart = oInit.iDisplayStart;\n\t\t\t\toSettings._iDisplayStart = oInit.iDisplayStart;\n\t\t\t}\n\t\t\t\n\t\t\tif ( oInit.iDeferLoading !== null )\n\t\t\t{\n\t\t\t\toSettings.bDeferLoading = true;\n\t\t\t\tvar tmp = $.isArray( oInit.iDeferLoading );\n\t\t\t\toSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;\n\t\t\t\toSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;\n\t\t\t}\n\t\t\t\n\t\t\t/* Language definitions */\n\t\t\tvar oLanguage = oSettings.oLanguage;\n\t\t\t$.extend( true, oLanguage, oInit.oLanguage );\n\t\t\t\n\t\t\tif ( oLanguage.sUrl )\n\t\t\t{\n\t\t\t\t/* Get the language definitions from a file - because this Ajax call makes the language\n\t\t\t\t * get async to the remainder of this function we use bInitHandedOff to indicate that\n\t\t\t\t * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor\n\t\t\t\t */\n\t\t\t\t$.ajax( {\n\t\t\t\t\tdataType: 'json',\n\t\t\t\t\turl: oLanguage.sUrl,\n\t\t\t\t\tsuccess: function ( json ) {\n\t\t\t\t\t\t_fnLanguageCompat( json );\n\t\t\t\t\t\t_fnCamelToHungarian( defaults.oLanguage, json );\n\t\t\t\t\t\t$.extend( true, oLanguage, json );\n\t\t\t\t\t\t_fnInitialise( oSettings );\n\t\t\t\t\t},\n\t\t\t\t\terror: function () {\n\t\t\t\t\t\t// Error occurred loading language file, continue on as best we can\n\t\t\t\t\t\t_fnInitialise( oSettings );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbInitHandedOff = true;\n\t\t\t}\n\t\t\t\n\t\t\t/*\n\t\t\t * Stripes\n\t\t\t */\n\t\t\tif ( oInit.asStripeClasses === null )\n\t\t\t{\n\t\t\t\toSettings.asStripeClasses =[\n\t\t\t\t\toClasses.sStripeOdd,\n\t\t\t\t\toClasses.sStripeEven\n\t\t\t\t];\n\t\t\t}\n\t\t\t\n\t\t\t/* Remove row stripe classes if they are already on the table row */\n\t\t\tvar stripeClasses = oSettings.asStripeClasses;\n\t\t\tvar rowOne = $this.children('tbody').find('tr').eq(0);\n\t\t\tif ( $.inArray( true, $.map( stripeClasses, function(el, i) {\n\t\t\t\treturn rowOne.hasClass(el);\n\t\t\t} ) ) !== -1 ) {\n\t\t\t\t$('tbody tr', this).removeClass( stripeClasses.join(' ') );\n\t\t\t\toSettings.asDestroyStripes = stripeClasses.slice();\n\t\t\t}\n\t\t\t\n\t\t\t/*\n\t\t\t * Columns\n\t\t\t * See if we should load columns automatically or use defined ones\n\t\t\t */\n\t\t\tvar anThs = [];\n\t\t\tvar aoColumnsInit;\n\t\t\tvar nThead = this.getElementsByTagName('thead');\n\t\t\tif ( nThead.length !== 0 )\n\t\t\t{\n\t\t\t\t_fnDetectHeader( oSettings.aoHeader, nThead[0] );\n\t\t\t\tanThs = _fnGetUniqueThs( oSettings );\n\t\t\t}\n\t\t\t\n\t\t\t/* If not given a column array, generate one with nulls */\n\t\t\tif ( oInit.aoColumns === null )\n\t\t\t{\n\t\t\t\taoColumnsInit = [];\n\t\t\t\tfor ( i=0, iLen=anThs.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\taoColumnsInit.push( null );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\taoColumnsInit = oInit.aoColumns;\n\t\t\t}\n\t\t\t\n\t\t\t/* Add the columns */\n\t\t\tfor ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\t_fnAddColumn( oSettings, anThs ? anThs[i] : null );\n\t\t\t}\n\t\t\t\n\t\t\t/* Apply the column definitions */\n\t\t\t_fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) {\n\t\t\t\t_fnColumnOptions( oSettings, iCol, oDef );\n\t\t\t} );\n\t\t\t\n\t\t\t/* HTML5 attribute detection - build an mData object automatically if the\n\t\t\t * attributes are found\n\t\t\t */\n\t\t\tif ( rowOne.length ) {\n\t\t\t\tvar a = function ( cell, name ) {\n\t\t\t\t\treturn cell.getAttribute( 'data-'+name ) !== null ? name : null;\n\t\t\t\t};\n\t\t\t\n\t\t\t\t$( rowOne[0] ).children('th, td').each( function (i, cell) {\n\t\t\t\t\tvar col = oSettings.aoColumns[i];\n\t\t\t\n\t\t\t\t\tif ( col.mData === i ) {\n\t\t\t\t\t\tvar sort = a( cell, 'sort' ) || a( cell, 'order' );\n\t\t\t\t\t\tvar filter = a( cell, 'filter' ) || a( cell, 'search' );\n\t\t\t\n\t\t\t\t\t\tif ( sort !== null || filter !== null ) {\n\t\t\t\t\t\t\tcol.mData = {\n\t\t\t\t\t\t\t\t_:      i+'.display',\n\t\t\t\t\t\t\t\tsort:   sort !== null   ? i+'.@data-'+sort   : undefined,\n\t\t\t\t\t\t\t\ttype:   sort !== null   ? i+'.@data-'+sort   : undefined,\n\t\t\t\t\t\t\t\tfilter: filter !== null ? i+'.@data-'+filter : undefined\n\t\t\t\t\t\t\t};\n\t\t\t\n\t\t\t\t\t\t\t_fnColumnOptions( oSettings, i );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\t\n\t\t\tvar features = oSettings.oFeatures;\n\t\t\tvar loadedInit = function () {\n\t\t\t\t/*\n\t\t\t\t * Sorting\n\t\t\t\t * @todo For modularisation (1.11) this needs to do into a sort start up handler\n\t\t\t\t */\n\t\t\t\n\t\t\t\t// If aaSorting is not defined, then we use the first indicator in asSorting\n\t\t\t\t// in case that has been altered, so the default sort reflects that option\n\t\t\t\tif ( oInit.aaSorting === undefined ) {\n\t\t\t\t\tvar sorting = oSettings.aaSorting;\n\t\t\t\t\tfor ( i=0, iLen=sorting.length ; i<iLen ; i++ ) {\n\t\t\t\t\t\tsorting[i][1] = oSettings.aoColumns[ i ].asSorting[0];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\t\t/* Do a first pass on the sorting classes (allows any size changes to be taken into\n\t\t\t\t * account, and also will apply sorting disabled classes if disabled\n\t\t\t\t */\n\t\t\t\t_fnSortingClasses( oSettings );\n\t\t\t\n\t\t\t\tif ( features.bSort ) {\n\t\t\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', function () {\n\t\t\t\t\t\tif ( oSettings.bSorted ) {\n\t\t\t\t\t\t\tvar aSort = _fnSortFlatten( oSettings );\n\t\t\t\t\t\t\tvar sortedColumns = {};\n\t\t\t\n\t\t\t\t\t\t\t$.each( aSort, function (i, val) {\n\t\t\t\t\t\t\t\tsortedColumns[ val.src ] = val.dir;\n\t\t\t\t\t\t\t} );\n\t\t\t\n\t\t\t\t\t\t\t_fnCallbackFire( oSettings, null, 'order', [oSettings, aSort, sortedColumns] );\n\t\t\t\t\t\t\t_fnSortAria( oSettings );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\n\t\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', function () {\n\t\t\t\t\tif ( oSettings.bSorted || _fnDataSource( oSettings ) === 'ssp' || features.bDeferRender ) {\n\t\t\t\t\t\t_fnSortingClasses( oSettings );\n\t\t\t\t\t}\n\t\t\t\t}, 'sc' );\n\t\t\t\n\t\t\t\n\t\t\t\t/*\n\t\t\t\t * Final init\n\t\t\t\t * Cache the header, body and footer as required, creating them if needed\n\t\t\t\t */\n\t\t\t\n\t\t\t\t// Work around for Webkit bug 83867 - store the caption-side before removing from doc\n\t\t\t\tvar captions = $this.children('caption').each( function () {\n\t\t\t\t\tthis._captionSide = $(this).css('caption-side');\n\t\t\t\t} );\n\t\t\t\n\t\t\t\tvar thead = $this.children('thead');\n\t\t\t\tif ( thead.length === 0 ) {\n\t\t\t\t\tthead = $('<thead/>').appendTo($this);\n\t\t\t\t}\n\t\t\t\toSettings.nTHead = thead[0];\n\t\t\t\n\t\t\t\tvar tbody = $this.children('tbody');\n\t\t\t\tif ( tbody.length === 0 ) {\n\t\t\t\t\ttbody = $('<tbody/>').appendTo($this);\n\t\t\t\t}\n\t\t\t\toSettings.nTBody = tbody[0];\n\t\t\t\n\t\t\t\tvar tfoot = $this.children('tfoot');\n\t\t\t\tif ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== \"\" || oSettings.oScroll.sY !== \"\") ) {\n\t\t\t\t\t// If we are a scrolling table, and no footer has been given, then we need to create\n\t\t\t\t\t// a tfoot element for the caption element to be appended to\n\t\t\t\t\ttfoot = $('<tfoot/>').appendTo($this);\n\t\t\t\t}\n\t\t\t\n\t\t\t\tif ( tfoot.length === 0 || tfoot.children().length === 0 ) {\n\t\t\t\t\t$this.addClass( oClasses.sNoFooter );\n\t\t\t\t}\n\t\t\t\telse if ( tfoot.length > 0 ) {\n\t\t\t\t\toSettings.nTFoot = tfoot[0];\n\t\t\t\t\t_fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot );\n\t\t\t\t}\n\t\t\t\n\t\t\t\t/* Check if there is data passing into the constructor */\n\t\t\t\tif ( oInit.aaData ) {\n\t\t\t\t\tfor ( i=0 ; i<oInit.aaData.length ; i++ ) {\n\t\t\t\t\t\t_fnAddData( oSettings, oInit.aaData[ i ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ( oSettings.bDeferLoading || _fnDataSource( oSettings ) == 'dom' ) {\n\t\t\t\t\t/* Grab the data from the page - only do this when deferred loading or no Ajax\n\t\t\t\t\t * source since there is no point in reading the DOM data if we are then going\n\t\t\t\t\t * to replace it with Ajax data\n\t\t\t\t\t */\n\t\t\t\t\t_fnAddTr( oSettings, $(oSettings.nTBody).children('tr') );\n\t\t\t\t}\n\t\t\t\n\t\t\t\t/* Copy the data index array */\n\t\t\t\toSettings.aiDisplay = oSettings.aiDisplayMaster.slice();\n\t\t\t\n\t\t\t\t/* Initialisation complete - table can be drawn */\n\t\t\t\toSettings.bInitialised = true;\n\t\t\t\n\t\t\t\t/* Check if we need to initialise the table (it might not have been handed off to the\n\t\t\t\t * language processor)\n\t\t\t\t */\n\t\t\t\tif ( bInitHandedOff === false ) {\n\t\t\t\t\t_fnInitialise( oSettings );\n\t\t\t\t}\n\t\t\t};\n\t\t\t\n\t\t\t/* Must be done after everything which can be overridden by the state saving! */\n\t\t\tif ( oInit.bStateSave )\n\t\t\t{\n\t\t\t\tfeatures.bStateSave = true;\n\t\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' );\n\t\t\t\t_fnLoadState( oSettings, oInit, loadedInit );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tloadedInit();\n\t\t\t}\n\t\t\t\n\t\t} );\n\t\t_that = null;\n\t\treturn this;\n\t};\n\n\t\n\t/*\n\t * It is useful to have variables which are scoped locally so only the\n\t * DataTables functions can access them and they don't leak into global space.\n\t * At the same time these functions are often useful over multiple files in the\n\t * core and API, so we list, or at least document, all variables which are used\n\t * by DataTables as private variables here. This also ensures that there is no\n\t * clashing of variable names and that they can easily referenced for reuse.\n\t */\n\t\n\t\n\t// Defined else where\n\t//  _selector_run\n\t//  _selector_opts\n\t//  _selector_first\n\t//  _selector_row_indexes\n\t\n\tvar _ext; // DataTable.ext\n\tvar _Api; // DataTable.Api\n\tvar _api_register; // DataTable.Api.register\n\tvar _api_registerPlural; // DataTable.Api.registerPlural\n\t\n\tvar _re_dic = {};\n\tvar _re_new_lines = /[\\r\\n]/g;\n\tvar _re_html = /<.*?>/g;\n\t\n\t// This is not strict ISO8601 - Date.parse() is quite lax, although\n\t// implementations differ between browsers.\n\tvar _re_date = /^\\d{2,4}[\\.\\/\\-]\\d{1,2}[\\.\\/\\-]\\d{1,2}([T ]{1}\\d{1,2}[:\\.]\\d{2}([\\.:]\\d{2})?)?$/;\n\t\n\t// Escape regular expression special characters\n\tvar _re_escape_regex = new RegExp( '(\\\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\\\', '$', '^', '-' ].join('|\\\\') + ')', 'g' );\n\t\n\t// http://en.wikipedia.org/wiki/Foreign_exchange_market\n\t// - \\u20BD - Russian ruble.\n\t// - \\u20a9 - South Korean Won\n\t// - \\u20BA - Turkish Lira\n\t// - \\u20B9 - Indian Rupee\n\t// - R - Brazil (R$) and South Africa\n\t// - fr - Swiss Franc\n\t// - kr - Swedish krona, Norwegian krone and Danish krone\n\t// - \\u2009 is thin space and \\u202F is narrow no-break space, both used in many\n\t//   standards as thousands separators.\n\tvar _re_formatted_numeric = /[',$£€¥%\\u2009\\u202F\\u20BD\\u20a9\\u20BArfk]/gi;\n\t\n\t\n\tvar _empty = function ( d ) {\n\t\treturn !d || d === true || d === '-' ? true : false;\n\t};\n\t\n\t\n\tvar _intVal = function ( s ) {\n\t\tvar integer = parseInt( s, 10 );\n\t\treturn !isNaN(integer) && isFinite(s) ? integer : null;\n\t};\n\t\n\t// Convert from a formatted number with characters other than `.` as the\n\t// decimal place, to a Javascript number\n\tvar _numToDecimal = function ( num, decimalPoint ) {\n\t\t// Cache created regular expressions for speed as this function is called often\n\t\tif ( ! _re_dic[ decimalPoint ] ) {\n\t\t\t_re_dic[ decimalPoint ] = new RegExp( _fnEscapeRegex( decimalPoint ), 'g' );\n\t\t}\n\t\treturn typeof num === 'string' && decimalPoint !== '.' ?\n\t\t\tnum.replace( /\\./g, '' ).replace( _re_dic[ decimalPoint ], '.' ) :\n\t\t\tnum;\n\t};\n\t\n\t\n\tvar _isNumber = function ( d, decimalPoint, formatted ) {\n\t\tvar strType = typeof d === 'string';\n\t\n\t\t// If empty return immediately so there must be a number if it is a\n\t\t// formatted string (this stops the string \"k\", or \"kr\", etc being detected\n\t\t// as a formatted number for currency\n\t\tif ( _empty( d ) ) {\n\t\t\treturn true;\n\t\t}\n\t\n\t\tif ( decimalPoint && strType ) {\n\t\t\td = _numToDecimal( d, decimalPoint );\n\t\t}\n\t\n\t\tif ( formatted && strType ) {\n\t\t\td = d.replace( _re_formatted_numeric, '' );\n\t\t}\n\t\n\t\treturn !isNaN( parseFloat(d) ) && isFinite( d );\n\t};\n\t\n\t\n\t// A string without HTML in it can be considered to be HTML still\n\tvar _isHtml = function ( d ) {\n\t\treturn _empty( d ) || typeof d === 'string';\n\t};\n\t\n\t\n\tvar _htmlNumeric = function ( d, decimalPoint, formatted ) {\n\t\tif ( _empty( d ) ) {\n\t\t\treturn true;\n\t\t}\n\t\n\t\tvar html = _isHtml( d );\n\t\treturn ! html ?\n\t\t\tnull :\n\t\t\t_isNumber( _stripHtml( d ), decimalPoint, formatted ) ?\n\t\t\t\ttrue :\n\t\t\t\tnull;\n\t};\n\t\n\t\n\tvar _pluck = function ( a, prop, prop2 ) {\n\t\tvar out = [];\n\t\tvar i=0, ien=a.length;\n\t\n\t\t// Could have the test in the loop for slightly smaller code, but speed\n\t\t// is essential here\n\t\tif ( prop2 !== undefined ) {\n\t\t\tfor ( ; i<ien ; i++ ) {\n\t\t\t\tif ( a[i] && a[i][ prop ] ) {\n\t\t\t\t\tout.push( a[i][ prop ][ prop2 ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tfor ( ; i<ien ; i++ ) {\n\t\t\t\tif ( a[i] ) {\n\t\t\t\t\tout.push( a[i][ prop ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\treturn out;\n\t};\n\t\n\t\n\t// Basically the same as _pluck, but rather than looping over `a` we use `order`\n\t// as the indexes to pick from `a`\n\tvar _pluck_order = function ( a, order, prop, prop2 )\n\t{\n\t\tvar out = [];\n\t\tvar i=0, ien=order.length;\n\t\n\t\t// Could have the test in the loop for slightly smaller code, but speed\n\t\t// is essential here\n\t\tif ( prop2 !== undefined ) {\n\t\t\tfor ( ; i<ien ; i++ ) {\n\t\t\t\tif ( a[ order[i] ][ prop ] ) {\n\t\t\t\t\tout.push( a[ order[i] ][ prop ][ prop2 ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tfor ( ; i<ien ; i++ ) {\n\t\t\t\tout.push( a[ order[i] ][ prop ] );\n\t\t\t}\n\t\t}\n\t\n\t\treturn out;\n\t};\n\t\n\t\n\tvar _range = function ( len, start )\n\t{\n\t\tvar out = [];\n\t\tvar end;\n\t\n\t\tif ( start === undefined ) {\n\t\t\tstart = 0;\n\t\t\tend = len;\n\t\t}\n\t\telse {\n\t\t\tend = start;\n\t\t\tstart = len;\n\t\t}\n\t\n\t\tfor ( var i=start ; i<end ; i++ ) {\n\t\t\tout.push( i );\n\t\t}\n\t\n\t\treturn out;\n\t};\n\t\n\t\n\tvar _removeEmpty = function ( a )\n\t{\n\t\tvar out = [];\n\t\n\t\tfor ( var i=0, ien=a.length ; i<ien ; i++ ) {\n\t\t\tif ( a[i] ) { // careful - will remove all falsy values!\n\t\t\t\tout.push( a[i] );\n\t\t\t}\n\t\t}\n\t\n\t\treturn out;\n\t};\n\t\n\t\n\tvar _stripHtml = function ( d ) {\n\t\treturn d.replace( _re_html, '' );\n\t};\n\t\n\t\n\t/**\n\t * Determine if all values in the array are unique. This means we can short\n\t * cut the _unique method at the cost of a single loop. A sorted array is used\n\t * to easily check the values.\n\t *\n\t * @param  {array} src Source array\n\t * @return {boolean} true if all unique, false otherwise\n\t * @ignore\n\t */\n\tvar _areAllUnique = function ( src ) {\n\t\tif ( src.length < 2 ) {\n\t\t\treturn true;\n\t\t}\n\t\n\t\tvar sorted = src.slice().sort();\n\t\tvar last = sorted[0];\n\t\n\t\tfor ( var i=1, ien=sorted.length ; i<ien ; i++ ) {\n\t\t\tif ( sorted[i] === last ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\n\t\t\tlast = sorted[i];\n\t\t}\n\t\n\t\treturn true;\n\t};\n\t\n\t\n\t/**\n\t * Find the unique elements in a source array.\n\t *\n\t * @param  {array} src Source array\n\t * @return {array} Array of unique items\n\t * @ignore\n\t */\n\tvar _unique = function ( src )\n\t{\n\t\tif ( _areAllUnique( src ) ) {\n\t\t\treturn src.slice();\n\t\t}\n\t\n\t\t// A faster unique method is to use object keys to identify used values,\n\t\t// but this doesn't work with arrays or objects, which we must also\n\t\t// consider. See jsperf.com/compare-array-unique-versions/4 for more\n\t\t// information.\n\t\tvar\n\t\t\tout = [],\n\t\t\tval,\n\t\t\ti, ien=src.length,\n\t\t\tj, k=0;\n\t\n\t\tagain: for ( i=0 ; i<ien ; i++ ) {\n\t\t\tval = src[i];\n\t\n\t\t\tfor ( j=0 ; j<k ; j++ ) {\n\t\t\t\tif ( out[j] === val ) {\n\t\t\t\t\tcontinue again;\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tout.push( val );\n\t\t\tk++;\n\t\t}\n\t\n\t\treturn out;\n\t};\n\t\n\t\n\t/**\n\t * DataTables utility methods\n\t * \n\t * This namespace provides helper methods that DataTables uses internally to\n\t * create a DataTable, but which are not exclusively used only for DataTables.\n\t * These methods can be used by extension authors to save the duplication of\n\t * code.\n\t *\n\t *  @namespace\n\t */\n\tDataTable.util = {\n\t\t/**\n\t\t * Throttle the calls to a function. Arguments and context are maintained\n\t\t * for the throttled function.\n\t\t *\n\t\t * @param {function} fn Function to be called\n\t\t * @param {integer} freq Call frequency in mS\n\t\t * @return {function} Wrapped function\n\t\t */\n\t\tthrottle: function ( fn, freq ) {\n\t\t\tvar\n\t\t\t\tfrequency = freq !== undefined ? freq : 200,\n\t\t\t\tlast,\n\t\t\t\ttimer;\n\t\n\t\t\treturn function () {\n\t\t\t\tvar\n\t\t\t\t\tthat = this,\n\t\t\t\t\tnow  = +new Date(),\n\t\t\t\t\targs = arguments;\n\t\n\t\t\t\tif ( last && now < last + frequency ) {\n\t\t\t\t\tclearTimeout( timer );\n\t\n\t\t\t\t\ttimer = setTimeout( function () {\n\t\t\t\t\t\tlast = undefined;\n\t\t\t\t\t\tfn.apply( that, args );\n\t\t\t\t\t}, frequency );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlast = now;\n\t\t\t\t\tfn.apply( that, args );\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * Escape a string such that it can be used in a regular expression\n\t\t *\n\t\t *  @param {string} val string to escape\n\t\t *  @returns {string} escaped string\n\t\t */\n\t\tescapeRegex: function ( val ) {\n\t\t\treturn val.replace( _re_escape_regex, '\\\\$1' );\n\t\t}\n\t};\n\t\n\t\n\t\n\t/**\n\t * Create a mapping object that allows camel case parameters to be looked up\n\t * for their Hungarian counterparts. The mapping is stored in a private\n\t * parameter called `_hungarianMap` which can be accessed on the source object.\n\t *  @param {object} o\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnHungarianMap ( o )\n\t{\n\t\tvar\n\t\t\thungarian = 'a aa ai ao as b fn i m o s ',\n\t\t\tmatch,\n\t\t\tnewKey,\n\t\t\tmap = {};\n\t\n\t\t$.each( o, function (key, val) {\n\t\t\tmatch = key.match(/^([^A-Z]+?)([A-Z])/);\n\t\n\t\t\tif ( match && hungarian.indexOf(match[1]+' ') !== -1 )\n\t\t\t{\n\t\t\t\tnewKey = key.replace( match[0], match[2].toLowerCase() );\n\t\t\t\tmap[ newKey ] = key;\n\t\n\t\t\t\tif ( match[1] === 'o' )\n\t\t\t\t{\n\t\t\t\t\t_fnHungarianMap( o[key] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t\n\t\to._hungarianMap = map;\n\t}\n\t\n\t\n\t/**\n\t * Convert from camel case parameters to Hungarian, based on a Hungarian map\n\t * created by _fnHungarianMap.\n\t *  @param {object} src The model object which holds all parameters that can be\n\t *    mapped.\n\t *  @param {object} user The object to convert from camel case to Hungarian.\n\t *  @param {boolean} force When set to `true`, properties which already have a\n\t *    Hungarian value in the `user` object will be overwritten. Otherwise they\n\t *    won't be.\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCamelToHungarian ( src, user, force )\n\t{\n\t\tif ( ! src._hungarianMap ) {\n\t\t\t_fnHungarianMap( src );\n\t\t}\n\t\n\t\tvar hungarianKey;\n\t\n\t\t$.each( user, function (key, val) {\n\t\t\thungarianKey = src._hungarianMap[ key ];\n\t\n\t\t\tif ( hungarianKey !== undefined && (force || user[hungarianKey] === undefined) )\n\t\t\t{\n\t\t\t\t// For objects, we need to buzz down into the object to copy parameters\n\t\t\t\tif ( hungarianKey.charAt(0) === 'o' )\n\t\t\t\t{\n\t\t\t\t\t// Copy the camelCase options over to the hungarian\n\t\t\t\t\tif ( ! user[ hungarianKey ] ) {\n\t\t\t\t\t\tuser[ hungarianKey ] = {};\n\t\t\t\t\t}\n\t\t\t\t\t$.extend( true, user[hungarianKey], user[key] );\n\t\n\t\t\t\t\t_fnCamelToHungarian( src[hungarianKey], user[hungarianKey], force );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tuser[hungarianKey] = user[ key ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n\t\n\t\n\t/**\n\t * Language compatibility - when certain options are given, and others aren't, we\n\t * need to duplicate the values over, in order to provide backwards compatibility\n\t * with older language files.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnLanguageCompat( lang )\n\t{\n\t\tvar defaults = DataTable.defaults.oLanguage;\n\t\tvar zeroRecords = lang.sZeroRecords;\n\t\n\t\t/* Backwards compatibility - if there is no sEmptyTable given, then use the same as\n\t\t * sZeroRecords - assuming that is given.\n\t\t */\n\t\tif ( ! lang.sEmptyTable && zeroRecords &&\n\t\t\tdefaults.sEmptyTable === \"No data available in table\" )\n\t\t{\n\t\t\t_fnMap( lang, lang, 'sZeroRecords', 'sEmptyTable' );\n\t\t}\n\t\n\t\t/* Likewise with loading records */\n\t\tif ( ! lang.sLoadingRecords && zeroRecords &&\n\t\t\tdefaults.sLoadingRecords === \"Loading...\" )\n\t\t{\n\t\t\t_fnMap( lang, lang, 'sZeroRecords', 'sLoadingRecords' );\n\t\t}\n\t\n\t\t// Old parameter name of the thousands separator mapped onto the new\n\t\tif ( lang.sInfoThousands ) {\n\t\t\tlang.sThousands = lang.sInfoThousands;\n\t\t}\n\t\n\t\tvar decimal = lang.sDecimal;\n\t\tif ( decimal ) {\n\t\t\t_addNumericSort( decimal );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Map one parameter onto another\n\t *  @param {object} o Object to map\n\t *  @param {*} knew The new parameter name\n\t *  @param {*} old The old parameter name\n\t */\n\tvar _fnCompatMap = function ( o, knew, old ) {\n\t\tif ( o[ knew ] !== undefined ) {\n\t\t\to[ old ] = o[ knew ];\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * Provide backwards compatibility for the main DT options. Note that the new\n\t * options are mapped onto the old parameters, so this is an external interface\n\t * change only.\n\t *  @param {object} init Object to map\n\t */\n\tfunction _fnCompatOpts ( init )\n\t{\n\t\t_fnCompatMap( init, 'ordering',      'bSort' );\n\t\t_fnCompatMap( init, 'orderMulti',    'bSortMulti' );\n\t\t_fnCompatMap( init, 'orderClasses',  'bSortClasses' );\n\t\t_fnCompatMap( init, 'orderCellsTop', 'bSortCellsTop' );\n\t\t_fnCompatMap( init, 'order',         'aaSorting' );\n\t\t_fnCompatMap( init, 'orderFixed',    'aaSortingFixed' );\n\t\t_fnCompatMap( init, 'paging',        'bPaginate' );\n\t\t_fnCompatMap( init, 'pagingType',    'sPaginationType' );\n\t\t_fnCompatMap( init, 'pageLength',    'iDisplayLength' );\n\t\t_fnCompatMap( init, 'searching',     'bFilter' );\n\t\n\t\t// Boolean initialisation of x-scrolling\n\t\tif ( typeof init.sScrollX === 'boolean' ) {\n\t\t\tinit.sScrollX = init.sScrollX ? '100%' : '';\n\t\t}\n\t\tif ( typeof init.scrollX === 'boolean' ) {\n\t\t\tinit.scrollX = init.scrollX ? '100%' : '';\n\t\t}\n\t\n\t\t// Column search objects are in an array, so it needs to be converted\n\t\t// element by element\n\t\tvar searchCols = init.aoSearchCols;\n\t\n\t\tif ( searchCols ) {\n\t\t\tfor ( var i=0, ien=searchCols.length ; i<ien ; i++ ) {\n\t\t\t\tif ( searchCols[i] ) {\n\t\t\t\t\t_fnCamelToHungarian( DataTable.models.oSearch, searchCols[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Provide backwards compatibility for column options. Note that the new options\n\t * are mapped onto the old parameters, so this is an external interface change\n\t * only.\n\t *  @param {object} init Object to map\n\t */\n\tfunction _fnCompatCols ( init )\n\t{\n\t\t_fnCompatMap( init, 'orderable',     'bSortable' );\n\t\t_fnCompatMap( init, 'orderData',     'aDataSort' );\n\t\t_fnCompatMap( init, 'orderSequence', 'asSorting' );\n\t\t_fnCompatMap( init, 'orderDataType', 'sortDataType' );\n\t\n\t\t// orderData can be given as an integer\n\t\tvar dataSort = init.aDataSort;\n\t\tif ( typeof dataSort === 'number' && ! $.isArray( dataSort ) ) {\n\t\t\tinit.aDataSort = [ dataSort ];\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Browser feature detection for capabilities, quirks\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnBrowserDetect( settings )\n\t{\n\t\t// We don't need to do this every time DataTables is constructed, the values\n\t\t// calculated are specific to the browser and OS configuration which we\n\t\t// don't expect to change between initialisations\n\t\tif ( ! DataTable.__browser ) {\n\t\t\tvar browser = {};\n\t\t\tDataTable.__browser = browser;\n\t\n\t\t\t// Scrolling feature / quirks detection\n\t\t\tvar n = $('<div/>')\n\t\t\t\t.css( {\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tleft: $(window).scrollLeft()*-1, // allow for scrolling\n\t\t\t\t\theight: 1,\n\t\t\t\t\twidth: 1,\n\t\t\t\t\toverflow: 'hidden'\n\t\t\t\t} )\n\t\t\t\t.append(\n\t\t\t\t\t$('<div/>')\n\t\t\t\t\t\t.css( {\n\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\ttop: 1,\n\t\t\t\t\t\t\tleft: 1,\n\t\t\t\t\t\t\twidth: 100,\n\t\t\t\t\t\t\toverflow: 'scroll'\n\t\t\t\t\t\t} )\n\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t$('<div/>')\n\t\t\t\t\t\t\t\t.css( {\n\t\t\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\t\t\theight: 10\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t\t.appendTo( 'body' );\n\t\n\t\t\tvar outer = n.children();\n\t\t\tvar inner = outer.children();\n\t\n\t\t\t// Numbers below, in order, are:\n\t\t\t// inner.offsetWidth, inner.clientWidth, outer.offsetWidth, outer.clientWidth\n\t\t\t//\n\t\t\t// IE6 XP:                           100 100 100  83\n\t\t\t// IE7 Vista:                        100 100 100  83\n\t\t\t// IE 8+ Windows:                     83  83 100  83\n\t\t\t// Evergreen Windows:                 83  83 100  83\n\t\t\t// Evergreen Mac with scrollbars:     85  85 100  85\n\t\t\t// Evergreen Mac without scrollbars: 100 100 100 100\n\t\n\t\t\t// Get scrollbar width\n\t\t\tbrowser.barWidth = outer[0].offsetWidth - outer[0].clientWidth;\n\t\n\t\t\t// IE6/7 will oversize a width 100% element inside a scrolling element, to\n\t\t\t// include the width of the scrollbar, while other browsers ensure the inner\n\t\t\t// element is contained without forcing scrolling\n\t\t\tbrowser.bScrollOversize = inner[0].offsetWidth === 100 && outer[0].clientWidth !== 100;\n\t\n\t\t\t// In rtl text layout, some browsers (most, but not all) will place the\n\t\t\t// scrollbar on the left, rather than the right.\n\t\t\tbrowser.bScrollbarLeft = Math.round( inner.offset().left ) !== 1;\n\t\n\t\t\t// IE8- don't provide height and width for getBoundingClientRect\n\t\t\tbrowser.bBounding = n[0].getBoundingClientRect().width ? true : false;\n\t\n\t\t\tn.remove();\n\t\t}\n\t\n\t\t$.extend( settings.oBrowser, DataTable.__browser );\n\t\tsettings.oScroll.iBarWidth = DataTable.__browser.barWidth;\n\t}\n\t\n\t\n\t/**\n\t * Array.prototype reduce[Right] method, used for browsers which don't support\n\t * JS 1.6. Done this way to reduce code size, since we iterate either way\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnReduce ( that, fn, init, start, end, inc )\n\t{\n\t\tvar\n\t\t\ti = start,\n\t\t\tvalue,\n\t\t\tisSet = false;\n\t\n\t\tif ( init !== undefined ) {\n\t\t\tvalue = init;\n\t\t\tisSet = true;\n\t\t}\n\t\n\t\twhile ( i !== end ) {\n\t\t\tif ( ! that.hasOwnProperty(i) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\n\t\t\tvalue = isSet ?\n\t\t\t\tfn( value, that[i], i, that ) :\n\t\t\t\tthat[i];\n\t\n\t\t\tisSet = true;\n\t\t\ti += inc;\n\t\t}\n\t\n\t\treturn value;\n\t}\n\t\n\t/**\n\t * Add a column to the list used for the table with default values\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {node} nTh The th element for this column\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAddColumn( oSettings, nTh )\n\t{\n\t\t// Add column to aoColumns array\n\t\tvar oDefaults = DataTable.defaults.column;\n\t\tvar iCol = oSettings.aoColumns.length;\n\t\tvar oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {\n\t\t\t\"nTh\": nTh ? nTh : document.createElement('th'),\n\t\t\t\"sTitle\":    oDefaults.sTitle    ? oDefaults.sTitle    : nTh ? nTh.innerHTML : '',\n\t\t\t\"aDataSort\": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],\n\t\t\t\"mData\": oDefaults.mData ? oDefaults.mData : iCol,\n\t\t\tidx: iCol\n\t\t} );\n\t\toSettings.aoColumns.push( oCol );\n\t\n\t\t// Add search object for column specific search. Note that the `searchCols[ iCol ]`\n\t\t// passed into extend can be undefined. This allows the user to give a default\n\t\t// with only some of the parameters defined, and also not give a default\n\t\tvar searchCols = oSettings.aoPreSearchCols;\n\t\tsearchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch, searchCols[ iCol ] );\n\t\n\t\t// Use the default column options function to initialise classes etc\n\t\t_fnColumnOptions( oSettings, iCol, $(nTh).data() );\n\t}\n\t\n\t\n\t/**\n\t * Apply options for a column\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {int} iCol column index to consider\n\t *  @param {object} oOptions object with sType, bVisible and bSearchable etc\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnColumnOptions( oSettings, iCol, oOptions )\n\t{\n\t\tvar oCol = oSettings.aoColumns[ iCol ];\n\t\tvar oClasses = oSettings.oClasses;\n\t\tvar th = $(oCol.nTh);\n\t\n\t\t// Try to get width information from the DOM. We can't get it from CSS\n\t\t// as we'd need to parse the CSS stylesheet. `width` option can override\n\t\tif ( ! oCol.sWidthOrig ) {\n\t\t\t// Width attribute\n\t\t\toCol.sWidthOrig = th.attr('width') || null;\n\t\n\t\t\t// Style attribute\n\t\t\tvar t = (th.attr('style') || '').match(/width:\\s*(\\d+[pxem%]+)/);\n\t\t\tif ( t ) {\n\t\t\t\toCol.sWidthOrig = t[1];\n\t\t\t}\n\t\t}\n\t\n\t\t/* User specified column options */\n\t\tif ( oOptions !== undefined && oOptions !== null )\n\t\t{\n\t\t\t// Backwards compatibility\n\t\t\t_fnCompatCols( oOptions );\n\t\n\t\t\t// Map camel case parameters to their Hungarian counterparts\n\t\t\t_fnCamelToHungarian( DataTable.defaults.column, oOptions );\n\t\n\t\t\t/* Backwards compatibility for mDataProp */\n\t\t\tif ( oOptions.mDataProp !== undefined && !oOptions.mData )\n\t\t\t{\n\t\t\t\toOptions.mData = oOptions.mDataProp;\n\t\t\t}\n\t\n\t\t\tif ( oOptions.sType )\n\t\t\t{\n\t\t\t\toCol._sManualType = oOptions.sType;\n\t\t\t}\n\t\n\t\t\t// `class` is a reserved word in Javascript, so we need to provide\n\t\t\t// the ability to use a valid name for the camel case input\n\t\t\tif ( oOptions.className && ! oOptions.sClass )\n\t\t\t{\n\t\t\t\toOptions.sClass = oOptions.className;\n\t\t\t}\n\t\n\t\t\t$.extend( oCol, oOptions );\n\t\t\t_fnMap( oCol, oOptions, \"sWidth\", \"sWidthOrig\" );\n\t\n\t\t\t/* iDataSort to be applied (backwards compatibility), but aDataSort will take\n\t\t\t * priority if defined\n\t\t\t */\n\t\t\tif ( oOptions.iDataSort !== undefined )\n\t\t\t{\n\t\t\t\toCol.aDataSort = [ oOptions.iDataSort ];\n\t\t\t}\n\t\t\t_fnMap( oCol, oOptions, \"aDataSort\" );\n\t\t}\n\t\n\t\t/* Cache the data get and set functions for speed */\n\t\tvar mDataSrc = oCol.mData;\n\t\tvar mData = _fnGetObjectDataFn( mDataSrc );\n\t\tvar mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;\n\t\n\t\tvar attrTest = function( src ) {\n\t\t\treturn typeof src === 'string' && src.indexOf('@') !== -1;\n\t\t};\n\t\toCol._bAttrSrc = $.isPlainObject( mDataSrc ) && (\n\t\t\tattrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter)\n\t\t);\n\t\toCol._setter = null;\n\t\n\t\toCol.fnGetData = function (rowData, type, meta) {\n\t\t\tvar innerData = mData( rowData, type, undefined, meta );\n\t\n\t\t\treturn mRender && type ?\n\t\t\t\tmRender( innerData, type, rowData, meta ) :\n\t\t\t\tinnerData;\n\t\t};\n\t\toCol.fnSetData = function ( rowData, val, meta ) {\n\t\t\treturn _fnSetObjectDataFn( mDataSrc )( rowData, val, meta );\n\t\t};\n\t\n\t\t// Indicate if DataTables should read DOM data as an object or array\n\t\t// Used in _fnGetRowElements\n\t\tif ( typeof mDataSrc !== 'number' ) {\n\t\t\toSettings._rowReadObject = true;\n\t\t}\n\t\n\t\t/* Feature sorting overrides column specific when off */\n\t\tif ( !oSettings.oFeatures.bSort )\n\t\t{\n\t\t\toCol.bSortable = false;\n\t\t\tth.addClass( oClasses.sSortableNone ); // Have to add class here as order event isn't called\n\t\t}\n\t\n\t\t/* Check that the class assignment is correct for sorting */\n\t\tvar bAsc = $.inArray('asc', oCol.asSorting) !== -1;\n\t\tvar bDesc = $.inArray('desc', oCol.asSorting) !== -1;\n\t\tif ( !oCol.bSortable || (!bAsc && !bDesc) )\n\t\t{\n\t\t\toCol.sSortingClass = oClasses.sSortableNone;\n\t\t\toCol.sSortingClassJUI = \"\";\n\t\t}\n\t\telse if ( bAsc && !bDesc )\n\t\t{\n\t\t\toCol.sSortingClass = oClasses.sSortableAsc;\n\t\t\toCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed;\n\t\t}\n\t\telse if ( !bAsc && bDesc )\n\t\t{\n\t\t\toCol.sSortingClass = oClasses.sSortableDesc;\n\t\t\toCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed;\n\t\t}\n\t\telse\n\t\t{\n\t\t\toCol.sSortingClass = oClasses.sSortable;\n\t\t\toCol.sSortingClassJUI = oClasses.sSortJUI;\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Adjust the table column widths for new data. Note: you would probably want to\n\t * do a redraw after calling this function!\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAdjustColumnSizing ( settings )\n\t{\n\t\t/* Not interested in doing column width calculation if auto-width is disabled */\n\t\tif ( settings.oFeatures.bAutoWidth !== false )\n\t\t{\n\t\t\tvar columns = settings.aoColumns;\n\t\n\t\t\t_fnCalculateColumnWidths( settings );\n\t\t\tfor ( var i=0 , iLen=columns.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tcolumns[i].nTh.style.width = columns[i].sWidth;\n\t\t\t}\n\t\t}\n\t\n\t\tvar scroll = settings.oScroll;\n\t\tif ( scroll.sY !== '' || scroll.sX !== '')\n\t\t{\n\t\t\t_fnScrollDraw( settings );\n\t\t}\n\t\n\t\t_fnCallbackFire( settings, null, 'column-sizing', [settings] );\n\t}\n\t\n\t\n\t/**\n\t * Covert the index of a visible column to the index in the data array (take account\n\t * of hidden columns)\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {int} iMatch Visible column index to lookup\n\t *  @returns {int} i the data index\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnVisibleToColumnIndex( oSettings, iMatch )\n\t{\n\t\tvar aiVis = _fnGetColumns( oSettings, 'bVisible' );\n\t\n\t\treturn typeof aiVis[iMatch] === 'number' ?\n\t\t\taiVis[iMatch] :\n\t\t\tnull;\n\t}\n\t\n\t\n\t/**\n\t * Covert the index of an index in the data array and convert it to the visible\n\t *   column index (take account of hidden columns)\n\t *  @param {int} iMatch Column index to lookup\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {int} i the data index\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnColumnIndexToVisible( oSettings, iMatch )\n\t{\n\t\tvar aiVis = _fnGetColumns( oSettings, 'bVisible' );\n\t\tvar iPos = $.inArray( iMatch, aiVis );\n\t\n\t\treturn iPos !== -1 ? iPos : null;\n\t}\n\t\n\t\n\t/**\n\t * Get the number of visible columns\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {int} i the number of visible columns\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnVisbleColumns( oSettings )\n\t{\n\t\tvar vis = 0;\n\t\n\t\t// No reduce in IE8, use a loop for now\n\t\t$.each( oSettings.aoColumns, function ( i, col ) {\n\t\t\tif ( col.bVisible && $(col.nTh).css('display') !== 'none' ) {\n\t\t\t\tvis++;\n\t\t\t}\n\t\t} );\n\t\n\t\treturn vis;\n\t}\n\t\n\t\n\t/**\n\t * Get an array of column indexes that match a given property\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {string} sParam Parameter in aoColumns to look for - typically\n\t *    bVisible or bSearchable\n\t *  @returns {array} Array of indexes with matched properties\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetColumns( oSettings, sParam )\n\t{\n\t\tvar a = [];\n\t\n\t\t$.map( oSettings.aoColumns, function(val, i) {\n\t\t\tif ( val[sParam] ) {\n\t\t\t\ta.push( i );\n\t\t\t}\n\t\t} );\n\t\n\t\treturn a;\n\t}\n\t\n\t\n\t/**\n\t * Calculate the 'type' of a column\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnColumnTypes ( settings )\n\t{\n\t\tvar columns = settings.aoColumns;\n\t\tvar data = settings.aoData;\n\t\tvar types = DataTable.ext.type.detect;\n\t\tvar i, ien, j, jen, k, ken;\n\t\tvar col, cell, detectedType, cache;\n\t\n\t\t// For each column, spin over the \n\t\tfor ( i=0, ien=columns.length ; i<ien ; i++ ) {\n\t\t\tcol = columns[i];\n\t\t\tcache = [];\n\t\n\t\t\tif ( ! col.sType && col._sManualType ) {\n\t\t\t\tcol.sType = col._sManualType;\n\t\t\t}\n\t\t\telse if ( ! col.sType ) {\n\t\t\t\tfor ( j=0, jen=types.length ; j<jen ; j++ ) {\n\t\t\t\t\tfor ( k=0, ken=data.length ; k<ken ; k++ ) {\n\t\t\t\t\t\t// Use a cache array so we only need to get the type data\n\t\t\t\t\t\t// from the formatter once (when using multiple detectors)\n\t\t\t\t\t\tif ( cache[k] === undefined ) {\n\t\t\t\t\t\t\tcache[k] = _fnGetCellData( settings, k, i, 'type' );\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tdetectedType = types[j]( cache[k], settings );\n\t\n\t\t\t\t\t\t// If null, then this type can't apply to this column, so\n\t\t\t\t\t\t// rather than testing all cells, break out. There is an\n\t\t\t\t\t\t// exception for the last type which is `html`. We need to\n\t\t\t\t\t\t// scan all rows since it is possible to mix string and HTML\n\t\t\t\t\t\t// types\n\t\t\t\t\t\tif ( ! detectedType && j !== types.length-1 ) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Only a single match is needed for html type since it is\n\t\t\t\t\t\t// bottom of the pile and very similar to string\n\t\t\t\t\t\tif ( detectedType === 'html' ) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Type is valid for all data points in the column - use this\n\t\t\t\t\t// type\n\t\t\t\t\tif ( detectedType ) {\n\t\t\t\t\t\tcol.sType = detectedType;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\t// Fall back - if no type was detected, always use string\n\t\t\t\tif ( ! col.sType ) {\n\t\t\t\t\tcol.sType = 'string';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Take the column definitions and static columns arrays and calculate how\n\t * they relate to column indexes. The callback function will then apply the\n\t * definition found for a column to a suitable configuration object.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {array} aoColDefs The aoColumnDefs array that is to be applied\n\t *  @param {array} aoCols The aoColumns array that defines columns individually\n\t *  @param {function} fn Callback function - takes two parameters, the calculated\n\t *    column index and the definition for that column.\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )\n\t{\n\t\tvar i, iLen, j, jLen, k, kLen, def;\n\t\tvar columns = oSettings.aoColumns;\n\t\n\t\t// Column definitions with aTargets\n\t\tif ( aoColDefs )\n\t\t{\n\t\t\t/* Loop over the definitions array - loop in reverse so first instance has priority */\n\t\t\tfor ( i=aoColDefs.length-1 ; i>=0 ; i-- )\n\t\t\t{\n\t\t\t\tdef = aoColDefs[i];\n\t\n\t\t\t\t/* Each definition can target multiple columns, as it is an array */\n\t\t\t\tvar aTargets = def.targets !== undefined ?\n\t\t\t\t\tdef.targets :\n\t\t\t\t\tdef.aTargets;\n\t\n\t\t\t\tif ( ! $.isArray( aTargets ) )\n\t\t\t\t{\n\t\t\t\t\taTargets = [ aTargets ];\n\t\t\t\t}\n\t\n\t\t\t\tfor ( j=0, jLen=aTargets.length ; j<jLen ; j++ )\n\t\t\t\t{\n\t\t\t\t\tif ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Add columns that we don't yet know about */\n\t\t\t\t\t\twhile( columns.length <= aTargets[j] )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_fnAddColumn( oSettings );\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t/* Integer, basic index */\n\t\t\t\t\t\tfn( aTargets[j], def );\n\t\t\t\t\t}\n\t\t\t\t\telse if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Negative integer, right to left column counting */\n\t\t\t\t\t\tfn( columns.length+aTargets[j], def );\n\t\t\t\t\t}\n\t\t\t\t\telse if ( typeof aTargets[j] === 'string' )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Class name matching on TH element */\n\t\t\t\t\t\tfor ( k=0, kLen=columns.length ; k<kLen ; k++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ( aTargets[j] == \"_all\" ||\n\t\t\t\t\t\t\t     $(columns[k].nTh).hasClass( aTargets[j] ) )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfn( k, def );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\t// Statically defined columns array\n\t\tif ( aoCols )\n\t\t{\n\t\t\tfor ( i=0, iLen=aoCols.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tfn( i, aoCols[i] );\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/**\n\t * Add a data array to the table, creating DOM node etc. This is the parallel to\n\t * _fnGatherData, but for adding rows from a Javascript source, rather than a\n\t * DOM source.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {array} aData data array to be added\n\t *  @param {node} [nTr] TR element to add to the table - optional. If not given,\n\t *    DataTables will create a row automatically\n\t *  @param {array} [anTds] Array of TD|TH elements for the row - must be given\n\t *    if nTr is.\n\t *  @returns {int} >=0 if successful (index of new aoData entry), -1 if failed\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAddData ( oSettings, aDataIn, nTr, anTds )\n\t{\n\t\t/* Create the object for storing information about this new row */\n\t\tvar iRow = oSettings.aoData.length;\n\t\tvar oData = $.extend( true, {}, DataTable.models.oRow, {\n\t\t\tsrc: nTr ? 'dom' : 'data',\n\t\t\tidx: iRow\n\t\t} );\n\t\n\t\toData._aData = aDataIn;\n\t\toSettings.aoData.push( oData );\n\t\n\t\t/* Create the cells */\n\t\tvar nTd, sThisType;\n\t\tvar columns = oSettings.aoColumns;\n\t\n\t\t// Invalidate the column types as the new data needs to be revalidated\n\t\tfor ( var i=0, iLen=columns.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tcolumns[i].sType = null;\n\t\t}\n\t\n\t\t/* Add to the display array */\n\t\toSettings.aiDisplayMaster.push( iRow );\n\t\n\t\tvar id = oSettings.rowIdFn( aDataIn );\n\t\tif ( id !== undefined ) {\n\t\t\toSettings.aIds[ id ] = oData;\n\t\t}\n\t\n\t\t/* Create the DOM information, or register it if already present */\n\t\tif ( nTr || ! oSettings.oFeatures.bDeferRender )\n\t\t{\n\t\t\t_fnCreateTr( oSettings, iRow, nTr, anTds );\n\t\t}\n\t\n\t\treturn iRow;\n\t}\n\t\n\t\n\t/**\n\t * Add one or more TR elements to the table. Generally we'd expect to\n\t * use this for reading data from a DOM sourced table, but it could be\n\t * used for an TR element. Note that if a TR is given, it is used (i.e.\n\t * it is not cloned).\n\t *  @param {object} settings dataTables settings object\n\t *  @param {array|node|jQuery} trs The TR element(s) to add to the table\n\t *  @returns {array} Array of indexes for the added rows\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAddTr( settings, trs )\n\t{\n\t\tvar row;\n\t\n\t\t// Allow an individual node to be passed in\n\t\tif ( ! (trs instanceof $) ) {\n\t\t\ttrs = $(trs);\n\t\t}\n\t\n\t\treturn trs.map( function (i, el) {\n\t\t\trow = _fnGetRowElements( settings, el );\n\t\t\treturn _fnAddData( settings, row.data, el, row.cells );\n\t\t} );\n\t}\n\t\n\t\n\t/**\n\t * Take a TR element and convert it to an index in aoData\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {node} n the TR element to find\n\t *  @returns {int} index if the node is found, null if not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnNodeToDataIndex( oSettings, n )\n\t{\n\t\treturn (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null;\n\t}\n\t\n\t\n\t/**\n\t * Take a TD element and convert it into a column data index (not the visible index)\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {int} iRow The row number the TD/TH can be found in\n\t *  @param {node} n The TD/TH element to find\n\t *  @returns {int} index if the node is found, -1 if not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnNodeToColumnIndex( oSettings, iRow, n )\n\t{\n\t\treturn $.inArray( n, oSettings.aoData[ iRow ].anCells );\n\t}\n\t\n\t\n\t/**\n\t * Get the data for a given cell from the internal cache, taking into account data mapping\n\t *  @param {object} settings dataTables settings object\n\t *  @param {int} rowIdx aoData row id\n\t *  @param {int} colIdx Column index\n\t *  @param {string} type data get type ('display', 'type' 'filter' 'sort')\n\t *  @returns {*} Cell data\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetCellData( settings, rowIdx, colIdx, type )\n\t{\n\t\tvar draw           = settings.iDraw;\n\t\tvar col            = settings.aoColumns[colIdx];\n\t\tvar rowData        = settings.aoData[rowIdx]._aData;\n\t\tvar defaultContent = col.sDefaultContent;\n\t\tvar cellData       = col.fnGetData( rowData, type, {\n\t\t\tsettings: settings,\n\t\t\trow:      rowIdx,\n\t\t\tcol:      colIdx\n\t\t} );\n\t\n\t\tif ( cellData === undefined ) {\n\t\t\tif ( settings.iDrawError != draw && defaultContent === null ) {\n\t\t\t\t_fnLog( settings, 0, \"Requested unknown parameter \"+\n\t\t\t\t\t(typeof col.mData=='function' ? '{function}' : \"'\"+col.mData+\"'\")+\n\t\t\t\t\t\" for row \"+rowIdx+\", column \"+colIdx, 4 );\n\t\t\t\tsettings.iDrawError = draw;\n\t\t\t}\n\t\t\treturn defaultContent;\n\t\t}\n\t\n\t\t// When the data source is null and a specific data type is requested (i.e.\n\t\t// not the original data), we can use default column data\n\t\tif ( (cellData === rowData || cellData === null) && defaultContent !== null && type !== undefined ) {\n\t\t\tcellData = defaultContent;\n\t\t}\n\t\telse if ( typeof cellData === 'function' ) {\n\t\t\t// If the data source is a function, then we run it and use the return,\n\t\t\t// executing in the scope of the data object (for instances)\n\t\t\treturn cellData.call( rowData );\n\t\t}\n\t\n\t\tif ( cellData === null && type == 'display' ) {\n\t\t\treturn '';\n\t\t}\n\t\treturn cellData;\n\t}\n\t\n\t\n\t/**\n\t * Set the value for a specific cell, into the internal data cache\n\t *  @param {object} settings dataTables settings object\n\t *  @param {int} rowIdx aoData row id\n\t *  @param {int} colIdx Column index\n\t *  @param {*} val Value to set\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSetCellData( settings, rowIdx, colIdx, val )\n\t{\n\t\tvar col     = settings.aoColumns[colIdx];\n\t\tvar rowData = settings.aoData[rowIdx]._aData;\n\t\n\t\tcol.fnSetData( rowData, val, {\n\t\t\tsettings: settings,\n\t\t\trow:      rowIdx,\n\t\t\tcol:      colIdx\n\t\t}  );\n\t}\n\t\n\t\n\t// Private variable that is used to match action syntax in the data property object\n\tvar __reArray = /\\[.*?\\]$/;\n\tvar __reFn = /\\(\\)$/;\n\t\n\t/**\n\t * Split string on periods, taking into account escaped periods\n\t * @param  {string} str String to split\n\t * @return {array} Split string\n\t */\n\tfunction _fnSplitObjNotation( str )\n\t{\n\t\treturn $.map( str.match(/(\\\\.|[^\\.])+/g) || [''], function ( s ) {\n\t\t\treturn s.replace(/\\\\\\./g, '.');\n\t\t} );\n\t}\n\t\n\t\n\t/**\n\t * Return a function that can be used to get data from a source object, taking\n\t * into account the ability to use nested objects as a source\n\t *  @param {string|int|function} mSource The data source for the object\n\t *  @returns {function} Data get function\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetObjectDataFn( mSource )\n\t{\n\t\tif ( $.isPlainObject( mSource ) )\n\t\t{\n\t\t\t/* Build an object of get functions, and wrap them in a single call */\n\t\t\tvar o = {};\n\t\t\t$.each( mSource, function (key, val) {\n\t\t\t\tif ( val ) {\n\t\t\t\t\to[key] = _fnGetObjectDataFn( val );\n\t\t\t\t}\n\t\t\t} );\n\t\n\t\t\treturn function (data, type, row, meta) {\n\t\t\t\tvar t = o[type] || o._;\n\t\t\t\treturn t !== undefined ?\n\t\t\t\t\tt(data, type, row, meta) :\n\t\t\t\t\tdata;\n\t\t\t};\n\t\t}\n\t\telse if ( mSource === null )\n\t\t{\n\t\t\t/* Give an empty string for rendering / sorting etc */\n\t\t\treturn function (data) { // type, row and meta also passed, but not used\n\t\t\t\treturn data;\n\t\t\t};\n\t\t}\n\t\telse if ( typeof mSource === 'function' )\n\t\t{\n\t\t\treturn function (data, type, row, meta) {\n\t\t\t\treturn mSource( data, type, row, meta );\n\t\t\t};\n\t\t}\n\t\telse if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||\n\t\t\t      mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) )\n\t\t{\n\t\t\t/* If there is a . in the source string then the data source is in a\n\t\t\t * nested object so we loop over the data for each level to get the next\n\t\t\t * level down. On each loop we test for undefined, and if found immediately\n\t\t\t * return. This allows entire objects to be missing and sDefaultContent to\n\t\t\t * be used if defined, rather than throwing an error\n\t\t\t */\n\t\t\tvar fetchData = function (data, type, src) {\n\t\t\t\tvar arrayNotation, funcNotation, out, innerSrc;\n\t\n\t\t\t\tif ( src !== \"\" )\n\t\t\t\t{\n\t\t\t\t\tvar a = _fnSplitObjNotation( src );\n\t\n\t\t\t\t\tfor ( var i=0, iLen=a.length ; i<iLen ; i++ )\n\t\t\t\t\t{\n\t\t\t\t\t\t// Check if we are dealing with special notation\n\t\t\t\t\t\tarrayNotation = a[i].match(__reArray);\n\t\t\t\t\t\tfuncNotation = a[i].match(__reFn);\n\t\n\t\t\t\t\t\tif ( arrayNotation )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Array notation\n\t\t\t\t\t\t\ta[i] = a[i].replace(__reArray, '');\n\t\n\t\t\t\t\t\t\t// Condition allows simply [] to be passed in\n\t\t\t\t\t\t\tif ( a[i] !== \"\" ) {\n\t\t\t\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tout = [];\n\t\n\t\t\t\t\t\t\t// Get the remainder of the nested object to get\n\t\t\t\t\t\t\ta.splice( 0, i+1 );\n\t\t\t\t\t\t\tinnerSrc = a.join('.');\n\t\n\t\t\t\t\t\t\t// Traverse each entry in the array getting the properties requested\n\t\t\t\t\t\t\tif ( $.isArray( data ) ) {\n\t\t\t\t\t\t\t\tfor ( var j=0, jLen=data.length ; j<jLen ; j++ ) {\n\t\t\t\t\t\t\t\t\tout.push( fetchData( data[j], type, innerSrc ) );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t\t// If a string is given in between the array notation indicators, that\n\t\t\t\t\t\t\t// is used to join the strings together, otherwise an array is returned\n\t\t\t\t\t\t\tvar join = arrayNotation[0].substring(1, arrayNotation[0].length-1);\n\t\t\t\t\t\t\tdata = (join===\"\") ? out : out.join(join);\n\t\n\t\t\t\t\t\t\t// The inner call to fetchData has already traversed through the remainder\n\t\t\t\t\t\t\t// of the source requested, so we exit from the loop\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( funcNotation )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Function call\n\t\t\t\t\t\t\ta[i] = a[i].replace(__reFn, '');\n\t\t\t\t\t\t\tdata = data[ a[i] ]();\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif ( data === null || data[ a[i] ] === undefined )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\treturn data;\n\t\t\t};\n\t\n\t\t\treturn function (data, type) { // row and meta also passed, but not used\n\t\t\t\treturn fetchData( data, type, mSource );\n\t\t\t};\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* Array or flat object mapping */\n\t\t\treturn function (data, type) { // row and meta also passed, but not used\n\t\t\t\treturn data[mSource];\n\t\t\t};\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Return a function that can be used to set data from a source object, taking\n\t * into account the ability to use nested objects as a source\n\t *  @param {string|int|function} mSource The data source for the object\n\t *  @returns {function} Data set function\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSetObjectDataFn( mSource )\n\t{\n\t\tif ( $.isPlainObject( mSource ) )\n\t\t{\n\t\t\t/* Unlike get, only the underscore (global) option is used for for\n\t\t\t * setting data since we don't know the type here. This is why an object\n\t\t\t * option is not documented for `mData` (which is read/write), but it is\n\t\t\t * for `mRender` which is read only.\n\t\t\t */\n\t\t\treturn _fnSetObjectDataFn( mSource._ );\n\t\t}\n\t\telse if ( mSource === null )\n\t\t{\n\t\t\t/* Nothing to do when the data source is null */\n\t\t\treturn function () {};\n\t\t}\n\t\telse if ( typeof mSource === 'function' )\n\t\t{\n\t\t\treturn function (data, val, meta) {\n\t\t\t\tmSource( data, 'set', val, meta );\n\t\t\t};\n\t\t}\n\t\telse if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||\n\t\t\t      mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) )\n\t\t{\n\t\t\t/* Like the get, we need to get data from a nested object */\n\t\t\tvar setData = function (data, val, src) {\n\t\t\t\tvar a = _fnSplitObjNotation( src ), b;\n\t\t\t\tvar aLast = a[a.length-1];\n\t\t\t\tvar arrayNotation, funcNotation, o, innerSrc;\n\t\n\t\t\t\tfor ( var i=0, iLen=a.length-1 ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\t// Check if we are dealing with an array notation request\n\t\t\t\t\tarrayNotation = a[i].match(__reArray);\n\t\t\t\t\tfuncNotation = a[i].match(__reFn);\n\t\n\t\t\t\t\tif ( arrayNotation )\n\t\t\t\t\t{\n\t\t\t\t\t\ta[i] = a[i].replace(__reArray, '');\n\t\t\t\t\t\tdata[ a[i] ] = [];\n\t\n\t\t\t\t\t\t// Get the remainder of the nested object to set so we can recurse\n\t\t\t\t\t\tb = a.slice();\n\t\t\t\t\t\tb.splice( 0, i+1 );\n\t\t\t\t\t\tinnerSrc = b.join('.');\n\t\n\t\t\t\t\t\t// Traverse each entry in the array setting the properties requested\n\t\t\t\t\t\tif ( $.isArray( val ) )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfor ( var j=0, jLen=val.length ; j<jLen ; j++ )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\to = {};\n\t\t\t\t\t\t\t\tsetData( o, val[j], innerSrc );\n\t\t\t\t\t\t\t\tdata[ a[i] ].push( o );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// We've been asked to save data to an array, but it\n\t\t\t\t\t\t\t// isn't array data to be saved. Best that can be done\n\t\t\t\t\t\t\t// is to just save the value.\n\t\t\t\t\t\t\tdata[ a[i] ] = val;\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// The inner call to setData has already traversed through the remainder\n\t\t\t\t\t\t// of the source and has set the data, thus we can exit here\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telse if ( funcNotation )\n\t\t\t\t\t{\n\t\t\t\t\t\t// Function call\n\t\t\t\t\t\ta[i] = a[i].replace(__reFn, '');\n\t\t\t\t\t\tdata = data[ a[i] ]( val );\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// If the nested object doesn't currently exist - since we are\n\t\t\t\t\t// trying to set the value - create it\n\t\t\t\t\tif ( data[ a[i] ] === null || data[ a[i] ] === undefined )\n\t\t\t\t\t{\n\t\t\t\t\t\tdata[ a[i] ] = {};\n\t\t\t\t\t}\n\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t}\n\t\n\t\t\t\t// Last item in the input - i.e, the actual set\n\t\t\t\tif ( aLast.match(__reFn ) )\n\t\t\t\t{\n\t\t\t\t\t// Function call\n\t\t\t\t\tdata = data[ aLast.replace(__reFn, '') ]( val );\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// If array notation is used, we just want to strip it and use the property name\n\t\t\t\t\t// and assign the value. If it isn't used, then we get the result we want anyway\n\t\t\t\t\tdata[ aLast.replace(__reArray, '') ] = val;\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t\treturn function (data, val) { // meta is also passed in, but not used\n\t\t\t\treturn setData( data, val, mSource );\n\t\t\t};\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* Array or flat object mapping */\n\t\t\treturn function (data, val) { // meta is also passed in, but not used\n\t\t\t\tdata[mSource] = val;\n\t\t\t};\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Return an array with the full table data\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns array {array} aData Master data array\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetDataMaster ( settings )\n\t{\n\t\treturn _pluck( settings.aoData, '_aData' );\n\t}\n\t\n\t\n\t/**\n\t * Nuke the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnClearTable( settings )\n\t{\n\t\tsettings.aoData.length = 0;\n\t\tsettings.aiDisplayMaster.length = 0;\n\t\tsettings.aiDisplay.length = 0;\n\t\tsettings.aIds = {};\n\t}\n\t\n\t\n\t /**\n\t * Take an array of integers (index array) and remove a target integer (value - not\n\t * the key!)\n\t *  @param {array} a Index array to target\n\t *  @param {int} iTarget value to find\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDeleteIndex( a, iTarget, splice )\n\t{\n\t\tvar iTargetIndex = -1;\n\t\n\t\tfor ( var i=0, iLen=a.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tif ( a[i] == iTarget )\n\t\t\t{\n\t\t\t\tiTargetIndex = i;\n\t\t\t}\n\t\t\telse if ( a[i] > iTarget )\n\t\t\t{\n\t\t\t\ta[i]--;\n\t\t\t}\n\t\t}\n\t\n\t\tif ( iTargetIndex != -1 && splice === undefined )\n\t\t{\n\t\t\ta.splice( iTargetIndex, 1 );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Mark cached data as invalid such that a re-read of the data will occur when\n\t * the cached data is next requested. Also update from the data source object.\n\t *\n\t * @param {object} settings DataTables settings object\n\t * @param {int}    rowIdx   Row index to invalidate\n\t * @param {string} [src]    Source to invalidate from: undefined, 'auto', 'dom'\n\t *     or 'data'\n\t * @param {int}    [colIdx] Column index to invalidate. If undefined the whole\n\t *     row will be invalidated\n\t * @memberof DataTable#oApi\n\t *\n\t * @todo For the modularisation of v1.11 this will need to become a callback, so\n\t *   the sort and filter methods can subscribe to it. That will required\n\t *   initialisation options for sorting, which is why it is not already baked in\n\t */\n\tfunction _fnInvalidate( settings, rowIdx, src, colIdx )\n\t{\n\t\tvar row = settings.aoData[ rowIdx ];\n\t\tvar i, ien;\n\t\tvar cellWrite = function ( cell, col ) {\n\t\t\t// This is very frustrating, but in IE if you just write directly\n\t\t\t// to innerHTML, and elements that are overwritten are GC'ed,\n\t\t\t// even if there is a reference to them elsewhere\n\t\t\twhile ( cell.childNodes.length ) {\n\t\t\t\tcell.removeChild( cell.firstChild );\n\t\t\t}\n\t\n\t\t\tcell.innerHTML = _fnGetCellData( settings, rowIdx, col, 'display' );\n\t\t};\n\t\n\t\t// Are we reading last data from DOM or the data object?\n\t\tif ( src === 'dom' || ((! src || src === 'auto') && row.src === 'dom') ) {\n\t\t\t// Read the data from the DOM\n\t\t\trow._aData = _fnGetRowElements(\n\t\t\t\t\tsettings, row, colIdx, colIdx === undefined ? undefined : row._aData\n\t\t\t\t)\n\t\t\t\t.data;\n\t\t}\n\t\telse {\n\t\t\t// Reading from data object, update the DOM\n\t\t\tvar cells = row.anCells;\n\t\n\t\t\tif ( cells ) {\n\t\t\t\tif ( colIdx !== undefined ) {\n\t\t\t\t\tcellWrite( cells[colIdx], colIdx );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfor ( i=0, ien=cells.length ; i<ien ; i++ ) {\n\t\t\t\t\t\tcellWrite( cells[i], i );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\t// For both row and cell invalidation, the cached data for sorting and\n\t\t// filtering is nulled out\n\t\trow._aSortData = null;\n\t\trow._aFilterData = null;\n\t\n\t\t// Invalidate the type for a specific column (if given) or all columns since\n\t\t// the data might have changed\n\t\tvar cols = settings.aoColumns;\n\t\tif ( colIdx !== undefined ) {\n\t\t\tcols[ colIdx ].sType = null;\n\t\t}\n\t\telse {\n\t\t\tfor ( i=0, ien=cols.length ; i<ien ; i++ ) {\n\t\t\t\tcols[i].sType = null;\n\t\t\t}\n\t\n\t\t\t// Update DataTables special `DT_*` attributes for the row\n\t\t\t_fnRowAttributes( settings, row );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Build a data source object from an HTML row, reading the contents of the\n\t * cells that are in the row.\n\t *\n\t * @param {object} settings DataTables settings object\n\t * @param {node|object} TR element from which to read data or existing row\n\t *   object from which to re-read the data from the cells\n\t * @param {int} [colIdx] Optional column index\n\t * @param {array|object} [d] Data source object. If `colIdx` is given then this\n\t *   parameter should also be given and will be used to write the data into.\n\t *   Only the column in question will be written\n\t * @returns {object} Object with two parameters: `data` the data read, in\n\t *   document order, and `cells` and array of nodes (they can be useful to the\n\t *   caller, so rather than needing a second traversal to get them, just return\n\t *   them from here).\n\t * @memberof DataTable#oApi\n\t */\n\tfunction _fnGetRowElements( settings, row, colIdx, d )\n\t{\n\t\tvar\n\t\t\ttds = [],\n\t\t\ttd = row.firstChild,\n\t\t\tname, col, o, i=0, contents,\n\t\t\tcolumns = settings.aoColumns,\n\t\t\tobjectRead = settings._rowReadObject;\n\t\n\t\t// Allow the data object to be passed in, or construct\n\t\td = d !== undefined ?\n\t\t\td :\n\t\t\tobjectRead ?\n\t\t\t\t{} :\n\t\t\t\t[];\n\t\n\t\tvar attr = function ( str, td  ) {\n\t\t\tif ( typeof str === 'string' ) {\n\t\t\t\tvar idx = str.indexOf('@');\n\t\n\t\t\t\tif ( idx !== -1 ) {\n\t\t\t\t\tvar attr = str.substring( idx+1 );\n\t\t\t\t\tvar setter = _fnSetObjectDataFn( str );\n\t\t\t\t\tsetter( d, td.getAttribute( attr ) );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\n\t\t// Read data from a cell and store into the data object\n\t\tvar cellProcess = function ( cell ) {\n\t\t\tif ( colIdx === undefined || colIdx === i ) {\n\t\t\t\tcol = columns[i];\n\t\t\t\tcontents = $.trim(cell.innerHTML);\n\t\n\t\t\t\tif ( col && col._bAttrSrc ) {\n\t\t\t\t\tvar setter = _fnSetObjectDataFn( col.mData._ );\n\t\t\t\t\tsetter( d, contents );\n\t\n\t\t\t\t\tattr( col.mData.sort, cell );\n\t\t\t\t\tattr( col.mData.type, cell );\n\t\t\t\t\tattr( col.mData.filter, cell );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Depending on the `data` option for the columns the data can\n\t\t\t\t\t// be read to either an object or an array.\n\t\t\t\t\tif ( objectRead ) {\n\t\t\t\t\t\tif ( ! col._setter ) {\n\t\t\t\t\t\t\t// Cache the setter function\n\t\t\t\t\t\t\tcol._setter = _fnSetObjectDataFn( col.mData );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcol._setter( d, contents );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\td[i] = contents;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\ti++;\n\t\t};\n\t\n\t\tif ( td ) {\n\t\t\t// `tr` element was passed in\n\t\t\twhile ( td ) {\n\t\t\t\tname = td.nodeName.toUpperCase();\n\t\n\t\t\t\tif ( name == \"TD\" || name == \"TH\" ) {\n\t\t\t\t\tcellProcess( td );\n\t\t\t\t\ttds.push( td );\n\t\t\t\t}\n\t\n\t\t\t\ttd = td.nextSibling;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// Existing row object passed in\n\t\t\ttds = row.anCells;\n\t\n\t\t\tfor ( var j=0, jen=tds.length ; j<jen ; j++ ) {\n\t\t\t\tcellProcess( tds[j] );\n\t\t\t}\n\t\t}\n\t\n\t\t// Read the ID from the DOM if present\n\t\tvar rowNode = row.firstChild ? row : row.nTr;\n\t\n\t\tif ( rowNode ) {\n\t\t\tvar id = rowNode.getAttribute( 'id' );\n\t\n\t\t\tif ( id ) {\n\t\t\t\t_fnSetObjectDataFn( settings.rowId )( d, id );\n\t\t\t}\n\t\t}\n\t\n\t\treturn {\n\t\t\tdata: d,\n\t\t\tcells: tds\n\t\t};\n\t}\n\t/**\n\t * Create a new TR element (and it's TD children) for a row\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {int} iRow Row to consider\n\t *  @param {node} [nTrIn] TR element to add to the table - optional. If not given,\n\t *    DataTables will create a row automatically\n\t *  @param {array} [anTds] Array of TD|TH elements for the row - must be given\n\t *    if nTr is.\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCreateTr ( oSettings, iRow, nTrIn, anTds )\n\t{\n\t\tvar\n\t\t\trow = oSettings.aoData[iRow],\n\t\t\trowData = row._aData,\n\t\t\tcells = [],\n\t\t\tnTr, nTd, oCol,\n\t\t\ti, iLen;\n\t\n\t\tif ( row.nTr === null )\n\t\t{\n\t\t\tnTr = nTrIn || document.createElement('tr');\n\t\n\t\t\trow.nTr = nTr;\n\t\t\trow.anCells = cells;\n\t\n\t\t\t/* Use a private property on the node to allow reserve mapping from the node\n\t\t\t * to the aoData array for fast look up\n\t\t\t */\n\t\t\tnTr._DT_RowIndex = iRow;\n\t\n\t\t\t/* Special parameters can be given by the data source to be used on the row */\n\t\t\t_fnRowAttributes( oSettings, row );\n\t\n\t\t\t/* Process each column */\n\t\t\tfor ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\toCol = oSettings.aoColumns[i];\n\t\n\t\t\t\tnTd = nTrIn ? anTds[i] : document.createElement( oCol.sCellType );\n\t\t\t\tnTd._DT_CellIndex = {\n\t\t\t\t\trow: iRow,\n\t\t\t\t\tcolumn: i\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tcells.push( nTd );\n\t\n\t\t\t\t// Need to create the HTML if new, or if a rendering function is defined\n\t\t\t\tif ( (!nTrIn || oCol.mRender || oCol.mData !== i) &&\n\t\t\t\t\t (!$.isPlainObject(oCol.mData) || oCol.mData._ !== i+'.display')\n\t\t\t\t) {\n\t\t\t\t\tnTd.innerHTML = _fnGetCellData( oSettings, iRow, i, 'display' );\n\t\t\t\t}\n\t\n\t\t\t\t/* Add user defined class */\n\t\t\t\tif ( oCol.sClass )\n\t\t\t\t{\n\t\t\t\t\tnTd.className += ' '+oCol.sClass;\n\t\t\t\t}\n\t\n\t\t\t\t// Visibility - add or remove as required\n\t\t\t\tif ( oCol.bVisible && ! nTrIn )\n\t\t\t\t{\n\t\t\t\t\tnTr.appendChild( nTd );\n\t\t\t\t}\n\t\t\t\telse if ( ! oCol.bVisible && nTrIn )\n\t\t\t\t{\n\t\t\t\t\tnTd.parentNode.removeChild( nTd );\n\t\t\t\t}\n\t\n\t\t\t\tif ( oCol.fnCreatedCell )\n\t\t\t\t{\n\t\t\t\t\toCol.fnCreatedCell.call( oSettings.oInstance,\n\t\t\t\t\t\tnTd, _fnGetCellData( oSettings, iRow, i ), rowData, iRow, i\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow] );\n\t\t}\n\t\n\t\t// Remove once webkit bug 131819 and Chromium bug 365619 have been resolved\n\t\t// and deployed\n\t\trow.nTr.setAttribute( 'role', 'row' );\n\t}\n\t\n\t\n\t/**\n\t * Add attributes to a row based on the special `DT_*` parameters in a data\n\t * source object.\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} DataTables row object for the row to be modified\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnRowAttributes( settings, row )\n\t{\n\t\tvar tr = row.nTr;\n\t\tvar data = row._aData;\n\t\n\t\tif ( tr ) {\n\t\t\tvar id = settings.rowIdFn( data );\n\t\n\t\t\tif ( id ) {\n\t\t\t\ttr.id = id;\n\t\t\t}\n\t\n\t\t\tif ( data.DT_RowClass ) {\n\t\t\t\t// Remove any classes added by DT_RowClass before\n\t\t\t\tvar a = data.DT_RowClass.split(' ');\n\t\t\t\trow.__rowc = row.__rowc ?\n\t\t\t\t\t_unique( row.__rowc.concat( a ) ) :\n\t\t\t\t\ta;\n\t\n\t\t\t\t$(tr)\n\t\t\t\t\t.removeClass( row.__rowc.join(' ') )\n\t\t\t\t\t.addClass( data.DT_RowClass );\n\t\t\t}\n\t\n\t\t\tif ( data.DT_RowAttr ) {\n\t\t\t\t$(tr).attr( data.DT_RowAttr );\n\t\t\t}\n\t\n\t\t\tif ( data.DT_RowData ) {\n\t\t\t\t$(tr).data( data.DT_RowData );\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Create the HTML header for the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnBuildHead( oSettings )\n\t{\n\t\tvar i, ien, cell, row, column;\n\t\tvar thead = oSettings.nTHead;\n\t\tvar tfoot = oSettings.nTFoot;\n\t\tvar createHeader = $('th, td', thead).length === 0;\n\t\tvar classes = oSettings.oClasses;\n\t\tvar columns = oSettings.aoColumns;\n\t\n\t\tif ( createHeader ) {\n\t\t\trow = $('<tr/>').appendTo( thead );\n\t\t}\n\t\n\t\tfor ( i=0, ien=columns.length ; i<ien ; i++ ) {\n\t\t\tcolumn = columns[i];\n\t\t\tcell = $( column.nTh ).addClass( column.sClass );\n\t\n\t\t\tif ( createHeader ) {\n\t\t\t\tcell.appendTo( row );\n\t\t\t}\n\t\n\t\t\t// 1.11 move into sorting\n\t\t\tif ( oSettings.oFeatures.bSort ) {\n\t\t\t\tcell.addClass( column.sSortingClass );\n\t\n\t\t\t\tif ( column.bSortable !== false ) {\n\t\t\t\t\tcell\n\t\t\t\t\t\t.attr( 'tabindex', oSettings.iTabIndex )\n\t\t\t\t\t\t.attr( 'aria-controls', oSettings.sTableId );\n\t\n\t\t\t\t\t_fnSortAttachListener( oSettings, column.nTh, i );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tif ( column.sTitle != cell[0].innerHTML ) {\n\t\t\t\tcell.html( column.sTitle );\n\t\t\t}\n\t\n\t\t\t_fnRenderer( oSettings, 'header' )(\n\t\t\t\toSettings, cell, column, classes\n\t\t\t);\n\t\t}\n\t\n\t\tif ( createHeader ) {\n\t\t\t_fnDetectHeader( oSettings.aoHeader, thead );\n\t\t}\n\t\t\n\t\t/* ARIA role for the rows */\n\t \t$(thead).find('>tr').attr('role', 'row');\n\t\n\t\t/* Deal with the footer - add classes if required */\n\t\t$(thead).find('>tr>th, >tr>td').addClass( classes.sHeaderTH );\n\t\t$(tfoot).find('>tr>th, >tr>td').addClass( classes.sFooterTH );\n\t\n\t\t// Cache the footer cells. Note that we only take the cells from the first\n\t\t// row in the footer. If there is more than one row the user wants to\n\t\t// interact with, they need to use the table().foot() method. Note also this\n\t\t// allows cells to be used for multiple columns using colspan\n\t\tif ( tfoot !== null ) {\n\t\t\tvar cells = oSettings.aoFooter[0];\n\t\n\t\t\tfor ( i=0, ien=cells.length ; i<ien ; i++ ) {\n\t\t\t\tcolumn = columns[i];\n\t\t\t\tcolumn.nTf = cells[i].cell;\n\t\n\t\t\t\tif ( column.sClass ) {\n\t\t\t\t\t$(column.nTf).addClass( column.sClass );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Draw the header (or footer) element based on the column visibility states. The\n\t * methodology here is to use the layout array from _fnDetectHeader, modified for\n\t * the instantaneous column visibility, to construct the new layout. The grid is\n\t * traversed over cell at a time in a rows x columns grid fashion, although each\n\t * cell insert can cover multiple elements in the grid - which is tracks using the\n\t * aApplied array. Cell inserts in the grid will only occur where there isn't\n\t * already a cell in that position.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param array {objects} aoSource Layout array from _fnDetectHeader\n\t *  @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc,\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDrawHead( oSettings, aoSource, bIncludeHidden )\n\t{\n\t\tvar i, iLen, j, jLen, k, kLen, n, nLocalTr;\n\t\tvar aoLocal = [];\n\t\tvar aApplied = [];\n\t\tvar iColumns = oSettings.aoColumns.length;\n\t\tvar iRowspan, iColspan;\n\t\n\t\tif ( ! aoSource )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\n\t\tif (  bIncludeHidden === undefined )\n\t\t{\n\t\t\tbIncludeHidden = false;\n\t\t}\n\t\n\t\t/* Make a copy of the master layout array, but without the visible columns in it */\n\t\tfor ( i=0, iLen=aoSource.length ; i<iLen ; i++ )\n\t\t{\n\t\t\taoLocal[i] = aoSource[i].slice();\n\t\t\taoLocal[i].nTr = aoSource[i].nTr;\n\t\n\t\t\t/* Remove any columns which are currently hidden */\n\t\t\tfor ( j=iColumns-1 ; j>=0 ; j-- )\n\t\t\t{\n\t\t\t\tif ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )\n\t\t\t\t{\n\t\t\t\t\taoLocal[i].splice( j, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t/* Prep the applied array - it needs an element for each row */\n\t\t\taApplied.push( [] );\n\t\t}\n\t\n\t\tfor ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tnLocalTr = aoLocal[i].nTr;\n\t\n\t\t\t/* All cells are going to be replaced, so empty out the row */\n\t\t\tif ( nLocalTr )\n\t\t\t{\n\t\t\t\twhile( (n = nLocalTr.firstChild) )\n\t\t\t\t{\n\t\t\t\t\tnLocalTr.removeChild( n );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tfor ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )\n\t\t\t{\n\t\t\t\tiRowspan = 1;\n\t\t\t\tiColspan = 1;\n\t\n\t\t\t\t/* Check to see if there is already a cell (row/colspan) covering our target\n\t\t\t\t * insert point. If there is, then there is nothing to do.\n\t\t\t\t */\n\t\t\t\tif ( aApplied[i][j] === undefined )\n\t\t\t\t{\n\t\t\t\t\tnLocalTr.appendChild( aoLocal[i][j].cell );\n\t\t\t\t\taApplied[i][j] = 1;\n\t\n\t\t\t\t\t/* Expand the cell to cover as many rows as needed */\n\t\t\t\t\twhile ( aoLocal[i+iRowspan] !== undefined &&\n\t\t\t\t\t        aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )\n\t\t\t\t\t{\n\t\t\t\t\t\taApplied[i+iRowspan][j] = 1;\n\t\t\t\t\t\tiRowspan++;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t/* Expand the cell to cover as many columns as needed */\n\t\t\t\t\twhile ( aoLocal[i][j+iColspan] !== undefined &&\n\t\t\t\t\t        aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Must update the applied array over the rows for the columns */\n\t\t\t\t\t\tfor ( k=0 ; k<iRowspan ; k++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\taApplied[i+k][j+iColspan] = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tiColspan++;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t/* Do the actual expansion in the DOM */\n\t\t\t\t\t$(aoLocal[i][j].cell)\n\t\t\t\t\t\t.attr('rowspan', iRowspan)\n\t\t\t\t\t\t.attr('colspan', iColspan);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Insert the required TR nodes into the table for display\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDraw( oSettings )\n\t{\n\t\t/* Provide a pre-callback function which can be used to cancel the draw is false is returned */\n\t\tvar aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );\n\t\tif ( $.inArray( false, aPreDraw ) !== -1 )\n\t\t{\n\t\t\t_fnProcessingDisplay( oSettings, false );\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar i, iLen, n;\n\t\tvar anRows = [];\n\t\tvar iRowCount = 0;\n\t\tvar asStripeClasses = oSettings.asStripeClasses;\n\t\tvar iStripes = asStripeClasses.length;\n\t\tvar iOpenRows = oSettings.aoOpenRows.length;\n\t\tvar oLang = oSettings.oLanguage;\n\t\tvar iInitDisplayStart = oSettings.iInitDisplayStart;\n\t\tvar bServerSide = _fnDataSource( oSettings ) == 'ssp';\n\t\tvar aiDisplay = oSettings.aiDisplay;\n\t\n\t\toSettings.bDrawing = true;\n\t\n\t\t/* Check and see if we have an initial draw position from state saving */\n\t\tif ( iInitDisplayStart !== undefined && iInitDisplayStart !== -1 )\n\t\t{\n\t\t\toSettings._iDisplayStart = bServerSide ?\n\t\t\t\tiInitDisplayStart :\n\t\t\t\tiInitDisplayStart >= oSettings.fnRecordsDisplay() ?\n\t\t\t\t\t0 :\n\t\t\t\t\tiInitDisplayStart;\n\t\n\t\t\toSettings.iInitDisplayStart = -1;\n\t\t}\n\t\n\t\tvar iDisplayStart = oSettings._iDisplayStart;\n\t\tvar iDisplayEnd = oSettings.fnDisplayEnd();\n\t\n\t\t/* Server-side processing draw intercept */\n\t\tif ( oSettings.bDeferLoading )\n\t\t{\n\t\t\toSettings.bDeferLoading = false;\n\t\t\toSettings.iDraw++;\n\t\t\t_fnProcessingDisplay( oSettings, false );\n\t\t}\n\t\telse if ( !bServerSide )\n\t\t{\n\t\t\toSettings.iDraw++;\n\t\t}\n\t\telse if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\n\t\tif ( aiDisplay.length !== 0 )\n\t\t{\n\t\t\tvar iStart = bServerSide ? 0 : iDisplayStart;\n\t\t\tvar iEnd = bServerSide ? oSettings.aoData.length : iDisplayEnd;\n\t\n\t\t\tfor ( var j=iStart ; j<iEnd ; j++ )\n\t\t\t{\n\t\t\t\tvar iDataIndex = aiDisplay[j];\n\t\t\t\tvar aoData = oSettings.aoData[ iDataIndex ];\n\t\t\t\tif ( aoData.nTr === null )\n\t\t\t\t{\n\t\t\t\t\t_fnCreateTr( oSettings, iDataIndex );\n\t\t\t\t}\n\t\n\t\t\t\tvar nRow = aoData.nTr;\n\t\n\t\t\t\t/* Remove the old striping classes and then add the new one */\n\t\t\t\tif ( iStripes !== 0 )\n\t\t\t\t{\n\t\t\t\t\tvar sStripe = asStripeClasses[ iRowCount % iStripes ];\n\t\t\t\t\tif ( aoData._sRowStripe != sStripe )\n\t\t\t\t\t{\n\t\t\t\t\t\t$(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe );\n\t\t\t\t\t\taoData._sRowStripe = sStripe;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\t// Row callback functions - might want to manipulate the row\n\t\t\t\t// iRowCount and j are not currently documented. Are they at all\n\t\t\t\t// useful?\n\t\t\t\t_fnCallbackFire( oSettings, 'aoRowCallback', null,\n\t\t\t\t\t[nRow, aoData._aData, iRowCount, j] );\n\t\n\t\t\t\tanRows.push( nRow );\n\t\t\t\tiRowCount++;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* Table is empty - create a row with an empty message in it */\n\t\t\tvar sZero = oLang.sZeroRecords;\n\t\t\tif ( oSettings.iDraw == 1 &&  _fnDataSource( oSettings ) == 'ajax' )\n\t\t\t{\n\t\t\t\tsZero = oLang.sLoadingRecords;\n\t\t\t}\n\t\t\telse if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )\n\t\t\t{\n\t\t\t\tsZero = oLang.sEmptyTable;\n\t\t\t}\n\t\n\t\t\tanRows[ 0 ] = $( '<tr/>', { 'class': iStripes ? asStripeClasses[0] : '' } )\n\t\t\t\t.append( $('<td />', {\n\t\t\t\t\t'valign':  'top',\n\t\t\t\t\t'colSpan': _fnVisbleColumns( oSettings ),\n\t\t\t\t\t'class':   oSettings.oClasses.sRowEmpty\n\t\t\t\t} ).html( sZero ) )[0];\n\t\t}\n\t\n\t\t/* Header and footer callbacks */\n\t\t_fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0],\n\t\t\t_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );\n\t\n\t\t_fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0],\n\t\t\t_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );\n\t\n\t\tvar body = $(oSettings.nTBody);\n\t\n\t\tbody.children().detach();\n\t\tbody.append( $(anRows) );\n\t\n\t\t/* Call all required callback functions for the end of a draw */\n\t\t_fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );\n\t\n\t\t/* Draw is complete, sorting and filtering must be as well */\n\t\toSettings.bSorted = false;\n\t\toSettings.bFiltered = false;\n\t\toSettings.bDrawing = false;\n\t}\n\t\n\t\n\t/**\n\t * Redraw the table - taking account of the various features which are enabled\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {boolean} [holdPosition] Keep the current paging position. By default\n\t *    the paging is reset to the first page\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnReDraw( settings, holdPosition )\n\t{\n\t\tvar\n\t\t\tfeatures = settings.oFeatures,\n\t\t\tsort     = features.bSort,\n\t\t\tfilter   = features.bFilter;\n\t\n\t\tif ( sort ) {\n\t\t\t_fnSort( settings );\n\t\t}\n\t\n\t\tif ( filter ) {\n\t\t\t_fnFilterComplete( settings, settings.oPreviousSearch );\n\t\t}\n\t\telse {\n\t\t\t// No filtering, so we want to just use the display master\n\t\t\tsettings.aiDisplay = settings.aiDisplayMaster.slice();\n\t\t}\n\t\n\t\tif ( holdPosition !== true ) {\n\t\t\tsettings._iDisplayStart = 0;\n\t\t}\n\t\n\t\t// Let any modules know about the draw hold position state (used by\n\t\t// scrolling internally)\n\t\tsettings._drawHold = holdPosition;\n\t\n\t\t_fnDraw( settings );\n\t\n\t\tsettings._drawHold = false;\n\t}\n\t\n\t\n\t/**\n\t * Add the options to the page HTML for the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAddOptionsHtml ( oSettings )\n\t{\n\t\tvar classes = oSettings.oClasses;\n\t\tvar table = $(oSettings.nTable);\n\t\tvar holding = $('<div/>').insertBefore( table ); // Holding element for speed\n\t\tvar features = oSettings.oFeatures;\n\t\n\t\t// All DataTables are wrapped in a div\n\t\tvar insert = $('<div/>', {\n\t\t\tid:      oSettings.sTableId+'_wrapper',\n\t\t\t'class': classes.sWrapper + (oSettings.nTFoot ? '' : ' '+classes.sNoFooter)\n\t\t} );\n\t\n\t\toSettings.nHolding = holding[0];\n\t\toSettings.nTableWrapper = insert[0];\n\t\toSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;\n\t\n\t\t/* Loop over the user set positioning and place the elements as needed */\n\t\tvar aDom = oSettings.sDom.split('');\n\t\tvar featureNode, cOption, nNewNode, cNext, sAttr, j;\n\t\tfor ( var i=0 ; i<aDom.length ; i++ )\n\t\t{\n\t\t\tfeatureNode = null;\n\t\t\tcOption = aDom[i];\n\t\n\t\t\tif ( cOption == '<' )\n\t\t\t{\n\t\t\t\t/* New container div */\n\t\t\t\tnNewNode = $('<div/>')[0];\n\t\n\t\t\t\t/* Check to see if we should append an id and/or a class name to the container */\n\t\t\t\tcNext = aDom[i+1];\n\t\t\t\tif ( cNext == \"'\" || cNext == '\"' )\n\t\t\t\t{\n\t\t\t\t\tsAttr = \"\";\n\t\t\t\t\tj = 2;\n\t\t\t\t\twhile ( aDom[i+j] != cNext )\n\t\t\t\t\t{\n\t\t\t\t\t\tsAttr += aDom[i+j];\n\t\t\t\t\t\tj++;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t/* Replace jQuery UI constants @todo depreciated */\n\t\t\t\t\tif ( sAttr == \"H\" )\n\t\t\t\t\t{\n\t\t\t\t\t\tsAttr = classes.sJUIHeader;\n\t\t\t\t\t}\n\t\t\t\t\telse if ( sAttr == \"F\" )\n\t\t\t\t\t{\n\t\t\t\t\t\tsAttr = classes.sJUIFooter;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t/* The attribute can be in the format of \"#id.class\", \"#id\" or \"class\" This logic\n\t\t\t\t\t * breaks the string into parts and applies them as needed\n\t\t\t\t\t */\n\t\t\t\t\tif ( sAttr.indexOf('.') != -1 )\n\t\t\t\t\t{\n\t\t\t\t\t\tvar aSplit = sAttr.split('.');\n\t\t\t\t\t\tnNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);\n\t\t\t\t\t\tnNewNode.className = aSplit[1];\n\t\t\t\t\t}\n\t\t\t\t\telse if ( sAttr.charAt(0) == \"#\" )\n\t\t\t\t\t{\n\t\t\t\t\t\tnNewNode.id = sAttr.substr(1, sAttr.length-1);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tnNewNode.className = sAttr;\n\t\t\t\t\t}\n\t\n\t\t\t\t\ti += j; /* Move along the position array */\n\t\t\t\t}\n\t\n\t\t\t\tinsert.append( nNewNode );\n\t\t\t\tinsert = $(nNewNode);\n\t\t\t}\n\t\t\telse if ( cOption == '>' )\n\t\t\t{\n\t\t\t\t/* End container div */\n\t\t\t\tinsert = insert.parent();\n\t\t\t}\n\t\t\t// @todo Move options into their own plugins?\n\t\t\telse if ( cOption == 'l' && features.bPaginate && features.bLengthChange )\n\t\t\t{\n\t\t\t\t/* Length */\n\t\t\t\tfeatureNode = _fnFeatureHtmlLength( oSettings );\n\t\t\t}\n\t\t\telse if ( cOption == 'f' && features.bFilter )\n\t\t\t{\n\t\t\t\t/* Filter */\n\t\t\t\tfeatureNode = _fnFeatureHtmlFilter( oSettings );\n\t\t\t}\n\t\t\telse if ( cOption == 'r' && features.bProcessing )\n\t\t\t{\n\t\t\t\t/* pRocessing */\n\t\t\t\tfeatureNode = _fnFeatureHtmlProcessing( oSettings );\n\t\t\t}\n\t\t\telse if ( cOption == 't' )\n\t\t\t{\n\t\t\t\t/* Table */\n\t\t\t\tfeatureNode = _fnFeatureHtmlTable( oSettings );\n\t\t\t}\n\t\t\telse if ( cOption ==  'i' && features.bInfo )\n\t\t\t{\n\t\t\t\t/* Info */\n\t\t\t\tfeatureNode = _fnFeatureHtmlInfo( oSettings );\n\t\t\t}\n\t\t\telse if ( cOption == 'p' && features.bPaginate )\n\t\t\t{\n\t\t\t\t/* Pagination */\n\t\t\t\tfeatureNode = _fnFeatureHtmlPaginate( oSettings );\n\t\t\t}\n\t\t\telse if ( DataTable.ext.feature.length !== 0 )\n\t\t\t{\n\t\t\t\t/* Plug-in features */\n\t\t\t\tvar aoFeatures = DataTable.ext.feature;\n\t\t\t\tfor ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )\n\t\t\t\t{\n\t\t\t\t\tif ( cOption == aoFeatures[k].cFeature )\n\t\t\t\t\t{\n\t\t\t\t\t\tfeatureNode = aoFeatures[k].fnInit( oSettings );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t/* Add to the 2D features array */\n\t\t\tif ( featureNode )\n\t\t\t{\n\t\t\t\tvar aanFeatures = oSettings.aanFeatures;\n\t\n\t\t\t\tif ( ! aanFeatures[cOption] )\n\t\t\t\t{\n\t\t\t\t\taanFeatures[cOption] = [];\n\t\t\t\t}\n\t\n\t\t\t\taanFeatures[cOption].push( featureNode );\n\t\t\t\tinsert.append( featureNode );\n\t\t\t}\n\t\t}\n\t\n\t\t/* Built our DOM structure - replace the holding div with what we want */\n\t\tholding.replaceWith( insert );\n\t\toSettings.nHolding = null;\n\t}\n\t\n\t\n\t/**\n\t * Use the DOM source to create up an array of header cells. The idea here is to\n\t * create a layout grid (array) of rows x columns, which contains a reference\n\t * to the cell that that point in the grid (regardless of col/rowspan), such that\n\t * any column / row could be removed and the new grid constructed\n\t *  @param array {object} aLayout Array to store the calculated layout in\n\t *  @param {node} nThead The header/footer element for the table\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDetectHeader ( aLayout, nThead )\n\t{\n\t\tvar nTrs = $(nThead).children('tr');\n\t\tvar nTr, nCell;\n\t\tvar i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;\n\t\tvar bUnique;\n\t\tvar fnShiftCol = function ( a, i, j ) {\n\t\t\tvar k = a[i];\n\t                while ( k[j] ) {\n\t\t\t\tj++;\n\t\t\t}\n\t\t\treturn j;\n\t\t};\n\t\n\t\taLayout.splice( 0, aLayout.length );\n\t\n\t\t/* We know how many rows there are in the layout - so prep it */\n\t\tfor ( i=0, iLen=nTrs.length ; i<iLen ; i++ )\n\t\t{\n\t\t\taLayout.push( [] );\n\t\t}\n\t\n\t\t/* Calculate a layout array */\n\t\tfor ( i=0, iLen=nTrs.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tnTr = nTrs[i];\n\t\t\tiColumn = 0;\n\t\n\t\t\t/* For every cell in the row... */\n\t\t\tnCell = nTr.firstChild;\n\t\t\twhile ( nCell ) {\n\t\t\t\tif ( nCell.nodeName.toUpperCase() == \"TD\" ||\n\t\t\t\t     nCell.nodeName.toUpperCase() == \"TH\" )\n\t\t\t\t{\n\t\t\t\t\t/* Get the col and rowspan attributes from the DOM and sanitise them */\n\t\t\t\t\tiColspan = nCell.getAttribute('colspan') * 1;\n\t\t\t\t\tiRowspan = nCell.getAttribute('rowspan') * 1;\n\t\t\t\t\tiColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;\n\t\t\t\t\tiRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;\n\t\n\t\t\t\t\t/* There might be colspan cells already in this row, so shift our target\n\t\t\t\t\t * accordingly\n\t\t\t\t\t */\n\t\t\t\t\tiColShifted = fnShiftCol( aLayout, i, iColumn );\n\t\n\t\t\t\t\t/* Cache calculation for unique columns */\n\t\t\t\t\tbUnique = iColspan === 1 ? true : false;\n\t\n\t\t\t\t\t/* If there is col / rowspan, copy the information into the layout grid */\n\t\t\t\t\tfor ( l=0 ; l<iColspan ; l++ )\n\t\t\t\t\t{\n\t\t\t\t\t\tfor ( k=0 ; k<iRowspan ; k++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\taLayout[i+k][iColShifted+l] = {\n\t\t\t\t\t\t\t\t\"cell\": nCell,\n\t\t\t\t\t\t\t\t\"unique\": bUnique\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\taLayout[i+k].nTr = nTr;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnCell = nCell.nextSibling;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Get an array of unique th elements, one for each column\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {node} nHeader automatically detect the layout from this node - optional\n\t *  @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional\n\t *  @returns array {node} aReturn list of unique th's\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetUniqueThs ( oSettings, nHeader, aLayout )\n\t{\n\t\tvar aReturn = [];\n\t\tif ( !aLayout )\n\t\t{\n\t\t\taLayout = oSettings.aoHeader;\n\t\t\tif ( nHeader )\n\t\t\t{\n\t\t\t\taLayout = [];\n\t\t\t\t_fnDetectHeader( aLayout, nHeader );\n\t\t\t}\n\t\t}\n\t\n\t\tfor ( var i=0, iLen=aLayout.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tfor ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ )\n\t\t\t{\n\t\t\t\tif ( aLayout[i][j].unique &&\n\t\t\t\t\t (!aReturn[j] || !oSettings.bSortCellsTop) )\n\t\t\t\t{\n\t\t\t\t\taReturn[j] = aLayout[i][j].cell;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\treturn aReturn;\n\t}\n\t\n\t/**\n\t * Create an Ajax call based on the table's settings, taking into account that\n\t * parameters can have multiple forms, and backwards compatibility.\n\t *\n\t * @param {object} oSettings dataTables settings object\n\t * @param {array} data Data to send to the server, required by\n\t *     DataTables - may be augmented by developer callbacks\n\t * @param {function} fn Callback function to run when data is obtained\n\t */\n\tfunction _fnBuildAjax( oSettings, data, fn )\n\t{\n\t\t// Compatibility with 1.9-, allow fnServerData and event to manipulate\n\t\t_fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [data] );\n\t\n\t\t// Convert to object based for 1.10+ if using the old array scheme which can\n\t\t// come from server-side processing or serverParams\n\t\tif ( data && $.isArray(data) ) {\n\t\t\tvar tmp = {};\n\t\t\tvar rbracket = /(.*?)\\[\\]$/;\n\t\n\t\t\t$.each( data, function (key, val) {\n\t\t\t\tvar match = val.name.match(rbracket);\n\t\n\t\t\t\tif ( match ) {\n\t\t\t\t\t// Support for arrays\n\t\t\t\t\tvar name = match[0];\n\t\n\t\t\t\t\tif ( ! tmp[ name ] ) {\n\t\t\t\t\t\ttmp[ name ] = [];\n\t\t\t\t\t}\n\t\t\t\t\ttmp[ name ].push( val.value );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttmp[val.name] = val.value;\n\t\t\t\t}\n\t\t\t} );\n\t\t\tdata = tmp;\n\t\t}\n\t\n\t\tvar ajaxData;\n\t\tvar ajax = oSettings.ajax;\n\t\tvar instance = oSettings.oInstance;\n\t\tvar callback = function ( json ) {\n\t\t\t_fnCallbackFire( oSettings, null, 'xhr', [oSettings, json, oSettings.jqXHR] );\n\t\t\tfn( json );\n\t\t};\n\t\n\t\tif ( $.isPlainObject( ajax ) && ajax.data )\n\t\t{\n\t\t\tajaxData = ajax.data;\n\t\n\t\t\tvar newData = $.isFunction( ajaxData ) ?\n\t\t\t\tajaxData( data, oSettings ) :  // fn can manipulate data or return\n\t\t\t\tajaxData;                      // an object object or array to merge\n\t\n\t\t\t// If the function returned something, use that alone\n\t\t\tdata = $.isFunction( ajaxData ) && newData ?\n\t\t\t\tnewData :\n\t\t\t\t$.extend( true, data, newData );\n\t\n\t\t\t// Remove the data property as we've resolved it already and don't want\n\t\t\t// jQuery to do it again (it is restored at the end of the function)\n\t\t\tdelete ajax.data;\n\t\t}\n\t\n\t\tvar baseAjax = {\n\t\t\t\"data\": data,\n\t\t\t\"success\": function (json) {\n\t\t\t\tvar error = json.error || json.sError;\n\t\t\t\tif ( error ) {\n\t\t\t\t\t_fnLog( oSettings, 0, error );\n\t\t\t\t}\n\t\n\t\t\t\toSettings.json = json;\n\t\t\t\tcallback( json );\n\t\t\t},\n\t\t\t\"dataType\": \"json\",\n\t\t\t\"cache\": false,\n\t\t\t\"type\": oSettings.sServerMethod,\n\t\t\t\"error\": function (xhr, error, thrown) {\n\t\t\t\tvar ret = _fnCallbackFire( oSettings, null, 'xhr', [oSettings, null, oSettings.jqXHR] );\n\t\n\t\t\t\tif ( $.inArray( true, ret ) === -1 ) {\n\t\t\t\t\tif ( error == \"parsererror\" ) {\n\t\t\t\t\t\t_fnLog( oSettings, 0, 'Invalid JSON response', 1 );\n\t\t\t\t\t}\n\t\t\t\t\telse if ( xhr.readyState === 4 ) {\n\t\t\t\t\t\t_fnLog( oSettings, 0, 'Ajax error', 7 );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\t_fnProcessingDisplay( oSettings, false );\n\t\t\t}\n\t\t};\n\t\n\t\t// Store the data submitted for the API\n\t\toSettings.oAjaxData = data;\n\t\n\t\t// Allow plug-ins and external processes to modify the data\n\t\t_fnCallbackFire( oSettings, null, 'preXhr', [oSettings, data] );\n\t\n\t\tif ( oSettings.fnServerData )\n\t\t{\n\t\t\t// DataTables 1.9- compatibility\n\t\t\toSettings.fnServerData.call( instance,\n\t\t\t\toSettings.sAjaxSource,\n\t\t\t\t$.map( data, function (val, key) { // Need to convert back to 1.9 trad format\n\t\t\t\t\treturn { name: key, value: val };\n\t\t\t\t} ),\n\t\t\t\tcallback,\n\t\t\t\toSettings\n\t\t\t);\n\t\t}\n\t\telse if ( oSettings.sAjaxSource || typeof ajax === 'string' )\n\t\t{\n\t\t\t// DataTables 1.9- compatibility\n\t\t\toSettings.jqXHR = $.ajax( $.extend( baseAjax, {\n\t\t\t\turl: ajax || oSettings.sAjaxSource\n\t\t\t} ) );\n\t\t}\n\t\telse if ( $.isFunction( ajax ) )\n\t\t{\n\t\t\t// Is a function - let the caller define what needs to be done\n\t\t\toSettings.jqXHR = ajax.call( instance, data, callback, oSettings );\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Object to extend the base settings\n\t\t\toSettings.jqXHR = $.ajax( $.extend( baseAjax, ajax ) );\n\t\n\t\t\t// Restore for next time around\n\t\t\tajax.data = ajaxData;\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Update the table using an Ajax call\n\t *  @param {object} settings dataTables settings object\n\t *  @returns {boolean} Block the table drawing or not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAjaxUpdate( settings )\n\t{\n\t\tif ( settings.bAjaxDataGet ) {\n\t\t\tsettings.iDraw++;\n\t\t\t_fnProcessingDisplay( settings, true );\n\t\n\t\t\t_fnBuildAjax(\n\t\t\t\tsettings,\n\t\t\t\t_fnAjaxParameters( settings ),\n\t\t\t\tfunction(json) {\n\t\t\t\t\t_fnAjaxUpdateDraw( settings, json );\n\t\t\t\t}\n\t\t\t);\n\t\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\t\n\t\n\t/**\n\t * Build up the parameters in an object needed for a server-side processing\n\t * request. Note that this is basically done twice, is different ways - a modern\n\t * method which is used by default in DataTables 1.10 which uses objects and\n\t * arrays, or the 1.9- method with is name / value pairs. 1.9 method is used if\n\t * the sAjaxSource option is used in the initialisation, or the legacyAjax\n\t * option is set.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {bool} block the table drawing or not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAjaxParameters( settings )\n\t{\n\t\tvar\n\t\t\tcolumns = settings.aoColumns,\n\t\t\tcolumnCount = columns.length,\n\t\t\tfeatures = settings.oFeatures,\n\t\t\tpreSearch = settings.oPreviousSearch,\n\t\t\tpreColSearch = settings.aoPreSearchCols,\n\t\t\ti, data = [], dataProp, column, columnSearch,\n\t\t\tsort = _fnSortFlatten( settings ),\n\t\t\tdisplayStart = settings._iDisplayStart,\n\t\t\tdisplayLength = features.bPaginate !== false ?\n\t\t\t\tsettings._iDisplayLength :\n\t\t\t\t-1;\n\t\n\t\tvar param = function ( name, value ) {\n\t\t\tdata.push( { 'name': name, 'value': value } );\n\t\t};\n\t\n\t\t// DataTables 1.9- compatible method\n\t\tparam( 'sEcho',          settings.iDraw );\n\t\tparam( 'iColumns',       columnCount );\n\t\tparam( 'sColumns',       _pluck( columns, 'sName' ).join(',') );\n\t\tparam( 'iDisplayStart',  displayStart );\n\t\tparam( 'iDisplayLength', displayLength );\n\t\n\t\t// DataTables 1.10+ method\n\t\tvar d = {\n\t\t\tdraw:    settings.iDraw,\n\t\t\tcolumns: [],\n\t\t\torder:   [],\n\t\t\tstart:   displayStart,\n\t\t\tlength:  displayLength,\n\t\t\tsearch:  {\n\t\t\t\tvalue: preSearch.sSearch,\n\t\t\t\tregex: preSearch.bRegex\n\t\t\t}\n\t\t};\n\t\n\t\tfor ( i=0 ; i<columnCount ; i++ ) {\n\t\t\tcolumn = columns[i];\n\t\t\tcolumnSearch = preColSearch[i];\n\t\t\tdataProp = typeof column.mData==\"function\" ? 'function' : column.mData ;\n\t\n\t\t\td.columns.push( {\n\t\t\t\tdata:       dataProp,\n\t\t\t\tname:       column.sName,\n\t\t\t\tsearchable: column.bSearchable,\n\t\t\t\torderable:  column.bSortable,\n\t\t\t\tsearch:     {\n\t\t\t\t\tvalue: columnSearch.sSearch,\n\t\t\t\t\tregex: columnSearch.bRegex\n\t\t\t\t}\n\t\t\t} );\n\t\n\t\t\tparam( \"mDataProp_\"+i, dataProp );\n\t\n\t\t\tif ( features.bFilter ) {\n\t\t\t\tparam( 'sSearch_'+i,     columnSearch.sSearch );\n\t\t\t\tparam( 'bRegex_'+i,      columnSearch.bRegex );\n\t\t\t\tparam( 'bSearchable_'+i, column.bSearchable );\n\t\t\t}\n\t\n\t\t\tif ( features.bSort ) {\n\t\t\t\tparam( 'bSortable_'+i, column.bSortable );\n\t\t\t}\n\t\t}\n\t\n\t\tif ( features.bFilter ) {\n\t\t\tparam( 'sSearch', preSearch.sSearch );\n\t\t\tparam( 'bRegex', preSearch.bRegex );\n\t\t}\n\t\n\t\tif ( features.bSort ) {\n\t\t\t$.each( sort, function ( i, val ) {\n\t\t\t\td.order.push( { column: val.col, dir: val.dir } );\n\t\n\t\t\t\tparam( 'iSortCol_'+i, val.col );\n\t\t\t\tparam( 'sSortDir_'+i, val.dir );\n\t\t\t} );\n\t\n\t\t\tparam( 'iSortingCols', sort.length );\n\t\t}\n\t\n\t\t// If the legacy.ajax parameter is null, then we automatically decide which\n\t\t// form to use, based on sAjaxSource\n\t\tvar legacy = DataTable.ext.legacy.ajax;\n\t\tif ( legacy === null ) {\n\t\t\treturn settings.sAjaxSource ? data : d;\n\t\t}\n\t\n\t\t// Otherwise, if legacy has been specified then we use that to decide on the\n\t\t// form\n\t\treturn legacy ? data : d;\n\t}\n\t\n\t\n\t/**\n\t * Data the data from the server (nuking the old) and redraw the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {object} json json data return from the server.\n\t *  @param {string} json.sEcho Tracking flag for DataTables to match requests\n\t *  @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering\n\t *  @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering\n\t *  @param {array} json.aaData The data to display on this page\n\t *  @param {string} [json.sColumns] Column ordering (sName, comma separated)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnAjaxUpdateDraw ( settings, json )\n\t{\n\t\t// v1.10 uses camelCase variables, while 1.9 uses Hungarian notation.\n\t\t// Support both\n\t\tvar compat = function ( old, modern ) {\n\t\t\treturn json[old] !== undefined ? json[old] : json[modern];\n\t\t};\n\t\n\t\tvar data = _fnAjaxDataSrc( settings, json );\n\t\tvar draw            = compat( 'sEcho',                'draw' );\n\t\tvar recordsTotal    = compat( 'iTotalRecords',        'recordsTotal' );\n\t\tvar recordsFiltered = compat( 'iTotalDisplayRecords', 'recordsFiltered' );\n\t\n\t\tif ( draw ) {\n\t\t\t// Protect against out of sequence returns\n\t\t\tif ( draw*1 < settings.iDraw ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsettings.iDraw = draw * 1;\n\t\t}\n\t\n\t\t_fnClearTable( settings );\n\t\tsettings._iRecordsTotal   = parseInt(recordsTotal, 10);\n\t\tsettings._iRecordsDisplay = parseInt(recordsFiltered, 10);\n\t\n\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t_fnAddData( settings, data[i] );\n\t\t}\n\t\tsettings.aiDisplay = settings.aiDisplayMaster.slice();\n\t\n\t\tsettings.bAjaxDataGet = false;\n\t\t_fnDraw( settings );\n\t\n\t\tif ( ! settings._bInitComplete ) {\n\t\t\t_fnInitComplete( settings, json );\n\t\t}\n\t\n\t\tsettings.bAjaxDataGet = true;\n\t\t_fnProcessingDisplay( settings, false );\n\t}\n\t\n\t\n\t/**\n\t * Get the data from the JSON data source to use for drawing a table. Using\n\t * `_fnGetObjectDataFn` allows the data to be sourced from a property of the\n\t * source object, or from a processing function.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param  {object} json Data source object / array from the server\n\t *  @return {array} Array of data to use\n\t */\n\tfunction _fnAjaxDataSrc ( oSettings, json )\n\t{\n\t\tvar dataSrc = $.isPlainObject( oSettings.ajax ) && oSettings.ajax.dataSrc !== undefined ?\n\t\t\toSettings.ajax.dataSrc :\n\t\t\toSettings.sAjaxDataProp; // Compatibility with 1.9-.\n\t\n\t\t// Compatibility with 1.9-. In order to read from aaData, check if the\n\t\t// default has been changed, if not, check for aaData\n\t\tif ( dataSrc === 'data' ) {\n\t\t\treturn json.aaData || json[dataSrc];\n\t\t}\n\t\n\t\treturn dataSrc !== \"\" ?\n\t\t\t_fnGetObjectDataFn( dataSrc )( json ) :\n\t\t\tjson;\n\t}\n\t\n\t/**\n\t * Generate the node required for filtering text\n\t *  @returns {node} Filter control element\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlFilter ( settings )\n\t{\n\t\tvar classes = settings.oClasses;\n\t\tvar tableId = settings.sTableId;\n\t\tvar language = settings.oLanguage;\n\t\tvar previousSearch = settings.oPreviousSearch;\n\t\tvar features = settings.aanFeatures;\n\t\tvar input = '<input type=\"search\" class=\"'+classes.sFilterInput+'\"/>';\n\t\n\t\tvar str = language.sSearch;\n\t\tstr = str.match(/_INPUT_/) ?\n\t\t\tstr.replace('_INPUT_', input) :\n\t\t\tstr+input;\n\t\n\t\tvar filter = $('<div/>', {\n\t\t\t\t'id': ! features.f ? tableId+'_filter' : null,\n\t\t\t\t'class': classes.sFilter\n\t\t\t} )\n\t\t\t.append( $('<label/>' ).append( str ) );\n\t\n\t\tvar searchFn = function() {\n\t\t\t/* Update all other filter input elements for the new display */\n\t\t\tvar n = features.f;\n\t\t\tvar val = !this.value ? \"\" : this.value; // mental IE8 fix :-(\n\t\n\t\t\t/* Now do the filter */\n\t\t\tif ( val != previousSearch.sSearch ) {\n\t\t\t\t_fnFilterComplete( settings, {\n\t\t\t\t\t\"sSearch\": val,\n\t\t\t\t\t\"bRegex\": previousSearch.bRegex,\n\t\t\t\t\t\"bSmart\": previousSearch.bSmart ,\n\t\t\t\t\t\"bCaseInsensitive\": previousSearch.bCaseInsensitive\n\t\t\t\t} );\n\t\n\t\t\t\t// Need to redraw, without resorting\n\t\t\t\tsettings._iDisplayStart = 0;\n\t\t\t\t_fnDraw( settings );\n\t\t\t}\n\t\t};\n\t\n\t\tvar searchDelay = settings.searchDelay !== null ?\n\t\t\tsettings.searchDelay :\n\t\t\t_fnDataSource( settings ) === 'ssp' ?\n\t\t\t\t400 :\n\t\t\t\t0;\n\t\n\t\tvar jqFilter = $('input', filter)\n\t\t\t.val( previousSearch.sSearch )\n\t\t\t.attr( 'placeholder', language.sSearchPlaceholder )\n\t\t\t.on(\n\t\t\t\t'keyup.DT search.DT input.DT paste.DT cut.DT',\n\t\t\t\tsearchDelay ?\n\t\t\t\t\t_fnThrottle( searchFn, searchDelay ) :\n\t\t\t\t\tsearchFn\n\t\t\t)\n\t\t\t.on( 'keypress.DT', function(e) {\n\t\t\t\t/* Prevent form submission */\n\t\t\t\tif ( e.keyCode == 13 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.attr('aria-controls', tableId);\n\t\n\t\t// Update the input elements whenever the table is filtered\n\t\t$(settings.nTable).on( 'search.dt.DT', function ( ev, s ) {\n\t\t\tif ( settings === s ) {\n\t\t\t\t// IE9 throws an 'unknown error' if document.activeElement is used\n\t\t\t\t// inside an iframe or frame...\n\t\t\t\ttry {\n\t\t\t\t\tif ( jqFilter[0] !== document.activeElement ) {\n\t\t\t\t\t\tjqFilter.val( previousSearch.sSearch );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch ( e ) {}\n\t\t\t}\n\t\t} );\n\t\n\t\treturn filter[0];\n\t}\n\t\n\t\n\t/**\n\t * Filter the table using both the global filter and column based filtering\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {object} oSearch search information\n\t *  @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilterComplete ( oSettings, oInput, iForce )\n\t{\n\t\tvar oPrevSearch = oSettings.oPreviousSearch;\n\t\tvar aoPrevSearch = oSettings.aoPreSearchCols;\n\t\tvar fnSaveFilter = function ( oFilter ) {\n\t\t\t/* Save the filtering values */\n\t\t\toPrevSearch.sSearch = oFilter.sSearch;\n\t\t\toPrevSearch.bRegex = oFilter.bRegex;\n\t\t\toPrevSearch.bSmart = oFilter.bSmart;\n\t\t\toPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;\n\t\t};\n\t\tvar fnRegex = function ( o ) {\n\t\t\t// Backwards compatibility with the bEscapeRegex option\n\t\t\treturn o.bEscapeRegex !== undefined ? !o.bEscapeRegex : o.bRegex;\n\t\t};\n\t\n\t\t// Resolve any column types that are unknown due to addition or invalidation\n\t\t// @todo As per sort - can this be moved into an event handler?\n\t\t_fnColumnTypes( oSettings );\n\t\n\t\t/* In server-side processing all filtering is done by the server, so no point hanging around here */\n\t\tif ( _fnDataSource( oSettings ) != 'ssp' )\n\t\t{\n\t\t\t/* Global filter */\n\t\t\t_fnFilter( oSettings, oInput.sSearch, iForce, fnRegex(oInput), oInput.bSmart, oInput.bCaseInsensitive );\n\t\t\tfnSaveFilter( oInput );\n\t\n\t\t\t/* Now do the individual column filter */\n\t\t\tfor ( var i=0 ; i<aoPrevSearch.length ; i++ )\n\t\t\t{\n\t\t\t\t_fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, fnRegex(aoPrevSearch[i]),\n\t\t\t\t\taoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive );\n\t\t\t}\n\t\n\t\t\t/* Custom filtering */\n\t\t\t_fnFilterCustom( oSettings );\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfnSaveFilter( oInput );\n\t\t}\n\t\n\t\t/* Tell the draw function we have been filtering */\n\t\toSettings.bFiltered = true;\n\t\t_fnCallbackFire( oSettings, null, 'search', [oSettings] );\n\t}\n\t\n\t\n\t/**\n\t * Apply custom filtering functions\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilterCustom( settings )\n\t{\n\t\tvar filters = DataTable.ext.search;\n\t\tvar displayRows = settings.aiDisplay;\n\t\tvar row, rowIdx;\n\t\n\t\tfor ( var i=0, ien=filters.length ; i<ien ; i++ ) {\n\t\t\tvar rows = [];\n\t\n\t\t\t// Loop over each row and see if it should be included\n\t\t\tfor ( var j=0, jen=displayRows.length ; j<jen ; j++ ) {\n\t\t\t\trowIdx = displayRows[ j ];\n\t\t\t\trow = settings.aoData[ rowIdx ];\n\t\n\t\t\t\tif ( filters[i]( settings, row._aFilterData, rowIdx, row._aData, j ) ) {\n\t\t\t\t\trows.push( rowIdx );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// So the array reference doesn't break set the results into the\n\t\t\t// existing array\n\t\t\tdisplayRows.length = 0;\n\t\t\t$.merge( displayRows, rows );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Filter the table on a per-column basis\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {string} sInput string to filter on\n\t *  @param {int} iColumn column to filter\n\t *  @param {bool} bRegex treat search string as a regular expression or not\n\t *  @param {bool} bSmart use smart filtering or not\n\t *  @param {bool} bCaseInsensitive Do case insenstive matching or not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilterColumn ( settings, searchStr, colIdx, regex, smart, caseInsensitive )\n\t{\n\t\tif ( searchStr === '' ) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar data;\n\t\tvar out = [];\n\t\tvar display = settings.aiDisplay;\n\t\tvar rpSearch = _fnFilterCreateSearch( searchStr, regex, smart, caseInsensitive );\n\t\n\t\tfor ( var i=0 ; i<display.length ; i++ ) {\n\t\t\tdata = settings.aoData[ display[i] ]._aFilterData[ colIdx ];\n\t\n\t\t\tif ( rpSearch.test( data ) ) {\n\t\t\t\tout.push( display[i] );\n\t\t\t}\n\t\t}\n\t\n\t\tsettings.aiDisplay = out;\n\t}\n\t\n\t\n\t/**\n\t * Filter the data table based on user input and draw the table\n\t *  @param {object} settings dataTables settings object\n\t *  @param {string} input string to filter on\n\t *  @param {int} force optional - force a research of the master array (1) or not (undefined or 0)\n\t *  @param {bool} regex treat as a regular expression or not\n\t *  @param {bool} smart perform smart filtering or not\n\t *  @param {bool} caseInsensitive Do case insenstive matching or not\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilter( settings, input, force, regex, smart, caseInsensitive )\n\t{\n\t\tvar rpSearch = _fnFilterCreateSearch( input, regex, smart, caseInsensitive );\n\t\tvar prevSearch = settings.oPreviousSearch.sSearch;\n\t\tvar displayMaster = settings.aiDisplayMaster;\n\t\tvar display, invalidated, i;\n\t\tvar filtered = [];\n\t\n\t\t// Need to take account of custom filtering functions - always filter\n\t\tif ( DataTable.ext.search.length !== 0 ) {\n\t\t\tforce = true;\n\t\t}\n\t\n\t\t// Check if any of the rows were invalidated\n\t\tinvalidated = _fnFilterData( settings );\n\t\n\t\t// If the input is blank - we just want the full data set\n\t\tif ( input.length <= 0 ) {\n\t\t\tsettings.aiDisplay = displayMaster.slice();\n\t\t}\n\t\telse {\n\t\t\t// New search - start from the master array\n\t\t\tif ( invalidated ||\n\t\t\t\t force ||\n\t\t\t\t prevSearch.length > input.length ||\n\t\t\t\t input.indexOf(prevSearch) !== 0 ||\n\t\t\t\t settings.bSorted // On resort, the display master needs to be\n\t\t\t\t                  // re-filtered since indexes will have changed\n\t\t\t) {\n\t\t\t\tsettings.aiDisplay = displayMaster.slice();\n\t\t\t}\n\t\n\t\t\t// Search the display array\n\t\t\tdisplay = settings.aiDisplay;\n\t\n\t\t\tfor ( i=0 ; i<display.length ; i++ ) {\n\t\t\t\tif ( rpSearch.test( settings.aoData[ display[i] ]._sFilterRow ) ) {\n\t\t\t\t\tfiltered.push( display[i] );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tsettings.aiDisplay = filtered;\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Build a regular expression object suitable for searching a table\n\t *  @param {string} sSearch string to search for\n\t *  @param {bool} bRegex treat as a regular expression or not\n\t *  @param {bool} bSmart perform smart filtering or not\n\t *  @param {bool} bCaseInsensitive Do case insensitive matching or not\n\t *  @returns {RegExp} constructed object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFilterCreateSearch( search, regex, smart, caseInsensitive )\n\t{\n\t\tsearch = regex ?\n\t\t\tsearch :\n\t\t\t_fnEscapeRegex( search );\n\t\t\n\t\tif ( smart ) {\n\t\t\t/* For smart filtering we want to allow the search to work regardless of\n\t\t\t * word order. We also want double quoted text to be preserved, so word\n\t\t\t * order is important - a la google. So this is what we want to\n\t\t\t * generate:\n\t\t\t * \n\t\t\t * ^(?=.*?\\bone\\b)(?=.*?\\btwo three\\b)(?=.*?\\bfour\\b).*$\n\t\t\t */\n\t\t\tvar a = $.map( search.match( /\"[^\"]+\"|[^ ]+/g ) || [''], function ( word ) {\n\t\t\t\tif ( word.charAt(0) === '\"' ) {\n\t\t\t\t\tvar m = word.match( /^\"(.*)\"$/ );\n\t\t\t\t\tword = m ? m[1] : word;\n\t\t\t\t}\n\t\n\t\t\t\treturn word.replace('\"', '');\n\t\t\t} );\n\t\n\t\t\tsearch = '^(?=.*?'+a.join( ')(?=.*?' )+').*$';\n\t\t}\n\t\n\t\treturn new RegExp( search, caseInsensitive ? 'i' : '' );\n\t}\n\t\n\t\n\t/**\n\t * Escape a string such that it can be used in a regular expression\n\t *  @param {string} sVal string to escape\n\t *  @returns {string} escaped string\n\t *  @memberof DataTable#oApi\n\t */\n\tvar _fnEscapeRegex = DataTable.util.escapeRegex;\n\t\n\tvar __filter_div = $('<div>')[0];\n\tvar __filter_div_textContent = __filter_div.textContent !== undefined;\n\t\n\t// Update the filtering data for each row if needed (by invalidation or first run)\n\tfunction _fnFilterData ( settings )\n\t{\n\t\tvar columns = settings.aoColumns;\n\t\tvar column;\n\t\tvar i, j, ien, jen, filterData, cellData, row;\n\t\tvar fomatters = DataTable.ext.type.search;\n\t\tvar wasInvalidated = false;\n\t\n\t\tfor ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\trow = settings.aoData[i];\n\t\n\t\t\tif ( ! row._aFilterData ) {\n\t\t\t\tfilterData = [];\n\t\n\t\t\t\tfor ( j=0, jen=columns.length ; j<jen ; j++ ) {\n\t\t\t\t\tcolumn = columns[j];\n\t\n\t\t\t\t\tif ( column.bSearchable ) {\n\t\t\t\t\t\tcellData = _fnGetCellData( settings, i, j, 'filter' );\n\t\n\t\t\t\t\t\tif ( fomatters[ column.sType ] ) {\n\t\t\t\t\t\t\tcellData = fomatters[ column.sType ]( cellData );\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Search in DataTables 1.10 is string based. In 1.11 this\n\t\t\t\t\t\t// should be altered to also allow strict type checking.\n\t\t\t\t\t\tif ( cellData === null ) {\n\t\t\t\t\t\t\tcellData = '';\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif ( typeof cellData !== 'string' && cellData.toString ) {\n\t\t\t\t\t\t\tcellData = cellData.toString();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tcellData = '';\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// If it looks like there is an HTML entity in the string,\n\t\t\t\t\t// attempt to decode it so sorting works as expected. Note that\n\t\t\t\t\t// we could use a single line of jQuery to do this, but the DOM\n\t\t\t\t\t// method used here is much faster http://jsperf.com/html-decode\n\t\t\t\t\tif ( cellData.indexOf && cellData.indexOf('&') !== -1 ) {\n\t\t\t\t\t\t__filter_div.innerHTML = cellData;\n\t\t\t\t\t\tcellData = __filter_div_textContent ?\n\t\t\t\t\t\t\t__filter_div.textContent :\n\t\t\t\t\t\t\t__filter_div.innerText;\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif ( cellData.replace ) {\n\t\t\t\t\t\tcellData = cellData.replace(/[\\r\\n]/g, '');\n\t\t\t\t\t}\n\t\n\t\t\t\t\tfilterData.push( cellData );\n\t\t\t\t}\n\t\n\t\t\t\trow._aFilterData = filterData;\n\t\t\t\trow._sFilterRow = filterData.join('  ');\n\t\t\t\twasInvalidated = true;\n\t\t\t}\n\t\t}\n\t\n\t\treturn wasInvalidated;\n\t}\n\t\n\t\n\t/**\n\t * Convert from the internal Hungarian notation to camelCase for external\n\t * interaction\n\t *  @param {object} obj Object to convert\n\t *  @returns {object} Inverted object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSearchToCamel ( obj )\n\t{\n\t\treturn {\n\t\t\tsearch:          obj.sSearch,\n\t\t\tsmart:           obj.bSmart,\n\t\t\tregex:           obj.bRegex,\n\t\t\tcaseInsensitive: obj.bCaseInsensitive\n\t\t};\n\t}\n\t\n\t\n\t\n\t/**\n\t * Convert from camelCase notation to the internal Hungarian. We could use the\n\t * Hungarian convert function here, but this is cleaner\n\t *  @param {object} obj Object to convert\n\t *  @returns {object} Inverted object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSearchToHung ( obj )\n\t{\n\t\treturn {\n\t\t\tsSearch:          obj.search,\n\t\t\tbSmart:           obj.smart,\n\t\t\tbRegex:           obj.regex,\n\t\t\tbCaseInsensitive: obj.caseInsensitive\n\t\t};\n\t}\n\t\n\t/**\n\t * Generate the node required for the info display\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {node} Information element\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlInfo ( settings )\n\t{\n\t\tvar\n\t\t\ttid = settings.sTableId,\n\t\t\tnodes = settings.aanFeatures.i,\n\t\t\tn = $('<div/>', {\n\t\t\t\t'class': settings.oClasses.sInfo,\n\t\t\t\t'id': ! nodes ? tid+'_info' : null\n\t\t\t} );\n\t\n\t\tif ( ! nodes ) {\n\t\t\t// Update display on each draw\n\t\t\tsettings.aoDrawCallback.push( {\n\t\t\t\t\"fn\": _fnUpdateInfo,\n\t\t\t\t\"sName\": \"information\"\n\t\t\t} );\n\t\n\t\t\tn\n\t\t\t\t.attr( 'role', 'status' )\n\t\t\t\t.attr( 'aria-live', 'polite' );\n\t\n\t\t\t// Table is described by our info div\n\t\t\t$(settings.nTable).attr( 'aria-describedby', tid+'_info' );\n\t\t}\n\t\n\t\treturn n[0];\n\t}\n\t\n\t\n\t/**\n\t * Update the information elements in the display\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnUpdateInfo ( settings )\n\t{\n\t\t/* Show information about the table */\n\t\tvar nodes = settings.aanFeatures.i;\n\t\tif ( nodes.length === 0 ) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar\n\t\t\tlang  = settings.oLanguage,\n\t\t\tstart = settings._iDisplayStart+1,\n\t\t\tend   = settings.fnDisplayEnd(),\n\t\t\tmax   = settings.fnRecordsTotal(),\n\t\t\ttotal = settings.fnRecordsDisplay(),\n\t\t\tout   = total ?\n\t\t\t\tlang.sInfo :\n\t\t\t\tlang.sInfoEmpty;\n\t\n\t\tif ( total !== max ) {\n\t\t\t/* Record set after filtering */\n\t\t\tout += ' ' + lang.sInfoFiltered;\n\t\t}\n\t\n\t\t// Convert the macros\n\t\tout += lang.sInfoPostFix;\n\t\tout = _fnInfoMacros( settings, out );\n\t\n\t\tvar callback = lang.fnInfoCallback;\n\t\tif ( callback !== null ) {\n\t\t\tout = callback.call( settings.oInstance,\n\t\t\t\tsettings, start, end, max, total, out\n\t\t\t);\n\t\t}\n\t\n\t\t$(nodes).html( out );\n\t}\n\t\n\t\n\tfunction _fnInfoMacros ( settings, str )\n\t{\n\t\t// When infinite scrolling, we are always starting at 1. _iDisplayStart is used only\n\t\t// internally\n\t\tvar\n\t\t\tformatter  = settings.fnFormatNumber,\n\t\t\tstart      = settings._iDisplayStart+1,\n\t\t\tlen        = settings._iDisplayLength,\n\t\t\tvis        = settings.fnRecordsDisplay(),\n\t\t\tall        = len === -1;\n\t\n\t\treturn str.\n\t\t\treplace(/_START_/g, formatter.call( settings, start ) ).\n\t\t\treplace(/_END_/g,   formatter.call( settings, settings.fnDisplayEnd() ) ).\n\t\t\treplace(/_MAX_/g,   formatter.call( settings, settings.fnRecordsTotal() ) ).\n\t\t\treplace(/_TOTAL_/g, formatter.call( settings, vis ) ).\n\t\t\treplace(/_PAGE_/g,  formatter.call( settings, all ? 1 : Math.ceil( start / len ) ) ).\n\t\t\treplace(/_PAGES_/g, formatter.call( settings, all ? 1 : Math.ceil( vis / len ) ) );\n\t}\n\t\n\t\n\t\n\t/**\n\t * Draw the table for the first time, adding all required features\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnInitialise ( settings )\n\t{\n\t\tvar i, iLen, iAjaxStart=settings.iInitDisplayStart;\n\t\tvar columns = settings.aoColumns, column;\n\t\tvar features = settings.oFeatures;\n\t\tvar deferLoading = settings.bDeferLoading; // value modified by the draw\n\t\n\t\t/* Ensure that the table data is fully initialised */\n\t\tif ( ! settings.bInitialised ) {\n\t\t\tsetTimeout( function(){ _fnInitialise( settings ); }, 200 );\n\t\t\treturn;\n\t\t}\n\t\n\t\t/* Show the display HTML options */\n\t\t_fnAddOptionsHtml( settings );\n\t\n\t\t/* Build and draw the header / footer for the table */\n\t\t_fnBuildHead( settings );\n\t\t_fnDrawHead( settings, settings.aoHeader );\n\t\t_fnDrawHead( settings, settings.aoFooter );\n\t\n\t\t/* Okay to show that something is going on now */\n\t\t_fnProcessingDisplay( settings, true );\n\t\n\t\t/* Calculate sizes for columns */\n\t\tif ( features.bAutoWidth ) {\n\t\t\t_fnCalculateColumnWidths( settings );\n\t\t}\n\t\n\t\tfor ( i=0, iLen=columns.length ; i<iLen ; i++ ) {\n\t\t\tcolumn = columns[i];\n\t\n\t\t\tif ( column.sWidth ) {\n\t\t\t\tcolumn.nTh.style.width = _fnStringToCss( column.sWidth );\n\t\t\t}\n\t\t}\n\t\n\t\t_fnCallbackFire( settings, null, 'preInit', [settings] );\n\t\n\t\t// If there is default sorting required - let's do it. The sort function\n\t\t// will do the drawing for us. Otherwise we draw the table regardless of the\n\t\t// Ajax source - this allows the table to look initialised for Ajax sourcing\n\t\t// data (show 'loading' message possibly)\n\t\t_fnReDraw( settings );\n\t\n\t\t// Server-side processing init complete is done by _fnAjaxUpdateDraw\n\t\tvar dataSrc = _fnDataSource( settings );\n\t\tif ( dataSrc != 'ssp' || deferLoading ) {\n\t\t\t// if there is an ajax source load the data\n\t\t\tif ( dataSrc == 'ajax' ) {\n\t\t\t\t_fnBuildAjax( settings, [], function(json) {\n\t\t\t\t\tvar aData = _fnAjaxDataSrc( settings, json );\n\t\n\t\t\t\t\t// Got the data - add it to the table\n\t\t\t\t\tfor ( i=0 ; i<aData.length ; i++ ) {\n\t\t\t\t\t\t_fnAddData( settings, aData[i] );\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Reset the init display for cookie saving. We've already done\n\t\t\t\t\t// a filter, and therefore cleared it before. So we need to make\n\t\t\t\t\t// it appear 'fresh'\n\t\t\t\t\tsettings.iInitDisplayStart = iAjaxStart;\n\t\n\t\t\t\t\t_fnReDraw( settings );\n\t\n\t\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t\t\t_fnInitComplete( settings, json );\n\t\t\t\t}, settings );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t\t_fnInitComplete( settings );\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Draw the table for the first time, adding all required features\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {object} [json] JSON from the server that completed the table, if using Ajax source\n\t *    with client-side processing (optional)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnInitComplete ( settings, json )\n\t{\n\t\tsettings._bInitComplete = true;\n\t\n\t\t// When data was added after the initialisation (data or Ajax) we need to\n\t\t// calculate the column sizing\n\t\tif ( json || settings.oInit.aaData ) {\n\t\t\t_fnAdjustColumnSizing( settings );\n\t\t}\n\t\n\t\t_fnCallbackFire( settings, null, 'plugin-init', [settings, json] );\n\t\t_fnCallbackFire( settings, 'aoInitComplete', 'init', [settings, json] );\n\t}\n\t\n\t\n\tfunction _fnLengthChange ( settings, val )\n\t{\n\t\tvar len = parseInt( val, 10 );\n\t\tsettings._iDisplayLength = len;\n\t\n\t\t_fnLengthOverflow( settings );\n\t\n\t\t// Fire length change event\n\t\t_fnCallbackFire( settings, null, 'length', [settings, len] );\n\t}\n\t\n\t\n\t/**\n\t * Generate the node required for user display length changing\n\t *  @param {object} settings dataTables settings object\n\t *  @returns {node} Display length feature node\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlLength ( settings )\n\t{\n\t\tvar\n\t\t\tclasses  = settings.oClasses,\n\t\t\ttableId  = settings.sTableId,\n\t\t\tmenu     = settings.aLengthMenu,\n\t\t\td2       = $.isArray( menu[0] ),\n\t\t\tlengths  = d2 ? menu[0] : menu,\n\t\t\tlanguage = d2 ? menu[1] : menu;\n\t\n\t\tvar select = $('<select/>', {\n\t\t\t'name':          tableId+'_length',\n\t\t\t'aria-controls': tableId,\n\t\t\t'class':         classes.sLengthSelect\n\t\t} );\n\t\n\t\tfor ( var i=0, ien=lengths.length ; i<ien ; i++ ) {\n\t\t\tselect[0][ i ] = new Option( language[i], lengths[i] );\n\t\t}\n\t\n\t\tvar div = $('<div><label/></div>').addClass( classes.sLength );\n\t\tif ( ! settings.aanFeatures.l ) {\n\t\t\tdiv[0].id = tableId+'_length';\n\t\t}\n\t\n\t\tdiv.children().append(\n\t\t\tsettings.oLanguage.sLengthMenu.replace( '_MENU_', select[0].outerHTML )\n\t\t);\n\t\n\t\t// Can't use `select` variable as user might provide their own and the\n\t\t// reference is broken by the use of outerHTML\n\t\t$('select', div)\n\t\t\t.val( settings._iDisplayLength )\n\t\t\t.on( 'change.DT', function(e) {\n\t\t\t\t_fnLengthChange( settings, $(this).val() );\n\t\t\t\t_fnDraw( settings );\n\t\t\t} );\n\t\n\t\t// Update node value whenever anything changes the table's length\n\t\t$(settings.nTable).on( 'length.dt.DT', function (e, s, len) {\n\t\t\tif ( settings === s ) {\n\t\t\t\t$('select', div).val( len );\n\t\t\t}\n\t\t} );\n\t\n\t\treturn div[0];\n\t}\n\t\n\t\n\t\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Note that most of the paging logic is done in\n\t * DataTable.ext.pager\n\t */\n\t\n\t/**\n\t * Generate the node required for default pagination\n\t *  @param {object} oSettings dataTables settings object\n\t *  @returns {node} Pagination feature node\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlPaginate ( settings )\n\t{\n\t\tvar\n\t\t\ttype   = settings.sPaginationType,\n\t\t\tplugin = DataTable.ext.pager[ type ],\n\t\t\tmodern = typeof plugin === 'function',\n\t\t\tredraw = function( settings ) {\n\t\t\t\t_fnDraw( settings );\n\t\t\t},\n\t\t\tnode = $('<div/>').addClass( settings.oClasses.sPaging + type )[0],\n\t\t\tfeatures = settings.aanFeatures;\n\t\n\t\tif ( ! modern ) {\n\t\t\tplugin.fnInit( settings, node, redraw );\n\t\t}\n\t\n\t\t/* Add a draw callback for the pagination on first instance, to update the paging display */\n\t\tif ( ! features.p )\n\t\t{\n\t\t\tnode.id = settings.sTableId+'_paginate';\n\t\n\t\t\tsettings.aoDrawCallback.push( {\n\t\t\t\t\"fn\": function( settings ) {\n\t\t\t\t\tif ( modern ) {\n\t\t\t\t\t\tvar\n\t\t\t\t\t\t\tstart      = settings._iDisplayStart,\n\t\t\t\t\t\t\tlen        = settings._iDisplayLength,\n\t\t\t\t\t\t\tvisRecords = settings.fnRecordsDisplay(),\n\t\t\t\t\t\t\tall        = len === -1,\n\t\t\t\t\t\t\tpage = all ? 0 : Math.ceil( start / len ),\n\t\t\t\t\t\t\tpages = all ? 1 : Math.ceil( visRecords / len ),\n\t\t\t\t\t\t\tbuttons = plugin(page, pages),\n\t\t\t\t\t\t\ti, ien;\n\t\n\t\t\t\t\t\tfor ( i=0, ien=features.p.length ; i<ien ; i++ ) {\n\t\t\t\t\t\t\t_fnRenderer( settings, 'pageButton' )(\n\t\t\t\t\t\t\t\tsettings, features.p[i], i, buttons, page, pages\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tplugin.fnUpdate( settings, redraw );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t\"sName\": \"pagination\"\n\t\t\t} );\n\t\t}\n\t\n\t\treturn node;\n\t}\n\t\n\t\n\t/**\n\t * Alter the display settings to change the page\n\t *  @param {object} settings DataTables settings object\n\t *  @param {string|int} action Paging action to take: \"first\", \"previous\",\n\t *    \"next\" or \"last\" or page number to jump to (integer)\n\t *  @param [bool] redraw Automatically draw the update or not\n\t *  @returns {bool} true page has changed, false - no change\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnPageChange ( settings, action, redraw )\n\t{\n\t\tvar\n\t\t\tstart     = settings._iDisplayStart,\n\t\t\tlen       = settings._iDisplayLength,\n\t\t\trecords   = settings.fnRecordsDisplay();\n\t\n\t\tif ( records === 0 || len === -1 )\n\t\t{\n\t\t\tstart = 0;\n\t\t}\n\t\telse if ( typeof action === \"number\" )\n\t\t{\n\t\t\tstart = action * len;\n\t\n\t\t\tif ( start > records )\n\t\t\t{\n\t\t\t\tstart = 0;\n\t\t\t}\n\t\t}\n\t\telse if ( action == \"first\" )\n\t\t{\n\t\t\tstart = 0;\n\t\t}\n\t\telse if ( action == \"previous\" )\n\t\t{\n\t\t\tstart = len >= 0 ?\n\t\t\t\tstart - len :\n\t\t\t\t0;\n\t\n\t\t\tif ( start < 0 )\n\t\t\t{\n\t\t\t  start = 0;\n\t\t\t}\n\t\t}\n\t\telse if ( action == \"next\" )\n\t\t{\n\t\t\tif ( start + len < records )\n\t\t\t{\n\t\t\t\tstart += len;\n\t\t\t}\n\t\t}\n\t\telse if ( action == \"last\" )\n\t\t{\n\t\t\tstart = Math.floor( (records-1) / len) * len;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t_fnLog( settings, 0, \"Unknown paging action: \"+action, 5 );\n\t\t}\n\t\n\t\tvar changed = settings._iDisplayStart !== start;\n\t\tsettings._iDisplayStart = start;\n\t\n\t\tif ( changed ) {\n\t\t\t_fnCallbackFire( settings, null, 'page', [settings] );\n\t\n\t\t\tif ( redraw ) {\n\t\t\t\t_fnDraw( settings );\n\t\t\t}\n\t\t}\n\t\n\t\treturn changed;\n\t}\n\t\n\t\n\t\n\t/**\n\t * Generate the node required for the processing node\n\t *  @param {object} settings dataTables settings object\n\t *  @returns {node} Processing element\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlProcessing ( settings )\n\t{\n\t\treturn $('<div/>', {\n\t\t\t\t'id': ! settings.aanFeatures.r ? settings.sTableId+'_processing' : null,\n\t\t\t\t'class': settings.oClasses.sProcessing\n\t\t\t} )\n\t\t\t.html( settings.oLanguage.sProcessing )\n\t\t\t.insertBefore( settings.nTable )[0];\n\t}\n\t\n\t\n\t/**\n\t * Display or hide the processing indicator\n\t *  @param {object} settings dataTables settings object\n\t *  @param {bool} show Show the processing indicator (true) or not (false)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnProcessingDisplay ( settings, show )\n\t{\n\t\tif ( settings.oFeatures.bProcessing ) {\n\t\t\t$(settings.aanFeatures.r).css( 'display', show ? 'block' : 'none' );\n\t\t}\n\t\n\t\t_fnCallbackFire( settings, null, 'processing', [settings, show] );\n\t}\n\t\n\t/**\n\t * Add any control elements for the table - specifically scrolling\n\t *  @param {object} settings dataTables settings object\n\t *  @returns {node} Node to add to the DOM\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnFeatureHtmlTable ( settings )\n\t{\n\t\tvar table = $(settings.nTable);\n\t\n\t\t// Add the ARIA grid role to the table\n\t\ttable.attr( 'role', 'grid' );\n\t\n\t\t// Scrolling from here on in\n\t\tvar scroll = settings.oScroll;\n\t\n\t\tif ( scroll.sX === '' && scroll.sY === '' ) {\n\t\t\treturn settings.nTable;\n\t\t}\n\t\n\t\tvar scrollX = scroll.sX;\n\t\tvar scrollY = scroll.sY;\n\t\tvar classes = settings.oClasses;\n\t\tvar caption = table.children('caption');\n\t\tvar captionSide = caption.length ? caption[0]._captionSide : null;\n\t\tvar headerClone = $( table[0].cloneNode(false) );\n\t\tvar footerClone = $( table[0].cloneNode(false) );\n\t\tvar footer = table.children('tfoot');\n\t\tvar _div = '<div/>';\n\t\tvar size = function ( s ) {\n\t\t\treturn !s ? null : _fnStringToCss( s );\n\t\t};\n\t\n\t\tif ( ! footer.length ) {\n\t\t\tfooter = null;\n\t\t}\n\t\n\t\t/*\n\t\t * The HTML structure that we want to generate in this function is:\n\t\t *  div - scroller\n\t\t *    div - scroll head\n\t\t *      div - scroll head inner\n\t\t *        table - scroll head table\n\t\t *          thead - thead\n\t\t *    div - scroll body\n\t\t *      table - table (master table)\n\t\t *        thead - thead clone for sizing\n\t\t *        tbody - tbody\n\t\t *    div - scroll foot\n\t\t *      div - scroll foot inner\n\t\t *        table - scroll foot table\n\t\t *          tfoot - tfoot\n\t\t */\n\t\tvar scroller = $( _div, { 'class': classes.sScrollWrapper } )\n\t\t\t.append(\n\t\t\t\t$(_div, { 'class': classes.sScrollHead } )\n\t\t\t\t\t.css( {\n\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\tposition: 'relative',\n\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\twidth: scrollX ? size(scrollX) : '100%'\n\t\t\t\t\t} )\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$(_div, { 'class': classes.sScrollHeadInner } )\n\t\t\t\t\t\t\t.css( {\n\t\t\t\t\t\t\t\t'box-sizing': 'content-box',\n\t\t\t\t\t\t\t\twidth: scroll.sXInner || '100%'\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\theaderClone\n\t\t\t\t\t\t\t\t\t.removeAttr('id')\n\t\t\t\t\t\t\t\t\t.css( 'margin-left', 0 )\n\t\t\t\t\t\t\t\t\t.append( captionSide === 'top' ? caption : null )\n\t\t\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\t\t\ttable.children('thead')\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t)\n\t\t\t.append(\n\t\t\t\t$(_div, { 'class': classes.sScrollBody } )\n\t\t\t\t\t.css( {\n\t\t\t\t\t\tposition: 'relative',\n\t\t\t\t\t\toverflow: 'auto',\n\t\t\t\t\t\twidth: size( scrollX )\n\t\t\t\t\t} )\n\t\t\t\t\t.append( table )\n\t\t\t);\n\t\n\t\tif ( footer ) {\n\t\t\tscroller.append(\n\t\t\t\t$(_div, { 'class': classes.sScrollFoot } )\n\t\t\t\t\t.css( {\n\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\twidth: scrollX ? size(scrollX) : '100%'\n\t\t\t\t\t} )\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$(_div, { 'class': classes.sScrollFootInner } )\n\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\tfooterClone\n\t\t\t\t\t\t\t\t\t.removeAttr('id')\n\t\t\t\t\t\t\t\t\t.css( 'margin-left', 0 )\n\t\t\t\t\t\t\t\t\t.append( captionSide === 'bottom' ? caption : null )\n\t\t\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\t\t\ttable.children('tfoot')\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\n\t\tvar children = scroller.children();\n\t\tvar scrollHead = children[0];\n\t\tvar scrollBody = children[1];\n\t\tvar scrollFoot = footer ? children[2] : null;\n\t\n\t\t// When the body is scrolled, then we also want to scroll the headers\n\t\tif ( scrollX ) {\n\t\t\t$(scrollBody).on( 'scroll.DT', function (e) {\n\t\t\t\tvar scrollLeft = this.scrollLeft;\n\t\n\t\t\t\tscrollHead.scrollLeft = scrollLeft;\n\t\n\t\t\t\tif ( footer ) {\n\t\t\t\t\tscrollFoot.scrollLeft = scrollLeft;\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\n\t\t$(scrollBody).css(\n\t\t\tscrollY && scroll.bCollapse ? 'max-height' : 'height', \n\t\t\tscrollY\n\t\t);\n\t\n\t\tsettings.nScrollHead = scrollHead;\n\t\tsettings.nScrollBody = scrollBody;\n\t\tsettings.nScrollFoot = scrollFoot;\n\t\n\t\t// On redraw - align columns\n\t\tsettings.aoDrawCallback.push( {\n\t\t\t\"fn\": _fnScrollDraw,\n\t\t\t\"sName\": \"scrolling\"\n\t\t} );\n\t\n\t\treturn scroller[0];\n\t}\n\t\n\t\n\t\n\t/**\n\t * Update the header, footer and body tables for resizing - i.e. column\n\t * alignment.\n\t *\n\t * Welcome to the most horrible function DataTables. The process that this\n\t * function follows is basically:\n\t *   1. Re-create the table inside the scrolling div\n\t *   2. Take live measurements from the DOM\n\t *   3. Apply the measurements to align the columns\n\t *   4. Clean up\n\t *\n\t *  @param {object} settings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnScrollDraw ( settings )\n\t{\n\t\t// Given that this is such a monster function, a lot of variables are use\n\t\t// to try and keep the minimised size as small as possible\n\t\tvar\n\t\t\tscroll         = settings.oScroll,\n\t\t\tscrollX        = scroll.sX,\n\t\t\tscrollXInner   = scroll.sXInner,\n\t\t\tscrollY        = scroll.sY,\n\t\t\tbarWidth       = scroll.iBarWidth,\n\t\t\tdivHeader      = $(settings.nScrollHead),\n\t\t\tdivHeaderStyle = divHeader[0].style,\n\t\t\tdivHeaderInner = divHeader.children('div'),\n\t\t\tdivHeaderInnerStyle = divHeaderInner[0].style,\n\t\t\tdivHeaderTable = divHeaderInner.children('table'),\n\t\t\tdivBodyEl      = settings.nScrollBody,\n\t\t\tdivBody        = $(divBodyEl),\n\t\t\tdivBodyStyle   = divBodyEl.style,\n\t\t\tdivFooter      = $(settings.nScrollFoot),\n\t\t\tdivFooterInner = divFooter.children('div'),\n\t\t\tdivFooterTable = divFooterInner.children('table'),\n\t\t\theader         = $(settings.nTHead),\n\t\t\ttable          = $(settings.nTable),\n\t\t\ttableEl        = table[0],\n\t\t\ttableStyle     = tableEl.style,\n\t\t\tfooter         = settings.nTFoot ? $(settings.nTFoot) : null,\n\t\t\tbrowser        = settings.oBrowser,\n\t\t\tie67           = browser.bScrollOversize,\n\t\t\tdtHeaderCells  = _pluck( settings.aoColumns, 'nTh' ),\n\t\t\theaderTrgEls, footerTrgEls,\n\t\t\theaderSrcEls, footerSrcEls,\n\t\t\theaderCopy, footerCopy,\n\t\t\theaderWidths=[], footerWidths=[],\n\t\t\theaderContent=[], footerContent=[],\n\t\t\tidx, correction, sanityWidth,\n\t\t\tzeroOut = function(nSizer) {\n\t\t\t\tvar style = nSizer.style;\n\t\t\t\tstyle.paddingTop = \"0\";\n\t\t\t\tstyle.paddingBottom = \"0\";\n\t\t\t\tstyle.borderTopWidth = \"0\";\n\t\t\t\tstyle.borderBottomWidth = \"0\";\n\t\t\t\tstyle.height = 0;\n\t\t\t};\n\t\n\t\t// If the scrollbar visibility has changed from the last draw, we need to\n\t\t// adjust the column sizes as the table width will have changed to account\n\t\t// for the scrollbar\n\t\tvar scrollBarVis = divBodyEl.scrollHeight > divBodyEl.clientHeight;\n\t\t\n\t\tif ( settings.scrollBarVis !== scrollBarVis && settings.scrollBarVis !== undefined ) {\n\t\t\tsettings.scrollBarVis = scrollBarVis;\n\t\t\t_fnAdjustColumnSizing( settings );\n\t\t\treturn; // adjust column sizing will call this function again\n\t\t}\n\t\telse {\n\t\t\tsettings.scrollBarVis = scrollBarVis;\n\t\t}\n\t\n\t\t/*\n\t\t * 1. Re-create the table inside the scrolling div\n\t\t */\n\t\n\t\t// Remove the old minimised thead and tfoot elements in the inner table\n\t\ttable.children('thead, tfoot').remove();\n\t\n\t\tif ( footer ) {\n\t\t\tfooterCopy = footer.clone().prependTo( table );\n\t\t\tfooterTrgEls = footer.find('tr'); // the original tfoot is in its own table and must be sized\n\t\t\tfooterSrcEls = footerCopy.find('tr');\n\t\t}\n\t\n\t\t// Clone the current header and footer elements and then place it into the inner table\n\t\theaderCopy = header.clone().prependTo( table );\n\t\theaderTrgEls = header.find('tr'); // original header is in its own table\n\t\theaderSrcEls = headerCopy.find('tr');\n\t\theaderCopy.find('th, td').removeAttr('tabindex');\n\t\n\t\n\t\t/*\n\t\t * 2. Take live measurements from the DOM - do not alter the DOM itself!\n\t\t */\n\t\n\t\t// Remove old sizing and apply the calculated column widths\n\t\t// Get the unique column headers in the newly created (cloned) header. We want to apply the\n\t\t// calculated sizes to this header\n\t\tif ( ! scrollX )\n\t\t{\n\t\t\tdivBodyStyle.width = '100%';\n\t\t\tdivHeader[0].style.width = '100%';\n\t\t}\n\t\n\t\t$.each( _fnGetUniqueThs( settings, headerCopy ), function ( i, el ) {\n\t\t\tidx = _fnVisibleToColumnIndex( settings, i );\n\t\t\tel.style.width = settings.aoColumns[idx].sWidth;\n\t\t} );\n\t\n\t\tif ( footer ) {\n\t\t\t_fnApplyToChildren( function(n) {\n\t\t\t\tn.style.width = \"\";\n\t\t\t}, footerSrcEls );\n\t\t}\n\t\n\t\t// Size the table as a whole\n\t\tsanityWidth = table.outerWidth();\n\t\tif ( scrollX === \"\" ) {\n\t\t\t// No x scrolling\n\t\t\ttableStyle.width = \"100%\";\n\t\n\t\t\t// IE7 will make the width of the table when 100% include the scrollbar\n\t\t\t// - which is shouldn't. When there is a scrollbar we need to take this\n\t\t\t// into account.\n\t\t\tif ( ie67 && (table.find('tbody').height() > divBodyEl.offsetHeight ||\n\t\t\t\tdivBody.css('overflow-y') == \"scroll\")\n\t\t\t) {\n\t\t\t\ttableStyle.width = _fnStringToCss( table.outerWidth() - barWidth);\n\t\t\t}\n\t\n\t\t\t// Recalculate the sanity width\n\t\t\tsanityWidth = table.outerWidth();\n\t\t}\n\t\telse if ( scrollXInner !== \"\" ) {\n\t\t\t// legacy x scroll inner has been given - use it\n\t\t\ttableStyle.width = _fnStringToCss(scrollXInner);\n\t\n\t\t\t// Recalculate the sanity width\n\t\t\tsanityWidth = table.outerWidth();\n\t\t}\n\t\n\t\t// Hidden header should have zero height, so remove padding and borders. Then\n\t\t// set the width based on the real headers\n\t\n\t\t// Apply all styles in one pass\n\t\t_fnApplyToChildren( zeroOut, headerSrcEls );\n\t\n\t\t// Read all widths in next pass\n\t\t_fnApplyToChildren( function(nSizer) {\n\t\t\theaderContent.push( nSizer.innerHTML );\n\t\t\theaderWidths.push( _fnStringToCss( $(nSizer).css('width') ) );\n\t\t}, headerSrcEls );\n\t\n\t\t// Apply all widths in final pass\n\t\t_fnApplyToChildren( function(nToSize, i) {\n\t\t\t// Only apply widths to the DataTables detected header cells - this\n\t\t\t// prevents complex headers from having contradictory sizes applied\n\t\t\tif ( $.inArray( nToSize, dtHeaderCells ) !== -1 ) {\n\t\t\t\tnToSize.style.width = headerWidths[i];\n\t\t\t}\n\t\t}, headerTrgEls );\n\t\n\t\t$(headerSrcEls).height(0);\n\t\n\t\t/* Same again with the footer if we have one */\n\t\tif ( footer )\n\t\t{\n\t\t\t_fnApplyToChildren( zeroOut, footerSrcEls );\n\t\n\t\t\t_fnApplyToChildren( function(nSizer) {\n\t\t\t\tfooterContent.push( nSizer.innerHTML );\n\t\t\t\tfooterWidths.push( _fnStringToCss( $(nSizer).css('width') ) );\n\t\t\t}, footerSrcEls );\n\t\n\t\t\t_fnApplyToChildren( function(nToSize, i) {\n\t\t\t\tnToSize.style.width = footerWidths[i];\n\t\t\t}, footerTrgEls );\n\t\n\t\t\t$(footerSrcEls).height(0);\n\t\t}\n\t\n\t\n\t\t/*\n\t\t * 3. Apply the measurements\n\t\t */\n\t\n\t\t// \"Hide\" the header and footer that we used for the sizing. We need to keep\n\t\t// the content of the cell so that the width applied to the header and body\n\t\t// both match, but we want to hide it completely. We want to also fix their\n\t\t// width to what they currently are\n\t\t_fnApplyToChildren( function(nSizer, i) {\n\t\t\tnSizer.innerHTML = '<div class=\"dataTables_sizing\" style=\"height:0;overflow:hidden;\">'+headerContent[i]+'</div>';\n\t\t\tnSizer.style.width = headerWidths[i];\n\t\t}, headerSrcEls );\n\t\n\t\tif ( footer )\n\t\t{\n\t\t\t_fnApplyToChildren( function(nSizer, i) {\n\t\t\t\tnSizer.innerHTML = '<div class=\"dataTables_sizing\" style=\"height:0;overflow:hidden;\">'+footerContent[i]+'</div>';\n\t\t\t\tnSizer.style.width = footerWidths[i];\n\t\t\t}, footerSrcEls );\n\t\t}\n\t\n\t\t// Sanity check that the table is of a sensible width. If not then we are going to get\n\t\t// misalignment - try to prevent this by not allowing the table to shrink below its min width\n\t\tif ( table.outerWidth() < sanityWidth )\n\t\t{\n\t\t\t// The min width depends upon if we have a vertical scrollbar visible or not */\n\t\t\tcorrection = ((divBodyEl.scrollHeight > divBodyEl.offsetHeight ||\n\t\t\t\tdivBody.css('overflow-y') == \"scroll\")) ?\n\t\t\t\t\tsanityWidth+barWidth :\n\t\t\t\t\tsanityWidth;\n\t\n\t\t\t// IE6/7 are a law unto themselves...\n\t\t\tif ( ie67 && (divBodyEl.scrollHeight >\n\t\t\t\tdivBodyEl.offsetHeight || divBody.css('overflow-y') == \"scroll\")\n\t\t\t) {\n\t\t\t\ttableStyle.width = _fnStringToCss( correction-barWidth );\n\t\t\t}\n\t\n\t\t\t// And give the user a warning that we've stopped the table getting too small\n\t\t\tif ( scrollX === \"\" || scrollXInner !== \"\" ) {\n\t\t\t\t_fnLog( settings, 1, 'Possible column misalignment', 6 );\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcorrection = '100%';\n\t\t}\n\t\n\t\t// Apply to the container elements\n\t\tdivBodyStyle.width = _fnStringToCss( correction );\n\t\tdivHeaderStyle.width = _fnStringToCss( correction );\n\t\n\t\tif ( footer ) {\n\t\t\tsettings.nScrollFoot.style.width = _fnStringToCss( correction );\n\t\t}\n\t\n\t\n\t\t/*\n\t\t * 4. Clean up\n\t\t */\n\t\tif ( ! scrollY ) {\n\t\t\t/* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting\n\t\t\t * the scrollbar height from the visible display, rather than adding it on. We need to\n\t\t\t * set the height in order to sort this. Don't want to do it in any other browsers.\n\t\t\t */\n\t\t\tif ( ie67 ) {\n\t\t\t\tdivBodyStyle.height = _fnStringToCss( tableEl.offsetHeight+barWidth );\n\t\t\t}\n\t\t}\n\t\n\t\t/* Finally set the width's of the header and footer tables */\n\t\tvar iOuterWidth = table.outerWidth();\n\t\tdivHeaderTable[0].style.width = _fnStringToCss( iOuterWidth );\n\t\tdivHeaderInnerStyle.width = _fnStringToCss( iOuterWidth );\n\t\n\t\t// Figure out if there are scrollbar present - if so then we need a the header and footer to\n\t\t// provide a bit more space to allow \"overflow\" scrolling (i.e. past the scrollbar)\n\t\tvar bScrolling = table.height() > divBodyEl.clientHeight || divBody.css('overflow-y') == \"scroll\";\n\t\tvar padding = 'padding' + (browser.bScrollbarLeft ? 'Left' : 'Right' );\n\t\tdivHeaderInnerStyle[ padding ] = bScrolling ? barWidth+\"px\" : \"0px\";\n\t\n\t\tif ( footer ) {\n\t\t\tdivFooterTable[0].style.width = _fnStringToCss( iOuterWidth );\n\t\t\tdivFooterInner[0].style.width = _fnStringToCss( iOuterWidth );\n\t\t\tdivFooterInner[0].style[padding] = bScrolling ? barWidth+\"px\" : \"0px\";\n\t\t}\n\t\n\t\t// Correct DOM ordering for colgroup - comes before the thead\n\t\ttable.children('colgroup').insertBefore( table.children('thead') );\n\t\n\t\t/* Adjust the position of the header in case we loose the y-scrollbar */\n\t\tdivBody.scroll();\n\t\n\t\t// If sorting or filtering has occurred, jump the scrolling back to the top\n\t\t// only if we aren't holding the position\n\t\tif ( (settings.bSorted || settings.bFiltered) && ! settings._drawHold ) {\n\t\t\tdivBodyEl.scrollTop = 0;\n\t\t}\n\t}\n\t\n\t\n\t\n\t/**\n\t * Apply a given function to the display child nodes of an element array (typically\n\t * TD children of TR rows\n\t *  @param {function} fn Method to apply to the objects\n\t *  @param array {nodes} an1 List of elements to look through for display children\n\t *  @param array {nodes} an2 Another list (identical structure to the first) - optional\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnApplyToChildren( fn, an1, an2 )\n\t{\n\t\tvar index=0, i=0, iLen=an1.length;\n\t\tvar nNode1, nNode2;\n\t\n\t\twhile ( i < iLen ) {\n\t\t\tnNode1 = an1[i].firstChild;\n\t\t\tnNode2 = an2 ? an2[i].firstChild : null;\n\t\n\t\t\twhile ( nNode1 ) {\n\t\t\t\tif ( nNode1.nodeType === 1 ) {\n\t\t\t\t\tif ( an2 ) {\n\t\t\t\t\t\tfn( nNode1, nNode2, index );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfn( nNode1, index );\n\t\t\t\t\t}\n\t\n\t\t\t\t\tindex++;\n\t\t\t\t}\n\t\n\t\t\t\tnNode1 = nNode1.nextSibling;\n\t\t\t\tnNode2 = an2 ? nNode2.nextSibling : null;\n\t\t\t}\n\t\n\t\t\ti++;\n\t\t}\n\t}\n\t\n\t\n\t\n\tvar __re_html_remove = /<.*?>/g;\n\t\n\t\n\t/**\n\t * Calculate the width of columns for the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCalculateColumnWidths ( oSettings )\n\t{\n\t\tvar\n\t\t\ttable = oSettings.nTable,\n\t\t\tcolumns = oSettings.aoColumns,\n\t\t\tscroll = oSettings.oScroll,\n\t\t\tscrollY = scroll.sY,\n\t\t\tscrollX = scroll.sX,\n\t\t\tscrollXInner = scroll.sXInner,\n\t\t\tcolumnCount = columns.length,\n\t\t\tvisibleColumns = _fnGetColumns( oSettings, 'bVisible' ),\n\t\t\theaderCells = $('th', oSettings.nTHead),\n\t\t\ttableWidthAttr = table.getAttribute('width'), // from DOM element\n\t\t\ttableContainer = table.parentNode,\n\t\t\tuserInputs = false,\n\t\t\ti, column, columnIdx, width, outerWidth,\n\t\t\tbrowser = oSettings.oBrowser,\n\t\t\tie67 = browser.bScrollOversize;\n\t\n\t\tvar styleWidth = table.style.width;\n\t\tif ( styleWidth && styleWidth.indexOf('%') !== -1 ) {\n\t\t\ttableWidthAttr = styleWidth;\n\t\t}\n\t\n\t\t/* Convert any user input sizes into pixel sizes */\n\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\tcolumn = columns[ visibleColumns[i] ];\n\t\n\t\t\tif ( column.sWidth !== null ) {\n\t\t\t\tcolumn.sWidth = _fnConvertToWidth( column.sWidthOrig, tableContainer );\n\t\n\t\t\t\tuserInputs = true;\n\t\t\t}\n\t\t}\n\t\n\t\t/* If the number of columns in the DOM equals the number that we have to\n\t\t * process in DataTables, then we can use the offsets that are created by\n\t\t * the web- browser. No custom sizes can be set in order for this to happen,\n\t\t * nor scrolling used\n\t\t */\n\t\tif ( ie67 || ! userInputs && ! scrollX && ! scrollY &&\n\t\t     columnCount == _fnVisbleColumns( oSettings ) &&\n\t\t     columnCount == headerCells.length\n\t\t) {\n\t\t\tfor ( i=0 ; i<columnCount ; i++ ) {\n\t\t\t\tvar colIdx = _fnVisibleToColumnIndex( oSettings, i );\n\t\n\t\t\t\tif ( colIdx !== null ) {\n\t\t\t\t\tcolumns[ colIdx ].sWidth = _fnStringToCss( headerCells.eq(i).width() );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Otherwise construct a single row, worst case, table with the widest\n\t\t\t// node in the data, assign any user defined widths, then insert it into\n\t\t\t// the DOM and allow the browser to do all the hard work of calculating\n\t\t\t// table widths\n\t\t\tvar tmpTable = $(table).clone() // don't use cloneNode - IE8 will remove events on the main table\n\t\t\t\t.css( 'visibility', 'hidden' )\n\t\t\t\t.removeAttr( 'id' );\n\t\n\t\t\t// Clean up the table body\n\t\t\ttmpTable.find('tbody tr').remove();\n\t\t\tvar tr = $('<tr/>').appendTo( tmpTable.find('tbody') );\n\t\n\t\t\t// Clone the table header and footer - we can't use the header / footer\n\t\t\t// from the cloned table, since if scrolling is active, the table's\n\t\t\t// real header and footer are contained in different table tags\n\t\t\ttmpTable.find('thead, tfoot').remove();\n\t\t\ttmpTable\n\t\t\t\t.append( $(oSettings.nTHead).clone() )\n\t\t\t\t.append( $(oSettings.nTFoot).clone() );\n\t\n\t\t\t// Remove any assigned widths from the footer (from scrolling)\n\t\t\ttmpTable.find('tfoot th, tfoot td').css('width', '');\n\t\n\t\t\t// Apply custom sizing to the cloned header\n\t\t\theaderCells = _fnGetUniqueThs( oSettings, tmpTable.find('thead')[0] );\n\t\n\t\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\t\tcolumn = columns[ visibleColumns[i] ];\n\t\n\t\t\t\theaderCells[i].style.width = column.sWidthOrig !== null && column.sWidthOrig !== '' ?\n\t\t\t\t\t_fnStringToCss( column.sWidthOrig ) :\n\t\t\t\t\t'';\n\t\n\t\t\t\t// For scrollX we need to force the column width otherwise the\n\t\t\t\t// browser will collapse it. If this width is smaller than the\n\t\t\t\t// width the column requires, then it will have no effect\n\t\t\t\tif ( column.sWidthOrig && scrollX ) {\n\t\t\t\t\t$( headerCells[i] ).append( $('<div/>').css( {\n\t\t\t\t\t\twidth: column.sWidthOrig,\n\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\theight: 1\n\t\t\t\t\t} ) );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Find the widest cell for each column and put it into the table\n\t\t\tif ( oSettings.aoData.length ) {\n\t\t\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\t\t\tcolumnIdx = visibleColumns[i];\n\t\t\t\t\tcolumn = columns[ columnIdx ];\n\t\n\t\t\t\t\t$( _fnGetWidestNode( oSettings, columnIdx ) )\n\t\t\t\t\t\t.clone( false )\n\t\t\t\t\t\t.append( column.sContentPadding )\n\t\t\t\t\t\t.appendTo( tr );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Tidy the temporary table - remove name attributes so there aren't\n\t\t\t// duplicated in the dom (radio elements for example)\n\t\t\t$('[name]', tmpTable).removeAttr('name');\n\t\n\t\t\t// Table has been built, attach to the document so we can work with it.\n\t\t\t// A holding element is used, positioned at the top of the container\n\t\t\t// with minimal height, so it has no effect on if the container scrolls\n\t\t\t// or not. Otherwise it might trigger scrolling when it actually isn't\n\t\t\t// needed\n\t\t\tvar holder = $('<div/>').css( scrollX || scrollY ?\n\t\t\t\t\t{\n\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\theight: 1,\n\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\toverflow: 'hidden'\n\t\t\t\t\t} :\n\t\t\t\t\t{}\n\t\t\t\t)\n\t\t\t\t.append( tmpTable )\n\t\t\t\t.appendTo( tableContainer );\n\t\n\t\t\t// When scrolling (X or Y) we want to set the width of the table as \n\t\t\t// appropriate. However, when not scrolling leave the table width as it\n\t\t\t// is. This results in slightly different, but I think correct behaviour\n\t\t\tif ( scrollX && scrollXInner ) {\n\t\t\t\ttmpTable.width( scrollXInner );\n\t\t\t}\n\t\t\telse if ( scrollX ) {\n\t\t\t\ttmpTable.css( 'width', 'auto' );\n\t\t\t\ttmpTable.removeAttr('width');\n\t\n\t\t\t\t// If there is no width attribute or style, then allow the table to\n\t\t\t\t// collapse\n\t\t\t\tif ( tmpTable.width() < tableContainer.clientWidth && tableWidthAttr ) {\n\t\t\t\t\ttmpTable.width( tableContainer.clientWidth );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( scrollY ) {\n\t\t\t\ttmpTable.width( tableContainer.clientWidth );\n\t\t\t}\n\t\t\telse if ( tableWidthAttr ) {\n\t\t\t\ttmpTable.width( tableWidthAttr );\n\t\t\t}\n\t\n\t\t\t// Get the width of each column in the constructed table - we need to\n\t\t\t// know the inner width (so it can be assigned to the other table's\n\t\t\t// cells) and the outer width so we can calculate the full width of the\n\t\t\t// table. This is safe since DataTables requires a unique cell for each\n\t\t\t// column, but if ever a header can span multiple columns, this will\n\t\t\t// need to be modified.\n\t\t\tvar total = 0;\n\t\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\t\tvar cell = $(headerCells[i]);\n\t\t\t\tvar border = cell.outerWidth() - cell.width();\n\t\n\t\t\t\t// Use getBounding... where possible (not IE8-) because it can give\n\t\t\t\t// sub-pixel accuracy, which we then want to round up!\n\t\t\t\tvar bounding = browser.bBounding ?\n\t\t\t\t\tMath.ceil( headerCells[i].getBoundingClientRect().width ) :\n\t\t\t\t\tcell.outerWidth();\n\t\n\t\t\t\t// Total is tracked to remove any sub-pixel errors as the outerWidth\n\t\t\t\t// of the table might not equal the total given here (IE!).\n\t\t\t\ttotal += bounding;\n\t\n\t\t\t\t// Width for each column to use\n\t\t\t\tcolumns[ visibleColumns[i] ].sWidth = _fnStringToCss( bounding - border );\n\t\t\t}\n\t\n\t\t\ttable.style.width = _fnStringToCss( total );\n\t\n\t\t\t// Finished with the table - ditch it\n\t\t\tholder.remove();\n\t\t}\n\t\n\t\t// If there is a width attr, we want to attach an event listener which\n\t\t// allows the table sizing to automatically adjust when the window is\n\t\t// resized. Use the width attr rather than CSS, since we can't know if the\n\t\t// CSS is a relative value or absolute - DOM read is always px.\n\t\tif ( tableWidthAttr ) {\n\t\t\ttable.style.width = _fnStringToCss( tableWidthAttr );\n\t\t}\n\t\n\t\tif ( (tableWidthAttr || scrollX) && ! oSettings._reszEvt ) {\n\t\t\tvar bindResize = function () {\n\t\t\t\t$(window).on('resize.DT-'+oSettings.sInstance, _fnThrottle( function () {\n\t\t\t\t\t_fnAdjustColumnSizing( oSettings );\n\t\t\t\t} ) );\n\t\t\t};\n\t\n\t\t\t// IE6/7 will crash if we bind a resize event handler on page load.\n\t\t\t// To be removed in 1.11 which drops IE6/7 support\n\t\t\tif ( ie67 ) {\n\t\t\t\tsetTimeout( bindResize, 1000 );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbindResize();\n\t\t\t}\n\t\n\t\t\toSettings._reszEvt = true;\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Throttle the calls to a function. Arguments and context are maintained for\n\t * the throttled function\n\t *  @param {function} fn Function to be called\n\t *  @param {int} [freq=200] call frequency in mS\n\t *  @returns {function} wrapped function\n\t *  @memberof DataTable#oApi\n\t */\n\tvar _fnThrottle = DataTable.util.throttle;\n\t\n\t\n\t/**\n\t * Convert a CSS unit width to pixels (e.g. 2em)\n\t *  @param {string} width width to be converted\n\t *  @param {node} parent parent to get the with for (required for relative widths) - optional\n\t *  @returns {int} width in pixels\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnConvertToWidth ( width, parent )\n\t{\n\t\tif ( ! width ) {\n\t\t\treturn 0;\n\t\t}\n\t\n\t\tvar n = $('<div/>')\n\t\t\t.css( 'width', _fnStringToCss( width ) )\n\t\t\t.appendTo( parent || document.body );\n\t\n\t\tvar val = n[0].offsetWidth;\n\t\tn.remove();\n\t\n\t\treturn val;\n\t}\n\t\n\t\n\t/**\n\t * Get the widest node\n\t *  @param {object} settings dataTables settings object\n\t *  @param {int} colIdx column of interest\n\t *  @returns {node} widest table node\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetWidestNode( settings, colIdx )\n\t{\n\t\tvar idx = _fnGetMaxLenString( settings, colIdx );\n\t\tif ( idx < 0 ) {\n\t\t\treturn null;\n\t\t}\n\t\n\t\tvar data = settings.aoData[ idx ];\n\t\treturn ! data.nTr ? // Might not have been created when deferred rendering\n\t\t\t$('<td/>').html( _fnGetCellData( settings, idx, colIdx, 'display' ) )[0] :\n\t\t\tdata.anCells[ colIdx ];\n\t}\n\t\n\t\n\t/**\n\t * Get the maximum strlen for each data column\n\t *  @param {object} settings dataTables settings object\n\t *  @param {int} colIdx column of interest\n\t *  @returns {string} max string length for each column\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnGetMaxLenString( settings, colIdx )\n\t{\n\t\tvar s, max=-1, maxIdx = -1;\n\t\n\t\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\ts = _fnGetCellData( settings, i, colIdx, 'display' )+'';\n\t\t\ts = s.replace( __re_html_remove, '' );\n\t\t\ts = s.replace( /&nbsp;/g, ' ' );\n\t\n\t\t\tif ( s.length > max ) {\n\t\t\t\tmax = s.length;\n\t\t\t\tmaxIdx = i;\n\t\t\t}\n\t\t}\n\t\n\t\treturn maxIdx;\n\t}\n\t\n\t\n\t/**\n\t * Append a CSS unit (only if required) to a string\n\t *  @param {string} value to css-ify\n\t *  @returns {string} value with css unit\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnStringToCss( s )\n\t{\n\t\tif ( s === null ) {\n\t\t\treturn '0px';\n\t\t}\n\t\n\t\tif ( typeof s == 'number' ) {\n\t\t\treturn s < 0 ?\n\t\t\t\t'0px' :\n\t\t\t\ts+'px';\n\t\t}\n\t\n\t\t// Check it has a unit character already\n\t\treturn s.match(/\\d$/) ?\n\t\t\ts+'px' :\n\t\t\ts;\n\t}\n\t\n\t\n\t\n\tfunction _fnSortFlatten ( settings )\n\t{\n\t\tvar\n\t\t\ti, iLen, k, kLen,\n\t\t\taSort = [],\n\t\t\taiOrig = [],\n\t\t\taoColumns = settings.aoColumns,\n\t\t\taDataSort, iCol, sType, srcCol,\n\t\t\tfixed = settings.aaSortingFixed,\n\t\t\tfixedObj = $.isPlainObject( fixed ),\n\t\t\tnestedSort = [],\n\t\t\tadd = function ( a ) {\n\t\t\t\tif ( a.length && ! $.isArray( a[0] ) ) {\n\t\t\t\t\t// 1D array\n\t\t\t\t\tnestedSort.push( a );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// 2D array\n\t\t\t\t\t$.merge( nestedSort, a );\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t// Build the sort array, with pre-fix and post-fix options if they have been\n\t\t// specified\n\t\tif ( $.isArray( fixed ) ) {\n\t\t\tadd( fixed );\n\t\t}\n\t\n\t\tif ( fixedObj && fixed.pre ) {\n\t\t\tadd( fixed.pre );\n\t\t}\n\t\n\t\tadd( settings.aaSorting );\n\t\n\t\tif (fixedObj && fixed.post ) {\n\t\t\tadd( fixed.post );\n\t\t}\n\t\n\t\tfor ( i=0 ; i<nestedSort.length ; i++ )\n\t\t{\n\t\t\tsrcCol = nestedSort[i][0];\n\t\t\taDataSort = aoColumns[ srcCol ].aDataSort;\n\t\n\t\t\tfor ( k=0, kLen=aDataSort.length ; k<kLen ; k++ )\n\t\t\t{\n\t\t\t\tiCol = aDataSort[k];\n\t\t\t\tsType = aoColumns[ iCol ].sType || 'string';\n\t\n\t\t\t\tif ( nestedSort[i]._idx === undefined ) {\n\t\t\t\t\tnestedSort[i]._idx = $.inArray( nestedSort[i][1], aoColumns[iCol].asSorting );\n\t\t\t\t}\n\t\n\t\t\t\taSort.push( {\n\t\t\t\t\tsrc:       srcCol,\n\t\t\t\t\tcol:       iCol,\n\t\t\t\t\tdir:       nestedSort[i][1],\n\t\t\t\t\tindex:     nestedSort[i]._idx,\n\t\t\t\t\ttype:      sType,\n\t\t\t\t\tformatter: DataTable.ext.type.order[ sType+\"-pre\" ]\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t\n\t\treturn aSort;\n\t}\n\t\n\t/**\n\t * Change the order of the table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t *  @todo This really needs split up!\n\t */\n\tfunction _fnSort ( oSettings )\n\t{\n\t\tvar\n\t\t\ti, ien, iLen, j, jLen, k, kLen,\n\t\t\tsDataType, nTh,\n\t\t\taiOrig = [],\n\t\t\toExtSort = DataTable.ext.type.order,\n\t\t\taoData = oSettings.aoData,\n\t\t\taoColumns = oSettings.aoColumns,\n\t\t\taDataSort, data, iCol, sType, oSort,\n\t\t\tformatters = 0,\n\t\t\tsortCol,\n\t\t\tdisplayMaster = oSettings.aiDisplayMaster,\n\t\t\taSort;\n\t\n\t\t// Resolve any column types that are unknown due to addition or invalidation\n\t\t// @todo Can this be moved into a 'data-ready' handler which is called when\n\t\t//   data is going to be used in the table?\n\t\t_fnColumnTypes( oSettings );\n\t\n\t\taSort = _fnSortFlatten( oSettings );\n\t\n\t\tfor ( i=0, ien=aSort.length ; i<ien ; i++ ) {\n\t\t\tsortCol = aSort[i];\n\t\n\t\t\t// Track if we can use the fast sort algorithm\n\t\t\tif ( sortCol.formatter ) {\n\t\t\t\tformatters++;\n\t\t\t}\n\t\n\t\t\t// Load the data needed for the sort, for each cell\n\t\t\t_fnSortData( oSettings, sortCol.col );\n\t\t}\n\t\n\t\t/* No sorting required if server-side or no sorting array */\n\t\tif ( _fnDataSource( oSettings ) != 'ssp' && aSort.length !== 0 )\n\t\t{\n\t\t\t// Create a value - key array of the current row positions such that we can use their\n\t\t\t// current position during the sort, if values match, in order to perform stable sorting\n\t\t\tfor ( i=0, iLen=displayMaster.length ; i<iLen ; i++ ) {\n\t\t\t\taiOrig[ displayMaster[i] ] = i;\n\t\t\t}\n\t\n\t\t\t/* Do the sort - here we want multi-column sorting based on a given data source (column)\n\t\t\t * and sorting function (from oSort) in a certain direction. It's reasonably complex to\n\t\t\t * follow on it's own, but this is what we want (example two column sorting):\n\t\t\t *  fnLocalSorting = function(a,b){\n\t\t\t *    var iTest;\n\t\t\t *    iTest = oSort['string-asc']('data11', 'data12');\n\t\t\t *      if (iTest !== 0)\n\t\t\t *        return iTest;\n\t\t\t *    iTest = oSort['numeric-desc']('data21', 'data22');\n\t\t\t *    if (iTest !== 0)\n\t\t\t *      return iTest;\n\t\t\t *    return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );\n\t\t\t *  }\n\t\t\t * Basically we have a test for each sorting column, if the data in that column is equal,\n\t\t\t * test the next column. If all columns match, then we use a numeric sort on the row\n\t\t\t * positions in the original data array to provide a stable sort.\n\t\t\t *\n\t\t\t * Note - I know it seems excessive to have two sorting methods, but the first is around\n\t\t\t * 15% faster, so the second is only maintained for backwards compatibility with sorting\n\t\t\t * methods which do not have a pre-sort formatting function.\n\t\t\t */\n\t\t\tif ( formatters === aSort.length ) {\n\t\t\t\t// All sort types have formatting functions\n\t\t\t\tdisplayMaster.sort( function ( a, b ) {\n\t\t\t\t\tvar\n\t\t\t\t\t\tx, y, k, test, sort,\n\t\t\t\t\t\tlen=aSort.length,\n\t\t\t\t\t\tdataA = aoData[a]._aSortData,\n\t\t\t\t\t\tdataB = aoData[b]._aSortData;\n\t\n\t\t\t\t\tfor ( k=0 ; k<len ; k++ ) {\n\t\t\t\t\t\tsort = aSort[k];\n\t\n\t\t\t\t\t\tx = dataA[ sort.col ];\n\t\t\t\t\t\ty = dataB[ sort.col ];\n\t\n\t\t\t\t\t\ttest = x<y ? -1 : x>y ? 1 : 0;\n\t\t\t\t\t\tif ( test !== 0 ) {\n\t\t\t\t\t\t\treturn sort.dir === 'asc' ? test : -test;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tx = aiOrig[a];\n\t\t\t\t\ty = aiOrig[b];\n\t\t\t\t\treturn x<y ? -1 : x>y ? 1 : 0;\n\t\t\t\t} );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Depreciated - remove in 1.11 (providing a plug-in option)\n\t\t\t\t// Not all sort types have formatting methods, so we have to call their sorting\n\t\t\t\t// methods.\n\t\t\t\tdisplayMaster.sort( function ( a, b ) {\n\t\t\t\t\tvar\n\t\t\t\t\t\tx, y, k, l, test, sort, fn,\n\t\t\t\t\t\tlen=aSort.length,\n\t\t\t\t\t\tdataA = aoData[a]._aSortData,\n\t\t\t\t\t\tdataB = aoData[b]._aSortData;\n\t\n\t\t\t\t\tfor ( k=0 ; k<len ; k++ ) {\n\t\t\t\t\t\tsort = aSort[k];\n\t\n\t\t\t\t\t\tx = dataA[ sort.col ];\n\t\t\t\t\t\ty = dataB[ sort.col ];\n\t\n\t\t\t\t\t\tfn = oExtSort[ sort.type+\"-\"+sort.dir ] || oExtSort[ \"string-\"+sort.dir ];\n\t\t\t\t\t\ttest = fn( x, y );\n\t\t\t\t\t\tif ( test !== 0 ) {\n\t\t\t\t\t\t\treturn test;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tx = aiOrig[a];\n\t\t\t\t\ty = aiOrig[b];\n\t\t\t\t\treturn x<y ? -1 : x>y ? 1 : 0;\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t\n\t\t/* Tell the draw function that we have sorted the data */\n\t\toSettings.bSorted = true;\n\t}\n\t\n\t\n\tfunction _fnSortAria ( settings )\n\t{\n\t\tvar label;\n\t\tvar nextSort;\n\t\tvar columns = settings.aoColumns;\n\t\tvar aSort = _fnSortFlatten( settings );\n\t\tvar oAria = settings.oLanguage.oAria;\n\t\n\t\t// ARIA attributes - need to loop all columns, to update all (removing old\n\t\t// attributes as needed)\n\t\tfor ( var i=0, iLen=columns.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tvar col = columns[i];\n\t\t\tvar asSorting = col.asSorting;\n\t\t\tvar sTitle = col.sTitle.replace( /<.*?>/g, \"\" );\n\t\t\tvar th = col.nTh;\n\t\n\t\t\t// IE7 is throwing an error when setting these properties with jQuery's\n\t\t\t// attr() and removeAttr() methods...\n\t\t\tth.removeAttribute('aria-sort');\n\t\n\t\t\t/* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */\n\t\t\tif ( col.bSortable ) {\n\t\t\t\tif ( aSort.length > 0 && aSort[0].col == i ) {\n\t\t\t\t\tth.setAttribute('aria-sort', aSort[0].dir==\"asc\" ? \"ascending\" : \"descending\" );\n\t\t\t\t\tnextSort = asSorting[ aSort[0].index+1 ] || asSorting[0];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tnextSort = asSorting[0];\n\t\t\t\t}\n\t\n\t\t\t\tlabel = sTitle + ( nextSort === \"asc\" ?\n\t\t\t\t\toAria.sSortAscending :\n\t\t\t\t\toAria.sSortDescending\n\t\t\t\t);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlabel = sTitle;\n\t\t\t}\n\t\n\t\t\tth.setAttribute('aria-label', label);\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Function to run on user sort request\n\t *  @param {object} settings dataTables settings object\n\t *  @param {node} attachTo node to attach the handler to\n\t *  @param {int} colIdx column sorting index\n\t *  @param {boolean} [append=false] Append the requested sort to the existing\n\t *    sort if true (i.e. multi-column sort)\n\t *  @param {function} [callback] callback function\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSortListener ( settings, colIdx, append, callback )\n\t{\n\t\tvar col = settings.aoColumns[ colIdx ];\n\t\tvar sorting = settings.aaSorting;\n\t\tvar asSorting = col.asSorting;\n\t\tvar nextSortIdx;\n\t\tvar next = function ( a, overflow ) {\n\t\t\tvar idx = a._idx;\n\t\t\tif ( idx === undefined ) {\n\t\t\t\tidx = $.inArray( a[1], asSorting );\n\t\t\t}\n\t\n\t\t\treturn idx+1 < asSorting.length ?\n\t\t\t\tidx+1 :\n\t\t\t\toverflow ?\n\t\t\t\t\tnull :\n\t\t\t\t\t0;\n\t\t};\n\t\n\t\t// Convert to 2D array if needed\n\t\tif ( typeof sorting[0] === 'number' ) {\n\t\t\tsorting = settings.aaSorting = [ sorting ];\n\t\t}\n\t\n\t\t// If appending the sort then we are multi-column sorting\n\t\tif ( append && settings.oFeatures.bSortMulti ) {\n\t\t\t// Are we already doing some kind of sort on this column?\n\t\t\tvar sortIdx = $.inArray( colIdx, _pluck(sorting, '0') );\n\t\n\t\t\tif ( sortIdx !== -1 ) {\n\t\t\t\t// Yes, modify the sort\n\t\t\t\tnextSortIdx = next( sorting[sortIdx], true );\n\t\n\t\t\t\tif ( nextSortIdx === null && sorting.length === 1 ) {\n\t\t\t\t\tnextSortIdx = 0; // can't remove sorting completely\n\t\t\t\t}\n\t\n\t\t\t\tif ( nextSortIdx === null ) {\n\t\t\t\t\tsorting.splice( sortIdx, 1 );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tsorting[sortIdx][1] = asSorting[ nextSortIdx ];\n\t\t\t\t\tsorting[sortIdx]._idx = nextSortIdx;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// No sort on this column yet\n\t\t\t\tsorting.push( [ colIdx, asSorting[0], 0 ] );\n\t\t\t\tsorting[sorting.length-1]._idx = 0;\n\t\t\t}\n\t\t}\n\t\telse if ( sorting.length && sorting[0][0] == colIdx ) {\n\t\t\t// Single column - already sorting on this column, modify the sort\n\t\t\tnextSortIdx = next( sorting[0] );\n\t\n\t\t\tsorting.length = 1;\n\t\t\tsorting[0][1] = asSorting[ nextSortIdx ];\n\t\t\tsorting[0]._idx = nextSortIdx;\n\t\t}\n\t\telse {\n\t\t\t// Single column - sort only on this column\n\t\t\tsorting.length = 0;\n\t\t\tsorting.push( [ colIdx, asSorting[0] ] );\n\t\t\tsorting[0]._idx = 0;\n\t\t}\n\t\n\t\t// Run the sort by calling a full redraw\n\t\t_fnReDraw( settings );\n\t\n\t\t// callback used for async user interaction\n\t\tif ( typeof callback == 'function' ) {\n\t\t\tcallback( settings );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Attach a sort handler (click) to a node\n\t *  @param {object} settings dataTables settings object\n\t *  @param {node} attachTo node to attach the handler to\n\t *  @param {int} colIdx column sorting index\n\t *  @param {function} [callback] callback function\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSortAttachListener ( settings, attachTo, colIdx, callback )\n\t{\n\t\tvar col = settings.aoColumns[ colIdx ];\n\t\n\t\t_fnBindAction( attachTo, {}, function (e) {\n\t\t\t/* If the column is not sortable - don't to anything */\n\t\t\tif ( col.bSortable === false ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// If processing is enabled use a timeout to allow the processing\n\t\t\t// display to be shown - otherwise to it synchronously\n\t\t\tif ( settings.oFeatures.bProcessing ) {\n\t\t\t\t_fnProcessingDisplay( settings, true );\n\t\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t_fnSortListener( settings, colIdx, e.shiftKey, callback );\n\t\n\t\t\t\t\t// In server-side processing, the draw callback will remove the\n\t\t\t\t\t// processing display\n\t\t\t\t\tif ( _fnDataSource( settings ) !== 'ssp' ) {\n\t\t\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t\t\t}\n\t\t\t\t}, 0 );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_fnSortListener( settings, colIdx, e.shiftKey, callback );\n\t\t\t}\n\t\t} );\n\t}\n\t\n\t\n\t/**\n\t * Set the sorting classes on table's body, Note: it is safe to call this function\n\t * when bSort and bSortClasses are false\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSortingClasses( settings )\n\t{\n\t\tvar oldSort = settings.aLastSort;\n\t\tvar sortClass = settings.oClasses.sSortColumn;\n\t\tvar sort = _fnSortFlatten( settings );\n\t\tvar features = settings.oFeatures;\n\t\tvar i, ien, colIdx;\n\t\n\t\tif ( features.bSort && features.bSortClasses ) {\n\t\t\t// Remove old sorting classes\n\t\t\tfor ( i=0, ien=oldSort.length ; i<ien ; i++ ) {\n\t\t\t\tcolIdx = oldSort[i].src;\n\t\n\t\t\t\t// Remove column sorting\n\t\t\t\t$( _pluck( settings.aoData, 'anCells', colIdx ) )\n\t\t\t\t\t.removeClass( sortClass + (i<2 ? i+1 : 3) );\n\t\t\t}\n\t\n\t\t\t// Add new column sorting\n\t\t\tfor ( i=0, ien=sort.length ; i<ien ; i++ ) {\n\t\t\t\tcolIdx = sort[i].src;\n\t\n\t\t\t\t$( _pluck( settings.aoData, 'anCells', colIdx ) )\n\t\t\t\t\t.addClass( sortClass + (i<2 ? i+1 : 3) );\n\t\t\t}\n\t\t}\n\t\n\t\tsettings.aLastSort = sort;\n\t}\n\t\n\t\n\t// Get the data to sort a column, be it from cache, fresh (populating the\n\t// cache), or from a sort formatter\n\tfunction _fnSortData( settings, idx )\n\t{\n\t\t// Custom sorting function - provided by the sort data type\n\t\tvar column = settings.aoColumns[ idx ];\n\t\tvar customSort = DataTable.ext.order[ column.sSortDataType ];\n\t\tvar customData;\n\t\n\t\tif ( customSort ) {\n\t\t\tcustomData = customSort.call( settings.oInstance, settings, idx,\n\t\t\t\t_fnColumnIndexToVisible( settings, idx )\n\t\t\t);\n\t\t}\n\t\n\t\t// Use / populate cache\n\t\tvar row, cellData;\n\t\tvar formatter = DataTable.ext.type.order[ column.sType+\"-pre\" ];\n\t\n\t\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\trow = settings.aoData[i];\n\t\n\t\t\tif ( ! row._aSortData ) {\n\t\t\t\trow._aSortData = [];\n\t\t\t}\n\t\n\t\t\tif ( ! row._aSortData[idx] || customSort ) {\n\t\t\t\tcellData = customSort ?\n\t\t\t\t\tcustomData[i] : // If there was a custom sort function, use data from there\n\t\t\t\t\t_fnGetCellData( settings, i, idx, 'sort' );\n\t\n\t\t\t\trow._aSortData[ idx ] = formatter ?\n\t\t\t\t\tformatter( cellData ) :\n\t\t\t\t\tcellData;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t\n\t/**\n\t * Save the state of a table\n\t *  @param {object} oSettings dataTables settings object\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSaveState ( settings )\n\t{\n\t\tif ( !settings.oFeatures.bStateSave || settings.bDestroying )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\n\t\t/* Store the interesting variables */\n\t\tvar state = {\n\t\t\ttime:    +new Date(),\n\t\t\tstart:   settings._iDisplayStart,\n\t\t\tlength:  settings._iDisplayLength,\n\t\t\torder:   $.extend( true, [], settings.aaSorting ),\n\t\t\tsearch:  _fnSearchToCamel( settings.oPreviousSearch ),\n\t\t\tcolumns: $.map( settings.aoColumns, function ( col, i ) {\n\t\t\t\treturn {\n\t\t\t\t\tvisible: col.bVisible,\n\t\t\t\t\tsearch: _fnSearchToCamel( settings.aoPreSearchCols[i] )\n\t\t\t\t};\n\t\t\t} )\n\t\t};\n\t\n\t\t_fnCallbackFire( settings, \"aoStateSaveParams\", 'stateSaveParams', [settings, state] );\n\t\n\t\tsettings.oSavedState = state;\n\t\tsettings.fnStateSaveCallback.call( settings.oInstance, settings, state );\n\t}\n\t\n\t\n\t/**\n\t * Attempt to load a saved table state\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {object} oInit DataTables init object so we can override settings\n\t *  @param {function} callback Callback to execute when the state has been loaded\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnLoadState ( settings, oInit, callback )\n\t{\n\t\tvar i, ien;\n\t\tvar columns = settings.aoColumns;\n\t\tvar loaded = function ( s ) {\n\t\t\tif ( ! s || ! s.time ) {\n\t\t\t\tcallback();\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// Allow custom and plug-in manipulation functions to alter the saved data set and\n\t\t\t// cancelling of loading by returning false\n\t\t\tvar abStateLoad = _fnCallbackFire( settings, 'aoStateLoadParams', 'stateLoadParams', [settings, s] );\n\t\t\tif ( $.inArray( false, abStateLoad ) !== -1 ) {\n\t\t\t\tcallback();\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// Reject old data\n\t\t\tvar duration = settings.iStateDuration;\n\t\t\tif ( duration > 0 && s.time < +new Date() - (duration*1000) ) {\n\t\t\t\tcallback();\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// Number of columns have changed - all bets are off, no restore of settings\n\t\t\tif ( s.columns && columns.length !== s.columns.length ) {\n\t\t\t\tcallback();\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// Store the saved state so it might be accessed at any time\n\t\t\tsettings.oLoadedState = $.extend( true, {}, s );\n\t\n\t\t\t// Restore key features - todo - for 1.11 this needs to be done by\n\t\t\t// subscribed events\n\t\t\tif ( s.start !== undefined ) {\n\t\t\t\tsettings._iDisplayStart    = s.start;\n\t\t\t\tsettings.iInitDisplayStart = s.start;\n\t\t\t}\n\t\t\tif ( s.length !== undefined ) {\n\t\t\t\tsettings._iDisplayLength   = s.length;\n\t\t\t}\n\t\n\t\t\t// Order\n\t\t\tif ( s.order !== undefined ) {\n\t\t\t\tsettings.aaSorting = [];\n\t\t\t\t$.each( s.order, function ( i, col ) {\n\t\t\t\t\tsettings.aaSorting.push( col[0] >= columns.length ?\n\t\t\t\t\t\t[ 0, col[1] ] :\n\t\t\t\t\t\tcol\n\t\t\t\t\t);\n\t\t\t\t} );\n\t\t\t}\n\t\n\t\t\t// Search\n\t\t\tif ( s.search !== undefined ) {\n\t\t\t\t$.extend( settings.oPreviousSearch, _fnSearchToHung( s.search ) );\n\t\t\t}\n\t\n\t\t\t// Columns\n\t\t\t//\n\t\t\tif ( s.columns ) {\n\t\t\t\tfor ( i=0, ien=s.columns.length ; i<ien ; i++ ) {\n\t\t\t\t\tvar col = s.columns[i];\n\t\n\t\t\t\t\t// Visibility\n\t\t\t\t\tif ( col.visible !== undefined ) {\n\t\t\t\t\t\tcolumns[i].bVisible = col.visible;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Search\n\t\t\t\t\tif ( col.search !== undefined ) {\n\t\t\t\t\t\t$.extend( settings.aoPreSearchCols[i], _fnSearchToHung( col.search ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t_fnCallbackFire( settings, 'aoStateLoaded', 'stateLoaded', [settings, s] );\n\t\t\tcallback();\n\t\t}\n\t\n\t\tif ( ! settings.oFeatures.bStateSave ) {\n\t\t\tcallback();\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar state = settings.fnStateLoadCallback.call( settings.oInstance, settings, loaded );\n\t\n\t\tif ( state !== undefined ) {\n\t\t\tloaded( state );\n\t\t}\n\t\t// otherwise, wait for the loaded callback to be executed\n\t}\n\t\n\t\n\t/**\n\t * Return the settings object for a particular table\n\t *  @param {node} table table we are using as a dataTable\n\t *  @returns {object} Settings object - or null if not found\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnSettingsFromNode ( table )\n\t{\n\t\tvar settings = DataTable.settings;\n\t\tvar idx = $.inArray( table, _pluck( settings, 'nTable' ) );\n\t\n\t\treturn idx !== -1 ?\n\t\t\tsettings[ idx ] :\n\t\t\tnull;\n\t}\n\t\n\t\n\t/**\n\t * Log an error message\n\t *  @param {object} settings dataTables settings object\n\t *  @param {int} level log error messages, or display them to the user\n\t *  @param {string} msg error message\n\t *  @param {int} tn Technical note id to get more information about the error.\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnLog( settings, level, msg, tn )\n\t{\n\t\tmsg = 'DataTables warning: '+\n\t\t\t(settings ? 'table id='+settings.sTableId+' - ' : '')+msg;\n\t\n\t\tif ( tn ) {\n\t\t\tmsg += '. For more information about this error, please see '+\n\t\t\t'http://datatables.net/tn/'+tn;\n\t\t}\n\t\n\t\tif ( ! level  ) {\n\t\t\t// Backwards compatibility pre 1.10\n\t\t\tvar ext = DataTable.ext;\n\t\t\tvar type = ext.sErrMode || ext.errMode;\n\t\n\t\t\tif ( settings ) {\n\t\t\t\t_fnCallbackFire( settings, null, 'error', [ settings, tn, msg ] );\n\t\t\t}\n\t\n\t\t\tif ( type == 'alert' ) {\n\t\t\t\talert( msg );\n\t\t\t}\n\t\t\telse if ( type == 'throw' ) {\n\t\t\t\tthrow new Error(msg);\n\t\t\t}\n\t\t\telse if ( typeof type == 'function' ) {\n\t\t\t\ttype( settings, tn, msg );\n\t\t\t}\n\t\t}\n\t\telse if ( window.console && console.log ) {\n\t\t\tconsole.log( msg );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * See if a property is defined on one object, if so assign it to the other object\n\t *  @param {object} ret target object\n\t *  @param {object} src source object\n\t *  @param {string} name property\n\t *  @param {string} [mappedName] name to map too - optional, name used if not given\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnMap( ret, src, name, mappedName )\n\t{\n\t\tif ( $.isArray( name ) ) {\n\t\t\t$.each( name, function (i, val) {\n\t\t\t\tif ( $.isArray( val ) ) {\n\t\t\t\t\t_fnMap( ret, src, val[0], val[1] );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t_fnMap( ret, src, val );\n\t\t\t\t}\n\t\t\t} );\n\t\n\t\t\treturn;\n\t\t}\n\t\n\t\tif ( mappedName === undefined ) {\n\t\t\tmappedName = name;\n\t\t}\n\t\n\t\tif ( src[name] !== undefined ) {\n\t\t\tret[mappedName] = src[name];\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Extend objects - very similar to jQuery.extend, but deep copy objects, and\n\t * shallow copy arrays. The reason we need to do this, is that we don't want to\n\t * deep copy array init values (such as aaSorting) since the dev wouldn't be\n\t * able to override them, but we do want to deep copy arrays.\n\t *  @param {object} out Object to extend\n\t *  @param {object} extender Object from which the properties will be applied to\n\t *      out\n\t *  @param {boolean} breakRefs If true, then arrays will be sliced to take an\n\t *      independent copy with the exception of the `data` or `aaData` parameters\n\t *      if they are present. This is so you can pass in a collection to\n\t *      DataTables and have that used as your data source without breaking the\n\t *      references\n\t *  @returns {object} out Reference, just for convenience - out === the return.\n\t *  @memberof DataTable#oApi\n\t *  @todo This doesn't take account of arrays inside the deep copied objects.\n\t */\n\tfunction _fnExtend( out, extender, breakRefs )\n\t{\n\t\tvar val;\n\t\n\t\tfor ( var prop in extender ) {\n\t\t\tif ( extender.hasOwnProperty(prop) ) {\n\t\t\t\tval = extender[prop];\n\t\n\t\t\t\tif ( $.isPlainObject( val ) ) {\n\t\t\t\t\tif ( ! $.isPlainObject( out[prop] ) ) {\n\t\t\t\t\t\tout[prop] = {};\n\t\t\t\t\t}\n\t\t\t\t\t$.extend( true, out[prop], val );\n\t\t\t\t}\n\t\t\t\telse if ( breakRefs && prop !== 'data' && prop !== 'aaData' && $.isArray(val) ) {\n\t\t\t\t\tout[prop] = val.slice();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tout[prop] = val;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\treturn out;\n\t}\n\t\n\t\n\t/**\n\t * Bind an event handers to allow a click or return key to activate the callback.\n\t * This is good for accessibility since a return on the keyboard will have the\n\t * same effect as a click, if the element has focus.\n\t *  @param {element} n Element to bind the action to\n\t *  @param {object} oData Data object to pass to the triggered function\n\t *  @param {function} fn Callback function for when the event is triggered\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnBindAction( n, oData, fn )\n\t{\n\t\t$(n)\n\t\t\t.on( 'click.DT', oData, function (e) {\n\t\t\t\t\tn.blur(); // Remove focus outline for mouse users\n\t\t\t\t\tfn(e);\n\t\t\t\t} )\n\t\t\t.on( 'keypress.DT', oData, function (e){\n\t\t\t\t\tif ( e.which === 13 ) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tfn(e);\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t\t.on( 'selectstart.DT', function () {\n\t\t\t\t\t/* Take the brutal approach to cancelling text selection */\n\t\t\t\t\treturn false;\n\t\t\t\t} );\n\t}\n\t\n\t\n\t/**\n\t * Register a callback function. Easily allows a callback function to be added to\n\t * an array store of callback functions that can then all be called together.\n\t *  @param {object} oSettings dataTables settings object\n\t *  @param {string} sStore Name of the array storage for the callbacks in oSettings\n\t *  @param {function} fn Function to be called back\n\t *  @param {string} sName Identifying name for the callback (i.e. a label)\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCallbackReg( oSettings, sStore, fn, sName )\n\t{\n\t\tif ( fn )\n\t\t{\n\t\t\toSettings[sStore].push( {\n\t\t\t\t\"fn\": fn,\n\t\t\t\t\"sName\": sName\n\t\t\t} );\n\t\t}\n\t}\n\t\n\t\n\t/**\n\t * Fire callback functions and trigger events. Note that the loop over the\n\t * callback array store is done backwards! Further note that you do not want to\n\t * fire off triggers in time sensitive applications (for example cell creation)\n\t * as its slow.\n\t *  @param {object} settings dataTables settings object\n\t *  @param {string} callbackArr Name of the array storage for the callbacks in\n\t *      oSettings\n\t *  @param {string} eventName Name of the jQuery custom event to trigger. If\n\t *      null no trigger is fired\n\t *  @param {array} args Array of arguments to pass to the callback function /\n\t *      trigger\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnCallbackFire( settings, callbackArr, eventName, args )\n\t{\n\t\tvar ret = [];\n\t\n\t\tif ( callbackArr ) {\n\t\t\tret = $.map( settings[callbackArr].slice().reverse(), function (val, i) {\n\t\t\t\treturn val.fn.apply( settings.oInstance, args );\n\t\t\t} );\n\t\t}\n\t\n\t\tif ( eventName !== null ) {\n\t\t\tvar e = $.Event( eventName+'.dt' );\n\t\n\t\t\t$(settings.nTable).trigger( e, args );\n\t\n\t\t\tret.push( e.result );\n\t\t}\n\t\n\t\treturn ret;\n\t}\n\t\n\t\n\tfunction _fnLengthOverflow ( settings )\n\t{\n\t\tvar\n\t\t\tstart = settings._iDisplayStart,\n\t\t\tend = settings.fnDisplayEnd(),\n\t\t\tlen = settings._iDisplayLength;\n\t\n\t\t/* If we have space to show extra rows (backing up from the end point - then do so */\n\t\tif ( start >= end )\n\t\t{\n\t\t\tstart = end - len;\n\t\t}\n\t\n\t\t// Keep the start record on the current page\n\t\tstart -= (start % len);\n\t\n\t\tif ( len === -1 || start < 0 )\n\t\t{\n\t\t\tstart = 0;\n\t\t}\n\t\n\t\tsettings._iDisplayStart = start;\n\t}\n\t\n\t\n\tfunction _fnRenderer( settings, type )\n\t{\n\t\tvar renderer = settings.renderer;\n\t\tvar host = DataTable.ext.renderer[type];\n\t\n\t\tif ( $.isPlainObject( renderer ) && renderer[type] ) {\n\t\t\t// Specific renderer for this type. If available use it, otherwise use\n\t\t\t// the default.\n\t\t\treturn host[renderer[type]] || host._;\n\t\t}\n\t\telse if ( typeof renderer === 'string' ) {\n\t\t\t// Common renderer - if there is one available for this type use it,\n\t\t\t// otherwise use the default\n\t\t\treturn host[renderer] || host._;\n\t\t}\n\t\n\t\t// Use the default\n\t\treturn host._;\n\t}\n\t\n\t\n\t/**\n\t * Detect the data source being used for the table. Used to simplify the code\n\t * a little (ajax) and to make it compress a little smaller.\n\t *\n\t *  @param {object} settings dataTables settings object\n\t *  @returns {string} Data source\n\t *  @memberof DataTable#oApi\n\t */\n\tfunction _fnDataSource ( settings )\n\t{\n\t\tif ( settings.oFeatures.bServerSide ) {\n\t\t\treturn 'ssp';\n\t\t}\n\t\telse if ( settings.ajax || settings.sAjaxSource ) {\n\t\t\treturn 'ajax';\n\t\t}\n\t\treturn 'dom';\n\t}\n\t\n\n\t\n\t\n\t/**\n\t * Computed structure of the DataTables API, defined by the options passed to\n\t * `DataTable.Api.register()` when building the API.\n\t *\n\t * The structure is built in order to speed creation and extension of the Api\n\t * objects since the extensions are effectively pre-parsed.\n\t *\n\t * The array is an array of objects with the following structure, where this\n\t * base array represents the Api prototype base:\n\t *\n\t *     [\n\t *       {\n\t *         name:      'data'                -- string   - Property name\n\t *         val:       function () {},       -- function - Api method (or undefined if just an object\n\t *         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result\n\t *         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property\n\t *       },\n\t *       {\n\t *         name:     'row'\n\t *         val:       {},\n\t *         methodExt: [ ... ],\n\t *         propExt:   [\n\t *           {\n\t *             name:      'data'\n\t *             val:       function () {},\n\t *             methodExt: [ ... ],\n\t *             propExt:   [ ... ]\n\t *           },\n\t *           ...\n\t *         ]\n\t *       }\n\t *     ]\n\t *\n\t * @type {Array}\n\t * @ignore\n\t */\n\tvar __apiStruct = [];\n\t\n\t\n\t/**\n\t * `Array.prototype` reference.\n\t *\n\t * @type object\n\t * @ignore\n\t */\n\tvar __arrayProto = Array.prototype;\n\t\n\t\n\t/**\n\t * Abstraction for `context` parameter of the `Api` constructor to allow it to\n\t * take several different forms for ease of use.\n\t *\n\t * Each of the input parameter types will be converted to a DataTables settings\n\t * object where possible.\n\t *\n\t * @param  {string|node|jQuery|object} mixed DataTable identifier. Can be one\n\t *   of:\n\t *\n\t *   * `string` - jQuery selector. Any DataTables' matching the given selector\n\t *     with be found and used.\n\t *   * `node` - `TABLE` node which has already been formed into a DataTable.\n\t *   * `jQuery` - A jQuery object of `TABLE` nodes.\n\t *   * `object` - DataTables settings object\n\t *   * `DataTables.Api` - API instance\n\t * @return {array|null} Matching DataTables settings objects. `null` or\n\t *   `undefined` is returned if no matching DataTable is found.\n\t * @ignore\n\t */\n\tvar _toSettings = function ( mixed )\n\t{\n\t\tvar idx, jq;\n\t\tvar settings = DataTable.settings;\n\t\tvar tables = $.map( settings, function (el, i) {\n\t\t\treturn el.nTable;\n\t\t} );\n\t\n\t\tif ( ! mixed ) {\n\t\t\treturn [];\n\t\t}\n\t\telse if ( mixed.nTable && mixed.oApi ) {\n\t\t\t// DataTables settings object\n\t\t\treturn [ mixed ];\n\t\t}\n\t\telse if ( mixed.nodeName && mixed.nodeName.toLowerCase() === 'table' ) {\n\t\t\t// Table node\n\t\t\tidx = $.inArray( mixed, tables );\n\t\t\treturn idx !== -1 ? [ settings[idx] ] : null;\n\t\t}\n\t\telse if ( mixed && typeof mixed.settings === 'function' ) {\n\t\t\treturn mixed.settings().toArray();\n\t\t}\n\t\telse if ( typeof mixed === 'string' ) {\n\t\t\t// jQuery selector\n\t\t\tjq = $(mixed);\n\t\t}\n\t\telse if ( mixed instanceof $ ) {\n\t\t\t// jQuery object (also DataTables instance)\n\t\t\tjq = mixed;\n\t\t}\n\t\n\t\tif ( jq ) {\n\t\t\treturn jq.map( function(i) {\n\t\t\t\tidx = $.inArray( this, tables );\n\t\t\t\treturn idx !== -1 ? settings[idx] : null;\n\t\t\t} ).toArray();\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * DataTables API class - used to control and interface with  one or more\n\t * DataTables enhanced tables.\n\t *\n\t * The API class is heavily based on jQuery, presenting a chainable interface\n\t * that you can use to interact with tables. Each instance of the API class has\n\t * a \"context\" - i.e. the tables that it will operate on. This could be a single\n\t * table, all tables on a page or a sub-set thereof.\n\t *\n\t * Additionally the API is designed to allow you to easily work with the data in\n\t * the tables, retrieving and manipulating it as required. This is done by\n\t * presenting the API class as an array like interface. The contents of the\n\t * array depend upon the actions requested by each method (for example\n\t * `rows().nodes()` will return an array of nodes, while `rows().data()` will\n\t * return an array of objects or arrays depending upon your table's\n\t * configuration). The API object has a number of array like methods (`push`,\n\t * `pop`, `reverse` etc) as well as additional helper methods (`each`, `pluck`,\n\t * `unique` etc) to assist your working with the data held in a table.\n\t *\n\t * Most methods (those which return an Api instance) are chainable, which means\n\t * the return from a method call also has all of the methods available that the\n\t * top level object had. For example, these two calls are equivalent:\n\t *\n\t *     // Not chained\n\t *     api.row.add( {...} );\n\t *     api.draw();\n\t *\n\t *     // Chained\n\t *     api.row.add( {...} ).draw();\n\t *\n\t * @class DataTable.Api\n\t * @param {array|object|string|jQuery} context DataTable identifier. This is\n\t *   used to define which DataTables enhanced tables this API will operate on.\n\t *   Can be one of:\n\t *\n\t *   * `string` - jQuery selector. Any DataTables' matching the given selector\n\t *     with be found and used.\n\t *   * `node` - `TABLE` node which has already been formed into a DataTable.\n\t *   * `jQuery` - A jQuery object of `TABLE` nodes.\n\t *   * `object` - DataTables settings object\n\t * @param {array} [data] Data to initialise the Api instance with.\n\t *\n\t * @example\n\t *   // Direct initialisation during DataTables construction\n\t *   var api = $('#example').DataTable();\n\t *\n\t * @example\n\t *   // Initialisation using a DataTables jQuery object\n\t *   var api = $('#example').dataTable().api();\n\t *\n\t * @example\n\t *   // Initialisation as a constructor\n\t *   var api = new $.fn.DataTable.Api( 'table.dataTable' );\n\t */\n\t_Api = function ( context, data )\n\t{\n\t\tif ( ! (this instanceof _Api) ) {\n\t\t\treturn new _Api( context, data );\n\t\t}\n\t\n\t\tvar settings = [];\n\t\tvar ctxSettings = function ( o ) {\n\t\t\tvar a = _toSettings( o );\n\t\t\tif ( a ) {\n\t\t\t\tsettings = settings.concat( a );\n\t\t\t}\n\t\t};\n\t\n\t\tif ( $.isArray( context ) ) {\n\t\t\tfor ( var i=0, ien=context.length ; i<ien ; i++ ) {\n\t\t\t\tctxSettings( context[i] );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tctxSettings( context );\n\t\t}\n\t\n\t\t// Remove duplicates\n\t\tthis.context = _unique( settings );\n\t\n\t\t// Initial data\n\t\tif ( data ) {\n\t\t\t$.merge( this, data );\n\t\t}\n\t\n\t\t// selector\n\t\tthis.selector = {\n\t\t\trows: null,\n\t\t\tcols: null,\n\t\t\topts: null\n\t\t};\n\t\n\t\t_Api.extend( this, this, __apiStruct );\n\t};\n\t\n\tDataTable.Api = _Api;\n\t\n\t// Don't destroy the existing prototype, just extend it. Required for jQuery 2's\n\t// isPlainObject.\n\t$.extend( _Api.prototype, {\n\t\tany: function ()\n\t\t{\n\t\t\treturn this.count() !== 0;\n\t\t},\n\t\n\t\n\t\tconcat:  __arrayProto.concat,\n\t\n\t\n\t\tcontext: [], // array of table settings objects\n\t\n\t\n\t\tcount: function ()\n\t\t{\n\t\t\treturn this.flatten().length;\n\t\t},\n\t\n\t\n\t\teach: function ( fn )\n\t\t{\n\t\t\tfor ( var i=0, ien=this.length ; i<ien; i++ ) {\n\t\t\t\tfn.call( this, this[i], i, this );\n\t\t\t}\n\t\n\t\t\treturn this;\n\t\t},\n\t\n\t\n\t\teq: function ( idx )\n\t\t{\n\t\t\tvar ctx = this.context;\n\t\n\t\t\treturn ctx.length > idx ?\n\t\t\t\tnew _Api( ctx[idx], this[idx] ) :\n\t\t\t\tnull;\n\t\t},\n\t\n\t\n\t\tfilter: function ( fn )\n\t\t{\n\t\t\tvar a = [];\n\t\n\t\t\tif ( __arrayProto.filter ) {\n\t\t\t\ta = __arrayProto.filter.call( this, fn, this );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Compatibility for browsers without EMCA-252-5 (JS 1.6)\n\t\t\t\tfor ( var i=0, ien=this.length ; i<ien ; i++ ) {\n\t\t\t\t\tif ( fn.call( this, this[i], i, this ) ) {\n\t\t\t\t\t\ta.push( this[i] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn new _Api( this.context, a );\n\t\t},\n\t\n\t\n\t\tflatten: function ()\n\t\t{\n\t\t\tvar a = [];\n\t\t\treturn new _Api( this.context, a.concat.apply( a, this.toArray() ) );\n\t\t},\n\t\n\t\n\t\tjoin:    __arrayProto.join,\n\t\n\t\n\t\tindexOf: __arrayProto.indexOf || function (obj, start)\n\t\t{\n\t\t\tfor ( var i=(start || 0), ien=this.length ; i<ien ; i++ ) {\n\t\t\t\tif ( this[i] === obj ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1;\n\t\t},\n\t\n\t\titerator: function ( flatten, type, fn, alwaysNew ) {\n\t\t\tvar\n\t\t\t\ta = [], ret,\n\t\t\t\ti, ien, j, jen,\n\t\t\t\tcontext = this.context,\n\t\t\t\trows, items, item,\n\t\t\t\tselector = this.selector;\n\t\n\t\t\t// Argument shifting\n\t\t\tif ( typeof flatten === 'string' ) {\n\t\t\t\talwaysNew = fn;\n\t\t\t\tfn = type;\n\t\t\t\ttype = flatten;\n\t\t\t\tflatten = false;\n\t\t\t}\n\t\n\t\t\tfor ( i=0, ien=context.length ; i<ien ; i++ ) {\n\t\t\t\tvar apiInst = new _Api( context[i] );\n\t\n\t\t\t\tif ( type === 'table' ) {\n\t\t\t\t\tret = fn.call( apiInst, context[i], i );\n\t\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\ta.push( ret );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ( type === 'columns' || type === 'rows' ) {\n\t\t\t\t\t// this has same length as context - one entry for each table\n\t\t\t\t\tret = fn.call( apiInst, context[i], this[i], i );\n\t\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\ta.push( ret );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ( type === 'column' || type === 'column-rows' || type === 'row' || type === 'cell' ) {\n\t\t\t\t\t// columns and rows share the same structure.\n\t\t\t\t\t// 'this' is an array of column indexes for each context\n\t\t\t\t\titems = this[i];\n\t\n\t\t\t\t\tif ( type === 'column-rows' ) {\n\t\t\t\t\t\trows = _selector_row_indexes( context[i], selector.opts );\n\t\t\t\t\t}\n\t\n\t\t\t\t\tfor ( j=0, jen=items.length ; j<jen ; j++ ) {\n\t\t\t\t\t\titem = items[j];\n\t\n\t\t\t\t\t\tif ( type === 'cell' ) {\n\t\t\t\t\t\t\tret = fn.call( apiInst, context[i], item.row, item.column, i, j );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tret = fn.call( apiInst, context[i], item, i, j, rows );\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\t\ta.push( ret );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tif ( a.length || alwaysNew ) {\n\t\t\t\tvar api = new _Api( context, flatten ? a.concat.apply( [], a ) : a );\n\t\t\t\tvar apiSelector = api.selector;\n\t\t\t\tapiSelector.rows = selector.rows;\n\t\t\t\tapiSelector.cols = selector.cols;\n\t\t\t\tapiSelector.opts = selector.opts;\n\t\t\t\treturn api;\n\t\t\t}\n\t\t\treturn this;\n\t\t},\n\t\n\t\n\t\tlastIndexOf: __arrayProto.lastIndexOf || function (obj, start)\n\t\t{\n\t\t\t// Bit cheeky...\n\t\t\treturn this.indexOf.apply( this.toArray.reverse(), arguments );\n\t\t},\n\t\n\t\n\t\tlength:  0,\n\t\n\t\n\t\tmap: function ( fn )\n\t\t{\n\t\t\tvar a = [];\n\t\n\t\t\tif ( __arrayProto.map ) {\n\t\t\t\ta = __arrayProto.map.call( this, fn, this );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Compatibility for browsers without EMCA-252-5 (JS 1.6)\n\t\t\t\tfor ( var i=0, ien=this.length ; i<ien ; i++ ) {\n\t\t\t\t\ta.push( fn.call( this, this[i], i ) );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn new _Api( this.context, a );\n\t\t},\n\t\n\t\n\t\tpluck: function ( prop )\n\t\t{\n\t\t\treturn this.map( function ( el ) {\n\t\t\t\treturn el[ prop ];\n\t\t\t} );\n\t\t},\n\t\n\t\tpop:     __arrayProto.pop,\n\t\n\t\n\t\tpush:    __arrayProto.push,\n\t\n\t\n\t\t// Does not return an API instance\n\t\treduce: __arrayProto.reduce || function ( fn, init )\n\t\t{\n\t\t\treturn _fnReduce( this, fn, init, 0, this.length, 1 );\n\t\t},\n\t\n\t\n\t\treduceRight: __arrayProto.reduceRight || function ( fn, init )\n\t\t{\n\t\t\treturn _fnReduce( this, fn, init, this.length-1, -1, -1 );\n\t\t},\n\t\n\t\n\t\treverse: __arrayProto.reverse,\n\t\n\t\n\t\t// Object with rows, columns and opts\n\t\tselector: null,\n\t\n\t\n\t\tshift:   __arrayProto.shift,\n\t\n\t\n\t\tslice: function () {\n\t\t\treturn new _Api( this.context, this );\n\t\t},\n\t\n\t\n\t\tsort:    __arrayProto.sort, // ? name - order?\n\t\n\t\n\t\tsplice:  __arrayProto.splice,\n\t\n\t\n\t\ttoArray: function ()\n\t\t{\n\t\t\treturn __arrayProto.slice.call( this );\n\t\t},\n\t\n\t\n\t\tto$: function ()\n\t\t{\n\t\t\treturn $( this );\n\t\t},\n\t\n\t\n\t\ttoJQuery: function ()\n\t\t{\n\t\t\treturn $( this );\n\t\t},\n\t\n\t\n\t\tunique: function ()\n\t\t{\n\t\t\treturn new _Api( this.context, _unique(this) );\n\t\t},\n\t\n\t\n\t\tunshift: __arrayProto.unshift\n\t} );\n\t\n\t\n\t_Api.extend = function ( scope, obj, ext )\n\t{\n\t\t// Only extend API instances and static properties of the API\n\t\tif ( ! ext.length || ! obj || ( ! (obj instanceof _Api) && ! obj.__dt_wrapper ) ) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar\n\t\t\ti, ien,\n\t\t\tj, jen,\n\t\t\tstruct, inner,\n\t\t\tmethodScoping = function ( scope, fn, struc ) {\n\t\t\t\treturn function () {\n\t\t\t\t\tvar ret = fn.apply( scope, arguments );\n\t\n\t\t\t\t\t// Method extension\n\t\t\t\t\t_Api.extend( ret, ret, struc.methodExt );\n\t\t\t\t\treturn ret;\n\t\t\t\t};\n\t\t\t};\n\t\n\t\tfor ( i=0, ien=ext.length ; i<ien ; i++ ) {\n\t\t\tstruct = ext[i];\n\t\n\t\t\t// Value\n\t\t\tobj[ struct.name ] = typeof struct.val === 'function' ?\n\t\t\t\tmethodScoping( scope, struct.val, struct ) :\n\t\t\t\t$.isPlainObject( struct.val ) ?\n\t\t\t\t\t{} :\n\t\t\t\t\tstruct.val;\n\t\n\t\t\tobj[ struct.name ].__dt_wrapper = true;\n\t\n\t\t\t// Property extension\n\t\t\t_Api.extend( scope, obj[ struct.name ], struct.propExt );\n\t\t}\n\t};\n\t\n\t\n\t// @todo - Is there need for an augment function?\n\t// _Api.augment = function ( inst, name )\n\t// {\n\t// \t// Find src object in the structure from the name\n\t// \tvar parts = name.split('.');\n\t\n\t// \t_Api.extend( inst, obj );\n\t// };\n\t\n\t\n\t//     [\n\t//       {\n\t//         name:      'data'                -- string   - Property name\n\t//         val:       function () {},       -- function - Api method (or undefined if just an object\n\t//         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result\n\t//         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property\n\t//       },\n\t//       {\n\t//         name:     'row'\n\t//         val:       {},\n\t//         methodExt: [ ... ],\n\t//         propExt:   [\n\t//           {\n\t//             name:      'data'\n\t//             val:       function () {},\n\t//             methodExt: [ ... ],\n\t//             propExt:   [ ... ]\n\t//           },\n\t//           ...\n\t//         ]\n\t//       }\n\t//     ]\n\t\n\t_Api.register = _api_register = function ( name, val )\n\t{\n\t\tif ( $.isArray( name ) ) {\n\t\t\tfor ( var j=0, jen=name.length ; j<jen ; j++ ) {\n\t\t\t\t_Api.register( name[j], val );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar\n\t\t\ti, ien,\n\t\t\their = name.split('.'),\n\t\t\tstruct = __apiStruct,\n\t\t\tkey, method;\n\t\n\t\tvar find = function ( src, name ) {\n\t\t\tfor ( var i=0, ien=src.length ; i<ien ; i++ ) {\n\t\t\t\tif ( src[i].name === name ) {\n\t\t\t\t\treturn src[i];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t};\n\t\n\t\tfor ( i=0, ien=heir.length ; i<ien ; i++ ) {\n\t\t\tmethod = heir[i].indexOf('()') !== -1;\n\t\t\tkey = method ?\n\t\t\t\their[i].replace('()', '') :\n\t\t\t\their[i];\n\t\n\t\t\tvar src = find( struct, key );\n\t\t\tif ( ! src ) {\n\t\t\t\tsrc = {\n\t\t\t\t\tname:      key,\n\t\t\t\t\tval:       {},\n\t\t\t\t\tmethodExt: [],\n\t\t\t\t\tpropExt:   []\n\t\t\t\t};\n\t\t\t\tstruct.push( src );\n\t\t\t}\n\t\n\t\t\tif ( i === ien-1 ) {\n\t\t\t\tsrc.val = val;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tstruct = method ?\n\t\t\t\t\tsrc.methodExt :\n\t\t\t\t\tsrc.propExt;\n\t\t\t}\n\t\t}\n\t};\n\t\n\t\n\t_Api.registerPlural = _api_registerPlural = function ( pluralName, singularName, val ) {\n\t\t_Api.register( pluralName, val );\n\t\n\t\t_Api.register( singularName, function () {\n\t\t\tvar ret = val.apply( this, arguments );\n\t\n\t\t\tif ( ret === this ) {\n\t\t\t\t// Returned item is the API instance that was passed in, return it\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\telse if ( ret instanceof _Api ) {\n\t\t\t\t// New API instance returned, want the value from the first item\n\t\t\t\t// in the returned array for the singular result.\n\t\t\t\treturn ret.length ?\n\t\t\t\t\t$.isArray( ret[0] ) ?\n\t\t\t\t\t\tnew _Api( ret.context, ret[0] ) : // Array results are 'enhanced'\n\t\t\t\t\t\tret[0] :\n\t\t\t\t\tundefined;\n\t\t\t}\n\t\n\t\t\t// Non-API return - just fire it back\n\t\t\treturn ret;\n\t\t} );\n\t};\n\t\n\t\n\t/**\n\t * Selector for HTML tables. Apply the given selector to the give array of\n\t * DataTables settings objects.\n\t *\n\t * @param {string|integer} [selector] jQuery selector string or integer\n\t * @param  {array} Array of DataTables settings objects to be filtered\n\t * @return {array}\n\t * @ignore\n\t */\n\tvar __table_selector = function ( selector, a )\n\t{\n\t\t// Integer is used to pick out a table by index\n\t\tif ( typeof selector === 'number' ) {\n\t\t\treturn [ a[ selector ] ];\n\t\t}\n\t\n\t\t// Perform a jQuery selector on the table nodes\n\t\tvar nodes = $.map( a, function (el, i) {\n\t\t\treturn el.nTable;\n\t\t} );\n\t\n\t\treturn $(nodes)\n\t\t\t.filter( selector )\n\t\t\t.map( function (i) {\n\t\t\t\t// Need to translate back from the table node to the settings\n\t\t\t\tvar idx = $.inArray( this, nodes );\n\t\t\t\treturn a[ idx ];\n\t\t\t} )\n\t\t\t.toArray();\n\t};\n\t\n\t\n\t\n\t/**\n\t * Context selector for the API's context (i.e. the tables the API instance\n\t * refers to.\n\t *\n\t * @name    DataTable.Api#tables\n\t * @param {string|integer} [selector] Selector to pick which tables the iterator\n\t *   should operate on. If not given, all tables in the current context are\n\t *   used. This can be given as a jQuery selector (for example `':gt(0)'`) to\n\t *   select multiple tables or as an integer to select a single table.\n\t * @returns {DataTable.Api} Returns a new API instance if a selector is given.\n\t */\n\t_api_register( 'tables()', function ( selector ) {\n\t\t// A new instance is created if there was a selector specified\n\t\treturn selector ?\n\t\t\tnew _Api( __table_selector( selector, this.context ) ) :\n\t\t\tthis;\n\t} );\n\t\n\t\n\t_api_register( 'table()', function ( selector ) {\n\t\tvar tables = this.tables( selector );\n\t\tvar ctx = tables.context;\n\t\n\t\t// Truncate to the first matched table\n\t\treturn ctx.length ?\n\t\t\tnew _Api( ctx[0] ) :\n\t\t\ttables;\n\t} );\n\t\n\t\n\t_api_registerPlural( 'tables().nodes()', 'table().node()' , function () {\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\treturn ctx.nTable;\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'tables().body()', 'table().body()' , function () {\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\treturn ctx.nTBody;\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'tables().header()', 'table().header()' , function () {\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\treturn ctx.nTHead;\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'tables().footer()', 'table().footer()' , function () {\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\treturn ctx.nTFoot;\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'tables().containers()', 'table().container()' , function () {\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\treturn ctx.nTableWrapper;\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t\n\t/**\n\t * Redraw the tables in the current context.\n\t */\n\t_api_register( 'draw()', function ( paging ) {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tif ( paging === 'page' ) {\n\t\t\t\t_fnDraw( settings );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif ( typeof paging === 'string' ) {\n\t\t\t\t\tpaging = paging === 'full-hold' ?\n\t\t\t\t\t\tfalse :\n\t\t\t\t\t\ttrue;\n\t\t\t\t}\n\t\n\t\t\t\t_fnReDraw( settings, paging===false );\n\t\t\t}\n\t\t} );\n\t} );\n\t\n\t\n\t\n\t/**\n\t * Get the current page index.\n\t *\n\t * @return {integer} Current page index (zero based)\n\t *//**\n\t * Set the current page.\n\t *\n\t * Note that if you attempt to show a page which does not exist, DataTables will\n\t * not throw an error, but rather reset the paging.\n\t *\n\t * @param {integer|string} action The paging action to take. This can be one of:\n\t *  * `integer` - The page index to jump to\n\t *  * `string` - An action to take:\n\t *    * `first` - Jump to first page.\n\t *    * `next` - Jump to the next page\n\t *    * `previous` - Jump to previous page\n\t *    * `last` - Jump to the last page.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'page()', function ( action ) {\n\t\tif ( action === undefined ) {\n\t\t\treturn this.page.info().page; // not an expensive call\n\t\t}\n\t\n\t\t// else, have an action to take on all tables\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnPageChange( settings, action );\n\t\t} );\n\t} );\n\t\n\t\n\t/**\n\t * Paging information for the first table in the current context.\n\t *\n\t * If you require paging information for another table, use the `table()` method\n\t * with a suitable selector.\n\t *\n\t * @return {object} Object with the following properties set:\n\t *  * `page` - Current page index (zero based - i.e. the first page is `0`)\n\t *  * `pages` - Total number of pages\n\t *  * `start` - Display index for the first record shown on the current page\n\t *  * `end` - Display index for the last record shown on the current page\n\t *  * `length` - Display length (number of records). Note that generally `start\n\t *    + length = end`, but this is not always true, for example if there are\n\t *    only 2 records to show on the final page, with a length of 10.\n\t *  * `recordsTotal` - Full data set length\n\t *  * `recordsDisplay` - Data set length once the current filtering criterion\n\t *    are applied.\n\t */\n\t_api_register( 'page.info()', function ( action ) {\n\t\tif ( this.context.length === 0 ) {\n\t\t\treturn undefined;\n\t\t}\n\t\n\t\tvar\n\t\t\tsettings   = this.context[0],\n\t\t\tstart      = settings._iDisplayStart,\n\t\t\tlen        = settings.oFeatures.bPaginate ? settings._iDisplayLength : -1,\n\t\t\tvisRecords = settings.fnRecordsDisplay(),\n\t\t\tall        = len === -1;\n\t\n\t\treturn {\n\t\t\t\"page\":           all ? 0 : Math.floor( start / len ),\n\t\t\t\"pages\":          all ? 1 : Math.ceil( visRecords / len ),\n\t\t\t\"start\":          start,\n\t\t\t\"end\":            settings.fnDisplayEnd(),\n\t\t\t\"length\":         len,\n\t\t\t\"recordsTotal\":   settings.fnRecordsTotal(),\n\t\t\t\"recordsDisplay\": visRecords,\n\t\t\t\"serverSide\":     _fnDataSource( settings ) === 'ssp'\n\t\t};\n\t} );\n\t\n\t\n\t/**\n\t * Get the current page length.\n\t *\n\t * @return {integer} Current page length. Note `-1` indicates that all records\n\t *   are to be shown.\n\t *//**\n\t * Set the current page length.\n\t *\n\t * @param {integer} Page length to set. Use `-1` to show all records.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'page.len()', function ( len ) {\n\t\t// Note that we can't call this function 'length()' because `length`\n\t\t// is a Javascript property of functions which defines how many arguments\n\t\t// the function expects.\n\t\tif ( len === undefined ) {\n\t\t\treturn this.context.length !== 0 ?\n\t\t\t\tthis.context[0]._iDisplayLength :\n\t\t\t\tundefined;\n\t\t}\n\t\n\t\t// else, set the page length\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnLengthChange( settings, len );\n\t\t} );\n\t} );\n\t\n\t\n\t\n\tvar __reload = function ( settings, holdPosition, callback ) {\n\t\t// Use the draw event to trigger a callback\n\t\tif ( callback ) {\n\t\t\tvar api = new _Api( settings );\n\t\n\t\t\tapi.one( 'draw', function () {\n\t\t\t\tcallback( api.ajax.json() );\n\t\t\t} );\n\t\t}\n\t\n\t\tif ( _fnDataSource( settings ) == 'ssp' ) {\n\t\t\t_fnReDraw( settings, holdPosition );\n\t\t}\n\t\telse {\n\t\t\t_fnProcessingDisplay( settings, true );\n\t\n\t\t\t// Cancel an existing request\n\t\t\tvar xhr = settings.jqXHR;\n\t\t\tif ( xhr && xhr.readyState !== 4 ) {\n\t\t\t\txhr.abort();\n\t\t\t}\n\t\n\t\t\t// Trigger xhr\n\t\t\t_fnBuildAjax( settings, [], function( json ) {\n\t\t\t\t_fnClearTable( settings );\n\t\n\t\t\t\tvar data = _fnAjaxDataSrc( settings, json );\n\t\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\t\t_fnAddData( settings, data[i] );\n\t\t\t\t}\n\t\n\t\t\t\t_fnReDraw( settings, holdPosition );\n\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t} );\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * Get the JSON response from the last Ajax request that DataTables made to the\n\t * server. Note that this returns the JSON from the first table in the current\n\t * context.\n\t *\n\t * @return {object} JSON received from the server.\n\t */\n\t_api_register( 'ajax.json()', function () {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( ctx.length > 0 ) {\n\t\t\treturn ctx[0].json;\n\t\t}\n\t\n\t\t// else return undefined;\n\t} );\n\t\n\t\n\t/**\n\t * Get the data submitted in the last Ajax request\n\t */\n\t_api_register( 'ajax.params()', function () {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( ctx.length > 0 ) {\n\t\t\treturn ctx[0].oAjaxData;\n\t\t}\n\t\n\t\t// else return undefined;\n\t} );\n\t\n\t\n\t/**\n\t * Reload tables from the Ajax data source. Note that this function will\n\t * automatically re-draw the table when the remote data has been loaded.\n\t *\n\t * @param {boolean} [reset=true] Reset (default) or hold the current paging\n\t *   position. A full re-sort and re-filter is performed when this method is\n\t *   called, which is why the pagination reset is the default action.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'ajax.reload()', function ( callback, resetPaging ) {\n\t\treturn this.iterator( 'table', function (settings) {\n\t\t\t__reload( settings, resetPaging===false, callback );\n\t\t} );\n\t} );\n\t\n\t\n\t/**\n\t * Get the current Ajax URL. Note that this returns the URL from the first\n\t * table in the current context.\n\t *\n\t * @return {string} Current Ajax source URL\n\t *//**\n\t * Set the Ajax URL. Note that this will set the URL for all tables in the\n\t * current context.\n\t *\n\t * @param {string} url URL to set.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'ajax.url()', function ( url ) {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( url === undefined ) {\n\t\t\t// get\n\t\t\tif ( ctx.length === 0 ) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tctx = ctx[0];\n\t\n\t\t\treturn ctx.ajax ?\n\t\t\t\t$.isPlainObject( ctx.ajax ) ?\n\t\t\t\t\tctx.ajax.url :\n\t\t\t\t\tctx.ajax :\n\t\t\t\tctx.sAjaxSource;\n\t\t}\n\t\n\t\t// set\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tif ( $.isPlainObject( settings.ajax ) ) {\n\t\t\t\tsettings.ajax.url = url;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsettings.ajax = url;\n\t\t\t}\n\t\t\t// No need to consider sAjaxSource here since DataTables gives priority\n\t\t\t// to `ajax` over `sAjaxSource`. So setting `ajax` here, renders any\n\t\t\t// value of `sAjaxSource` redundant.\n\t\t} );\n\t} );\n\t\n\t\n\t/**\n\t * Load data from the newly set Ajax URL. Note that this method is only\n\t * available when `ajax.url()` is used to set a URL. Additionally, this method\n\t * has the same effect as calling `ajax.reload()` but is provided for\n\t * convenience when setting a new URL. Like `ajax.reload()` it will\n\t * automatically redraw the table once the remote data has been loaded.\n\t *\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'ajax.url().load()', function ( callback, resetPaging ) {\n\t\t// Same as a reload, but makes sense to present it for easy access after a\n\t\t// url change\n\t\treturn this.iterator( 'table', function ( ctx ) {\n\t\t\t__reload( ctx, resetPaging===false, callback );\n\t\t} );\n\t} );\n\t\n\t\n\t\n\t\n\tvar _selector_run = function ( type, selector, selectFn, settings, opts )\n\t{\n\t\tvar\n\t\t\tout = [], res,\n\t\t\ta, i, ien, j, jen,\n\t\t\tselectorType = typeof selector;\n\t\n\t\t// Can't just check for isArray here, as an API or jQuery instance might be\n\t\t// given with their array like look\n\t\tif ( ! selector || selectorType === 'string' || selectorType === 'function' || selector.length === undefined ) {\n\t\t\tselector = [ selector ];\n\t\t}\n\t\n\t\tfor ( i=0, ien=selector.length ; i<ien ; i++ ) {\n\t\t\t// Only split on simple strings - complex expressions will be jQuery selectors\n\t\t\ta = selector[i] && selector[i].split && ! selector[i].match(/[\\[\\(:]/) ?\n\t\t\t\tselector[i].split(',') :\n\t\t\t\t[ selector[i] ];\n\t\n\t\t\tfor ( j=0, jen=a.length ; j<jen ; j++ ) {\n\t\t\t\tres = selectFn( typeof a[j] === 'string' ? $.trim(a[j]) : a[j] );\n\t\n\t\t\t\tif ( res && res.length ) {\n\t\t\t\t\tout = out.concat( res );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\t// selector extensions\n\t\tvar ext = _ext.selector[ type ];\n\t\tif ( ext.length ) {\n\t\t\tfor ( i=0, ien=ext.length ; i<ien ; i++ ) {\n\t\t\t\tout = ext[i]( settings, opts, out );\n\t\t\t}\n\t\t}\n\t\n\t\treturn _unique( out );\n\t};\n\t\n\t\n\tvar _selector_opts = function ( opts )\n\t{\n\t\tif ( ! opts ) {\n\t\t\topts = {};\n\t\t}\n\t\n\t\t// Backwards compatibility for 1.9- which used the terminology filter rather\n\t\t// than search\n\t\tif ( opts.filter && opts.search === undefined ) {\n\t\t\topts.search = opts.filter;\n\t\t}\n\t\n\t\treturn $.extend( {\n\t\t\tsearch: 'none',\n\t\t\torder: 'current',\n\t\t\tpage: 'all'\n\t\t}, opts );\n\t};\n\t\n\t\n\tvar _selector_first = function ( inst )\n\t{\n\t\t// Reduce the API instance to the first item found\n\t\tfor ( var i=0, ien=inst.length ; i<ien ; i++ ) {\n\t\t\tif ( inst[i].length > 0 ) {\n\t\t\t\t// Assign the first element to the first item in the instance\n\t\t\t\t// and truncate the instance and context\n\t\t\t\tinst[0] = inst[i];\n\t\t\t\tinst[0].length = 1;\n\t\t\t\tinst.length = 1;\n\t\t\t\tinst.context = [ inst.context[i] ];\n\t\n\t\t\t\treturn inst;\n\t\t\t}\n\t\t}\n\t\n\t\t// Not found - return an empty instance\n\t\tinst.length = 0;\n\t\treturn inst;\n\t};\n\t\n\t\n\tvar _selector_row_indexes = function ( settings, opts )\n\t{\n\t\tvar\n\t\t\ti, ien, tmp, a=[],\n\t\t\tdisplayFiltered = settings.aiDisplay,\n\t\t\tdisplayMaster = settings.aiDisplayMaster;\n\t\n\t\tvar\n\t\t\tsearch = opts.search,  // none, applied, removed\n\t\t\torder  = opts.order,   // applied, current, index (original - compatibility with 1.9)\n\t\t\tpage   = opts.page;    // all, current\n\t\n\t\tif ( _fnDataSource( settings ) == 'ssp' ) {\n\t\t\t// In server-side processing mode, most options are irrelevant since\n\t\t\t// rows not shown don't exist and the index order is the applied order\n\t\t\t// Removed is a special case - for consistency just return an empty\n\t\t\t// array\n\t\t\treturn search === 'removed' ?\n\t\t\t\t[] :\n\t\t\t\t_range( 0, displayMaster.length );\n\t\t}\n\t\telse if ( page == 'current' ) {\n\t\t\t// Current page implies that order=current and fitler=applied, since it is\n\t\t\t// fairly senseless otherwise, regardless of what order and search actually\n\t\t\t// are\n\t\t\tfor ( i=settings._iDisplayStart, ien=settings.fnDisplayEnd() ; i<ien ; i++ ) {\n\t\t\t\ta.push( displayFiltered[i] );\n\t\t\t}\n\t\t}\n\t\telse if ( order == 'current' || order == 'applied' ) {\n\t\t\ta = search == 'none' ?\n\t\t\t\tdisplayMaster.slice() :                      // no search\n\t\t\t\tsearch == 'applied' ?\n\t\t\t\t\tdisplayFiltered.slice() :                // applied search\n\t\t\t\t\t$.map( displayMaster, function (el, i) { // removed search\n\t\t\t\t\t\treturn $.inArray( el, displayFiltered ) === -1 ? el : null;\n\t\t\t\t\t} );\n\t\t}\n\t\telse if ( order == 'index' || order == 'original' ) {\n\t\t\tfor ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\t\tif ( search == 'none' ) {\n\t\t\t\t\ta.push( i );\n\t\t\t\t}\n\t\t\t\telse { // applied | removed\n\t\t\t\t\ttmp = $.inArray( i, displayFiltered );\n\t\n\t\t\t\t\tif ((tmp === -1 && search == 'removed') ||\n\t\t\t\t\t\t(tmp >= 0   && search == 'applied') )\n\t\t\t\t\t{\n\t\t\t\t\t\ta.push( i );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\treturn a;\n\t};\n\t\n\t\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Rows\n\t *\n\t * {}          - no selector - use all available rows\n\t * {integer}   - row aoData index\n\t * {node}      - TR node\n\t * {string}    - jQuery selector to apply to the TR elements\n\t * {array}     - jQuery array of nodes, or simply an array of TR nodes\n\t *\n\t */\n\t\n\t\n\tvar __row_selector = function ( settings, selector, opts )\n\t{\n\t\tvar rows;\n\t\tvar run = function ( sel ) {\n\t\t\tvar selInt = _intVal( sel );\n\t\t\tvar i, ien;\n\t\n\t\t\t// Short cut - selector is a number and no options provided (default is\n\t\t\t// all records, so no need to check if the index is in there, since it\n\t\t\t// must be - dev error if the index doesn't exist).\n\t\t\tif ( selInt !== null && ! opts ) {\n\t\t\t\treturn [ selInt ];\n\t\t\t}\n\t\n\t\t\tif ( ! rows ) {\n\t\t\t\trows = _selector_row_indexes( settings, opts );\n\t\t\t}\n\t\n\t\t\tif ( selInt !== null && $.inArray( selInt, rows ) !== -1 ) {\n\t\t\t\t// Selector - integer\n\t\t\t\treturn [ selInt ];\n\t\t\t}\n\t\t\telse if ( sel === null || sel === undefined || sel === '' ) {\n\t\t\t\t// Selector - none\n\t\t\t\treturn rows;\n\t\t\t}\n\t\n\t\t\t// Selector - function\n\t\t\tif ( typeof sel === 'function' ) {\n\t\t\t\treturn $.map( rows, function (idx) {\n\t\t\t\t\tvar row = settings.aoData[ idx ];\n\t\t\t\t\treturn sel( idx, row._aData, row.nTr ) ? idx : null;\n\t\t\t\t} );\n\t\t\t}\n\t\n\t\t\t// Get nodes in the order from the `rows` array with null values removed\n\t\t\tvar nodes = _removeEmpty(\n\t\t\t\t_pluck_order( settings.aoData, rows, 'nTr' )\n\t\t\t);\n\t\n\t\t\t// Selector - node\n\t\t\tif ( sel.nodeName ) {\n\t\t\t\tif ( sel._DT_RowIndex !== undefined ) {\n\t\t\t\t\treturn [ sel._DT_RowIndex ]; // Property added by DT for fast lookup\n\t\t\t\t}\n\t\t\t\telse if ( sel._DT_CellIndex ) {\n\t\t\t\t\treturn [ sel._DT_CellIndex.row ];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tvar host = $(sel).closest('*[data-dt-row]');\n\t\t\t\t\treturn host.length ?\n\t\t\t\t\t\t[ host.data('dt-row') ] :\n\t\t\t\t\t\t[];\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// ID selector. Want to always be able to select rows by id, regardless\n\t\t\t// of if the tr element has been created or not, so can't rely upon\n\t\t\t// jQuery here - hence a custom implementation. This does not match\n\t\t\t// Sizzle's fast selector or HTML4 - in HTML5 the ID can be anything,\n\t\t\t// but to select it using a CSS selector engine (like Sizzle or\n\t\t\t// querySelect) it would need to need to be escaped for some characters.\n\t\t\t// DataTables simplifies this for row selectors since you can select\n\t\t\t// only a row. A # indicates an id any anything that follows is the id -\n\t\t\t// unescaped.\n\t\t\tif ( typeof sel === 'string' && sel.charAt(0) === '#' ) {\n\t\t\t\t// get row index from id\n\t\t\t\tvar rowObj = settings.aIds[ sel.replace( /^#/, '' ) ];\n\t\t\t\tif ( rowObj !== undefined ) {\n\t\t\t\t\treturn [ rowObj.idx ];\n\t\t\t\t}\n\t\n\t\t\t\t// need to fall through to jQuery in case there is DOM id that\n\t\t\t\t// matches\n\t\t\t}\n\t\n\t\t\t// Selector - jQuery selector string, array of nodes or jQuery object/\n\t\t\t// As jQuery's .filter() allows jQuery objects to be passed in filter,\n\t\t\t// it also allows arrays, so this will cope with all three options\n\t\t\treturn $(nodes)\n\t\t\t\t.filter( sel )\n\t\t\t\t.map( function () {\n\t\t\t\t\treturn this._DT_RowIndex;\n\t\t\t\t} )\n\t\t\t\t.toArray();\n\t\t};\n\t\n\t\treturn _selector_run( 'row', selector, run, settings, opts );\n\t};\n\t\n\t\n\t_api_register( 'rows()', function ( selector, opts ) {\n\t\t// argument shifting\n\t\tif ( selector === undefined ) {\n\t\t\tselector = '';\n\t\t}\n\t\telse if ( $.isPlainObject( selector ) ) {\n\t\t\topts = selector;\n\t\t\tselector = '';\n\t\t}\n\t\n\t\topts = _selector_opts( opts );\n\t\n\t\tvar inst = this.iterator( 'table', function ( settings ) {\n\t\t\treturn __row_selector( settings, selector, opts );\n\t\t}, 1 );\n\t\n\t\t// Want argument shifting here and in __row_selector?\n\t\tinst.selector.rows = selector;\n\t\tinst.selector.opts = opts;\n\t\n\t\treturn inst;\n\t} );\n\t\n\t_api_register( 'rows().nodes()', function () {\n\t\treturn this.iterator( 'row', function ( settings, row ) {\n\t\t\treturn settings.aoData[ row ].nTr || undefined;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_register( 'rows().data()', function () {\n\t\treturn this.iterator( true, 'rows', function ( settings, rows ) {\n\t\t\treturn _pluck_order( settings.aoData, rows, '_aData' );\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'rows().cache()', 'row().cache()', function ( type ) {\n\t\treturn this.iterator( 'row', function ( settings, row ) {\n\t\t\tvar r = settings.aoData[ row ];\n\t\t\treturn type === 'search' ? r._aFilterData : r._aSortData;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'rows().invalidate()', 'row().invalidate()', function ( src ) {\n\t\treturn this.iterator( 'row', function ( settings, row ) {\n\t\t\t_fnInvalidate( settings, row, src );\n\t\t} );\n\t} );\n\t\n\t_api_registerPlural( 'rows().indexes()', 'row().index()', function () {\n\t\treturn this.iterator( 'row', function ( settings, row ) {\n\t\t\treturn row;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'rows().ids()', 'row().id()', function ( hash ) {\n\t\tvar a = [];\n\t\tvar context = this.context;\n\t\n\t\t// `iterator` will drop undefined values, but in this case we want them\n\t\tfor ( var i=0, ien=context.length ; i<ien ; i++ ) {\n\t\t\tfor ( var j=0, jen=this[i].length ; j<jen ; j++ ) {\n\t\t\t\tvar id = context[i].rowIdFn( context[i].aoData[ this[i][j] ]._aData );\n\t\t\t\ta.push( (hash === true ? '#' : '' )+ id );\n\t\t\t}\n\t\t}\n\t\n\t\treturn new _Api( context, a );\n\t} );\n\t\n\t_api_registerPlural( 'rows().remove()', 'row().remove()', function () {\n\t\tvar that = this;\n\t\n\t\tthis.iterator( 'row', function ( settings, row, thatIdx ) {\n\t\t\tvar data = settings.aoData;\n\t\t\tvar rowData = data[ row ];\n\t\t\tvar i, ien, j, jen;\n\t\t\tvar loopRow, loopCells;\n\t\n\t\t\tdata.splice( row, 1 );\n\t\n\t\t\t// Update the cached indexes\n\t\t\tfor ( i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\tloopRow = data[i];\n\t\t\t\tloopCells = loopRow.anCells;\n\t\n\t\t\t\t// Rows\n\t\t\t\tif ( loopRow.nTr !== null ) {\n\t\t\t\t\tloopRow.nTr._DT_RowIndex = i;\n\t\t\t\t}\n\t\n\t\t\t\t// Cells\n\t\t\t\tif ( loopCells !== null ) {\n\t\t\t\t\tfor ( j=0, jen=loopCells.length ; j<jen ; j++ ) {\n\t\t\t\t\t\tloopCells[j]._DT_CellIndex.row = i;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Delete from the display arrays\n\t\t\t_fnDeleteIndex( settings.aiDisplayMaster, row );\n\t\t\t_fnDeleteIndex( settings.aiDisplay, row );\n\t\t\t_fnDeleteIndex( that[ thatIdx ], row, false ); // maintain local indexes\n\t\n\t\t\t// Check for an 'overflow' they case for displaying the table\n\t\t\t_fnLengthOverflow( settings );\n\t\n\t\t\t// Remove the row's ID reference if there is one\n\t\t\tvar id = settings.rowIdFn( rowData._aData );\n\t\t\tif ( id !== undefined ) {\n\t\t\t\tdelete settings.aIds[ id ];\n\t\t\t}\n\t\t} );\n\t\n\t\tthis.iterator( 'table', function ( settings ) {\n\t\t\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\t\tsettings.aoData[i].idx = i;\n\t\t\t}\n\t\t} );\n\t\n\t\treturn this;\n\t} );\n\t\n\t\n\t_api_register( 'rows.add()', function ( rows ) {\n\t\tvar newRows = this.iterator( 'table', function ( settings ) {\n\t\t\t\tvar row, i, ien;\n\t\t\t\tvar out = [];\n\t\n\t\t\t\tfor ( i=0, ien=rows.length ; i<ien ; i++ ) {\n\t\t\t\t\trow = rows[i];\n\t\n\t\t\t\t\tif ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {\n\t\t\t\t\t\tout.push( _fnAddTr( settings, row )[0] );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tout.push( _fnAddData( settings, row ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\treturn out;\n\t\t\t}, 1 );\n\t\n\t\t// Return an Api.rows() extended instance, so rows().nodes() etc can be used\n\t\tvar modRows = this.rows( -1 );\n\t\tmodRows.pop();\n\t\t$.merge( modRows, newRows );\n\t\n\t\treturn modRows;\n\t} );\n\t\n\t\n\t\n\t\n\t\n\t/**\n\t *\n\t */\n\t_api_register( 'row()', function ( selector, opts ) {\n\t\treturn _selector_first( this.rows( selector, opts ) );\n\t} );\n\t\n\t\n\t_api_register( 'row().data()', function ( data ) {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( data === undefined ) {\n\t\t\t// Get\n\t\t\treturn ctx.length && this.length ?\n\t\t\t\tctx[0].aoData[ this[0] ]._aData :\n\t\t\t\tundefined;\n\t\t}\n\t\n\t\t// Set\n\t\tctx[0].aoData[ this[0] ]._aData = data;\n\t\n\t\t// Automatically invalidate\n\t\t_fnInvalidate( ctx[0], this[0], 'data' );\n\t\n\t\treturn this;\n\t} );\n\t\n\t\n\t_api_register( 'row().node()', function () {\n\t\tvar ctx = this.context;\n\t\n\t\treturn ctx.length && this.length ?\n\t\t\tctx[0].aoData[ this[0] ].nTr || null :\n\t\t\tnull;\n\t} );\n\t\n\t\n\t_api_register( 'row.add()', function ( row ) {\n\t\t// Allow a jQuery object to be passed in - only a single row is added from\n\t\t// it though - the first element in the set\n\t\tif ( row instanceof $ && row.length ) {\n\t\t\trow = row[0];\n\t\t}\n\t\n\t\tvar rows = this.iterator( 'table', function ( settings ) {\n\t\t\tif ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {\n\t\t\t\treturn _fnAddTr( settings, row )[0];\n\t\t\t}\n\t\t\treturn _fnAddData( settings, row );\n\t\t} );\n\t\n\t\t// Return an Api.rows() extended instance, with the newly added row selected\n\t\treturn this.row( rows[0] );\n\t} );\n\t\n\t\n\t\n\tvar __details_add = function ( ctx, row, data, klass )\n\t{\n\t\t// Convert to array of TR elements\n\t\tvar rows = [];\n\t\tvar addRow = function ( r, k ) {\n\t\t\t// Recursion to allow for arrays of jQuery objects\n\t\t\tif ( $.isArray( r ) || r instanceof $ ) {\n\t\t\t\tfor ( var i=0, ien=r.length ; i<ien ; i++ ) {\n\t\t\t\t\taddRow( r[i], k );\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// If we get a TR element, then just add it directly - up to the dev\n\t\t\t// to add the correct number of columns etc\n\t\t\tif ( r.nodeName && r.nodeName.toLowerCase() === 'tr' ) {\n\t\t\t\trows.push( r );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Otherwise create a row with a wrapper\n\t\t\t\tvar created = $('<tr><td/></tr>').addClass( k );\n\t\t\t\t$('td', created)\n\t\t\t\t\t.addClass( k )\n\t\t\t\t\t.html( r )\n\t\t\t\t\t[0].colSpan = _fnVisbleColumns( ctx );\n\t\n\t\t\t\trows.push( created[0] );\n\t\t\t}\n\t\t};\n\t\n\t\taddRow( data, klass );\n\t\n\t\tif ( row._details ) {\n\t\t\trow._details.detach();\n\t\t}\n\t\n\t\trow._details = $(rows);\n\t\n\t\t// If the children were already shown, that state should be retained\n\t\tif ( row._detailsShow ) {\n\t\t\trow._details.insertAfter( row.nTr );\n\t\t}\n\t};\n\t\n\t\n\tvar __details_remove = function ( api, idx )\n\t{\n\t\tvar ctx = api.context;\n\t\n\t\tif ( ctx.length ) {\n\t\t\tvar row = ctx[0].aoData[ idx !== undefined ? idx : api[0] ];\n\t\n\t\t\tif ( row && row._details ) {\n\t\t\t\trow._details.remove();\n\t\n\t\t\t\trow._detailsShow = undefined;\n\t\t\t\trow._details = undefined;\n\t\t\t}\n\t\t}\n\t};\n\t\n\t\n\tvar __details_display = function ( api, show ) {\n\t\tvar ctx = api.context;\n\t\n\t\tif ( ctx.length && api.length ) {\n\t\t\tvar row = ctx[0].aoData[ api[0] ];\n\t\n\t\t\tif ( row._details ) {\n\t\t\t\trow._detailsShow = show;\n\t\n\t\t\t\tif ( show ) {\n\t\t\t\t\trow._details.insertAfter( row.nTr );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\trow._details.detach();\n\t\t\t\t}\n\t\n\t\t\t\t__details_events( ctx[0] );\n\t\t\t}\n\t\t}\n\t};\n\t\n\t\n\tvar __details_events = function ( settings )\n\t{\n\t\tvar api = new _Api( settings );\n\t\tvar namespace = '.dt.DT_details';\n\t\tvar drawEvent = 'draw'+namespace;\n\t\tvar colvisEvent = 'column-visibility'+namespace;\n\t\tvar destroyEvent = 'destroy'+namespace;\n\t\tvar data = settings.aoData;\n\t\n\t\tapi.off( drawEvent +' '+ colvisEvent +' '+ destroyEvent );\n\t\n\t\tif ( _pluck( data, '_details' ).length > 0 ) {\n\t\t\t// On each draw, insert the required elements into the document\n\t\t\tapi.on( drawEvent, function ( e, ctx ) {\n\t\t\t\tif ( settings !== ctx ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\tapi.rows( {page:'current'} ).eq(0).each( function (idx) {\n\t\t\t\t\t// Internal data grab\n\t\t\t\t\tvar row = data[ idx ];\n\t\n\t\t\t\t\tif ( row._detailsShow ) {\n\t\t\t\t\t\trow._details.insertAfter( row.nTr );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} );\n\t\n\t\t\t// Column visibility change - update the colspan\n\t\t\tapi.on( colvisEvent, function ( e, ctx, idx, vis ) {\n\t\t\t\tif ( settings !== ctx ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\t// Update the colspan for the details rows (note, only if it already has\n\t\t\t\t// a colspan)\n\t\t\t\tvar row, visible = _fnVisbleColumns( ctx );\n\t\n\t\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\t\trow = data[i];\n\t\n\t\t\t\t\tif ( row._details ) {\n\t\t\t\t\t\trow._details.children('td[colspan]').attr('colspan', visible );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\n\t\t\t// Table destroyed - nuke any child rows\n\t\t\tapi.on( destroyEvent, function ( e, ctx ) {\n\t\t\t\tif ( settings !== ctx ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\t\tif ( data[i]._details ) {\n\t\t\t\t\t\t__details_remove( api, i );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t};\n\t\n\t// Strings for the method names to help minification\n\tvar _emp = '';\n\tvar _child_obj = _emp+'row().child';\n\tvar _child_mth = _child_obj+'()';\n\t\n\t// data can be:\n\t//  tr\n\t//  string\n\t//  jQuery or array of any of the above\n\t_api_register( _child_mth, function ( data, klass ) {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( data === undefined ) {\n\t\t\t// get\n\t\t\treturn ctx.length && this.length ?\n\t\t\t\tctx[0].aoData[ this[0] ]._details :\n\t\t\t\tundefined;\n\t\t}\n\t\telse if ( data === true ) {\n\t\t\t// show\n\t\t\tthis.child.show();\n\t\t}\n\t\telse if ( data === false ) {\n\t\t\t// remove\n\t\t\t__details_remove( this );\n\t\t}\n\t\telse if ( ctx.length && this.length ) {\n\t\t\t// set\n\t\t\t__details_add( ctx[0], ctx[0].aoData[ this[0] ], data, klass );\n\t\t}\n\t\n\t\treturn this;\n\t} );\n\t\n\t\n\t_api_register( [\n\t\t_child_obj+'.show()',\n\t\t_child_mth+'.show()' // only when `child()` was called with parameters (without\n\t], function ( show ) {   // it returns an object and this method is not executed)\n\t\t__details_display( this, true );\n\t\treturn this;\n\t} );\n\t\n\t\n\t_api_register( [\n\t\t_child_obj+'.hide()',\n\t\t_child_mth+'.hide()' // only when `child()` was called with parameters (without\n\t], function () {         // it returns an object and this method is not executed)\n\t\t__details_display( this, false );\n\t\treturn this;\n\t} );\n\t\n\t\n\t_api_register( [\n\t\t_child_obj+'.remove()',\n\t\t_child_mth+'.remove()' // only when `child()` was called with parameters (without\n\t], function () {           // it returns an object and this method is not executed)\n\t\t__details_remove( this );\n\t\treturn this;\n\t} );\n\t\n\t\n\t_api_register( _child_obj+'.isShown()', function () {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( ctx.length && this.length ) {\n\t\t\t// _detailsShown as false or undefined will fall through to return false\n\t\t\treturn ctx[0].aoData[ this[0] ]._detailsShow || false;\n\t\t}\n\t\treturn false;\n\t} );\n\t\n\t\n\t\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Columns\n\t *\n\t * {integer}           - column index (>=0 count from left, <0 count from right)\n\t * \"{integer}:visIdx\"  - visible column index (i.e. translate to column index)  (>=0 count from left, <0 count from right)\n\t * \"{integer}:visible\" - alias for {integer}:visIdx  (>=0 count from left, <0 count from right)\n\t * \"{string}:name\"     - column name\n\t * \"{string}\"          - jQuery selector on column header nodes\n\t *\n\t */\n\t\n\t// can be an array of these items, comma separated list, or an array of comma\n\t// separated lists\n\t\n\tvar __re_column_selector = /^([^:]+):(name|visIdx|visible)$/;\n\t\n\t\n\t// r1 and r2 are redundant - but it means that the parameters match for the\n\t// iterator callback in columns().data()\n\tvar __columnData = function ( settings, column, r1, r2, rows ) {\n\t\tvar a = [];\n\t\tfor ( var row=0, ien=rows.length ; row<ien ; row++ ) {\n\t\t\ta.push( _fnGetCellData( settings, rows[row], column ) );\n\t\t}\n\t\treturn a;\n\t};\n\t\n\t\n\tvar __column_selector = function ( settings, selector, opts )\n\t{\n\t\tvar\n\t\t\tcolumns = settings.aoColumns,\n\t\t\tnames = _pluck( columns, 'sName' ),\n\t\t\tnodes = _pluck( columns, 'nTh' );\n\t\n\t\tvar run = function ( s ) {\n\t\t\tvar selInt = _intVal( s );\n\t\n\t\t\t// Selector - all\n\t\t\tif ( s === '' ) {\n\t\t\t\treturn _range( columns.length );\n\t\t\t}\n\t\n\t\t\t// Selector - index\n\t\t\tif ( selInt !== null ) {\n\t\t\t\treturn [ selInt >= 0 ?\n\t\t\t\t\tselInt : // Count from left\n\t\t\t\t\tcolumns.length + selInt // Count from right (+ because its a negative value)\n\t\t\t\t];\n\t\t\t}\n\t\n\t\t\t// Selector = function\n\t\t\tif ( typeof s === 'function' ) {\n\t\t\t\tvar rows = _selector_row_indexes( settings, opts );\n\t\n\t\t\t\treturn $.map( columns, function (col, idx) {\n\t\t\t\t\treturn s(\n\t\t\t\t\t\t\tidx,\n\t\t\t\t\t\t\t__columnData( settings, idx, 0, 0, rows ),\n\t\t\t\t\t\t\tnodes[ idx ]\n\t\t\t\t\t\t) ? idx : null;\n\t\t\t\t} );\n\t\t\t}\n\t\n\t\t\t// jQuery or string selector\n\t\t\tvar match = typeof s === 'string' ?\n\t\t\t\ts.match( __re_column_selector ) :\n\t\t\t\t'';\n\t\n\t\t\tif ( match ) {\n\t\t\t\tswitch( match[2] ) {\n\t\t\t\t\tcase 'visIdx':\n\t\t\t\t\tcase 'visible':\n\t\t\t\t\t\tvar idx = parseInt( match[1], 10 );\n\t\t\t\t\t\t// Visible index given, convert to column index\n\t\t\t\t\t\tif ( idx < 0 ) {\n\t\t\t\t\t\t\t// Counting from the right\n\t\t\t\t\t\t\tvar visColumns = $.map( columns, function (col,i) {\n\t\t\t\t\t\t\t\treturn col.bVisible ? i : null;\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\treturn [ visColumns[ visColumns.length + idx ] ];\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Counting from the left\n\t\t\t\t\t\treturn [ _fnVisibleToColumnIndex( settings, idx ) ];\n\t\n\t\t\t\t\tcase 'name':\n\t\t\t\t\t\t// match by name. `names` is column index complete and in order\n\t\t\t\t\t\treturn $.map( names, function (name, i) {\n\t\t\t\t\t\t\treturn name === match[1] ? i : null;\n\t\t\t\t\t\t} );\n\t\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Cell in the table body\n\t\t\tif ( s.nodeName && s._DT_CellIndex ) {\n\t\t\t\treturn [ s._DT_CellIndex.column ];\n\t\t\t}\n\t\n\t\t\t// jQuery selector on the TH elements for the columns\n\t\t\tvar jqResult = $( nodes )\n\t\t\t\t.filter( s )\n\t\t\t\t.map( function () {\n\t\t\t\t\treturn $.inArray( this, nodes ); // `nodes` is column index complete and in order\n\t\t\t\t} )\n\t\t\t\t.toArray();\n\t\n\t\t\tif ( jqResult.length || ! s.nodeName ) {\n\t\t\t\treturn jqResult;\n\t\t\t}\n\t\n\t\t\t// Otherwise a node which might have a `dt-column` data attribute, or be\n\t\t\t// a child or such an element\n\t\t\tvar host = $(s).closest('*[data-dt-column]');\n\t\t\treturn host.length ?\n\t\t\t\t[ host.data('dt-column') ] :\n\t\t\t\t[];\n\t\t};\n\t\n\t\treturn _selector_run( 'column', selector, run, settings, opts );\n\t};\n\t\n\t\n\tvar __setColumnVis = function ( settings, column, vis ) {\n\t\tvar\n\t\t\tcols = settings.aoColumns,\n\t\t\tcol  = cols[ column ],\n\t\t\tdata = settings.aoData,\n\t\t\trow, cells, i, ien, tr;\n\t\n\t\t// Get\n\t\tif ( vis === undefined ) {\n\t\t\treturn col.bVisible;\n\t\t}\n\t\n\t\t// Set\n\t\t// No change\n\t\tif ( col.bVisible === vis ) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tif ( vis ) {\n\t\t\t// Insert column\n\t\t\t// Need to decide if we should use appendChild or insertBefore\n\t\t\tvar insertBefore = $.inArray( true, _pluck(cols, 'bVisible'), column+1 );\n\t\n\t\t\tfor ( i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\ttr = data[i].nTr;\n\t\t\t\tcells = data[i].anCells;\n\t\n\t\t\t\tif ( tr ) {\n\t\t\t\t\t// insertBefore can act like appendChild if 2nd arg is null\n\t\t\t\t\ttr.insertBefore( cells[ column ], cells[ insertBefore ] || null );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// Remove column\n\t\t\t$( _pluck( settings.aoData, 'anCells', column ) ).detach();\n\t\t}\n\t\n\t\t// Common actions\n\t\tcol.bVisible = vis;\n\t\t_fnDrawHead( settings, settings.aoHeader );\n\t\t_fnDrawHead( settings, settings.aoFooter );\n\t\n\t\t_fnSaveState( settings );\n\t};\n\t\n\t\n\t_api_register( 'columns()', function ( selector, opts ) {\n\t\t// argument shifting\n\t\tif ( selector === undefined ) {\n\t\t\tselector = '';\n\t\t}\n\t\telse if ( $.isPlainObject( selector ) ) {\n\t\t\topts = selector;\n\t\t\tselector = '';\n\t\t}\n\t\n\t\topts = _selector_opts( opts );\n\t\n\t\tvar inst = this.iterator( 'table', function ( settings ) {\n\t\t\treturn __column_selector( settings, selector, opts );\n\t\t}, 1 );\n\t\n\t\t// Want argument shifting here and in _row_selector?\n\t\tinst.selector.cols = selector;\n\t\tinst.selector.opts = opts;\n\t\n\t\treturn inst;\n\t} );\n\t\n\t_api_registerPlural( 'columns().header()', 'column().header()', function ( selector, opts ) {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\treturn settings.aoColumns[column].nTh;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'columns().footer()', 'column().footer()', function ( selector, opts ) {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\treturn settings.aoColumns[column].nTf;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'columns().data()', 'column().data()', function () {\n\t\treturn this.iterator( 'column-rows', __columnData, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'columns().dataSrc()', 'column().dataSrc()', function () {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\treturn settings.aoColumns[column].mData;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'columns().cache()', 'column().cache()', function ( type ) {\n\t\treturn this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {\n\t\t\treturn _pluck_order( settings.aoData, rows,\n\t\t\t\ttype === 'search' ? '_aFilterData' : '_aSortData', column\n\t\t\t);\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'columns().nodes()', 'column().nodes()', function () {\n\t\treturn this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {\n\t\t\treturn _pluck_order( settings.aoData, rows, 'anCells', column ) ;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_registerPlural( 'columns().visible()', 'column().visible()', function ( vis, calc ) {\n\t\tvar ret = this.iterator( 'column', function ( settings, column ) {\n\t\t\tif ( vis === undefined ) {\n\t\t\t\treturn settings.aoColumns[ column ].bVisible;\n\t\t\t} // else\n\t\t\t__setColumnVis( settings, column, vis );\n\t\t} );\n\t\n\t\t// Group the column visibility changes\n\t\tif ( vis !== undefined ) {\n\t\t\t// Second loop once the first is done for events\n\t\t\tthis.iterator( 'column', function ( settings, column ) {\n\t\t\t\t_fnCallbackFire( settings, null, 'column-visibility', [settings, column, vis, calc] );\n\t\t\t} );\n\t\n\t\t\tif ( calc === undefined || calc ) {\n\t\t\t\tthis.columns.adjust();\n\t\t\t}\n\t\t}\n\t\n\t\treturn ret;\n\t} );\n\t\n\t_api_registerPlural( 'columns().indexes()', 'column().index()', function ( type ) {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\treturn type === 'visible' ?\n\t\t\t\t_fnColumnIndexToVisible( settings, column ) :\n\t\t\t\tcolumn;\n\t\t}, 1 );\n\t} );\n\t\n\t_api_register( 'columns.adjust()', function () {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnAdjustColumnSizing( settings );\n\t\t}, 1 );\n\t} );\n\t\n\t_api_register( 'column.index()', function ( type, idx ) {\n\t\tif ( this.context.length !== 0 ) {\n\t\t\tvar ctx = this.context[0];\n\t\n\t\t\tif ( type === 'fromVisible' || type === 'toData' ) {\n\t\t\t\treturn _fnVisibleToColumnIndex( ctx, idx );\n\t\t\t}\n\t\t\telse if ( type === 'fromData' || type === 'toVisible' ) {\n\t\t\t\treturn _fnColumnIndexToVisible( ctx, idx );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\t_api_register( 'column()', function ( selector, opts ) {\n\t\treturn _selector_first( this.columns( selector, opts ) );\n\t} );\n\t\n\t\n\t\n\tvar __cell_selector = function ( settings, selector, opts )\n\t{\n\t\tvar data = settings.aoData;\n\t\tvar rows = _selector_row_indexes( settings, opts );\n\t\tvar cells = _removeEmpty( _pluck_order( data, rows, 'anCells' ) );\n\t\tvar allCells = $( [].concat.apply([], cells) );\n\t\tvar row;\n\t\tvar columns = settings.aoColumns.length;\n\t\tvar a, i, ien, j, o, host;\n\t\n\t\tvar run = function ( s ) {\n\t\t\tvar fnSelector = typeof s === 'function';\n\t\n\t\t\tif ( s === null || s === undefined || fnSelector ) {\n\t\t\t\t// All cells and function selectors\n\t\t\t\ta = [];\n\t\n\t\t\t\tfor ( i=0, ien=rows.length ; i<ien ; i++ ) {\n\t\t\t\t\trow = rows[i];\n\t\n\t\t\t\t\tfor ( j=0 ; j<columns ; j++ ) {\n\t\t\t\t\t\to = {\n\t\t\t\t\t\t\trow: row,\n\t\t\t\t\t\t\tcolumn: j\n\t\t\t\t\t\t};\n\t\n\t\t\t\t\t\tif ( fnSelector ) {\n\t\t\t\t\t\t\t// Selector - function\n\t\t\t\t\t\t\thost = data[ row ];\n\t\n\t\t\t\t\t\t\tif ( s( o, _fnGetCellData(settings, row, j), host.anCells ? host.anCells[j] : null ) ) {\n\t\t\t\t\t\t\t\ta.push( o );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// Selector - all\n\t\t\t\t\t\t\ta.push( o );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\treturn a;\n\t\t\t}\n\t\t\t\n\t\t\t// Selector - index\n\t\t\tif ( $.isPlainObject( s ) ) {\n\t\t\t\treturn [s];\n\t\t\t}\n\t\n\t\t\t// Selector - jQuery filtered cells\n\t\t\tvar jqResult = allCells\n\t\t\t\t.filter( s )\n\t\t\t\t.map( function (i, el) {\n\t\t\t\t\treturn { // use a new object, in case someone changes the values\n\t\t\t\t\t\trow:    el._DT_CellIndex.row,\n\t\t\t\t\t\tcolumn: el._DT_CellIndex.column\n\t \t\t\t\t};\n\t\t\t\t} )\n\t\t\t\t.toArray();\n\t\n\t\t\tif ( jqResult.length || ! s.nodeName ) {\n\t\t\t\treturn jqResult;\n\t\t\t}\n\t\n\t\t\t// Otherwise the selector is a node, and there is one last option - the\n\t\t\t// element might be a child of an element which has dt-row and dt-column\n\t\t\t// data attributes\n\t\t\thost = $(s).closest('*[data-dt-row]');\n\t\t\treturn host.length ?\n\t\t\t\t[ {\n\t\t\t\t\trow: host.data('dt-row'),\n\t\t\t\t\tcolumn: host.data('dt-column')\n\t\t\t\t} ] :\n\t\t\t\t[];\n\t\t};\n\t\n\t\treturn _selector_run( 'cell', selector, run, settings, opts );\n\t};\n\t\n\t\n\t\n\t\n\t_api_register( 'cells()', function ( rowSelector, columnSelector, opts ) {\n\t\t// Argument shifting\n\t\tif ( $.isPlainObject( rowSelector ) ) {\n\t\t\t// Indexes\n\t\t\tif ( rowSelector.row === undefined ) {\n\t\t\t\t// Selector options in first parameter\n\t\t\t\topts = rowSelector;\n\t\t\t\trowSelector = null;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Cell index objects in first parameter\n\t\t\t\topts = columnSelector;\n\t\t\t\tcolumnSelector = null;\n\t\t\t}\n\t\t}\n\t\tif ( $.isPlainObject( columnSelector ) ) {\n\t\t\topts = columnSelector;\n\t\t\tcolumnSelector = null;\n\t\t}\n\t\n\t\t// Cell selector\n\t\tif ( columnSelector === null || columnSelector === undefined ) {\n\t\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t\treturn __cell_selector( settings, rowSelector, _selector_opts( opts ) );\n\t\t\t} );\n\t\t}\n\t\n\t\t// Row + column selector\n\t\tvar columns = this.columns( columnSelector, opts );\n\t\tvar rows = this.rows( rowSelector, opts );\n\t\tvar a, i, ien, j, jen;\n\t\n\t\tvar cells = this.iterator( 'table', function ( settings, idx ) {\n\t\t\ta = [];\n\t\n\t\t\tfor ( i=0, ien=rows[idx].length ; i<ien ; i++ ) {\n\t\t\t\tfor ( j=0, jen=columns[idx].length ; j<jen ; j++ ) {\n\t\t\t\t\ta.push( {\n\t\t\t\t\t\trow:    rows[idx][i],\n\t\t\t\t\t\tcolumn: columns[idx][j]\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn a;\n\t\t}, 1 );\n\t\n\t\t$.extend( cells.selector, {\n\t\t\tcols: columnSelector,\n\t\t\trows: rowSelector,\n\t\t\topts: opts\n\t\t} );\n\t\n\t\treturn cells;\n\t} );\n\t\n\t\n\t_api_registerPlural( 'cells().nodes()', 'cell().node()', function () {\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\tvar data = settings.aoData[ row ];\n\t\n\t\t\treturn data && data.anCells ?\n\t\t\t\tdata.anCells[ column ] :\n\t\t\t\tundefined;\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_register( 'cells().data()', function () {\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\treturn _fnGetCellData( settings, row, column );\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'cells().cache()', 'cell().cache()', function ( type ) {\n\t\ttype = type === 'search' ? '_aFilterData' : '_aSortData';\n\t\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\treturn settings.aoData[ row ][ type ][ column ];\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'cells().render()', 'cell().render()', function ( type ) {\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\treturn _fnGetCellData( settings, row, column, type );\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'cells().indexes()', 'cell().index()', function () {\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\treturn {\n\t\t\t\trow: row,\n\t\t\t\tcolumn: column,\n\t\t\t\tcolumnVisible: _fnColumnIndexToVisible( settings, column )\n\t\t\t};\n\t\t}, 1 );\n\t} );\n\t\n\t\n\t_api_registerPlural( 'cells().invalidate()', 'cell().invalidate()', function ( src ) {\n\t\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t\t_fnInvalidate( settings, row, src, column );\n\t\t} );\n\t} );\n\t\n\t\n\t\n\t_api_register( 'cell()', function ( rowSelector, columnSelector, opts ) {\n\t\treturn _selector_first( this.cells( rowSelector, columnSelector, opts ) );\n\t} );\n\t\n\t\n\t_api_register( 'cell().data()', function ( data ) {\n\t\tvar ctx = this.context;\n\t\tvar cell = this[0];\n\t\n\t\tif ( data === undefined ) {\n\t\t\t// Get\n\t\t\treturn ctx.length && cell.length ?\n\t\t\t\t_fnGetCellData( ctx[0], cell[0].row, cell[0].column ) :\n\t\t\t\tundefined;\n\t\t}\n\t\n\t\t// Set\n\t\t_fnSetCellData( ctx[0], cell[0].row, cell[0].column, data );\n\t\t_fnInvalidate( ctx[0], cell[0].row, 'data', cell[0].column );\n\t\n\t\treturn this;\n\t} );\n\t\n\t\n\t\n\t/**\n\t * Get current ordering (sorting) that has been applied to the table.\n\t *\n\t * @returns {array} 2D array containing the sorting information for the first\n\t *   table in the current context. Each element in the parent array represents\n\t *   a column being sorted upon (i.e. multi-sorting with two columns would have\n\t *   2 inner arrays). The inner arrays may have 2 or 3 elements. The first is\n\t *   the column index that the sorting condition applies to, the second is the\n\t *   direction of the sort (`desc` or `asc`) and, optionally, the third is the\n\t *   index of the sorting order from the `column.sorting` initialisation array.\n\t *//**\n\t * Set the ordering for the table.\n\t *\n\t * @param {integer} order Column index to sort upon.\n\t * @param {string} direction Direction of the sort to be applied (`asc` or `desc`)\n\t * @returns {DataTables.Api} this\n\t *//**\n\t * Set the ordering for the table.\n\t *\n\t * @param {array} order 1D array of sorting information to be applied.\n\t * @param {array} [...] Optional additional sorting conditions\n\t * @returns {DataTables.Api} this\n\t *//**\n\t * Set the ordering for the table.\n\t *\n\t * @param {array} order 2D array of sorting information to be applied.\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'order()', function ( order, dir ) {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( order === undefined ) {\n\t\t\t// get\n\t\t\treturn ctx.length !== 0 ?\n\t\t\t\tctx[0].aaSorting :\n\t\t\t\tundefined;\n\t\t}\n\t\n\t\t// set\n\t\tif ( typeof order === 'number' ) {\n\t\t\t// Simple column / direction passed in\n\t\t\torder = [ [ order, dir ] ];\n\t\t}\n\t\telse if ( order.length && ! $.isArray( order[0] ) ) {\n\t\t\t// Arguments passed in (list of 1D arrays)\n\t\t\torder = Array.prototype.slice.call( arguments );\n\t\t}\n\t\t// otherwise a 2D array was passed in\n\t\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tsettings.aaSorting = order.slice();\n\t\t} );\n\t} );\n\t\n\t\n\t/**\n\t * Attach a sort listener to an element for a given column\n\t *\n\t * @param {node|jQuery|string} node Identifier for the element(s) to attach the\n\t *   listener to. This can take the form of a single DOM node, a jQuery\n\t *   collection of nodes or a jQuery selector which will identify the node(s).\n\t * @param {integer} column the column that a click on this node will sort on\n\t * @param {function} [callback] callback function when sort is run\n\t * @returns {DataTables.Api} this\n\t */\n\t_api_register( 'order.listener()', function ( node, column, callback ) {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnSortAttachListener( settings, node, column, callback );\n\t\t} );\n\t} );\n\t\n\t\n\t_api_register( 'order.fixed()', function ( set ) {\n\t\tif ( ! set ) {\n\t\t\tvar ctx = this.context;\n\t\t\tvar fixed = ctx.length ?\n\t\t\t\tctx[0].aaSortingFixed :\n\t\t\t\tundefined;\n\t\n\t\t\treturn $.isArray( fixed ) ?\n\t\t\t\t{ pre: fixed } :\n\t\t\t\tfixed;\n\t\t}\n\t\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tsettings.aaSortingFixed = $.extend( true, {}, set );\n\t\t} );\n\t} );\n\t\n\t\n\t// Order by the selected column(s)\n\t_api_register( [\n\t\t'columns().order()',\n\t\t'column().order()'\n\t], function ( dir ) {\n\t\tvar that = this;\n\t\n\t\treturn this.iterator( 'table', function ( settings, i ) {\n\t\t\tvar sort = [];\n\t\n\t\t\t$.each( that[i], function (j, col) {\n\t\t\t\tsort.push( [ col, dir ] );\n\t\t\t} );\n\t\n\t\t\tsettings.aaSorting = sort;\n\t\t} );\n\t} );\n\t\n\t\n\t\n\t_api_register( 'search()', function ( input, regex, smart, caseInsen ) {\n\t\tvar ctx = this.context;\n\t\n\t\tif ( input === undefined ) {\n\t\t\t// get\n\t\t\treturn ctx.length !== 0 ?\n\t\t\t\tctx[0].oPreviousSearch.sSearch :\n\t\t\t\tundefined;\n\t\t}\n\t\n\t\t// set\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tif ( ! settings.oFeatures.bFilter ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t_fnFilterComplete( settings, $.extend( {}, settings.oPreviousSearch, {\n\t\t\t\t\"sSearch\": input+\"\",\n\t\t\t\t\"bRegex\":  regex === null ? false : regex,\n\t\t\t\t\"bSmart\":  smart === null ? true  : smart,\n\t\t\t\t\"bCaseInsensitive\": caseInsen === null ? true : caseInsen\n\t\t\t} ), 1 );\n\t\t} );\n\t} );\n\t\n\t\n\t_api_registerPlural(\n\t\t'columns().search()',\n\t\t'column().search()',\n\t\tfunction ( input, regex, smart, caseInsen ) {\n\t\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\t\tvar preSearch = settings.aoPreSearchCols;\n\t\n\t\t\t\tif ( input === undefined ) {\n\t\t\t\t\t// get\n\t\t\t\t\treturn preSearch[ column ].sSearch;\n\t\t\t\t}\n\t\n\t\t\t\t// set\n\t\t\t\tif ( ! settings.oFeatures.bFilter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\t$.extend( preSearch[ column ], {\n\t\t\t\t\t\"sSearch\": input+\"\",\n\t\t\t\t\t\"bRegex\":  regex === null ? false : regex,\n\t\t\t\t\t\"bSmart\":  smart === null ? true  : smart,\n\t\t\t\t\t\"bCaseInsensitive\": caseInsen === null ? true : caseInsen\n\t\t\t\t} );\n\t\n\t\t\t\t_fnFilterComplete( settings, settings.oPreviousSearch, 1 );\n\t\t\t} );\n\t\t}\n\t);\n\t\n\t/*\n\t * State API methods\n\t */\n\t\n\t_api_register( 'state()', function () {\n\t\treturn this.context.length ?\n\t\t\tthis.context[0].oSavedState :\n\t\t\tnull;\n\t} );\n\t\n\t\n\t_api_register( 'state.clear()', function () {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t// Save an empty object\n\t\t\tsettings.fnStateSaveCallback.call( settings.oInstance, settings, {} );\n\t\t} );\n\t} );\n\t\n\t\n\t_api_register( 'state.loaded()', function () {\n\t\treturn this.context.length ?\n\t\t\tthis.context[0].oLoadedState :\n\t\t\tnull;\n\t} );\n\t\n\t\n\t_api_register( 'state.save()', function () {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnSaveState( settings );\n\t\t} );\n\t} );\n\t\n\t\n\t\n\t/**\n\t * Provide a common method for plug-ins to check the version of DataTables being\n\t * used, in order to ensure compatibility.\n\t *\n\t *  @param {string} version Version string to check for, in the format \"X.Y.Z\".\n\t *    Note that the formats \"X\" and \"X.Y\" are also acceptable.\n\t *  @returns {boolean} true if this version of DataTables is greater or equal to\n\t *    the required version, or false if this version of DataTales is not\n\t *    suitable\n\t *  @static\n\t *  @dtopt API-Static\n\t *\n\t *  @example\n\t *    alert( $.fn.dataTable.versionCheck( '1.9.0' ) );\n\t */\n\tDataTable.versionCheck = DataTable.fnVersionCheck = function( version )\n\t{\n\t\tvar aThis = DataTable.version.split('.');\n\t\tvar aThat = version.split('.');\n\t\tvar iThis, iThat;\n\t\n\t\tfor ( var i=0, iLen=aThat.length ; i<iLen ; i++ ) {\n\t\t\tiThis = parseInt( aThis[i], 10 ) || 0;\n\t\t\tiThat = parseInt( aThat[i], 10 ) || 0;\n\t\n\t\t\t// Parts are the same, keep comparing\n\t\t\tif (iThis === iThat) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\n\t\t\t// Parts are different, return immediately\n\t\t\treturn iThis > iThat;\n\t\t}\n\t\n\t\treturn true;\n\t};\n\t\n\t\n\t/**\n\t * Check if a `<table>` node is a DataTable table already or not.\n\t *\n\t *  @param {node|jquery|string} table Table node, jQuery object or jQuery\n\t *      selector for the table to test. Note that if more than more than one\n\t *      table is passed on, only the first will be checked\n\t *  @returns {boolean} true the table given is a DataTable, or false otherwise\n\t *  @static\n\t *  @dtopt API-Static\n\t *\n\t *  @example\n\t *    if ( ! $.fn.DataTable.isDataTable( '#example' ) ) {\n\t *      $('#example').dataTable();\n\t *    }\n\t */\n\tDataTable.isDataTable = DataTable.fnIsDataTable = function ( table )\n\t{\n\t\tvar t = $(table).get(0);\n\t\tvar is = false;\n\t\n\t\tif ( table instanceof DataTable.Api ) {\n\t\t\treturn true;\n\t\t}\n\t\n\t\t$.each( DataTable.settings, function (i, o) {\n\t\t\tvar head = o.nScrollHead ? $('table', o.nScrollHead)[0] : null;\n\t\t\tvar foot = o.nScrollFoot ? $('table', o.nScrollFoot)[0] : null;\n\t\n\t\t\tif ( o.nTable === t || head === t || foot === t ) {\n\t\t\t\tis = true;\n\t\t\t}\n\t\t} );\n\t\n\t\treturn is;\n\t};\n\t\n\t\n\t/**\n\t * Get all DataTable tables that have been initialised - optionally you can\n\t * select to get only currently visible tables.\n\t *\n\t *  @param {boolean} [visible=false] Flag to indicate if you want all (default)\n\t *    or visible tables only.\n\t *  @returns {array} Array of `table` nodes (not DataTable instances) which are\n\t *    DataTables\n\t *  @static\n\t *  @dtopt API-Static\n\t *\n\t *  @example\n\t *    $.each( $.fn.dataTable.tables(true), function () {\n\t *      $(table).DataTable().columns.adjust();\n\t *    } );\n\t */\n\tDataTable.tables = DataTable.fnTables = function ( visible )\n\t{\n\t\tvar api = false;\n\t\n\t\tif ( $.isPlainObject( visible ) ) {\n\t\t\tapi = visible.api;\n\t\t\tvisible = visible.visible;\n\t\t}\n\t\n\t\tvar a = $.map( DataTable.settings, function (o) {\n\t\t\tif ( !visible || (visible && $(o.nTable).is(':visible')) ) {\n\t\t\t\treturn o.nTable;\n\t\t\t}\n\t\t} );\n\t\n\t\treturn api ?\n\t\t\tnew _Api( a ) :\n\t\t\ta;\n\t};\n\t\n\t\n\t/**\n\t * Convert from camel case parameters to Hungarian notation. This is made public\n\t * for the extensions to provide the same ability as DataTables core to accept\n\t * either the 1.9 style Hungarian notation, or the 1.10+ style camelCase\n\t * parameters.\n\t *\n\t *  @param {object} src The model object which holds all parameters that can be\n\t *    mapped.\n\t *  @param {object} user The object to convert from camel case to Hungarian.\n\t *  @param {boolean} force When set to `true`, properties which already have a\n\t *    Hungarian value in the `user` object will be overwritten. Otherwise they\n\t *    won't be.\n\t */\n\tDataTable.camelToHungarian = _fnCamelToHungarian;\n\t\n\t\n\t\n\t/**\n\t *\n\t */\n\t_api_register( '$()', function ( selector, opts ) {\n\t\tvar\n\t\t\trows   = this.rows( opts ).nodes(), // Get all rows\n\t\t\tjqRows = $(rows);\n\t\n\t\treturn $( [].concat(\n\t\t\tjqRows.filter( selector ).toArray(),\n\t\t\tjqRows.find( selector ).toArray()\n\t\t) );\n\t} );\n\t\n\t\n\t// jQuery functions to operate on the tables\n\t$.each( [ 'on', 'one', 'off' ], function (i, key) {\n\t\t_api_register( key+'()', function ( /* event, handler */ ) {\n\t\t\tvar args = Array.prototype.slice.call(arguments);\n\t\n\t\t\t// Add the `dt` namespace automatically if it isn't already present\n\t\t\targs[0] = $.map( args[0].split( /\\s/ ), function ( e ) {\n\t\t\t\treturn ! e.match(/\\.dt\\b/) ?\n\t\t\t\t\te+'.dt' :\n\t\t\t\t\te;\n\t\t\t\t} ).join( ' ' );\n\t\n\t\t\tvar inst = $( this.tables().nodes() );\n\t\t\tinst[key].apply( inst, args );\n\t\t\treturn this;\n\t\t} );\n\t} );\n\t\n\t\n\t_api_register( 'clear()', function () {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\t_fnClearTable( settings );\n\t\t} );\n\t} );\n\t\n\t\n\t_api_register( 'settings()', function () {\n\t\treturn new _Api( this.context, this.context );\n\t} );\n\t\n\t\n\t_api_register( 'init()', function () {\n\t\tvar ctx = this.context;\n\t\treturn ctx.length ? ctx[0].oInit : null;\n\t} );\n\t\n\t\n\t_api_register( 'data()', function () {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\treturn _pluck( settings.aoData, '_aData' );\n\t\t} ).flatten();\n\t} );\n\t\n\t\n\t_api_register( 'destroy()', function ( remove ) {\n\t\tremove = remove || false;\n\t\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\tvar orig      = settings.nTableWrapper.parentNode;\n\t\t\tvar classes   = settings.oClasses;\n\t\t\tvar table     = settings.nTable;\n\t\t\tvar tbody     = settings.nTBody;\n\t\t\tvar thead     = settings.nTHead;\n\t\t\tvar tfoot     = settings.nTFoot;\n\t\t\tvar jqTable   = $(table);\n\t\t\tvar jqTbody   = $(tbody);\n\t\t\tvar jqWrapper = $(settings.nTableWrapper);\n\t\t\tvar rows      = $.map( settings.aoData, function (r) { return r.nTr; } );\n\t\t\tvar i, ien;\n\t\n\t\t\t// Flag to note that the table is currently being destroyed - no action\n\t\t\t// should be taken\n\t\t\tsettings.bDestroying = true;\n\t\n\t\t\t// Fire off the destroy callbacks for plug-ins etc\n\t\t\t_fnCallbackFire( settings, \"aoDestroyCallback\", \"destroy\", [settings] );\n\t\n\t\t\t// If not being removed from the document, make all columns visible\n\t\t\tif ( ! remove ) {\n\t\t\t\tnew _Api( settings ).columns().visible( true );\n\t\t\t}\n\t\n\t\t\t// Blitz all `DT` namespaced events (these are internal events, the\n\t\t\t// lowercase, `dt` events are user subscribed and they are responsible\n\t\t\t// for removing them\n\t\t\tjqWrapper.off('.DT').find(':not(tbody *)').off('.DT');\n\t\t\t$(window).off('.DT-'+settings.sInstance);\n\t\n\t\t\t// When scrolling we had to break the table up - restore it\n\t\t\tif ( table != thead.parentNode ) {\n\t\t\t\tjqTable.children('thead').detach();\n\t\t\t\tjqTable.append( thead );\n\t\t\t}\n\t\n\t\t\tif ( tfoot && table != tfoot.parentNode ) {\n\t\t\t\tjqTable.children('tfoot').detach();\n\t\t\t\tjqTable.append( tfoot );\n\t\t\t}\n\t\n\t\t\tsettings.aaSorting = [];\n\t\t\tsettings.aaSortingFixed = [];\n\t\t\t_fnSortingClasses( settings );\n\t\n\t\t\t$( rows ).removeClass( settings.asStripeClasses.join(' ') );\n\t\n\t\t\t$('th, td', thead).removeClass( classes.sSortable+' '+\n\t\t\t\tclasses.sSortableAsc+' '+classes.sSortableDesc+' '+classes.sSortableNone\n\t\t\t);\n\t\n\t\t\tif ( settings.bJUI ) {\n\t\t\t\t$('th span.'+classes.sSortIcon+ ', td span.'+classes.sSortIcon, thead).detach();\n\t\t\t\t$('th, td', thead).each( function () {\n\t\t\t\t\tvar wrapper = $('div.'+classes.sSortJUIWrapper, this);\n\t\t\t\t\t$(this).append( wrapper.contents() );\n\t\t\t\t\twrapper.detach();\n\t\t\t\t} );\n\t\t\t}\n\t\n\t\t\t// Add the TR elements back into the table in their original order\n\t\t\tjqTbody.children().detach();\n\t\t\tjqTbody.append( rows );\n\t\n\t\t\t// Remove the DataTables generated nodes, events and classes\n\t\t\tvar removedMethod = remove ? 'remove' : 'detach';\n\t\t\tjqTable[ removedMethod ]();\n\t\t\tjqWrapper[ removedMethod ]();\n\t\n\t\t\t// If we need to reattach the table to the document\n\t\t\tif ( ! remove && orig ) {\n\t\t\t\t// insertBefore acts like appendChild if !arg[1]\n\t\t\t\torig.insertBefore( table, settings.nTableReinsertBefore );\n\t\n\t\t\t\t// Restore the width of the original table - was read from the style property,\n\t\t\t\t// so we can restore directly to that\n\t\t\t\tjqTable\n\t\t\t\t\t.css( 'width', settings.sDestroyWidth )\n\t\t\t\t\t.removeClass( classes.sTable );\n\t\n\t\t\t\t// If the were originally stripe classes - then we add them back here.\n\t\t\t\t// Note this is not fool proof (for example if not all rows had stripe\n\t\t\t\t// classes - but it's a good effort without getting carried away\n\t\t\t\tien = settings.asDestroyStripes.length;\n\t\n\t\t\t\tif ( ien ) {\n\t\t\t\t\tjqTbody.children().each( function (i) {\n\t\t\t\t\t\t$(this).addClass( settings.asDestroyStripes[i % ien] );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t/* Remove the settings object from the settings array */\n\t\t\tvar idx = $.inArray( settings, DataTable.settings );\n\t\t\tif ( idx !== -1 ) {\n\t\t\t\tDataTable.settings.splice( idx, 1 );\n\t\t\t}\n\t\t} );\n\t} );\n\t\n\t\n\t// Add the `every()` method for rows, columns and cells in a compact form\n\t$.each( [ 'column', 'row', 'cell' ], function ( i, type ) {\n\t\t_api_register( type+'s().every()', function ( fn ) {\n\t\t\tvar opts = this.selector.opts;\n\t\t\tvar api = this;\n\t\n\t\t\treturn this.iterator( type, function ( settings, arg1, arg2, arg3, arg4 ) {\n\t\t\t\t// Rows and columns:\n\t\t\t\t//  arg1 - index\n\t\t\t\t//  arg2 - table counter\n\t\t\t\t//  arg3 - loop counter\n\t\t\t\t//  arg4 - undefined\n\t\t\t\t// Cells:\n\t\t\t\t//  arg1 - row index\n\t\t\t\t//  arg2 - column index\n\t\t\t\t//  arg3 - table counter\n\t\t\t\t//  arg4 - loop counter\n\t\t\t\tfn.call(\n\t\t\t\t\tapi[ type ](\n\t\t\t\t\t\targ1,\n\t\t\t\t\t\ttype==='cell' ? arg2 : opts,\n\t\t\t\t\t\ttype==='cell' ? opts : undefined\n\t\t\t\t\t),\n\t\t\t\t\targ1, arg2, arg3, arg4\n\t\t\t\t);\n\t\t\t} );\n\t\t} );\n\t} );\n\t\n\t\n\t// i18n method for extensions to be able to use the language object from the\n\t// DataTable\n\t_api_register( 'i18n()', function ( token, def, plural ) {\n\t\tvar ctx = this.context[0];\n\t\tvar resolved = _fnGetObjectDataFn( token )( ctx.oLanguage );\n\t\n\t\tif ( resolved === undefined ) {\n\t\t\tresolved = def;\n\t\t}\n\t\n\t\tif ( plural !== undefined && $.isPlainObject( resolved ) ) {\n\t\t\tresolved = resolved[ plural ] !== undefined ?\n\t\t\t\tresolved[ plural ] :\n\t\t\t\tresolved._;\n\t\t}\n\t\n\t\treturn resolved.replace( '%d', plural ); // nb: plural might be undefined,\n\t} );\n\t/**\n\t * Version string for plug-ins to check compatibility. Allowed format is\n\t * `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used\n\t * only for non-release builds. See http://semver.org/ for more information.\n\t *  @member\n\t *  @type string\n\t *  @default Version number\n\t */\n\tDataTable.version = \"1.10.15\";\n\n\t/**\n\t * Private data store, containing all of the settings objects that are\n\t * created for the tables on a given page.\n\t *\n\t * Note that the `DataTable.settings` object is aliased to\n\t * `jQuery.fn.dataTableExt` through which it may be accessed and\n\t * manipulated, or `jQuery.fn.dataTable.settings`.\n\t *  @member\n\t *  @type array\n\t *  @default []\n\t *  @private\n\t */\n\tDataTable.settings = [];\n\n\t/**\n\t * Object models container, for the various models that DataTables has\n\t * available to it. These models define the objects that are used to hold\n\t * the active state and configuration of the table.\n\t *  @namespace\n\t */\n\tDataTable.models = {};\n\t\n\t\n\t\n\t/**\n\t * Template object for the way in which DataTables holds information about\n\t * search information for the global filter and individual column filters.\n\t *  @namespace\n\t */\n\tDataTable.models.oSearch = {\n\t\t/**\n\t\t * Flag to indicate if the filtering should be case insensitive or not\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t */\n\t\t\"bCaseInsensitive\": true,\n\t\n\t\t/**\n\t\t * Applied search term\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t */\n\t\t\"sSearch\": \"\",\n\t\n\t\t/**\n\t\t * Flag to indicate if the search term should be interpreted as a\n\t\t * regular expression (true) or not (false) and therefore and special\n\t\t * regex characters escaped.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bRegex\": false,\n\t\n\t\t/**\n\t\t * Flag to indicate if DataTables is to use its smart filtering or not.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t */\n\t\t\"bSmart\": true\n\t};\n\t\n\t\n\t\n\t\n\t/**\n\t * Template object for the way in which DataTables holds information about\n\t * each individual row. This is the object format used for the settings\n\t * aoData array.\n\t *  @namespace\n\t */\n\tDataTable.models.oRow = {\n\t\t/**\n\t\t * TR element for the row\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTr\": null,\n\t\n\t\t/**\n\t\t * Array of TD elements for each row. This is null until the row has been\n\t\t * created.\n\t\t *  @type array nodes\n\t\t *  @default []\n\t\t */\n\t\t\"anCells\": null,\n\t\n\t\t/**\n\t\t * Data object from the original data source for the row. This is either\n\t\t * an array if using the traditional form of DataTables, or an object if\n\t\t * using mData options. The exact type will depend on the passed in\n\t\t * data from the data source, or will be an array if using DOM a data\n\t\t * source.\n\t\t *  @type array|object\n\t\t *  @default []\n\t\t */\n\t\t\"_aData\": [],\n\t\n\t\t/**\n\t\t * Sorting data cache - this array is ostensibly the same length as the\n\t\t * number of columns (although each index is generated only as it is\n\t\t * needed), and holds the data that is used for sorting each column in the\n\t\t * row. We do this cache generation at the start of the sort in order that\n\t\t * the formatting of the sort data need be done only once for each cell\n\t\t * per sort. This array should not be read from or written to by anything\n\t\t * other than the master sorting methods.\n\t\t *  @type array\n\t\t *  @default null\n\t\t *  @private\n\t\t */\n\t\t\"_aSortData\": null,\n\t\n\t\t/**\n\t\t * Per cell filtering data cache. As per the sort data cache, used to\n\t\t * increase the performance of the filtering in DataTables\n\t\t *  @type array\n\t\t *  @default null\n\t\t *  @private\n\t\t */\n\t\t\"_aFilterData\": null,\n\t\n\t\t/**\n\t\t * Filtering data cache. This is the same as the cell filtering cache, but\n\t\t * in this case a string rather than an array. This is easily computed with\n\t\t * a join on `_aFilterData`, but is provided as a cache so the join isn't\n\t\t * needed on every search (memory traded for performance)\n\t\t *  @type array\n\t\t *  @default null\n\t\t *  @private\n\t\t */\n\t\t\"_sFilterRow\": null,\n\t\n\t\t/**\n\t\t * Cache of the class name that DataTables has applied to the row, so we\n\t\t * can quickly look at this variable rather than needing to do a DOM check\n\t\t * on className for the nTr property.\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t *  @private\n\t\t */\n\t\t\"_sRowStripe\": \"\",\n\t\n\t\t/**\n\t\t * Denote if the original data source was from the DOM, or the data source\n\t\t * object. This is used for invalidating data, so DataTables can\n\t\t * automatically read data from the original source, unless uninstructed\n\t\t * otherwise.\n\t\t *  @type string\n\t\t *  @default null\n\t\t *  @private\n\t\t */\n\t\t\"src\": null,\n\t\n\t\t/**\n\t\t * Index in the aoData array. This saves an indexOf lookup when we have the\n\t\t * object, but want to know the index\n\t\t *  @type integer\n\t\t *  @default -1\n\t\t *  @private\n\t\t */\n\t\t\"idx\": -1\n\t};\n\t\n\t\n\t/**\n\t * Template object for the column information object in DataTables. This object\n\t * is held in the settings aoColumns array and contains all the information that\n\t * DataTables needs about each individual column.\n\t *\n\t * Note that this object is related to {@link DataTable.defaults.column}\n\t * but this one is the internal data store for DataTables's cache of columns.\n\t * It should NOT be manipulated outside of DataTables. Any configuration should\n\t * be done through the initialisation options.\n\t *  @namespace\n\t */\n\tDataTable.models.oColumn = {\n\t\t/**\n\t\t * Column index. This could be worked out on-the-fly with $.inArray, but it\n\t\t * is faster to just hold it as a variable\n\t\t *  @type integer\n\t\t *  @default null\n\t\t */\n\t\t\"idx\": null,\n\t\n\t\t/**\n\t\t * A list of the columns that sorting should occur on when this column\n\t\t * is sorted. That this property is an array allows multi-column sorting\n\t\t * to be defined for a column (for example first name / last name columns\n\t\t * would benefit from this). The values are integers pointing to the\n\t\t * columns to be sorted on (typically it will be a single integer pointing\n\t\t * at itself, but that doesn't need to be the case).\n\t\t *  @type array\n\t\t */\n\t\t\"aDataSort\": null,\n\t\n\t\t/**\n\t\t * Define the sorting directions that are applied to the column, in sequence\n\t\t * as the column is repeatedly sorted upon - i.e. the first value is used\n\t\t * as the sorting direction when the column if first sorted (clicked on).\n\t\t * Sort it again (click again) and it will move on to the next index.\n\t\t * Repeat until loop.\n\t\t *  @type array\n\t\t */\n\t\t\"asSorting\": null,\n\t\n\t\t/**\n\t\t * Flag to indicate if the column is searchable, and thus should be included\n\t\t * in the filtering or not.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bSearchable\": null,\n\t\n\t\t/**\n\t\t * Flag to indicate if the column is sortable or not.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bSortable\": null,\n\t\n\t\t/**\n\t\t * Flag to indicate if the column is currently visible in the table or not\n\t\t *  @type boolean\n\t\t */\n\t\t\"bVisible\": null,\n\t\n\t\t/**\n\t\t * Store for manual type assignment using the `column.type` option. This\n\t\t * is held in store so we can manipulate the column's `sType` property.\n\t\t *  @type string\n\t\t *  @default null\n\t\t *  @private\n\t\t */\n\t\t\"_sManualType\": null,\n\t\n\t\t/**\n\t\t * Flag to indicate if HTML5 data attributes should be used as the data\n\t\t * source for filtering or sorting. True is either are.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *  @private\n\t\t */\n\t\t\"_bAttrSrc\": false,\n\t\n\t\t/**\n\t\t * Developer definable function that is called whenever a cell is created (Ajax source,\n\t\t * etc) or processed for input (DOM source). This can be used as a compliment to mRender\n\t\t * allowing you to modify the DOM element (add background colour for example) when the\n\t\t * element is available.\n\t\t *  @type function\n\t\t *  @param {element} nTd The TD node that has been created\n\t\t *  @param {*} sData The Data for the cell\n\t\t *  @param {array|object} oData The data for the whole row\n\t\t *  @param {int} iRow The row index for the aoData data store\n\t\t *  @default null\n\t\t */\n\t\t\"fnCreatedCell\": null,\n\t\n\t\t/**\n\t\t * Function to get data from a cell in a column. You should <b>never</b>\n\t\t * access data directly through _aData internally in DataTables - always use\n\t\t * the method attached to this property. It allows mData to function as\n\t\t * required. This function is automatically assigned by the column\n\t\t * initialisation method\n\t\t *  @type function\n\t\t *  @param {array|object} oData The data array/object for the array\n\t\t *    (i.e. aoData[]._aData)\n\t\t *  @param {string} sSpecific The specific data type you want to get -\n\t\t *    'display', 'type' 'filter' 'sort'\n\t\t *  @returns {*} The data for the cell from the given row's data\n\t\t *  @default null\n\t\t */\n\t\t\"fnGetData\": null,\n\t\n\t\t/**\n\t\t * Function to set data for a cell in the column. You should <b>never</b>\n\t\t * set the data directly to _aData internally in DataTables - always use\n\t\t * this method. It allows mData to function as required. This function\n\t\t * is automatically assigned by the column initialisation method\n\t\t *  @type function\n\t\t *  @param {array|object} oData The data array/object for the array\n\t\t *    (i.e. aoData[]._aData)\n\t\t *  @param {*} sValue Value to set\n\t\t *  @default null\n\t\t */\n\t\t\"fnSetData\": null,\n\t\n\t\t/**\n\t\t * Property to read the value for the cells in the column from the data\n\t\t * source array / object. If null, then the default content is used, if a\n\t\t * function is given then the return from the function is used.\n\t\t *  @type function|int|string|null\n\t\t *  @default null\n\t\t */\n\t\t\"mData\": null,\n\t\n\t\t/**\n\t\t * Partner property to mData which is used (only when defined) to get\n\t\t * the data - i.e. it is basically the same as mData, but without the\n\t\t * 'set' option, and also the data fed to it is the result from mData.\n\t\t * This is the rendering method to match the data method of mData.\n\t\t *  @type function|int|string|null\n\t\t *  @default null\n\t\t */\n\t\t\"mRender\": null,\n\t\n\t\t/**\n\t\t * Unique header TH/TD element for this column - this is what the sorting\n\t\t * listener is attached to (if sorting is enabled.)\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTh\": null,\n\t\n\t\t/**\n\t\t * Unique footer TH/TD element for this column (if there is one). Not used\n\t\t * in DataTables as such, but can be used for plug-ins to reference the\n\t\t * footer for each column.\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTf\": null,\n\t\n\t\t/**\n\t\t * The class to apply to all TD elements in the table's TBODY for the column\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sClass\": null,\n\t\n\t\t/**\n\t\t * When DataTables calculates the column widths to assign to each column,\n\t\t * it finds the longest string in each column and then constructs a\n\t\t * temporary table and reads the widths from that. The problem with this\n\t\t * is that \"mmm\" is much wider then \"iiii\", but the latter is a longer\n\t\t * string - thus the calculation can go wrong (doing it properly and putting\n\t\t * it into an DOM object and measuring that is horribly(!) slow). Thus as\n\t\t * a \"work around\" we provide this option. It will append its value to the\n\t\t * text that is found to be the longest string for the column - i.e. padding.\n\t\t *  @type string\n\t\t */\n\t\t\"sContentPadding\": null,\n\t\n\t\t/**\n\t\t * Allows a default value to be given for a column's data, and will be used\n\t\t * whenever a null data source is encountered (this can be because mData\n\t\t * is set to null, or because the data source itself is null).\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sDefaultContent\": null,\n\t\n\t\t/**\n\t\t * Name for the column, allowing reference to the column by name as well as\n\t\t * by index (needs a lookup to work by name).\n\t\t *  @type string\n\t\t */\n\t\t\"sName\": null,\n\t\n\t\t/**\n\t\t * Custom sorting data type - defines which of the available plug-ins in\n\t\t * afnSortData the custom sorting will use - if any is defined.\n\t\t *  @type string\n\t\t *  @default std\n\t\t */\n\t\t\"sSortDataType\": 'std',\n\t\n\t\t/**\n\t\t * Class to be applied to the header element when sorting on this column\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sSortingClass\": null,\n\t\n\t\t/**\n\t\t * Class to be applied to the header element when sorting on this column -\n\t\t * when jQuery UI theming is used.\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sSortingClassJUI\": null,\n\t\n\t\t/**\n\t\t * Title of the column - what is seen in the TH element (nTh).\n\t\t *  @type string\n\t\t */\n\t\t\"sTitle\": null,\n\t\n\t\t/**\n\t\t * Column sorting and filtering type\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sType\": null,\n\t\n\t\t/**\n\t\t * Width of the column\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sWidth\": null,\n\t\n\t\t/**\n\t\t * Width of the column when it was first \"encountered\"\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sWidthOrig\": null\n\t};\n\t\n\t\n\t/*\n\t * Developer note: The properties of the object below are given in Hungarian\n\t * notation, that was used as the interface for DataTables prior to v1.10, however\n\t * from v1.10 onwards the primary interface is camel case. In order to avoid\n\t * breaking backwards compatibility utterly with this change, the Hungarian\n\t * version is still, internally the primary interface, but is is not documented\n\t * - hence the @name tags in each doc comment. This allows a Javascript function\n\t * to create a map from Hungarian notation to camel case (going the other direction\n\t * would require each property to be listed, which would at around 3K to the size\n\t * of DataTables, while this method is about a 0.5K hit.\n\t *\n\t * Ultimately this does pave the way for Hungarian notation to be dropped\n\t * completely, but that is a massive amount of work and will break current\n\t * installs (therefore is on-hold until v2).\n\t */\n\t\n\t/**\n\t * Initialisation options that can be given to DataTables at initialisation\n\t * time.\n\t *  @namespace\n\t */\n\tDataTable.defaults = {\n\t\t/**\n\t\t * An array of data to use for the table, passed in at initialisation which\n\t\t * will be used in preference to any data which is already in the DOM. This is\n\t\t * particularly useful for constructing tables purely in Javascript, for\n\t\t * example with a custom Ajax call.\n\t\t *  @type array\n\t\t *  @default null\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.data\n\t\t *\n\t\t *  @example\n\t\t *    // Using a 2D array data source\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"data\": [\n\t\t *          ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'],\n\t\t *          ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'],\n\t\t *        ],\n\t\t *        \"columns\": [\n\t\t *          { \"title\": \"Engine\" },\n\t\t *          { \"title\": \"Browser\" },\n\t\t *          { \"title\": \"Platform\" },\n\t\t *          { \"title\": \"Version\" },\n\t\t *          { \"title\": \"Grade\" }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using an array of objects as a data source (`data`)\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"data\": [\n\t\t *          {\n\t\t *            \"engine\":   \"Trident\",\n\t\t *            \"browser\":  \"Internet Explorer 4.0\",\n\t\t *            \"platform\": \"Win 95+\",\n\t\t *            \"version\":  4,\n\t\t *            \"grade\":    \"X\"\n\t\t *          },\n\t\t *          {\n\t\t *            \"engine\":   \"Trident\",\n\t\t *            \"browser\":  \"Internet Explorer 5.0\",\n\t\t *            \"platform\": \"Win 95+\",\n\t\t *            \"version\":  5,\n\t\t *            \"grade\":    \"C\"\n\t\t *          }\n\t\t *        ],\n\t\t *        \"columns\": [\n\t\t *          { \"title\": \"Engine\",   \"data\": \"engine\" },\n\t\t *          { \"title\": \"Browser\",  \"data\": \"browser\" },\n\t\t *          { \"title\": \"Platform\", \"data\": \"platform\" },\n\t\t *          { \"title\": \"Version\",  \"data\": \"version\" },\n\t\t *          { \"title\": \"Grade\",    \"data\": \"grade\" }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"aaData\": null,\n\t\n\t\n\t\t/**\n\t\t * If ordering is enabled, then DataTables will perform a first pass sort on\n\t\t * initialisation. You can define which column(s) the sort is performed\n\t\t * upon, and the sorting direction, with this variable. The `sorting` array\n\t\t * should contain an array for each column to be sorted initially containing\n\t\t * the column's index and a direction string ('asc' or 'desc').\n\t\t *  @type array\n\t\t *  @default [[0,'asc']]\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.order\n\t\t *\n\t\t *  @example\n\t\t *    // Sort by 3rd column first, and then 4th column\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"order\": [[2,'asc'], [3,'desc']]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *    // No initial sorting\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"order\": []\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"aaSorting\": [[0,'asc']],\n\t\n\t\n\t\t/**\n\t\t * This parameter is basically identical to the `sorting` parameter, but\n\t\t * cannot be overridden by user interaction with the table. What this means\n\t\t * is that you could have a column (visible or hidden) which the sorting\n\t\t * will always be forced on first - any sorting after that (from the user)\n\t\t * will then be performed as required. This can be useful for grouping rows\n\t\t * together.\n\t\t *  @type array\n\t\t *  @default null\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.orderFixed\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"orderFixed\": [[0,'asc']]\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"aaSortingFixed\": [],\n\t\n\t\n\t\t/**\n\t\t * DataTables can be instructed to load data to display in the table from a\n\t\t * Ajax source. This option defines how that Ajax call is made and where to.\n\t\t *\n\t\t * The `ajax` property has three different modes of operation, depending on\n\t\t * how it is defined. These are:\n\t\t *\n\t\t * * `string` - Set the URL from where the data should be loaded from.\n\t\t * * `object` - Define properties for `jQuery.ajax`.\n\t\t * * `function` - Custom data get function\n\t\t *\n\t\t * `string`\n\t\t * --------\n\t\t *\n\t\t * As a string, the `ajax` property simply defines the URL from which\n\t\t * DataTables will load data.\n\t\t *\n\t\t * `object`\n\t\t * --------\n\t\t *\n\t\t * As an object, the parameters in the object are passed to\n\t\t * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control\n\t\t * of the Ajax request. DataTables has a number of default parameters which\n\t\t * you can override using this option. Please refer to the jQuery\n\t\t * documentation for a full description of the options available, although\n\t\t * the following parameters provide additional options in DataTables or\n\t\t * require special consideration:\n\t\t *\n\t\t * * `data` - As with jQuery, `data` can be provided as an object, but it\n\t\t *   can also be used as a function to manipulate the data DataTables sends\n\t\t *   to the server. The function takes a single parameter, an object of\n\t\t *   parameters with the values that DataTables has readied for sending. An\n\t\t *   object may be returned which will be merged into the DataTables\n\t\t *   defaults, or you can add the items to the object that was passed in and\n\t\t *   not return anything from the function. This supersedes `fnServerParams`\n\t\t *   from DataTables 1.9-.\n\t\t *\n\t\t * * `dataSrc` - By default DataTables will look for the property `data` (or\n\t\t *   `aaData` for compatibility with DataTables 1.9-) when obtaining data\n\t\t *   from an Ajax source or for server-side processing - this parameter\n\t\t *   allows that property to be changed. You can use Javascript dotted\n\t\t *   object notation to get a data source for multiple levels of nesting, or\n\t\t *   it my be used as a function. As a function it takes a single parameter,\n\t\t *   the JSON returned from the server, which can be manipulated as\n\t\t *   required, with the returned value being that used by DataTables as the\n\t\t *   data source for the table. This supersedes `sAjaxDataProp` from\n\t\t *   DataTables 1.9-.\n\t\t *\n\t\t * * `success` - Should not be overridden it is used internally in\n\t\t *   DataTables. To manipulate / transform the data returned by the server\n\t\t *   use `ajax.dataSrc`, or use `ajax` as a function (see below).\n\t\t *\n\t\t * `function`\n\t\t * ----------\n\t\t *\n\t\t * As a function, making the Ajax call is left up to yourself allowing\n\t\t * complete control of the Ajax request. Indeed, if desired, a method other\n\t\t * than Ajax could be used to obtain the required data, such as Web storage\n\t\t * or an AIR database.\n\t\t *\n\t\t * The function is given four parameters and no return is required. The\n\t\t * parameters are:\n\t\t *\n\t\t * 1. _object_ - Data to send to the server\n\t\t * 2. _function_ - Callback function that must be executed when the required\n\t\t *    data has been obtained. That data should be passed into the callback\n\t\t *    as the only parameter\n\t\t * 3. _object_ - DataTables settings object for the table\n\t\t *\n\t\t * Note that this supersedes `fnServerData` from DataTables 1.9-.\n\t\t *\n\t\t *  @type string|object|function\n\t\t *  @default null\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.ajax\n\t\t *  @since 1.10.0\n\t\t *\n\t\t * @example\n\t\t *   // Get JSON data from a file via Ajax.\n\t\t *   // Note DataTables expects data in the form `{ data: [ ...data... ] }` by default).\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": \"data.json\"\n\t\t *   } );\n\t\t *\n\t\t * @example\n\t\t *   // Get JSON data from a file via Ajax, using `dataSrc` to change\n\t\t *   // `data` to `tableData` (i.e. `{ tableData: [ ...data... ] }`)\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": {\n\t\t *       \"url\": \"data.json\",\n\t\t *       \"dataSrc\": \"tableData\"\n\t\t *     }\n\t\t *   } );\n\t\t *\n\t\t * @example\n\t\t *   // Get JSON data from a file via Ajax, using `dataSrc` to read data\n\t\t *   // from a plain array rather than an array in an object\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": {\n\t\t *       \"url\": \"data.json\",\n\t\t *       \"dataSrc\": \"\"\n\t\t *     }\n\t\t *   } );\n\t\t *\n\t\t * @example\n\t\t *   // Manipulate the data returned from the server - add a link to data\n\t\t *   // (note this can, should, be done using `render` for the column - this\n\t\t *   // is just a simple example of how the data can be manipulated).\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": {\n\t\t *       \"url\": \"data.json\",\n\t\t *       \"dataSrc\": function ( json ) {\n\t\t *         for ( var i=0, ien=json.length ; i<ien ; i++ ) {\n\t\t *           json[i][0] = '<a href=\"/message/'+json[i][0]+'>View message</a>';\n\t\t *         }\n\t\t *         return json;\n\t\t *       }\n\t\t *     }\n\t\t *   } );\n\t\t *\n\t\t * @example\n\t\t *   // Add data to the request\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": {\n\t\t *       \"url\": \"data.json\",\n\t\t *       \"data\": function ( d ) {\n\t\t *         return {\n\t\t *           \"extra_search\": $('#extra').val()\n\t\t *         };\n\t\t *       }\n\t\t *     }\n\t\t *   } );\n\t\t *\n\t\t * @example\n\t\t *   // Send request as POST\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": {\n\t\t *       \"url\": \"data.json\",\n\t\t *       \"type\": \"POST\"\n\t\t *     }\n\t\t *   } );\n\t\t *\n\t\t * @example\n\t\t *   // Get the data from localStorage (could interface with a form for\n\t\t *   // adding, editing and removing rows).\n\t\t *   $('#example').dataTable( {\n\t\t *     \"ajax\": function (data, callback, settings) {\n\t\t *       callback(\n\t\t *         JSON.parse( localStorage.getItem('dataTablesData') )\n\t\t *       );\n\t\t *     }\n\t\t *   } );\n\t\t */\n\t\t\"ajax\": null,\n\t\n\t\n\t\t/**\n\t\t * This parameter allows you to readily specify the entries in the length drop\n\t\t * down menu that DataTables shows when pagination is enabled. It can be\n\t\t * either a 1D array of options which will be used for both the displayed\n\t\t * option and the value, or a 2D array which will use the array in the first\n\t\t * position as the value, and the array in the second position as the\n\t\t * displayed options (useful for language strings such as 'All').\n\t\t *\n\t\t * Note that the `pageLength` property will be automatically set to the\n\t\t * first value given in this array, unless `pageLength` is also provided.\n\t\t *  @type array\n\t\t *  @default [ 10, 25, 50, 100 ]\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.lengthMenu\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"lengthMenu\": [[10, 25, 50, -1], [10, 25, 50, \"All\"]]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"aLengthMenu\": [ 10, 25, 50, 100 ],\n\t\n\t\n\t\t/**\n\t\t * The `columns` option in the initialisation parameter allows you to define\n\t\t * details about the way individual columns behave. For a full list of\n\t\t * column options that can be set, please see\n\t\t * {@link DataTable.defaults.column}. Note that if you use `columns` to\n\t\t * define your columns, you must have an entry in the array for every single\n\t\t * column that you have in your table (these can be null if you don't which\n\t\t * to specify any options).\n\t\t *  @member\n\t\t *\n\t\t *  @name DataTable.defaults.column\n\t\t */\n\t\t\"aoColumns\": null,\n\t\n\t\t/**\n\t\t * Very similar to `columns`, `columnDefs` allows you to target a specific\n\t\t * column, multiple columns, or all columns, using the `targets` property of\n\t\t * each object in the array. This allows great flexibility when creating\n\t\t * tables, as the `columnDefs` arrays can be of any length, targeting the\n\t\t * columns you specifically want. `columnDefs` may use any of the column\n\t\t * options available: {@link DataTable.defaults.column}, but it _must_\n\t\t * have `targets` defined in each object in the array. Values in the `targets`\n\t\t * array may be:\n\t\t *   <ul>\n\t\t *     <li>a string - class name will be matched on the TH for the column</li>\n\t\t *     <li>0 or a positive integer - column index counting from the left</li>\n\t\t *     <li>a negative integer - column index counting from the right</li>\n\t\t *     <li>the string \"_all\" - all columns (i.e. assign a default)</li>\n\t\t *   </ul>\n\t\t *  @member\n\t\t *\n\t\t *  @name DataTable.defaults.columnDefs\n\t\t */\n\t\t\"aoColumnDefs\": null,\n\t\n\t\n\t\t/**\n\t\t * Basically the same as `search`, this parameter defines the individual column\n\t\t * filtering state at initialisation time. The array must be of the same size\n\t\t * as the number of columns, and each element be an object with the parameters\n\t\t * `search` and `escapeRegex` (the latter is optional). 'null' is also\n\t\t * accepted and the default will be used.\n\t\t *  @type array\n\t\t *  @default []\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.searchCols\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"searchCols\": [\n\t\t *          null,\n\t\t *          { \"search\": \"My filter\" },\n\t\t *          null,\n\t\t *          { \"search\": \"^[0-9]\", \"escapeRegex\": false }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"aoSearchCols\": [],\n\t\n\t\n\t\t/**\n\t\t * An array of CSS classes that should be applied to displayed rows. This\n\t\t * array may be of any length, and DataTables will apply each class\n\t\t * sequentially, looping when required.\n\t\t *  @type array\n\t\t *  @default null <i>Will take the values determined by the `oClasses.stripe*`\n\t\t *    options</i>\n\t\t *\n\t\t *  @dtopt Option\n\t\t *  @name DataTable.defaults.stripeClasses\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stripeClasses\": [ 'strip1', 'strip2', 'strip3' ]\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"asStripeClasses\": null,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable automatic column width calculation. This can be disabled\n\t\t * as an optimisation (it takes some time to calculate the widths) if the\n\t\t * tables widths are passed in using `columns`.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.autoWidth\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"autoWidth\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bAutoWidth\": true,\n\t\n\t\n\t\t/**\n\t\t * Deferred rendering can provide DataTables with a huge speed boost when you\n\t\t * are using an Ajax or JS data source for the table. This option, when set to\n\t\t * true, will cause DataTables to defer the creation of the table elements for\n\t\t * each row until they are needed for a draw - saving a significant amount of\n\t\t * time.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.deferRender\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"ajax\": \"sources/arrays.txt\",\n\t\t *        \"deferRender\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bDeferRender\": false,\n\t\n\t\n\t\t/**\n\t\t * Replace a DataTable which matches the given selector and replace it with\n\t\t * one which has the properties of the new initialisation object passed. If no\n\t\t * table matches the selector, then the new DataTable will be constructed as\n\t\t * per normal.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.destroy\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"srollY\": \"200px\",\n\t\t *        \"paginate\": false\n\t\t *      } );\n\t\t *\n\t\t *      // Some time later....\n\t\t *      $('#example').dataTable( {\n\t\t *        \"filter\": false,\n\t\t *        \"destroy\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bDestroy\": false,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable filtering of data. Filtering in DataTables is \"smart\" in\n\t\t * that it allows the end user to input multiple words (space separated) and\n\t\t * will match a row containing those words, even if not in the order that was\n\t\t * specified (this allow matching across multiple columns). Note that if you\n\t\t * wish to use filtering in DataTables this must remain 'true' - to remove the\n\t\t * default filtering input box and retain filtering abilities, please use\n\t\t * {@link DataTable.defaults.dom}.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.searching\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"searching\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bFilter\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable the table information display. This shows information\n\t\t * about the data that is currently visible on the page, including information\n\t\t * about filtered data if that action is being performed.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.info\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"info\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bInfo\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable jQuery UI ThemeRoller support (required as ThemeRoller requires some\n\t\t * slightly different and additional mark-up from what DataTables has\n\t\t * traditionally used).\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.jQueryUI\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"jQueryUI\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bJQueryUI\": false,\n\t\n\t\n\t\t/**\n\t\t * Allows the end user to select the size of a formatted page from a select\n\t\t * menu (sizes are 10, 25, 50 and 100). Requires pagination (`paginate`).\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.lengthChange\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"lengthChange\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bLengthChange\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable pagination.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.paging\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"paging\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bPaginate\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable the display of a 'processing' indicator when the table is\n\t\t * being processed (e.g. a sort). This is particularly useful for tables with\n\t\t * large amounts of data where it can take a noticeable amount of time to sort\n\t\t * the entries.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.processing\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"processing\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bProcessing\": false,\n\t\n\t\n\t\t/**\n\t\t * Retrieve the DataTables object for the given selector. Note that if the\n\t\t * table has already been initialised, this parameter will cause DataTables\n\t\t * to simply return the object that has already been set up - it will not take\n\t\t * account of any changes you might have made to the initialisation object\n\t\t * passed to DataTables (setting this parameter to true is an acknowledgement\n\t\t * that you understand this). `destroy` can be used to reinitialise a table if\n\t\t * you need.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.retrieve\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      initTable();\n\t\t *      tableActions();\n\t\t *    } );\n\t\t *\n\t\t *    function initTable ()\n\t\t *    {\n\t\t *      return $('#example').dataTable( {\n\t\t *        \"scrollY\": \"200px\",\n\t\t *        \"paginate\": false,\n\t\t *        \"retrieve\": true\n\t\t *      } );\n\t\t *    }\n\t\t *\n\t\t *    function tableActions ()\n\t\t *    {\n\t\t *      var table = initTable();\n\t\t *      // perform API operations with oTable\n\t\t *    }\n\t\t */\n\t\t\"bRetrieve\": false,\n\t\n\t\n\t\t/**\n\t\t * When vertical (y) scrolling is enabled, DataTables will force the height of\n\t\t * the table's viewport to the given height at all times (useful for layout).\n\t\t * However, this can look odd when filtering data down to a small data set,\n\t\t * and the footer is left \"floating\" further down. This parameter (when\n\t\t * enabled) will cause DataTables to collapse the table's viewport down when\n\t\t * the result set will fit within the given Y height.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.scrollCollapse\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"scrollY\": \"200\",\n\t\t *        \"scrollCollapse\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bScrollCollapse\": false,\n\t\n\t\n\t\t/**\n\t\t * Configure DataTables to use server-side processing. Note that the\n\t\t * `ajax` parameter must also be given in order to give DataTables a\n\t\t * source to obtain the required data for each draw.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @dtopt Server-side\n\t\t *  @name DataTable.defaults.serverSide\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"serverSide\": true,\n\t\t *        \"ajax\": \"xhr.php\"\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bServerSide\": false,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable sorting of columns. Sorting of individual columns can be\n\t\t * disabled by the `sortable` option for each column.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.ordering\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"ordering\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bSort\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or display DataTables' ability to sort multiple columns at the\n\t\t * same time (activated by shift-click by the user).\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.orderMulti\n\t\t *\n\t\t *  @example\n\t\t *    // Disable multiple column sorting ability\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"orderMulti\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bSortMulti\": true,\n\t\n\t\n\t\t/**\n\t\t * Allows control over whether DataTables should use the top (true) unique\n\t\t * cell that is found for a single column, or the bottom (false - default).\n\t\t * This is useful when using complex headers.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.orderCellsTop\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"orderCellsTop\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bSortCellsTop\": false,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable the addition of the classes `sorting\\_1`, `sorting\\_2` and\n\t\t * `sorting\\_3` to the columns which are currently being sorted on. This is\n\t\t * presented as a feature switch as it can increase processing time (while\n\t\t * classes are removed and added) so for large data sets you might want to\n\t\t * turn this off.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.orderClasses\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"orderClasses\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bSortClasses\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable state saving. When enabled HTML5 `localStorage` will be\n\t\t * used to save table display information such as pagination information,\n\t\t * display length, filtering and sorting. As such when the end user reloads\n\t\t * the page the display display will match what thy had previously set up.\n\t\t *\n\t\t * Due to the use of `localStorage` the default state saving is not supported\n\t\t * in IE6 or 7. If state saving is required in those browsers, use\n\t\t * `stateSaveCallback` to provide a storage solution such as cookies.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.stateSave\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function () {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"bStateSave\": false,\n\t\n\t\n\t\t/**\n\t\t * This function is called when a TR element is created (and all TD child\n\t\t * elements have been inserted), or registered if using a DOM source, allowing\n\t\t * manipulation of the TR element (adding classes etc).\n\t\t *  @type function\n\t\t *  @param {node} row \"TR\" element for the current row\n\t\t *  @param {array} data Raw data array for this row\n\t\t *  @param {int} dataIndex The index of this row in the internal aoData array\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.createdRow\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"createdRow\": function( row, data, dataIndex ) {\n\t\t *          // Bold the grade for all 'A' grade browsers\n\t\t *          if ( data[4] == \"A\" )\n\t\t *          {\n\t\t *            $('td:eq(4)', row).html( '<b>A</b>' );\n\t\t *          }\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnCreatedRow\": null,\n\t\n\t\n\t\t/**\n\t\t * This function is called on every 'draw' event, and allows you to\n\t\t * dynamically modify any aspect you want about the created DOM.\n\t\t *  @type function\n\t\t *  @param {object} settings DataTables settings object\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.drawCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"drawCallback\": function( settings ) {\n\t\t *          alert( 'DataTables has redrawn the table' );\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnDrawCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * Identical to fnHeaderCallback() but for the table footer this function\n\t\t * allows you to modify the table footer on every 'draw' event.\n\t\t *  @type function\n\t\t *  @param {node} foot \"TR\" element for the footer\n\t\t *  @param {array} data Full table data (as derived from the original HTML)\n\t\t *  @param {int} start Index for the current display starting point in the\n\t\t *    display array\n\t\t *  @param {int} end Index for the current display ending point in the\n\t\t *    display array\n\t\t *  @param {array int} display Index array to translate the visual position\n\t\t *    to the full data array\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.footerCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"footerCallback\": function( tfoot, data, start, end, display ) {\n\t\t *          tfoot.getElementsByTagName('th')[0].innerHTML = \"Starting index is \"+start;\n\t\t *        }\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"fnFooterCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * When rendering large numbers in the information element for the table\n\t\t * (i.e. \"Showing 1 to 10 of 57 entries\") DataTables will render large numbers\n\t\t * to have a comma separator for the 'thousands' units (e.g. 1 million is\n\t\t * rendered as \"1,000,000\") to help readability for the end user. This\n\t\t * function will override the default method DataTables uses.\n\t\t *  @type function\n\t\t *  @member\n\t\t *  @param {int} toFormat number to be formatted\n\t\t *  @returns {string} formatted string for DataTables to show the number\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.formatNumber\n\t\t *\n\t\t *  @example\n\t\t *    // Format a number using a single quote for the separator (note that\n\t\t *    // this can also be done with the language.thousands option)\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"formatNumber\": function ( toFormat ) {\n\t\t *          return toFormat.toString().replace(\n\t\t *            /\\B(?=(\\d{3})+(?!\\d))/g, \"'\"\n\t\t *          );\n\t\t *        };\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnFormatNumber\": function ( toFormat ) {\n\t\t\treturn toFormat.toString().replace(\n\t\t\t\t/\\B(?=(\\d{3})+(?!\\d))/g,\n\t\t\t\tthis.oLanguage.sThousands\n\t\t\t);\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * This function is called on every 'draw' event, and allows you to\n\t\t * dynamically modify the header row. This can be used to calculate and\n\t\t * display useful information about the table.\n\t\t *  @type function\n\t\t *  @param {node} head \"TR\" element for the header\n\t\t *  @param {array} data Full table data (as derived from the original HTML)\n\t\t *  @param {int} start Index for the current display starting point in the\n\t\t *    display array\n\t\t *  @param {int} end Index for the current display ending point in the\n\t\t *    display array\n\t\t *  @param {array int} display Index array to translate the visual position\n\t\t *    to the full data array\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.headerCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"fheaderCallback\": function( head, data, start, end, display ) {\n\t\t *          head.getElementsByTagName('th')[0].innerHTML = \"Displaying \"+(end-start)+\" records\";\n\t\t *        }\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"fnHeaderCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * The information element can be used to convey information about the current\n\t\t * state of the table. Although the internationalisation options presented by\n\t\t * DataTables are quite capable of dealing with most customisations, there may\n\t\t * be times where you wish to customise the string further. This callback\n\t\t * allows you to do exactly that.\n\t\t *  @type function\n\t\t *  @param {object} oSettings DataTables settings object\n\t\t *  @param {int} start Starting position in data for the draw\n\t\t *  @param {int} end End position in data for the draw\n\t\t *  @param {int} max Total number of rows in the table (regardless of\n\t\t *    filtering)\n\t\t *  @param {int} total Total number of rows in the data set, after filtering\n\t\t *  @param {string} pre The string that DataTables has formatted using it's\n\t\t *    own rules\n\t\t *  @returns {string} The string to be displayed in the information element.\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.infoCallback\n\t\t *\n\t\t *  @example\n\t\t *    $('#example').dataTable( {\n\t\t *      \"infoCallback\": function( settings, start, end, max, total, pre ) {\n\t\t *        return start +\" to \"+ end;\n\t\t *      }\n\t\t *    } );\n\t\t */\n\t\t\"fnInfoCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * Called when the table has been initialised. Normally DataTables will\n\t\t * initialise sequentially and there will be no need for this function,\n\t\t * however, this does not hold true when using external language information\n\t\t * since that is obtained using an async XHR call.\n\t\t *  @type function\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @param {object} json The JSON object request from the server - only\n\t\t *    present if client-side Ajax sourced data is used\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.initComplete\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"initComplete\": function(settings, json) {\n\t\t *          alert( 'DataTables has finished its initialisation.' );\n\t\t *        }\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"fnInitComplete\": null,\n\t\n\t\n\t\t/**\n\t\t * Called at the very start of each table draw and can be used to cancel the\n\t\t * draw by returning false, any other return (including undefined) results in\n\t\t * the full draw occurring).\n\t\t *  @type function\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @returns {boolean} False will cancel the draw, anything else (including no\n\t\t *    return) will allow it to complete.\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.preDrawCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"preDrawCallback\": function( settings ) {\n\t\t *          if ( $('#test').val() == 1 ) {\n\t\t *            return false;\n\t\t *          }\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnPreDrawCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * This function allows you to 'post process' each row after it have been\n\t\t * generated for each table draw, but before it is rendered on screen. This\n\t\t * function might be used for setting the row class name etc.\n\t\t *  @type function\n\t\t *  @param {node} row \"TR\" element for the current row\n\t\t *  @param {array} data Raw data array for this row\n\t\t *  @param {int} displayIndex The display index for the current table draw\n\t\t *  @param {int} displayIndexFull The index of the data in the full list of\n\t\t *    rows (after filtering)\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.rowCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"rowCallback\": function( row, data, displayIndex, displayIndexFull ) {\n\t\t *          // Bold the grade for all 'A' grade browsers\n\t\t *          if ( data[4] == \"A\" ) {\n\t\t *            $('td:eq(4)', row).html( '<b>A</b>' );\n\t\t *          }\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnRowCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t *\n\t\t * This parameter allows you to override the default function which obtains\n\t\t * the data from the server so something more suitable for your application.\n\t\t * For example you could use POST data, or pull information from a Gears or\n\t\t * AIR database.\n\t\t *  @type function\n\t\t *  @member\n\t\t *  @param {string} source HTTP source to obtain the data from (`ajax`)\n\t\t *  @param {array} data A key/value pair object containing the data to send\n\t\t *    to the server\n\t\t *  @param {function} callback to be called on completion of the data get\n\t\t *    process that will draw the data on the page.\n\t\t *  @param {object} settings DataTables settings object\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @dtopt Server-side\n\t\t *  @name DataTable.defaults.serverData\n\t\t *\n\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t */\n\t\t\"fnServerData\": null,\n\t\n\t\n\t\t/**\n\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t *\n\t\t *  It is often useful to send extra data to the server when making an Ajax\n\t\t * request - for example custom filtering information, and this callback\n\t\t * function makes it trivial to send extra information to the server. The\n\t\t * passed in parameter is the data set that has been constructed by\n\t\t * DataTables, and you can add to this or modify it as you require.\n\t\t *  @type function\n\t\t *  @param {array} data Data array (array of objects which are name/value\n\t\t *    pairs) that has been constructed by DataTables and will be sent to the\n\t\t *    server. In the case of Ajax sourced data with server-side processing\n\t\t *    this will be an empty array, for server-side processing there will be a\n\t\t *    significant number of parameters!\n\t\t *  @returns {undefined} Ensure that you modify the data array passed in,\n\t\t *    as this is passed by reference.\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @dtopt Server-side\n\t\t *  @name DataTable.defaults.serverParams\n\t\t *\n\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t */\n\t\t\"fnServerParams\": null,\n\t\n\t\n\t\t/**\n\t\t * Load the table state. With this function you can define from where, and how, the\n\t\t * state of a table is loaded. By default DataTables will load from `localStorage`\n\t\t * but you might wish to use a server-side database or cookies.\n\t\t *  @type function\n\t\t *  @member\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @param {object} callback Callback that can be executed when done. It\n\t\t *    should be passed the loaded state object.\n\t\t *  @return {object} The DataTables state object to be loaded\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.stateLoadCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true,\n\t\t *        \"stateLoadCallback\": function (settings, callback) {\n\t\t *          $.ajax( {\n\t\t *            \"url\": \"/state_load\",\n\t\t *            \"dataType\": \"json\",\n\t\t *            \"success\": function (json) {\n\t\t *              callback( json );\n\t\t *            }\n\t\t *          } );\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnStateLoadCallback\": function ( settings ) {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(\n\t\t\t\t\t(settings.iStateDuration === -1 ? sessionStorage : localStorage).getItem(\n\t\t\t\t\t\t'DataTables_'+settings.sInstance+'_'+location.pathname\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} catch (e) {}\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * Callback which allows modification of the saved state prior to loading that state.\n\t\t * This callback is called when the table is loading state from the stored data, but\n\t\t * prior to the settings object being modified by the saved state. Note that for\n\t\t * plug-in authors, you should use the `stateLoadParams` event to load parameters for\n\t\t * a plug-in.\n\t\t *  @type function\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @param {object} data The state object that is to be loaded\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.stateLoadParams\n\t\t *\n\t\t *  @example\n\t\t *    // Remove a saved filter, so filtering is never loaded\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true,\n\t\t *        \"stateLoadParams\": function (settings, data) {\n\t\t *          data.oSearch.sSearch = \"\";\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Disallow state loading by returning false\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true,\n\t\t *        \"stateLoadParams\": function (settings, data) {\n\t\t *          return false;\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnStateLoadParams\": null,\n\t\n\t\n\t\t/**\n\t\t * Callback that is called when the state has been loaded from the state saving method\n\t\t * and the DataTables settings object has been modified as a result of the loaded state.\n\t\t *  @type function\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @param {object} data The state object that was loaded\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.stateLoaded\n\t\t *\n\t\t *  @example\n\t\t *    // Show an alert with the filtering value that was saved\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true,\n\t\t *        \"stateLoaded\": function (settings, data) {\n\t\t *          alert( 'Saved filter was: '+data.oSearch.sSearch );\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnStateLoaded\": null,\n\t\n\t\n\t\t/**\n\t\t * Save the table state. This function allows you to define where and how the state\n\t\t * information for the table is stored By default DataTables will use `localStorage`\n\t\t * but you might wish to use a server-side database or cookies.\n\t\t *  @type function\n\t\t *  @member\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @param {object} data The state object to be saved\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.stateSaveCallback\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true,\n\t\t *        \"stateSaveCallback\": function (settings, data) {\n\t\t *          // Send an Ajax request to the server with the state object\n\t\t *          $.ajax( {\n\t\t *            \"url\": \"/state_save\",\n\t\t *            \"data\": data,\n\t\t *            \"dataType\": \"json\",\n\t\t *            \"method\": \"POST\"\n\t\t *            \"success\": function () {}\n\t\t *          } );\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnStateSaveCallback\": function ( settings, data ) {\n\t\t\ttry {\n\t\t\t\t(settings.iStateDuration === -1 ? sessionStorage : localStorage).setItem(\n\t\t\t\t\t'DataTables_'+settings.sInstance+'_'+location.pathname,\n\t\t\t\t\tJSON.stringify( data )\n\t\t\t\t);\n\t\t\t} catch (e) {}\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * Callback which allows modification of the state to be saved. Called when the table\n\t\t * has changed state a new state save is required. This method allows modification of\n\t\t * the state saving object prior to actually doing the save, including addition or\n\t\t * other state properties or modification. Note that for plug-in authors, you should\n\t\t * use the `stateSaveParams` event to save parameters for a plug-in.\n\t\t *  @type function\n\t\t *  @param {object} settings DataTables settings object\n\t\t *  @param {object} data The state object to be saved\n\t\t *\n\t\t *  @dtopt Callbacks\n\t\t *  @name DataTable.defaults.stateSaveParams\n\t\t *\n\t\t *  @example\n\t\t *    // Remove a saved filter, so filtering is never saved\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateSave\": true,\n\t\t *        \"stateSaveParams\": function (settings, data) {\n\t\t *          data.oSearch.sSearch = \"\";\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"fnStateSaveParams\": null,\n\t\n\t\n\t\t/**\n\t\t * Duration for which the saved state information is considered valid. After this period\n\t\t * has elapsed the state will be returned to the default.\n\t\t * Value is given in seconds.\n\t\t *  @type int\n\t\t *  @default 7200 <i>(2 hours)</i>\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.stateDuration\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"stateDuration\": 60*60*24; // 1 day\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"iStateDuration\": 7200,\n\t\n\t\n\t\t/**\n\t\t * When enabled DataTables will not make a request to the server for the first\n\t\t * page draw - rather it will use the data already on the page (no sorting etc\n\t\t * will be applied to it), thus saving on an XHR at load time. `deferLoading`\n\t\t * is used to indicate that deferred loading is required, but it is also used\n\t\t * to tell DataTables how many records there are in the full table (allowing\n\t\t * the information element and pagination to be displayed correctly). In the case\n\t\t * where a filtering is applied to the table on initial load, this can be\n\t\t * indicated by giving the parameter as an array, where the first element is\n\t\t * the number of records available after filtering and the second element is the\n\t\t * number of records without filtering (allowing the table information element\n\t\t * to be shown correctly).\n\t\t *  @type int | array\n\t\t *  @default null\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.deferLoading\n\t\t *\n\t\t *  @example\n\t\t *    // 57 records available in the table, no filtering applied\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"serverSide\": true,\n\t\t *        \"ajax\": \"scripts/server_processing.php\",\n\t\t *        \"deferLoading\": 57\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // 57 records after filtering, 100 without filtering (an initial filter applied)\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"serverSide\": true,\n\t\t *        \"ajax\": \"scripts/server_processing.php\",\n\t\t *        \"deferLoading\": [ 57, 100 ],\n\t\t *        \"search\": {\n\t\t *          \"search\": \"my_filter\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"iDeferLoading\": null,\n\t\n\t\n\t\t/**\n\t\t * Number of rows to display on a single page when using pagination. If\n\t\t * feature enabled (`lengthChange`) then the end user will be able to override\n\t\t * this to a custom setting using a pop-up menu.\n\t\t *  @type int\n\t\t *  @default 10\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.pageLength\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"pageLength\": 50\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"iDisplayLength\": 10,\n\t\n\t\n\t\t/**\n\t\t * Define the starting point for data display when using DataTables with\n\t\t * pagination. Note that this parameter is the number of records, rather than\n\t\t * the page number, so if you have 10 records per page and want to start on\n\t\t * the third page, it should be \"20\".\n\t\t *  @type int\n\t\t *  @default 0\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.displayStart\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"displayStart\": 20\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"iDisplayStart\": 0,\n\t\n\t\n\t\t/**\n\t\t * By default DataTables allows keyboard navigation of the table (sorting, paging,\n\t\t * and filtering) by adding a `tabindex` attribute to the required elements. This\n\t\t * allows you to tab through the controls and press the enter key to activate them.\n\t\t * The tabindex is default 0, meaning that the tab follows the flow of the document.\n\t\t * You can overrule this using this parameter if you wish. Use a value of -1 to\n\t\t * disable built-in keyboard navigation.\n\t\t *  @type int\n\t\t *  @default 0\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.tabIndex\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"tabIndex\": 1\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"iTabIndex\": 0,\n\t\n\t\n\t\t/**\n\t\t * Classes that DataTables assigns to the various components and features\n\t\t * that it adds to the HTML table. This allows classes to be configured\n\t\t * during initialisation in addition to through the static\n\t\t * {@link DataTable.ext.oStdClasses} object).\n\t\t *  @namespace\n\t\t *  @name DataTable.defaults.classes\n\t\t */\n\t\t\"oClasses\": {},\n\t\n\t\n\t\t/**\n\t\t * All strings that DataTables uses in the user interface that it creates\n\t\t * are defined in this object, allowing you to modified them individually or\n\t\t * completely replace them all as required.\n\t\t *  @namespace\n\t\t *  @name DataTable.defaults.language\n\t\t */\n\t\t\"oLanguage\": {\n\t\t\t/**\n\t\t\t * Strings that are used for WAI-ARIA labels and controls only (these are not\n\t\t\t * actually visible on the page, but will be read by screenreaders, and thus\n\t\t\t * must be internationalised as well).\n\t\t\t *  @namespace\n\t\t\t *  @name DataTable.defaults.language.aria\n\t\t\t */\n\t\t\t\"oAria\": {\n\t\t\t\t/**\n\t\t\t\t * ARIA label that is added to the table headers when the column may be\n\t\t\t\t * sorted ascending by activing the column (click or return when focused).\n\t\t\t\t * Note that the column header is prefixed to this string.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default : activate to sort column ascending\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.aria.sortAscending\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"aria\": {\n\t\t\t\t *            \"sortAscending\": \" - click/return to sort ascending\"\n\t\t\t\t *          }\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sSortAscending\": \": activate to sort column ascending\",\n\t\n\t\t\t\t/**\n\t\t\t\t * ARIA label that is added to the table headers when the column may be\n\t\t\t\t * sorted descending by activing the column (click or return when focused).\n\t\t\t\t * Note that the column header is prefixed to this string.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default : activate to sort column ascending\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.aria.sortDescending\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"aria\": {\n\t\t\t\t *            \"sortDescending\": \" - click/return to sort descending\"\n\t\t\t\t *          }\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sSortDescending\": \": activate to sort column descending\"\n\t\t\t},\n\t\n\t\t\t/**\n\t\t\t * Pagination string used by DataTables for the built-in pagination\n\t\t\t * control types.\n\t\t\t *  @namespace\n\t\t\t *  @name DataTable.defaults.language.paginate\n\t\t\t */\n\t\t\t\"oPaginate\": {\n\t\t\t\t/**\n\t\t\t\t * Text to use when using the 'full_numbers' type of pagination for the\n\t\t\t\t * button to take the user to the first page.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default First\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.paginate.first\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"paginate\": {\n\t\t\t\t *            \"first\": \"First page\"\n\t\t\t\t *          }\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sFirst\": \"First\",\n\t\n\t\n\t\t\t\t/**\n\t\t\t\t * Text to use when using the 'full_numbers' type of pagination for the\n\t\t\t\t * button to take the user to the last page.\n\t\t\t\t *  @type string\n\t\t\t\t *  @default Last\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.paginate.last\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"paginate\": {\n\t\t\t\t *            \"last\": \"Last page\"\n\t\t\t\t *          }\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sLast\": \"Last\",\n\t\n\t\n\t\t\t\t/**\n\t\t\t\t * Text to use for the 'next' pagination button (to take the user to the\n\t\t\t\t * next page).\n\t\t\t\t *  @type string\n\t\t\t\t *  @default Next\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.paginate.next\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"paginate\": {\n\t\t\t\t *            \"next\": \"Next page\"\n\t\t\t\t *          }\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sNext\": \"Next\",\n\t\n\t\n\t\t\t\t/**\n\t\t\t\t * Text to use for the 'previous' pagination button (to take the user to\n\t\t\t\t * the previous page).\n\t\t\t\t *  @type string\n\t\t\t\t *  @default Previous\n\t\t\t\t *\n\t\t\t\t *  @dtopt Language\n\t\t\t\t *  @name DataTable.defaults.language.paginate.previous\n\t\t\t\t *\n\t\t\t\t *  @example\n\t\t\t\t *    $(document).ready( function() {\n\t\t\t\t *      $('#example').dataTable( {\n\t\t\t\t *        \"language\": {\n\t\t\t\t *          \"paginate\": {\n\t\t\t\t *            \"previous\": \"Previous page\"\n\t\t\t\t *          }\n\t\t\t\t *        }\n\t\t\t\t *      } );\n\t\t\t\t *    } );\n\t\t\t\t */\n\t\t\t\t\"sPrevious\": \"Previous\"\n\t\t\t},\n\t\n\t\t\t/**\n\t\t\t * This string is shown in preference to `zeroRecords` when the table is\n\t\t\t * empty of data (regardless of filtering). Note that this is an optional\n\t\t\t * parameter - if it is not given, the value of `zeroRecords` will be used\n\t\t\t * instead (either the default or given value).\n\t\t\t *  @type string\n\t\t\t *  @default No data available in table\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.emptyTable\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"emptyTable\": \"No data available in table\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sEmptyTable\": \"No data available in table\",\n\t\n\t\n\t\t\t/**\n\t\t\t * This string gives information to the end user about the information\n\t\t\t * that is current on display on the page. The following tokens can be\n\t\t\t * used in the string and will be dynamically replaced as the table\n\t\t\t * display updates. This tokens can be placed anywhere in the string, or\n\t\t\t * removed as needed by the language requires:\n\t\t\t *\n\t\t\t * * `\\_START\\_` - Display index of the first record on the current page\n\t\t\t * * `\\_END\\_` - Display index of the last record on the current page\n\t\t\t * * `\\_TOTAL\\_` - Number of records in the table after filtering\n\t\t\t * * `\\_MAX\\_` - Number of records in the table without filtering\n\t\t\t * * `\\_PAGE\\_` - Current page number\n\t\t\t * * `\\_PAGES\\_` - Total number of pages of data in the table\n\t\t\t *\n\t\t\t *  @type string\n\t\t\t *  @default Showing _START_ to _END_ of _TOTAL_ entries\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.info\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"info\": \"Showing page _PAGE_ of _PAGES_\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sInfo\": \"Showing _START_ to _END_ of _TOTAL_ entries\",\n\t\n\t\n\t\t\t/**\n\t\t\t * Display information string for when the table is empty. Typically the\n\t\t\t * format of this string should match `info`.\n\t\t\t *  @type string\n\t\t\t *  @default Showing 0 to 0 of 0 entries\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.infoEmpty\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"infoEmpty\": \"No entries to show\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sInfoEmpty\": \"Showing 0 to 0 of 0 entries\",\n\t\n\t\n\t\t\t/**\n\t\t\t * When a user filters the information in a table, this string is appended\n\t\t\t * to the information (`info`) to give an idea of how strong the filtering\n\t\t\t * is. The variable _MAX_ is dynamically updated.\n\t\t\t *  @type string\n\t\t\t *  @default (filtered from _MAX_ total entries)\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.infoFiltered\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"infoFiltered\": \" - filtering from _MAX_ records\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sInfoFiltered\": \"(filtered from _MAX_ total entries)\",\n\t\n\t\n\t\t\t/**\n\t\t\t * If can be useful to append extra information to the info string at times,\n\t\t\t * and this variable does exactly that. This information will be appended to\n\t\t\t * the `info` (`infoEmpty` and `infoFiltered` in whatever combination they are\n\t\t\t * being used) at all times.\n\t\t\t *  @type string\n\t\t\t *  @default <i>Empty string</i>\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.infoPostFix\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"infoPostFix\": \"All records shown are derived from real information.\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sInfoPostFix\": \"\",\n\t\n\t\n\t\t\t/**\n\t\t\t * This decimal place operator is a little different from the other\n\t\t\t * language options since DataTables doesn't output floating point\n\t\t\t * numbers, so it won't ever use this for display of a number. Rather,\n\t\t\t * what this parameter does is modify the sort methods of the table so\n\t\t\t * that numbers which are in a format which has a character other than\n\t\t\t * a period (`.`) as a decimal place will be sorted numerically.\n\t\t\t *\n\t\t\t * Note that numbers with different decimal places cannot be shown in\n\t\t\t * the same table and still be sortable, the table must be consistent.\n\t\t\t * However, multiple different tables on the page can use different\n\t\t\t * decimal place characters.\n\t\t\t *  @type string\n\t\t\t *  @default \n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.decimal\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"decimal\": \",\"\n\t\t\t *          \"thousands\": \".\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sDecimal\": \"\",\n\t\n\t\n\t\t\t/**\n\t\t\t * DataTables has a build in number formatter (`formatNumber`) which is\n\t\t\t * used to format large numbers that are used in the table information.\n\t\t\t * By default a comma is used, but this can be trivially changed to any\n\t\t\t * character you wish with this parameter.\n\t\t\t *  @type string\n\t\t\t *  @default ,\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.thousands\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"thousands\": \"'\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sThousands\": \",\",\n\t\n\t\n\t\t\t/**\n\t\t\t * Detail the action that will be taken when the drop down menu for the\n\t\t\t * pagination length option is changed. The '_MENU_' variable is replaced\n\t\t\t * with a default select list of 10, 25, 50 and 100, and can be replaced\n\t\t\t * with a custom select box if required.\n\t\t\t *  @type string\n\t\t\t *  @default Show _MENU_ entries\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.lengthMenu\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Language change only\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"lengthMenu\": \"Display _MENU_ records\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Language and options change\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"lengthMenu\": 'Display <select>'+\n\t\t\t *            '<option value=\"10\">10</option>'+\n\t\t\t *            '<option value=\"20\">20</option>'+\n\t\t\t *            '<option value=\"30\">30</option>'+\n\t\t\t *            '<option value=\"40\">40</option>'+\n\t\t\t *            '<option value=\"50\">50</option>'+\n\t\t\t *            '<option value=\"-1\">All</option>'+\n\t\t\t *            '</select> records'\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sLengthMenu\": \"Show _MENU_ entries\",\n\t\n\t\n\t\t\t/**\n\t\t\t * When using Ajax sourced data and during the first draw when DataTables is\n\t\t\t * gathering the data, this message is shown in an empty row in the table to\n\t\t\t * indicate to the end user the the data is being loaded. Note that this\n\t\t\t * parameter is not used when loading data by server-side processing, just\n\t\t\t * Ajax sourced data with client-side processing.\n\t\t\t *  @type string\n\t\t\t *  @default Loading...\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.loadingRecords\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"loadingRecords\": \"Please wait - loading...\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sLoadingRecords\": \"Loading...\",\n\t\n\t\n\t\t\t/**\n\t\t\t * Text which is displayed when the table is processing a user action\n\t\t\t * (usually a sort command or similar).\n\t\t\t *  @type string\n\t\t\t *  @default Processing...\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.processing\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"processing\": \"DataTables is currently busy\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sProcessing\": \"Processing...\",\n\t\n\t\n\t\t\t/**\n\t\t\t * Details the actions that will be taken when the user types into the\n\t\t\t * filtering input text box. The variable \"_INPUT_\", if used in the string,\n\t\t\t * is replaced with the HTML text box for the filtering input allowing\n\t\t\t * control over where it appears in the string. If \"_INPUT_\" is not given\n\t\t\t * then the input box is appended to the string automatically.\n\t\t\t *  @type string\n\t\t\t *  @default Search:\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.search\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Input text box will be appended at the end automatically\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"search\": \"Filter records:\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Specify where the filter should appear\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"search\": \"Apply filter _INPUT_ to table\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sSearch\": \"Search:\",\n\t\n\t\n\t\t\t/**\n\t\t\t * Assign a `placeholder` attribute to the search `input` element\n\t\t\t *  @type string\n\t\t\t *  @default \n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.searchPlaceholder\n\t\t\t */\n\t\t\t\"sSearchPlaceholder\": \"\",\n\t\n\t\n\t\t\t/**\n\t\t\t * All of the language information can be stored in a file on the\n\t\t\t * server-side, which DataTables will look up if this parameter is passed.\n\t\t\t * It must store the URL of the language file, which is in a JSON format,\n\t\t\t * and the object has the same properties as the oLanguage object in the\n\t\t\t * initialiser object (i.e. the above parameters). Please refer to one of\n\t\t\t * the example language files to see how this works in action.\n\t\t\t *  @type string\n\t\t\t *  @default <i>Empty string - i.e. disabled</i>\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.url\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"url\": \"http://www.sprymedia.co.uk/dataTables/lang.txt\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sUrl\": \"\",\n\t\n\t\n\t\t\t/**\n\t\t\t * Text shown inside the table records when the is no information to be\n\t\t\t * displayed after filtering. `emptyTable` is shown when there is simply no\n\t\t\t * information in the table at all (regardless of filtering).\n\t\t\t *  @type string\n\t\t\t *  @default No matching records found\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.zeroRecords\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"zeroRecords\": \"No records to display\"\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sZeroRecords\": \"No matching records found\"\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * This parameter allows you to have define the global filtering state at\n\t\t * initialisation time. As an object the `search` parameter must be\n\t\t * defined, but all other parameters are optional. When `regex` is true,\n\t\t * the search string will be treated as a regular expression, when false\n\t\t * (default) it will be treated as a straight string. When `smart`\n\t\t * DataTables will use it's smart filtering methods (to word match at\n\t\t * any point in the data), when false this will not be done.\n\t\t *  @namespace\n\t\t *  @extends DataTable.models.oSearch\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.search\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"search\": {\"search\": \"Initial search\"}\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"oSearch\": $.extend( {}, DataTable.models.oSearch ),\n\t\n\t\n\t\t/**\n\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t *\n\t\t * By default DataTables will look for the property `data` (or `aaData` for\n\t\t * compatibility with DataTables 1.9-) when obtaining data from an Ajax\n\t\t * source or for server-side processing - this parameter allows that\n\t\t * property to be changed. You can use Javascript dotted object notation to\n\t\t * get a data source for multiple levels of nesting.\n\t\t *  @type string\n\t\t *  @default data\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @dtopt Server-side\n\t\t *  @name DataTable.defaults.ajaxDataProp\n\t\t *\n\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t */\n\t\t\"sAjaxDataProp\": \"data\",\n\t\n\t\n\t\t/**\n\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t *\n\t\t * You can instruct DataTables to load data from an external\n\t\t * source using this parameter (use aData if you want to pass data in you\n\t\t * already have). Simply provide a url a JSON object can be obtained from.\n\t\t *  @type string\n\t\t *  @default null\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @dtopt Server-side\n\t\t *  @name DataTable.defaults.ajaxSource\n\t\t *\n\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t */\n\t\t\"sAjaxSource\": null,\n\t\n\t\n\t\t/**\n\t\t * This initialisation variable allows you to specify exactly where in the\n\t\t * DOM you want DataTables to inject the various controls it adds to the page\n\t\t * (for example you might want the pagination controls at the top of the\n\t\t * table). DIV elements (with or without a custom class) can also be added to\n\t\t * aid styling. The follow syntax is used:\n\t\t *   <ul>\n\t\t *     <li>The following options are allowed:\n\t\t *       <ul>\n\t\t *         <li>'l' - Length changing</li>\n\t\t *         <li>'f' - Filtering input</li>\n\t\t *         <li>'t' - The table!</li>\n\t\t *         <li>'i' - Information</li>\n\t\t *         <li>'p' - Pagination</li>\n\t\t *         <li>'r' - pRocessing</li>\n\t\t *       </ul>\n\t\t *     </li>\n\t\t *     <li>The following constants are allowed:\n\t\t *       <ul>\n\t\t *         <li>'H' - jQueryUI theme \"header\" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li>\n\t\t *         <li>'F' - jQueryUI theme \"footer\" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li>\n\t\t *       </ul>\n\t\t *     </li>\n\t\t *     <li>The following syntax is expected:\n\t\t *       <ul>\n\t\t *         <li>'&lt;' and '&gt;' - div elements</li>\n\t\t *         <li>'&lt;\"class\" and '&gt;' - div with a class</li>\n\t\t *         <li>'&lt;\"#id\" and '&gt;' - div with an ID</li>\n\t\t *       </ul>\n\t\t *     </li>\n\t\t *     <li>Examples:\n\t\t *       <ul>\n\t\t *         <li>'&lt;\"wrapper\"flipt&gt;'</li>\n\t\t *         <li>'&lt;lf&lt;t&gt;ip&gt;'</li>\n\t\t *       </ul>\n\t\t *     </li>\n\t\t *   </ul>\n\t\t *  @type string\n\t\t *  @default lfrtip <i>(when `jQueryUI` is false)</i> <b>or</b>\n\t\t *    <\"H\"lfr>t<\"F\"ip> <i>(when `jQueryUI` is true)</i>\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.dom\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"dom\": '&lt;\"top\"i&gt;rt&lt;\"bottom\"flp&gt;&lt;\"clear\"&gt;'\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sDom\": \"lfrtip\",\n\t\n\t\n\t\t/**\n\t\t * Search delay option. This will throttle full table searches that use the\n\t\t * DataTables provided search input element (it does not effect calls to\n\t\t * `dt-api search()`, providing a delay before the search is made.\n\t\t *  @type integer\n\t\t *  @default 0\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.searchDelay\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"searchDelay\": 200\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"searchDelay\": null,\n\t\n\t\n\t\t/**\n\t\t * DataTables features six different built-in options for the buttons to\n\t\t * display for pagination control:\n\t\t *\n\t\t * * `numbers` - Page number buttons only\n\t\t * * `simple` - 'Previous' and 'Next' buttons only\n\t\t * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers\n\t\t * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons\n\t\t * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus page numbers\n\t\t * * `first_last_numbers` - 'First' and 'Last' buttons, plus page numbers\n\t\t *  \n\t\t * Further methods can be added using {@link DataTable.ext.oPagination}.\n\t\t *  @type string\n\t\t *  @default simple_numbers\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.pagingType\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"pagingType\": \"full_numbers\"\n\t\t *      } );\n\t\t *    } )\n\t\t */\n\t\t\"sPaginationType\": \"simple_numbers\",\n\t\n\t\n\t\t/**\n\t\t * Enable horizontal scrolling. When a table is too wide to fit into a\n\t\t * certain layout, or you have a large number of columns in the table, you\n\t\t * can enable x-scrolling to show the table in a viewport, which can be\n\t\t * scrolled. This property can be `true` which will allow the table to\n\t\t * scroll horizontally when needed, or any CSS unit, or a number (in which\n\t\t * case it will be treated as a pixel measurement). Setting as simply `true`\n\t\t * is recommended.\n\t\t *  @type boolean|string\n\t\t *  @default <i>blank string - i.e. disabled</i>\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.scrollX\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"scrollX\": true,\n\t\t *        \"scrollCollapse\": true\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sScrollX\": \"\",\n\t\n\t\n\t\t/**\n\t\t * This property can be used to force a DataTable to use more width than it\n\t\t * might otherwise do when x-scrolling is enabled. For example if you have a\n\t\t * table which requires to be well spaced, this parameter is useful for\n\t\t * \"over-sizing\" the table, and thus forcing scrolling. This property can by\n\t\t * any CSS unit, or a number (in which case it will be treated as a pixel\n\t\t * measurement).\n\t\t *  @type string\n\t\t *  @default <i>blank string - i.e. disabled</i>\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @name DataTable.defaults.scrollXInner\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"scrollX\": \"100%\",\n\t\t *        \"scrollXInner\": \"110%\"\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sScrollXInner\": \"\",\n\t\n\t\n\t\t/**\n\t\t * Enable vertical scrolling. Vertical scrolling will constrain the DataTable\n\t\t * to the given height, and enable scrolling for any data which overflows the\n\t\t * current viewport. This can be used as an alternative to paging to display\n\t\t * a lot of data in a small area (although paging and scrolling can both be\n\t\t * enabled at the same time). This property can be any CSS unit, or a number\n\t\t * (in which case it will be treated as a pixel measurement).\n\t\t *  @type string\n\t\t *  @default <i>blank string - i.e. disabled</i>\n\t\t *\n\t\t *  @dtopt Features\n\t\t *  @name DataTable.defaults.scrollY\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"scrollY\": \"200px\",\n\t\t *        \"paginate\": false\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sScrollY\": \"\",\n\t\n\t\n\t\t/**\n\t\t * __Deprecated__ The functionality provided by this parameter has now been\n\t\t * superseded by that provided through `ajax`, which should be used instead.\n\t\t *\n\t\t * Set the HTTP method that is used to make the Ajax call for server-side\n\t\t * processing or Ajax sourced data.\n\t\t *  @type string\n\t\t *  @default GET\n\t\t *\n\t\t *  @dtopt Options\n\t\t *  @dtopt Server-side\n\t\t *  @name DataTable.defaults.serverMethod\n\t\t *\n\t\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t\t */\n\t\t\"sServerMethod\": \"GET\",\n\t\n\t\n\t\t/**\n\t\t * DataTables makes use of renderers when displaying HTML elements for\n\t\t * a table. These renderers can be added or modified by plug-ins to\n\t\t * generate suitable mark-up for a site. For example the Bootstrap\n\t\t * integration plug-in for DataTables uses a paging button renderer to\n\t\t * display pagination buttons in the mark-up required by Bootstrap.\n\t\t *\n\t\t * For further information about the renderers available see\n\t\t * DataTable.ext.renderer\n\t\t *  @type string|object\n\t\t *  @default null\n\t\t *\n\t\t *  @name DataTable.defaults.renderer\n\t\t *\n\t\t */\n\t\t\"renderer\": null,\n\t\n\t\n\t\t/**\n\t\t * Set the data property name that DataTables should use to get a row's id\n\t\t * to set as the `id` property in the node.\n\t\t *  @type string\n\t\t *  @default DT_RowId\n\t\t *\n\t\t *  @name DataTable.defaults.rowId\n\t\t */\n\t\t\"rowId\": \"DT_RowId\"\n\t};\n\t\n\t_fnHungarianMap( DataTable.defaults );\n\t\n\t\n\t\n\t/*\n\t * Developer note - See note in model.defaults.js about the use of Hungarian\n\t * notation and camel case.\n\t */\n\t\n\t/**\n\t * Column options that can be given to DataTables at initialisation time.\n\t *  @namespace\n\t */\n\tDataTable.defaults.column = {\n\t\t/**\n\t\t * Define which column(s) an order will occur on for this column. This\n\t\t * allows a column's ordering to take multiple columns into account when\n\t\t * doing a sort or use the data from a different column. For example first\n\t\t * name / last name columns make sense to do a multi-column sort over the\n\t\t * two columns.\n\t\t *  @type array|int\n\t\t *  @default null <i>Takes the value of the column index automatically</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.orderData\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"orderData\": [ 0, 1 ], \"targets\": [ 0 ] },\n\t\t *          { \"orderData\": [ 1, 0 ], \"targets\": [ 1 ] },\n\t\t *          { \"orderData\": 2, \"targets\": [ 2 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"orderData\": [ 0, 1 ] },\n\t\t *          { \"orderData\": [ 1, 0 ] },\n\t\t *          { \"orderData\": 2 },\n\t\t *          null,\n\t\t *          null\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"aDataSort\": null,\n\t\t\"iDataSort\": -1,\n\t\n\t\n\t\t/**\n\t\t * You can control the default ordering direction, and even alter the\n\t\t * behaviour of the sort handler (i.e. only allow ascending ordering etc)\n\t\t * using this parameter.\n\t\t *  @type array\n\t\t *  @default [ 'asc', 'desc' ]\n\t\t *\n\t\t *  @name DataTable.defaults.column.orderSequence\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"orderSequence\": [ \"asc\" ], \"targets\": [ 1 ] },\n\t\t *          { \"orderSequence\": [ \"desc\", \"asc\", \"asc\" ], \"targets\": [ 2 ] },\n\t\t *          { \"orderSequence\": [ \"desc\" ], \"targets\": [ 3 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          null,\n\t\t *          { \"orderSequence\": [ \"asc\" ] },\n\t\t *          { \"orderSequence\": [ \"desc\", \"asc\", \"asc\" ] },\n\t\t *          { \"orderSequence\": [ \"desc\" ] },\n\t\t *          null\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"asSorting\": [ 'asc', 'desc' ],\n\t\n\t\n\t\t/**\n\t\t * Enable or disable filtering on the data in this column.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @name DataTable.defaults.column.searchable\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"searchable\": false, \"targets\": [ 0 ] }\n\t\t *        ] } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"searchable\": false },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ] } );\n\t\t *    } );\n\t\t */\n\t\t\"bSearchable\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable ordering on this column.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @name DataTable.defaults.column.orderable\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"orderable\": false, \"targets\": [ 0 ] }\n\t\t *        ] } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"orderable\": false },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ] } );\n\t\t *    } );\n\t\t */\n\t\t\"bSortable\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable the display of this column.\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t *\n\t\t *  @name DataTable.defaults.column.visible\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"visible\": false, \"targets\": [ 0 ] }\n\t\t *        ] } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"visible\": false },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ] } );\n\t\t *    } );\n\t\t */\n\t\t\"bVisible\": true,\n\t\n\t\n\t\t/**\n\t\t * Developer definable function that is called whenever a cell is created (Ajax source,\n\t\t * etc) or processed for input (DOM source). This can be used as a compliment to mRender\n\t\t * allowing you to modify the DOM element (add background colour for example) when the\n\t\t * element is available.\n\t\t *  @type function\n\t\t *  @param {element} td The TD node that has been created\n\t\t *  @param {*} cellData The Data for the cell\n\t\t *  @param {array|object} rowData The data for the whole row\n\t\t *  @param {int} row The row index for the aoData data store\n\t\t *  @param {int} col The column index for aoColumns\n\t\t *\n\t\t *  @name DataTable.defaults.column.createdCell\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [3],\n\t\t *          \"createdCell\": function (td, cellData, rowData, row, col) {\n\t\t *            if ( cellData == \"1.7\" ) {\n\t\t *              $(td).css('color', 'blue')\n\t\t *            }\n\t\t *          }\n\t\t *        } ]\n\t\t *      });\n\t\t *    } );\n\t\t */\n\t\t\"fnCreatedCell\": null,\n\t\n\t\n\t\t/**\n\t\t * This parameter has been replaced by `data` in DataTables to ensure naming\n\t\t * consistency. `dataProp` can still be used, as there is backwards\n\t\t * compatibility in DataTables for this option, but it is strongly\n\t\t * recommended that you use `data` in preference to `dataProp`.\n\t\t *  @name DataTable.defaults.column.dataProp\n\t\t */\n\t\n\t\n\t\t/**\n\t\t * This property can be used to read data from any data source property,\n\t\t * including deeply nested objects / properties. `data` can be given in a\n\t\t * number of different ways which effect its behaviour:\n\t\t *\n\t\t * * `integer` - treated as an array index for the data source. This is the\n\t\t *   default that DataTables uses (incrementally increased for each column).\n\t\t * * `string` - read an object property from the data source. There are\n\t\t *   three 'special' options that can be used in the string to alter how\n\t\t *   DataTables reads the data from the source object:\n\t\t *    * `.` - Dotted Javascript notation. Just as you use a `.` in\n\t\t *      Javascript to read from nested objects, so to can the options\n\t\t *      specified in `data`. For example: `browser.version` or\n\t\t *      `browser.name`. If your object parameter name contains a period, use\n\t\t *      `\\\\` to escape it - i.e. `first\\\\.name`.\n\t\t *    * `[]` - Array notation. DataTables can automatically combine data\n\t\t *      from and array source, joining the data with the characters provided\n\t\t *      between the two brackets. For example: `name[, ]` would provide a\n\t\t *      comma-space separated list from the source array. If no characters\n\t\t *      are provided between the brackets, the original array source is\n\t\t *      returned.\n\t\t *    * `()` - Function notation. Adding `()` to the end of a parameter will\n\t\t *      execute a function of the name given. For example: `browser()` for a\n\t\t *      simple function on the data source, `browser.version()` for a\n\t\t *      function in a nested property or even `browser().version` to get an\n\t\t *      object property if the function called returns an object. Note that\n\t\t *      function notation is recommended for use in `render` rather than\n\t\t *      `data` as it is much simpler to use as a renderer.\n\t\t * * `null` - use the original data source for the row rather than plucking\n\t\t *   data directly from it. This action has effects on two other\n\t\t *   initialisation options:\n\t\t *    * `defaultContent` - When null is given as the `data` option and\n\t\t *      `defaultContent` is specified for the column, the value defined by\n\t\t *      `defaultContent` will be used for the cell.\n\t\t *    * `render` - When null is used for the `data` option and the `render`\n\t\t *      option is specified for the column, the whole data source for the\n\t\t *      row is used for the renderer.\n\t\t * * `function` - the function given will be executed whenever DataTables\n\t\t *   needs to set or get the data for a cell in the column. The function\n\t\t *   takes three parameters:\n\t\t *    * Parameters:\n\t\t *      * `{array|object}` The data source for the row\n\t\t *      * `{string}` The type call data requested - this will be 'set' when\n\t\t *        setting data or 'filter', 'display', 'type', 'sort' or undefined\n\t\t *        when gathering data. Note that when `undefined` is given for the\n\t\t *        type DataTables expects to get the raw data for the object back<\n\t\t *      * `{*}` Data to set when the second parameter is 'set'.\n\t\t *    * Return:\n\t\t *      * The return value from the function is not required when 'set' is\n\t\t *        the type of call, but otherwise the return is what will be used\n\t\t *        for the data requested.\n\t\t *\n\t\t * Note that `data` is a getter and setter option. If you just require\n\t\t * formatting of data for output, you will likely want to use `render` which\n\t\t * is simply a getter and thus simpler to use.\n\t\t *\n\t\t * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The\n\t\t * name change reflects the flexibility of this property and is consistent\n\t\t * with the naming of mRender. If 'mDataProp' is given, then it will still\n\t\t * be used by DataTables, as it automatically maps the old name to the new\n\t\t * if required.\n\t\t *\n\t\t *  @type string|int|function|null\n\t\t *  @default null <i>Use automatically calculated column index</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.data\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Read table data from objects\n\t\t *    // JSON structure for each row:\n\t\t *    //   {\n\t\t *    //      \"engine\": {value},\n\t\t *    //      \"browser\": {value},\n\t\t *    //      \"platform\": {value},\n\t\t *    //      \"version\": {value},\n\t\t *    //      \"grade\": {value}\n\t\t *    //   }\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"ajaxSource\": \"sources/objects.txt\",\n\t\t *        \"columns\": [\n\t\t *          { \"data\": \"engine\" },\n\t\t *          { \"data\": \"browser\" },\n\t\t *          { \"data\": \"platform\" },\n\t\t *          { \"data\": \"version\" },\n\t\t *          { \"data\": \"grade\" }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Read information from deeply nested objects\n\t\t *    // JSON structure for each row:\n\t\t *    //   {\n\t\t *    //      \"engine\": {value},\n\t\t *    //      \"browser\": {value},\n\t\t *    //      \"platform\": {\n\t\t *    //         \"inner\": {value}\n\t\t *    //      },\n\t\t *    //      \"details\": [\n\t\t *    //         {value}, {value}\n\t\t *    //      ]\n\t\t *    //   }\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"ajaxSource\": \"sources/deep.txt\",\n\t\t *        \"columns\": [\n\t\t *          { \"data\": \"engine\" },\n\t\t *          { \"data\": \"browser\" },\n\t\t *          { \"data\": \"platform.inner\" },\n\t\t *          { \"data\": \"platform.details.0\" },\n\t\t *          { \"data\": \"platform.details.1\" }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `data` as a function to provide different information for\n\t\t *    // sorting, filtering and display. In this case, currency (price)\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"data\": function ( source, type, val ) {\n\t\t *            if (type === 'set') {\n\t\t *              source.price = val;\n\t\t *              // Store the computed dislay and filter values for efficiency\n\t\t *              source.price_display = val==\"\" ? \"\" : \"$\"+numberFormat(val);\n\t\t *              source.price_filter  = val==\"\" ? \"\" : \"$\"+numberFormat(val)+\" \"+val;\n\t\t *              return;\n\t\t *            }\n\t\t *            else if (type === 'display') {\n\t\t *              return source.price_display;\n\t\t *            }\n\t\t *            else if (type === 'filter') {\n\t\t *              return source.price_filter;\n\t\t *            }\n\t\t *            // 'sort', 'type' and undefined all just use the integer\n\t\t *            return source.price;\n\t\t *          }\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using default content\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"data\": null,\n\t\t *          \"defaultContent\": \"Click to edit\"\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using array notation - outputting a list from an array\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"data\": \"name[, ]\"\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t */\n\t\t\"mData\": null,\n\t\n\t\n\t\t/**\n\t\t * This property is the rendering partner to `data` and it is suggested that\n\t\t * when you want to manipulate data for display (including filtering,\n\t\t * sorting etc) without altering the underlying data for the table, use this\n\t\t * property. `render` can be considered to be the the read only companion to\n\t\t * `data` which is read / write (then as such more complex). Like `data`\n\t\t * this option can be given in a number of different ways to effect its\n\t\t * behaviour:\n\t\t *\n\t\t * * `integer` - treated as an array index for the data source. This is the\n\t\t *   default that DataTables uses (incrementally increased for each column).\n\t\t * * `string` - read an object property from the data source. There are\n\t\t *   three 'special' options that can be used in the string to alter how\n\t\t *   DataTables reads the data from the source object:\n\t\t *    * `.` - Dotted Javascript notation. Just as you use a `.` in\n\t\t *      Javascript to read from nested objects, so to can the options\n\t\t *      specified in `data`. For example: `browser.version` or\n\t\t *      `browser.name`. If your object parameter name contains a period, use\n\t\t *      `\\\\` to escape it - i.e. `first\\\\.name`.\n\t\t *    * `[]` - Array notation. DataTables can automatically combine data\n\t\t *      from and array source, joining the data with the characters provided\n\t\t *      between the two brackets. For example: `name[, ]` would provide a\n\t\t *      comma-space separated list from the source array. If no characters\n\t\t *      are provided between the brackets, the original array source is\n\t\t *      returned.\n\t\t *    * `()` - Function notation. Adding `()` to the end of a parameter will\n\t\t *      execute a function of the name given. For example: `browser()` for a\n\t\t *      simple function on the data source, `browser.version()` for a\n\t\t *      function in a nested property or even `browser().version` to get an\n\t\t *      object property if the function called returns an object.\n\t\t * * `object` - use different data for the different data types requested by\n\t\t *   DataTables ('filter', 'display', 'type' or 'sort'). The property names\n\t\t *   of the object is the data type the property refers to and the value can\n\t\t *   defined using an integer, string or function using the same rules as\n\t\t *   `render` normally does. Note that an `_` option _must_ be specified.\n\t\t *   This is the default value to use if you haven't specified a value for\n\t\t *   the data type requested by DataTables.\n\t\t * * `function` - the function given will be executed whenever DataTables\n\t\t *   needs to set or get the data for a cell in the column. The function\n\t\t *   takes three parameters:\n\t\t *    * Parameters:\n\t\t *      * {array|object} The data source for the row (based on `data`)\n\t\t *      * {string} The type call data requested - this will be 'filter',\n\t\t *        'display', 'type' or 'sort'.\n\t\t *      * {array|object} The full data source for the row (not based on\n\t\t *        `data`)\n\t\t *    * Return:\n\t\t *      * The return value from the function is what will be used for the\n\t\t *        data requested.\n\t\t *\n\t\t *  @type string|int|function|object|null\n\t\t *  @default null Use the data source value.\n\t\t *\n\t\t *  @name DataTable.defaults.column.render\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Create a comma separated list from an array of objects\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"ajaxSource\": \"sources/deep.txt\",\n\t\t *        \"columns\": [\n\t\t *          { \"data\": \"engine\" },\n\t\t *          { \"data\": \"browser\" },\n\t\t *          {\n\t\t *            \"data\": \"platform\",\n\t\t *            \"render\": \"[, ].name\"\n\t\t *          }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Execute a function to obtain data\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"data\": null, // Use the full data source object for the renderer's source\n\t\t *          \"render\": \"browserName()\"\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // As an object, extracting different data for the different types\n\t\t *    // This would be used with a data source such as:\n\t\t *    //   { \"phone\": 5552368, \"phone_filter\": \"5552368 555-2368\", \"phone_display\": \"555-2368\" }\n\t\t *    // Here the `phone` integer is used for sorting and type detection, while `phone_filter`\n\t\t *    // (which has both forms) is used for filtering for if a user inputs either format, while\n\t\t *    // the formatted phone number is the one that is shown in the table.\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"data\": null, // Use the full data source object for the renderer's source\n\t\t *          \"render\": {\n\t\t *            \"_\": \"phone\",\n\t\t *            \"filter\": \"phone_filter\",\n\t\t *            \"display\": \"phone_display\"\n\t\t *          }\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Use as a function to create a link from the data source\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"data\": \"download_link\",\n\t\t *          \"render\": function ( data, type, full ) {\n\t\t *            return '<a href=\"'+data+'\">Download</a>';\n\t\t *          }\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"mRender\": null,\n\t\n\t\n\t\t/**\n\t\t * Change the cell type created for the column - either TD cells or TH cells. This\n\t\t * can be useful as TH cells have semantic meaning in the table body, allowing them\n\t\t * to act as a header for a row (you may wish to add scope='row' to the TH elements).\n\t\t *  @type string\n\t\t *  @default td\n\t\t *\n\t\t *  @name DataTable.defaults.column.cellType\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Make the first column use TH cells\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [ {\n\t\t *          \"targets\": [ 0 ],\n\t\t *          \"cellType\": \"th\"\n\t\t *        } ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sCellType\": \"td\",\n\t\n\t\n\t\t/**\n\t\t * Class to give to each cell in this column.\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.class\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"class\": \"my_class\", \"targets\": [ 0 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"class\": \"my_class\" },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sClass\": \"\",\n\t\n\t\t/**\n\t\t * When DataTables calculates the column widths to assign to each column,\n\t\t * it finds the longest string in each column and then constructs a\n\t\t * temporary table and reads the widths from that. The problem with this\n\t\t * is that \"mmm\" is much wider then \"iiii\", but the latter is a longer\n\t\t * string - thus the calculation can go wrong (doing it properly and putting\n\t\t * it into an DOM object and measuring that is horribly(!) slow). Thus as\n\t\t * a \"work around\" we provide this option. It will append its value to the\n\t\t * text that is found to be the longest string for the column - i.e. padding.\n\t\t * Generally you shouldn't need this!\n\t\t *  @type string\n\t\t *  @default <i>Empty string<i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.contentPadding\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          {\n\t\t *            \"contentPadding\": \"mmm\"\n\t\t *          }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sContentPadding\": \"\",\n\t\n\t\n\t\t/**\n\t\t * Allows a default value to be given for a column's data, and will be used\n\t\t * whenever a null data source is encountered (this can be because `data`\n\t\t * is set to null, or because the data source itself is null).\n\t\t *  @type string\n\t\t *  @default null\n\t\t *\n\t\t *  @name DataTable.defaults.column.defaultContent\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          {\n\t\t *            \"data\": null,\n\t\t *            \"defaultContent\": \"Edit\",\n\t\t *            \"targets\": [ -1 ]\n\t\t *          }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          {\n\t\t *            \"data\": null,\n\t\t *            \"defaultContent\": \"Edit\"\n\t\t *          }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sDefaultContent\": null,\n\t\n\t\n\t\t/**\n\t\t * This parameter is only used in DataTables' server-side processing. It can\n\t\t * be exceptionally useful to know what columns are being displayed on the\n\t\t * client side, and to map these to database fields. When defined, the names\n\t\t * also allow DataTables to reorder information from the server if it comes\n\t\t * back in an unexpected order (i.e. if you switch your columns around on the\n\t\t * client-side, your server-side code does not also need updating).\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.name\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"name\": \"engine\", \"targets\": [ 0 ] },\n\t\t *          { \"name\": \"browser\", \"targets\": [ 1 ] },\n\t\t *          { \"name\": \"platform\", \"targets\": [ 2 ] },\n\t\t *          { \"name\": \"version\", \"targets\": [ 3 ] },\n\t\t *          { \"name\": \"grade\", \"targets\": [ 4 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"name\": \"engine\" },\n\t\t *          { \"name\": \"browser\" },\n\t\t *          { \"name\": \"platform\" },\n\t\t *          { \"name\": \"version\" },\n\t\t *          { \"name\": \"grade\" }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sName\": \"\",\n\t\n\t\n\t\t/**\n\t\t * Defines a data source type for the ordering which can be used to read\n\t\t * real-time information from the table (updating the internally cached\n\t\t * version) prior to ordering. This allows ordering to occur on user\n\t\t * editable elements such as form inputs.\n\t\t *  @type string\n\t\t *  @default std\n\t\t *\n\t\t *  @name DataTable.defaults.column.orderDataType\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"orderDataType\": \"dom-text\", \"targets\": [ 2, 3 ] },\n\t\t *          { \"type\": \"numeric\", \"targets\": [ 3 ] },\n\t\t *          { \"orderDataType\": \"dom-select\", \"targets\": [ 4 ] },\n\t\t *          { \"orderDataType\": \"dom-checkbox\", \"targets\": [ 5 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          null,\n\t\t *          null,\n\t\t *          { \"orderDataType\": \"dom-text\" },\n\t\t *          { \"orderDataType\": \"dom-text\", \"type\": \"numeric\" },\n\t\t *          { \"orderDataType\": \"dom-select\" },\n\t\t *          { \"orderDataType\": \"dom-checkbox\" }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sSortDataType\": \"std\",\n\t\n\t\n\t\t/**\n\t\t * The title of this column.\n\t\t *  @type string\n\t\t *  @default null <i>Derived from the 'TH' value for this column in the\n\t\t *    original HTML table.</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.title\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"title\": \"My column title\", \"targets\": [ 0 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"title\": \"My column title\" },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sTitle\": null,\n\t\n\t\n\t\t/**\n\t\t * The type allows you to specify how the data for this column will be\n\t\t * ordered. Four types (string, numeric, date and html (which will strip\n\t\t * HTML tags before ordering)) are currently available. Note that only date\n\t\t * formats understood by Javascript's Date() object will be accepted as type\n\t\t * date. For example: \"Mar 26, 2008 5:03 PM\". May take the values: 'string',\n\t\t * 'numeric', 'date' or 'html' (by default). Further types can be adding\n\t\t * through plug-ins.\n\t\t *  @type string\n\t\t *  @default null <i>Auto-detected from raw data</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.type\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"type\": \"html\", \"targets\": [ 0 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"type\": \"html\" },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sType\": null,\n\t\n\t\n\t\t/**\n\t\t * Defining the width of the column, this parameter may take any CSS value\n\t\t * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not\n\t\t * been given a specific width through this interface ensuring that the table\n\t\t * remains readable.\n\t\t *  @type string\n\t\t *  @default null <i>Automatic</i>\n\t\t *\n\t\t *  @name DataTable.defaults.column.width\n\t\t *  @dtopt Columns\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columnDefs`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columnDefs\": [\n\t\t *          { \"width\": \"20%\", \"targets\": [ 0 ] }\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Using `columns`\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"columns\": [\n\t\t *          { \"width\": \"20%\" },\n\t\t *          null,\n\t\t *          null,\n\t\t *          null,\n\t\t *          null\n\t\t *        ]\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sWidth\": null\n\t};\n\t\n\t_fnHungarianMap( DataTable.defaults.column );\n\t\n\t\n\t\n\t/**\n\t * DataTables settings object - this holds all the information needed for a\n\t * given table, including configuration, data and current application of the\n\t * table options. DataTables does not have a single instance for each DataTable\n\t * with the settings attached to that instance, but rather instances of the\n\t * DataTable \"class\" are created on-the-fly as needed (typically by a\n\t * $().dataTable() call) and the settings object is then applied to that\n\t * instance.\n\t *\n\t * Note that this object is related to {@link DataTable.defaults} but this\n\t * one is the internal data store for DataTables's cache of columns. It should\n\t * NOT be manipulated outside of DataTables. Any configuration should be done\n\t * through the initialisation options.\n\t *  @namespace\n\t *  @todo Really should attach the settings object to individual instances so we\n\t *    don't need to create new instances on each $().dataTable() call (if the\n\t *    table already exists). It would also save passing oSettings around and\n\t *    into every single function. However, this is a very significant\n\t *    architecture change for DataTables and will almost certainly break\n\t *    backwards compatibility with older installations. This is something that\n\t *    will be done in 2.0.\n\t */\n\tDataTable.models.oSettings = {\n\t\t/**\n\t\t * Primary features of DataTables and their enablement state.\n\t\t *  @namespace\n\t\t */\n\t\t\"oFeatures\": {\n\t\n\t\t\t/**\n\t\t\t * Flag to say if DataTables should automatically try to calculate the\n\t\t\t * optimum table and columns widths (true) or not (false).\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bAutoWidth\": null,\n\t\n\t\t\t/**\n\t\t\t * Delay the creation of TR and TD elements until they are actually\n\t\t\t * needed by a driven page draw. This can give a significant speed\n\t\t\t * increase for Ajax source and Javascript source data, but makes no\n\t\t\t * difference at all fro DOM and server-side processing tables.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bDeferRender\": null,\n\t\n\t\t\t/**\n\t\t\t * Enable filtering on the table or not. Note that if this is disabled\n\t\t\t * then there is no filtering at all on the table, including fnFilter.\n\t\t\t * To just remove the filtering input use sDom and remove the 'f' option.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bFilter\": null,\n\t\n\t\t\t/**\n\t\t\t * Table information element (the 'Showing x of y records' div) enable\n\t\t\t * flag.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bInfo\": null,\n\t\n\t\t\t/**\n\t\t\t * Present a user control allowing the end user to change the page size\n\t\t\t * when pagination is enabled.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bLengthChange\": null,\n\t\n\t\t\t/**\n\t\t\t * Pagination enabled or not. Note that if this is disabled then length\n\t\t\t * changing must also be disabled.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bPaginate\": null,\n\t\n\t\t\t/**\n\t\t\t * Processing indicator enable flag whenever DataTables is enacting a\n\t\t\t * user request - typically an Ajax request for server-side processing.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bProcessing\": null,\n\t\n\t\t\t/**\n\t\t\t * Server-side processing enabled flag - when enabled DataTables will\n\t\t\t * get all data from the server for every draw - there is no filtering,\n\t\t\t * sorting or paging done on the client-side.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bServerSide\": null,\n\t\n\t\t\t/**\n\t\t\t * Sorting enablement flag.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bSort\": null,\n\t\n\t\t\t/**\n\t\t\t * Multi-column sorting\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bSortMulti\": null,\n\t\n\t\t\t/**\n\t\t\t * Apply a class to the columns which are being sorted to provide a\n\t\t\t * visual highlight or not. This can slow things down when enabled since\n\t\t\t * there is a lot of DOM interaction.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bSortClasses\": null,\n\t\n\t\t\t/**\n\t\t\t * State saving enablement flag.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bStateSave\": null\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * Scrolling settings for a table.\n\t\t *  @namespace\n\t\t */\n\t\t\"oScroll\": {\n\t\t\t/**\n\t\t\t * When the table is shorter in height than sScrollY, collapse the\n\t\t\t * table container down to the height of the table (when true).\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type boolean\n\t\t\t */\n\t\t\t\"bCollapse\": null,\n\t\n\t\t\t/**\n\t\t\t * Width of the scrollbar for the web-browser's platform. Calculated\n\t\t\t * during table initialisation.\n\t\t\t *  @type int\n\t\t\t *  @default 0\n\t\t\t */\n\t\t\t\"iBarWidth\": 0,\n\t\n\t\t\t/**\n\t\t\t * Viewport width for horizontal scrolling. Horizontal scrolling is\n\t\t\t * disabled if an empty string.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type string\n\t\t\t */\n\t\t\t\"sX\": null,\n\t\n\t\t\t/**\n\t\t\t * Width to expand the table to when using x-scrolling. Typically you\n\t\t\t * should not need to use this.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type string\n\t\t\t *  @deprecated\n\t\t\t */\n\t\t\t\"sXInner\": null,\n\t\n\t\t\t/**\n\t\t\t * Viewport height for vertical scrolling. Vertical scrolling is disabled\n\t\t\t * if an empty string.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t *  @type string\n\t\t\t */\n\t\t\t\"sY\": null\n\t\t},\n\t\n\t\t/**\n\t\t * Language information for the table.\n\t\t *  @namespace\n\t\t *  @extends DataTable.defaults.oLanguage\n\t\t */\n\t\t\"oLanguage\": {\n\t\t\t/**\n\t\t\t * Information callback function. See\n\t\t\t * {@link DataTable.defaults.fnInfoCallback}\n\t\t\t *  @type function\n\t\t\t *  @default null\n\t\t\t */\n\t\t\t\"fnInfoCallback\": null\n\t\t},\n\t\n\t\t/**\n\t\t * Browser support parameters\n\t\t *  @namespace\n\t\t */\n\t\t\"oBrowser\": {\n\t\t\t/**\n\t\t\t * Indicate if the browser incorrectly calculates width:100% inside a\n\t\t\t * scrolling element (IE6/7)\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t */\n\t\t\t\"bScrollOversize\": false,\n\t\n\t\t\t/**\n\t\t\t * Determine if the vertical scrollbar is on the right or left of the\n\t\t\t * scrolling container - needed for rtl language layout, although not\n\t\t\t * all browsers move the scrollbar (Safari).\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t */\n\t\t\t\"bScrollbarLeft\": false,\n\t\n\t\t\t/**\n\t\t\t * Flag for if `getBoundingClientRect` is fully supported or not\n\t\t\t *  @type boolean\n\t\t\t *  @default false\n\t\t\t */\n\t\t\t\"bBounding\": false,\n\t\n\t\t\t/**\n\t\t\t * Browser scrollbar width\n\t\t\t *  @type integer\n\t\t\t *  @default 0\n\t\t\t */\n\t\t\t\"barWidth\": 0\n\t\t},\n\t\n\t\n\t\t\"ajax\": null,\n\t\n\t\n\t\t/**\n\t\t * Array referencing the nodes which are used for the features. The\n\t\t * parameters of this object match what is allowed by sDom - i.e.\n\t\t *   <ul>\n\t\t *     <li>'l' - Length changing</li>\n\t\t *     <li>'f' - Filtering input</li>\n\t\t *     <li>'t' - The table!</li>\n\t\t *     <li>'i' - Information</li>\n\t\t *     <li>'p' - Pagination</li>\n\t\t *     <li>'r' - pRocessing</li>\n\t\t *   </ul>\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aanFeatures\": [],\n\t\n\t\t/**\n\t\t * Store data information - see {@link DataTable.models.oRow} for detailed\n\t\t * information.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoData\": [],\n\t\n\t\t/**\n\t\t * Array of indexes which are in the current display (after filtering etc)\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aiDisplay\": [],\n\t\n\t\t/**\n\t\t * Array of indexes for display - no filtering\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aiDisplayMaster\": [],\n\t\n\t\t/**\n\t\t * Map of row ids to data indexes\n\t\t *  @type object\n\t\t *  @default {}\n\t\t */\n\t\t\"aIds\": {},\n\t\n\t\t/**\n\t\t * Store information about each column that is in use\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoColumns\": [],\n\t\n\t\t/**\n\t\t * Store information about the table's header\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoHeader\": [],\n\t\n\t\t/**\n\t\t * Store information about the table's footer\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoFooter\": [],\n\t\n\t\t/**\n\t\t * Store the applied global search information in case we want to force a\n\t\t * research or compare the old search to a new one.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @namespace\n\t\t *  @extends DataTable.models.oSearch\n\t\t */\n\t\t\"oPreviousSearch\": {},\n\t\n\t\t/**\n\t\t * Store the applied search for each column - see\n\t\t * {@link DataTable.models.oSearch} for the format that is used for the\n\t\t * filtering information for each column.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoPreSearchCols\": [],\n\t\n\t\t/**\n\t\t * Sorting that is applied to the table. Note that the inner arrays are\n\t\t * used in the following manner:\n\t\t * <ul>\n\t\t *   <li>Index 0 - column number</li>\n\t\t *   <li>Index 1 - current sorting direction</li>\n\t\t * </ul>\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type array\n\t\t *  @todo These inner arrays should really be objects\n\t\t */\n\t\t\"aaSorting\": null,\n\t\n\t\t/**\n\t\t * Sorting that is always applied to the table (i.e. prefixed in front of\n\t\t * aaSorting).\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aaSortingFixed\": [],\n\t\n\t\t/**\n\t\t * Classes to use for the striping of a table.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"asStripeClasses\": null,\n\t\n\t\t/**\n\t\t * If restoring a table - we should restore its striping classes as well\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"asDestroyStripes\": [],\n\t\n\t\t/**\n\t\t * If restoring a table - we should restore its width\n\t\t *  @type int\n\t\t *  @default 0\n\t\t */\n\t\t\"sDestroyWidth\": 0,\n\t\n\t\t/**\n\t\t * Callback functions array for every time a row is inserted (i.e. on a draw).\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoRowCallback\": [],\n\t\n\t\t/**\n\t\t * Callback functions for the header on each draw.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoHeaderCallback\": [],\n\t\n\t\t/**\n\t\t * Callback function for the footer on each draw.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoFooterCallback\": [],\n\t\n\t\t/**\n\t\t * Array of callback functions for draw callback functions\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoDrawCallback\": [],\n\t\n\t\t/**\n\t\t * Array of callback functions for row created function\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoRowCreatedCallback\": [],\n\t\n\t\t/**\n\t\t * Callback functions for just before the table is redrawn. A return of\n\t\t * false will be used to cancel the draw.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoPreDrawCallback\": [],\n\t\n\t\t/**\n\t\t * Callback functions for when the table has been initialised.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoInitComplete\": [],\n\t\n\t\n\t\t/**\n\t\t * Callbacks for modifying the settings to be stored for state saving, prior to\n\t\t * saving state.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoStateSaveParams\": [],\n\t\n\t\t/**\n\t\t * Callbacks for modifying the settings that have been stored for state saving\n\t\t * prior to using the stored values to restore the state.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoStateLoadParams\": [],\n\t\n\t\t/**\n\t\t * Callbacks for operating on the settings object once the saved state has been\n\t\t * loaded\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoStateLoaded\": [],\n\t\n\t\t/**\n\t\t * Cache the table ID for quick access\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t */\n\t\t\"sTableId\": \"\",\n\t\n\t\t/**\n\t\t * The TABLE node for the main table\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTable\": null,\n\t\n\t\t/**\n\t\t * Permanent ref to the thead element\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTHead\": null,\n\t\n\t\t/**\n\t\t * Permanent ref to the tfoot element - if it exists\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTFoot\": null,\n\t\n\t\t/**\n\t\t * Permanent ref to the tbody element\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTBody\": null,\n\t\n\t\t/**\n\t\t * Cache the wrapper node (contains all DataTables controlled elements)\n\t\t *  @type node\n\t\t *  @default null\n\t\t */\n\t\t\"nTableWrapper\": null,\n\t\n\t\t/**\n\t\t * Indicate if when using server-side processing the loading of data\n\t\t * should be deferred until the second draw.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bDeferLoading\": false,\n\t\n\t\t/**\n\t\t * Indicate if all required information has been read in\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bInitialised\": false,\n\t\n\t\t/**\n\t\t * Information about open rows. Each object in the array has the parameters\n\t\t * 'nTr' and 'nParent'\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoOpenRows\": [],\n\t\n\t\t/**\n\t\t * Dictate the positioning of DataTables' control elements - see\n\t\t * {@link DataTable.model.oInit.sDom}.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sDom\": null,\n\t\n\t\t/**\n\t\t * Search delay (in mS)\n\t\t *  @type integer\n\t\t *  @default null\n\t\t */\n\t\t\"searchDelay\": null,\n\t\n\t\t/**\n\t\t * Which type of pagination should be used.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t *  @default two_button\n\t\t */\n\t\t\"sPaginationType\": \"two_button\",\n\t\n\t\t/**\n\t\t * The state duration (for `stateSave`) in seconds.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type int\n\t\t *  @default 0\n\t\t */\n\t\t\"iStateDuration\": 0,\n\t\n\t\t/**\n\t\t * Array of callback functions for state saving. Each array element is an\n\t\t * object with the following parameters:\n\t\t *   <ul>\n\t\t *     <li>function:fn - function to call. Takes two parameters, oSettings\n\t\t *       and the JSON string to save that has been thus far created. Returns\n\t\t *       a JSON string to be inserted into a json object\n\t\t *       (i.e. '\"param\": [ 0, 1, 2]')</li>\n\t\t *     <li>string:sName - name of callback</li>\n\t\t *   </ul>\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoStateSave\": [],\n\t\n\t\t/**\n\t\t * Array of callback functions for state loading. Each array element is an\n\t\t * object with the following parameters:\n\t\t *   <ul>\n\t\t *     <li>function:fn - function to call. Takes two parameters, oSettings\n\t\t *       and the object stored. May return false to cancel state loading</li>\n\t\t *     <li>string:sName - name of callback</li>\n\t\t *   </ul>\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoStateLoad\": [],\n\t\n\t\t/**\n\t\t * State that was saved. Useful for back reference\n\t\t *  @type object\n\t\t *  @default null\n\t\t */\n\t\t\"oSavedState\": null,\n\t\n\t\t/**\n\t\t * State that was loaded. Useful for back reference\n\t\t *  @type object\n\t\t *  @default null\n\t\t */\n\t\t\"oLoadedState\": null,\n\t\n\t\t/**\n\t\t * Source url for AJAX data for the table.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sAjaxSource\": null,\n\t\n\t\t/**\n\t\t * Property from a given object from which to read the table data from. This\n\t\t * can be an empty string (when not server-side processing), in which case\n\t\t * it is  assumed an an array is given directly.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t */\n\t\t\"sAjaxDataProp\": null,\n\t\n\t\t/**\n\t\t * Note if draw should be blocked while getting data\n\t\t *  @type boolean\n\t\t *  @default true\n\t\t */\n\t\t\"bAjaxDataGet\": true,\n\t\n\t\t/**\n\t\t * The last jQuery XHR object that was used for server-side data gathering.\n\t\t * This can be used for working with the XHR information in one of the\n\t\t * callbacks\n\t\t *  @type object\n\t\t *  @default null\n\t\t */\n\t\t\"jqXHR\": null,\n\t\n\t\t/**\n\t\t * JSON returned from the server in the last Ajax request\n\t\t *  @type object\n\t\t *  @default undefined\n\t\t */\n\t\t\"json\": undefined,\n\t\n\t\t/**\n\t\t * Data submitted as part of the last Ajax request\n\t\t *  @type object\n\t\t *  @default undefined\n\t\t */\n\t\t\"oAjaxData\": undefined,\n\t\n\t\t/**\n\t\t * Function to get the server-side data.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type function\n\t\t */\n\t\t\"fnServerData\": null,\n\t\n\t\t/**\n\t\t * Functions which are called prior to sending an Ajax request so extra\n\t\t * parameters can easily be sent to the server\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoServerParams\": [],\n\t\n\t\t/**\n\t\t * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if\n\t\t * required).\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t */\n\t\t\"sServerMethod\": null,\n\t\n\t\t/**\n\t\t * Format numbers for display.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type function\n\t\t */\n\t\t\"fnFormatNumber\": null,\n\t\n\t\t/**\n\t\t * List of options that can be used for the user selectable length menu.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aLengthMenu\": null,\n\t\n\t\t/**\n\t\t * Counter for the draws that the table does. Also used as a tracker for\n\t\t * server-side processing\n\t\t *  @type int\n\t\t *  @default 0\n\t\t */\n\t\t\"iDraw\": 0,\n\t\n\t\t/**\n\t\t * Indicate if a redraw is being done - useful for Ajax\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bDrawing\": false,\n\t\n\t\t/**\n\t\t * Draw index (iDraw) of the last error when parsing the returned data\n\t\t *  @type int\n\t\t *  @default -1\n\t\t */\n\t\t\"iDrawError\": -1,\n\t\n\t\t/**\n\t\t * Paging display length\n\t\t *  @type int\n\t\t *  @default 10\n\t\t */\n\t\t\"_iDisplayLength\": 10,\n\t\n\t\t/**\n\t\t * Paging start point - aiDisplay index\n\t\t *  @type int\n\t\t *  @default 0\n\t\t */\n\t\t\"_iDisplayStart\": 0,\n\t\n\t\t/**\n\t\t * Server-side processing - number of records in the result set\n\t\t * (i.e. before filtering), Use fnRecordsTotal rather than\n\t\t * this property to get the value of the number of records, regardless of\n\t\t * the server-side processing setting.\n\t\t *  @type int\n\t\t *  @default 0\n\t\t *  @private\n\t\t */\n\t\t\"_iRecordsTotal\": 0,\n\t\n\t\t/**\n\t\t * Server-side processing - number of records in the current display set\n\t\t * (i.e. after filtering). Use fnRecordsDisplay rather than\n\t\t * this property to get the value of the number of records, regardless of\n\t\t * the server-side processing setting.\n\t\t *  @type boolean\n\t\t *  @default 0\n\t\t *  @private\n\t\t */\n\t\t\"_iRecordsDisplay\": 0,\n\t\n\t\t/**\n\t\t * Flag to indicate if jQuery UI marking and classes should be used.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bJUI\": null,\n\t\n\t\t/**\n\t\t * The classes to use for the table\n\t\t *  @type object\n\t\t *  @default {}\n\t\t */\n\t\t\"oClasses\": {},\n\t\n\t\t/**\n\t\t * Flag attached to the settings object so you can check in the draw\n\t\t * callback if filtering has been done in the draw. Deprecated in favour of\n\t\t * events.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *  @deprecated\n\t\t */\n\t\t\"bFiltered\": false,\n\t\n\t\t/**\n\t\t * Flag attached to the settings object so you can check in the draw\n\t\t * callback if sorting has been done in the draw. Deprecated in favour of\n\t\t * events.\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t *  @deprecated\n\t\t */\n\t\t\"bSorted\": false,\n\t\n\t\t/**\n\t\t * Indicate that if multiple rows are in the header and there is more than\n\t\t * one unique cell per column, if the top one (true) or bottom one (false)\n\t\t * should be used for sorting / title by DataTables.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bSortCellsTop\": null,\n\t\n\t\t/**\n\t\t * Initialisation object that is used for the table\n\t\t *  @type object\n\t\t *  @default null\n\t\t */\n\t\t\"oInit\": null,\n\t\n\t\t/**\n\t\t * Destroy callback functions - for plug-ins to attach themselves to the\n\t\t * destroy so they can clean up markup and events.\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aoDestroyCallback\": [],\n\t\n\t\n\t\t/**\n\t\t * Get the number of records in the current record set, before filtering\n\t\t *  @type function\n\t\t */\n\t\t\"fnRecordsTotal\": function ()\n\t\t{\n\t\t\treturn _fnDataSource( this ) == 'ssp' ?\n\t\t\t\tthis._iRecordsTotal * 1 :\n\t\t\t\tthis.aiDisplayMaster.length;\n\t\t},\n\t\n\t\t/**\n\t\t * Get the number of records in the current record set, after filtering\n\t\t *  @type function\n\t\t */\n\t\t\"fnRecordsDisplay\": function ()\n\t\t{\n\t\t\treturn _fnDataSource( this ) == 'ssp' ?\n\t\t\t\tthis._iRecordsDisplay * 1 :\n\t\t\t\tthis.aiDisplay.length;\n\t\t},\n\t\n\t\t/**\n\t\t * Get the display end point - aiDisplay index\n\t\t *  @type function\n\t\t */\n\t\t\"fnDisplayEnd\": function ()\n\t\t{\n\t\t\tvar\n\t\t\t\tlen      = this._iDisplayLength,\n\t\t\t\tstart    = this._iDisplayStart,\n\t\t\t\tcalc     = start + len,\n\t\t\t\trecords  = this.aiDisplay.length,\n\t\t\t\tfeatures = this.oFeatures,\n\t\t\t\tpaginate = features.bPaginate;\n\t\n\t\t\tif ( features.bServerSide ) {\n\t\t\t\treturn paginate === false || len === -1 ?\n\t\t\t\t\tstart + records :\n\t\t\t\t\tMath.min( start+len, this._iRecordsDisplay );\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn ! paginate || calc>records || len===-1 ?\n\t\t\t\t\trecords :\n\t\t\t\t\tcalc;\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * The DataTables object for this table\n\t\t *  @type object\n\t\t *  @default null\n\t\t */\n\t\t\"oInstance\": null,\n\t\n\t\t/**\n\t\t * Unique identifier for each instance of the DataTables object. If there\n\t\t * is an ID on the table node, then it takes that value, otherwise an\n\t\t * incrementing internal counter is used.\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"sInstance\": null,\n\t\n\t\t/**\n\t\t * tabindex attribute value that is added to DataTables control elements, allowing\n\t\t * keyboard navigation of the table and its controls.\n\t\t */\n\t\t\"iTabIndex\": 0,\n\t\n\t\t/**\n\t\t * DIV container for the footer scrolling table if scrolling\n\t\t */\n\t\t\"nScrollHead\": null,\n\t\n\t\t/**\n\t\t * DIV container for the footer scrolling table if scrolling\n\t\t */\n\t\t\"nScrollFoot\": null,\n\t\n\t\t/**\n\t\t * Last applied sort\n\t\t *  @type array\n\t\t *  @default []\n\t\t */\n\t\t\"aLastSort\": [],\n\t\n\t\t/**\n\t\t * Stored plug-in instances\n\t\t *  @type object\n\t\t *  @default {}\n\t\t */\n\t\t\"oPlugins\": {},\n\t\n\t\t/**\n\t\t * Function used to get a row's id from the row's data\n\t\t *  @type function\n\t\t *  @default null\n\t\t */\n\t\t\"rowIdFn\": null,\n\t\n\t\t/**\n\t\t * Data location where to store a row's id\n\t\t *  @type string\n\t\t *  @default null\n\t\t */\n\t\t\"rowId\": null\n\t};\n\n\t/**\n\t * Extension object for DataTables that is used to provide all extension\n\t * options.\n\t *\n\t * Note that the `DataTable.ext` object is available through\n\t * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is\n\t * also aliased to `jQuery.fn.dataTableExt` for historic reasons.\n\t *  @namespace\n\t *  @extends DataTable.models.ext\n\t */\n\t\n\t\n\t/**\n\t * DataTables extensions\n\t * \n\t * This namespace acts as a collection area for plug-ins that can be used to\n\t * extend DataTables capabilities. Indeed many of the build in methods\n\t * use this method to provide their own capabilities (sorting methods for\n\t * example).\n\t *\n\t * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy\n\t * reasons\n\t *\n\t *  @namespace\n\t */\n\tDataTable.ext = _ext = {\n\t\t/**\n\t\t * Buttons. For use with the Buttons extension for DataTables. This is\n\t\t * defined here so other extensions can define buttons regardless of load\n\t\t * order. It is _not_ used by DataTables core.\n\t\t *\n\t\t *  @type object\n\t\t *  @default {}\n\t\t */\n\t\tbuttons: {},\n\t\n\t\n\t\t/**\n\t\t * Element class names\n\t\t *\n\t\t *  @type object\n\t\t *  @default {}\n\t\t */\n\t\tclasses: {},\n\t\n\t\n\t\t/**\n\t\t * DataTables build type (expanded by the download builder)\n\t\t *\n\t\t *  @type string\n\t\t */\n\t\tbuilder: \"-source-\",\n\t\n\t\n\t\t/**\n\t\t * Error reporting.\n\t\t * \n\t\t * How should DataTables report an error. Can take the value 'alert',\n\t\t * 'throw', 'none' or a function.\n\t\t *\n\t\t *  @type string|function\n\t\t *  @default alert\n\t\t */\n\t\terrMode: \"alert\",\n\t\n\t\n\t\t/**\n\t\t * Feature plug-ins.\n\t\t * \n\t\t * This is an array of objects which describe the feature plug-ins that are\n\t\t * available to DataTables. These feature plug-ins are then available for\n\t\t * use through the `dom` initialisation option.\n\t\t * \n\t\t * Each feature plug-in is described by an object which must have the\n\t\t * following properties:\n\t\t * \n\t\t * * `fnInit` - function that is used to initialise the plug-in,\n\t\t * * `cFeature` - a character so the feature can be enabled by the `dom`\n\t\t *   instillation option. This is case sensitive.\n\t\t *\n\t\t * The `fnInit` function has the following input parameters:\n\t\t *\n\t\t * 1. `{object}` DataTables settings object: see\n\t\t *    {@link DataTable.models.oSettings}\n\t\t *\n\t\t * And the following return is expected:\n\t\t * \n\t\t * * {node|null} The element which contains your feature. Note that the\n\t\t *   return may also be void if your plug-in does not require to inject any\n\t\t *   DOM elements into DataTables control (`dom`) - for example this might\n\t\t *   be useful when developing a plug-in which allows table control via\n\t\t *   keyboard entry\n\t\t *\n\t\t *  @type array\n\t\t *\n\t\t *  @example\n\t\t *    $.fn.dataTable.ext.features.push( {\n\t\t *      \"fnInit\": function( oSettings ) {\n\t\t *        return new TableTools( { \"oDTSettings\": oSettings } );\n\t\t *      },\n\t\t *      \"cFeature\": \"T\"\n\t\t *    } );\n\t\t */\n\t\tfeature: [],\n\t\n\t\n\t\t/**\n\t\t * Row searching.\n\t\t * \n\t\t * This method of searching is complimentary to the default type based\n\t\t * searching, and a lot more comprehensive as it allows you complete control\n\t\t * over the searching logic. Each element in this array is a function\n\t\t * (parameters described below) that is called for every row in the table,\n\t\t * and your logic decides if it should be included in the searching data set\n\t\t * or not.\n\t\t *\n\t\t * Searching functions have the following input parameters:\n\t\t *\n\t\t * 1. `{object}` DataTables settings object: see\n\t\t *    {@link DataTable.models.oSettings}\n\t\t * 2. `{array|object}` Data for the row to be processed (same as the\n\t\t *    original format that was passed in as the data source, or an array\n\t\t *    from a DOM data source\n\t\t * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which\n\t\t *    can be useful to retrieve the `TR` element if you need DOM interaction.\n\t\t *\n\t\t * And the following return is expected:\n\t\t *\n\t\t * * {boolean} Include the row in the searched result set (true) or not\n\t\t *   (false)\n\t\t *\n\t\t * Note that as with the main search ability in DataTables, technically this\n\t\t * is \"filtering\", since it is subtractive. However, for consistency in\n\t\t * naming we call it searching here.\n\t\t *\n\t\t *  @type array\n\t\t *  @default []\n\t\t *\n\t\t *  @example\n\t\t *    // The following example shows custom search being applied to the\n\t\t *    // fourth column (i.e. the data[3] index) based on two input values\n\t\t *    // from the end-user, matching the data in a certain range.\n\t\t *    $.fn.dataTable.ext.search.push(\n\t\t *      function( settings, data, dataIndex ) {\n\t\t *        var min = document.getElementById('min').value * 1;\n\t\t *        var max = document.getElementById('max').value * 1;\n\t\t *        var version = data[3] == \"-\" ? 0 : data[3]*1;\n\t\t *\n\t\t *        if ( min == \"\" && max == \"\" ) {\n\t\t *          return true;\n\t\t *        }\n\t\t *        else if ( min == \"\" && version < max ) {\n\t\t *          return true;\n\t\t *        }\n\t\t *        else if ( min < version && \"\" == max ) {\n\t\t *          return true;\n\t\t *        }\n\t\t *        else if ( min < version && version < max ) {\n\t\t *          return true;\n\t\t *        }\n\t\t *        return false;\n\t\t *      }\n\t\t *    );\n\t\t */\n\t\tsearch: [],\n\t\n\t\n\t\t/**\n\t\t * Selector extensions\n\t\t *\n\t\t * The `selector` option can be used to extend the options available for the\n\t\t * selector modifier options (`selector-modifier` object data type) that\n\t\t * each of the three built in selector types offer (row, column and cell +\n\t\t * their plural counterparts). For example the Select extension uses this\n\t\t * mechanism to provide an option to select only rows, columns and cells\n\t\t * that have been marked as selected by the end user (`{selected: true}`),\n\t\t * which can be used in conjunction with the existing built in selector\n\t\t * options.\n\t\t *\n\t\t * Each property is an array to which functions can be pushed. The functions\n\t\t * take three attributes:\n\t\t *\n\t\t * * Settings object for the host table\n\t\t * * Options object (`selector-modifier` object type)\n\t\t * * Array of selected item indexes\n\t\t *\n\t\t * The return is an array of the resulting item indexes after the custom\n\t\t * selector has been applied.\n\t\t *\n\t\t *  @type object\n\t\t */\n\t\tselector: {\n\t\t\tcell: [],\n\t\t\tcolumn: [],\n\t\t\trow: []\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * Internal functions, exposed for used in plug-ins.\n\t\t * \n\t\t * Please note that you should not need to use the internal methods for\n\t\t * anything other than a plug-in (and even then, try to avoid if possible).\n\t\t * The internal function may change between releases.\n\t\t *\n\t\t *  @type object\n\t\t *  @default {}\n\t\t */\n\t\tinternal: {},\n\t\n\t\n\t\t/**\n\t\t * Legacy configuration options. Enable and disable legacy options that\n\t\t * are available in DataTables.\n\t\t *\n\t\t *  @type object\n\t\t */\n\t\tlegacy: {\n\t\t\t/**\n\t\t\t * Enable / disable DataTables 1.9 compatible server-side processing\n\t\t\t * requests\n\t\t\t *\n\t\t\t *  @type boolean\n\t\t\t *  @default null\n\t\t\t */\n\t\t\tajax: null\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * Pagination plug-in methods.\n\t\t * \n\t\t * Each entry in this object is a function and defines which buttons should\n\t\t * be shown by the pagination rendering method that is used for the table:\n\t\t * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the\n\t\t * buttons are displayed in the document, while the functions here tell it\n\t\t * what buttons to display. This is done by returning an array of button\n\t\t * descriptions (what each button will do).\n\t\t *\n\t\t * Pagination types (the four built in options and any additional plug-in\n\t\t * options defined here) can be used through the `paginationType`\n\t\t * initialisation parameter.\n\t\t *\n\t\t * The functions defined take two parameters:\n\t\t *\n\t\t * 1. `{int} page` The current page index\n\t\t * 2. `{int} pages` The number of pages in the table\n\t\t *\n\t\t * Each function is expected to return an array where each element of the\n\t\t * array can be one of:\n\t\t *\n\t\t * * `first` - Jump to first page when activated\n\t\t * * `last` - Jump to last page when activated\n\t\t * * `previous` - Show previous page when activated\n\t\t * * `next` - Show next page when activated\n\t\t * * `{int}` - Show page of the index given\n\t\t * * `{array}` - A nested array containing the above elements to add a\n\t\t *   containing 'DIV' element (might be useful for styling).\n\t\t *\n\t\t * Note that DataTables v1.9- used this object slightly differently whereby\n\t\t * an object with two functions would be defined for each plug-in. That\n\t\t * ability is still supported by DataTables 1.10+ to provide backwards\n\t\t * compatibility, but this option of use is now decremented and no longer\n\t\t * documented in DataTables 1.10+.\n\t\t *\n\t\t *  @type object\n\t\t *  @default {}\n\t\t *\n\t\t *  @example\n\t\t *    // Show previous, next and current page buttons only\n\t\t *    $.fn.dataTableExt.oPagination.current = function ( page, pages ) {\n\t\t *      return [ 'previous', page, 'next' ];\n\t\t *    };\n\t\t */\n\t\tpager: {},\n\t\n\t\n\t\trenderer: {\n\t\t\tpageButton: {},\n\t\t\theader: {}\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * Ordering plug-ins - custom data source\n\t\t * \n\t\t * The extension options for ordering of data available here is complimentary\n\t\t * to the default type based ordering that DataTables typically uses. It\n\t\t * allows much greater control over the the data that is being used to\n\t\t * order a column, but is necessarily therefore more complex.\n\t\t * \n\t\t * This type of ordering is useful if you want to do ordering based on data\n\t\t * live from the DOM (for example the contents of an 'input' element) rather\n\t\t * than just the static string that DataTables knows of.\n\t\t * \n\t\t * The way these plug-ins work is that you create an array of the values you\n\t\t * wish to be ordering for the column in question and then return that\n\t\t * array. The data in the array much be in the index order of the rows in\n\t\t * the table (not the currently ordering order!). Which order data gathering\n\t\t * function is run here depends on the `dt-init columns.orderDataType`\n\t\t * parameter that is used for the column (if any).\n\t\t *\n\t\t * The functions defined take two parameters:\n\t\t *\n\t\t * 1. `{object}` DataTables settings object: see\n\t\t *    {@link DataTable.models.oSettings}\n\t\t * 2. `{int}` Target column index\n\t\t *\n\t\t * Each function is expected to return an array:\n\t\t *\n\t\t * * `{array}` Data for the column to be ordering upon\n\t\t *\n\t\t *  @type array\n\t\t *\n\t\t *  @example\n\t\t *    // Ordering using `input` node values\n\t\t *    $.fn.dataTable.ext.order['dom-text'] = function  ( settings, col )\n\t\t *    {\n\t\t *      return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) {\n\t\t *        return $('input', td).val();\n\t\t *      } );\n\t\t *    }\n\t\t */\n\t\torder: {},\n\t\n\t\n\t\t/**\n\t\t * Type based plug-ins.\n\t\t *\n\t\t * Each column in DataTables has a type assigned to it, either by automatic\n\t\t * detection or by direct assignment using the `type` option for the column.\n\t\t * The type of a column will effect how it is ordering and search (plug-ins\n\t\t * can also make use of the column type if required).\n\t\t *\n\t\t * @namespace\n\t\t */\n\t\ttype: {\n\t\t\t/**\n\t\t\t * Type detection functions.\n\t\t\t *\n\t\t\t * The functions defined in this object are used to automatically detect\n\t\t\t * a column's type, making initialisation of DataTables super easy, even\n\t\t\t * when complex data is in the table.\n\t\t\t *\n\t\t\t * The functions defined take two parameters:\n\t\t\t *\n\t\t     *  1. `{*}` Data from the column cell to be analysed\n\t\t     *  2. `{settings}` DataTables settings object. This can be used to\n\t\t     *     perform context specific type detection - for example detection\n\t\t     *     based on language settings such as using a comma for a decimal\n\t\t     *     place. Generally speaking the options from the settings will not\n\t\t     *     be required\n\t\t\t *\n\t\t\t * Each function is expected to return:\n\t\t\t *\n\t\t\t * * `{string|null}` Data type detected, or null if unknown (and thus\n\t\t\t *   pass it on to the other type detection functions.\n\t\t\t *\n\t\t\t *  @type array\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Currency type detection plug-in:\n\t\t\t *    $.fn.dataTable.ext.type.detect.push(\n\t\t\t *      function ( data, settings ) {\n\t\t\t *        // Check the numeric part\n\t\t\t *        if ( ! $.isNumeric( data.substring(1) ) ) {\n\t\t\t *          return null;\n\t\t\t *        }\n\t\t\t *\n\t\t\t *        // Check prefixed by currency\n\t\t\t *        if ( data.charAt(0) == '$' || data.charAt(0) == '&pound;' ) {\n\t\t\t *          return 'currency';\n\t\t\t *        }\n\t\t\t *        return null;\n\t\t\t *      }\n\t\t\t *    );\n\t\t\t */\n\t\t\tdetect: [],\n\t\n\t\n\t\t\t/**\n\t\t\t * Type based search formatting.\n\t\t\t *\n\t\t\t * The type based searching functions can be used to pre-format the\n\t\t\t * data to be search on. For example, it can be used to strip HTML\n\t\t\t * tags or to de-format telephone numbers for numeric only searching.\n\t\t\t *\n\t\t\t * Note that is a search is not defined for a column of a given type,\n\t\t\t * no search formatting will be performed.\n\t\t\t * \n\t\t\t * Pre-processing of searching data plug-ins - When you assign the sType\n\t\t\t * for a column (or have it automatically detected for you by DataTables\n\t\t\t * or a type detection plug-in), you will typically be using this for\n\t\t\t * custom sorting, but it can also be used to provide custom searching\n\t\t\t * by allowing you to pre-processing the data and returning the data in\n\t\t\t * the format that should be searched upon. This is done by adding\n\t\t\t * functions this object with a parameter name which matches the sType\n\t\t\t * for that target column. This is the corollary of <i>afnSortData</i>\n\t\t\t * for searching data.\n\t\t\t *\n\t\t\t * The functions defined take a single parameter:\n\t\t\t *\n\t\t     *  1. `{*}` Data from the column cell to be prepared for searching\n\t\t\t *\n\t\t\t * Each function is expected to return:\n\t\t\t *\n\t\t\t * * `{string|null}` Formatted string that will be used for the searching.\n\t\t\t *\n\t\t\t *  @type object\n\t\t\t *  @default {}\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) {\n\t\t\t *      return d.replace(/\\n/g,\" \").replace( /<.*?>/g, \"\" );\n\t\t\t *    }\n\t\t\t */\n\t\t\tsearch: {},\n\t\n\t\n\t\t\t/**\n\t\t\t * Type based ordering.\n\t\t\t *\n\t\t\t * The column type tells DataTables what ordering to apply to the table\n\t\t\t * when a column is sorted upon. The order for each type that is defined,\n\t\t\t * is defined by the functions available in this object.\n\t\t\t *\n\t\t\t * Each ordering option can be described by three properties added to\n\t\t\t * this object:\n\t\t\t *\n\t\t\t * * `{type}-pre` - Pre-formatting function\n\t\t\t * * `{type}-asc` - Ascending order function\n\t\t\t * * `{type}-desc` - Descending order function\n\t\t\t *\n\t\t\t * All three can be used together, only `{type}-pre` or only\n\t\t\t * `{type}-asc` and `{type}-desc` together. It is generally recommended\n\t\t\t * that only `{type}-pre` is used, as this provides the optimal\n\t\t\t * implementation in terms of speed, although the others are provided\n\t\t\t * for compatibility with existing Javascript sort functions.\n\t\t\t *\n\t\t\t * `{type}-pre`: Functions defined take a single parameter:\n\t\t\t *\n\t\t     *  1. `{*}` Data from the column cell to be prepared for ordering\n\t\t\t *\n\t\t\t * And return:\n\t\t\t *\n\t\t\t * * `{*}` Data to be sorted upon\n\t\t\t *\n\t\t\t * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort\n\t\t\t * functions, taking two parameters:\n\t\t\t *\n\t\t     *  1. `{*}` Data to compare to the second parameter\n\t\t     *  2. `{*}` Data to compare to the first parameter\n\t\t\t *\n\t\t\t * And returning:\n\t\t\t *\n\t\t\t * * `{*}` Ordering match: <0 if first parameter should be sorted lower\n\t\t\t *   than the second parameter, ===0 if the two parameters are equal and\n\t\t\t *   >0 if the first parameter should be sorted height than the second\n\t\t\t *   parameter.\n\t\t\t * \n\t\t\t *  @type object\n\t\t\t *  @default {}\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Numeric ordering of formatted numbers with a pre-formatter\n\t\t\t *    $.extend( $.fn.dataTable.ext.type.order, {\n\t\t\t *      \"string-pre\": function(x) {\n\t\t\t *        a = (a === \"-\" || a === \"\") ? 0 : a.replace( /[^\\d\\-\\.]/g, \"\" );\n\t\t\t *        return parseFloat( a );\n\t\t\t *      }\n\t\t\t *    } );\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    // Case-sensitive string ordering, with no pre-formatting method\n\t\t\t *    $.extend( $.fn.dataTable.ext.order, {\n\t\t\t *      \"string-case-asc\": function(x,y) {\n\t\t\t *        return ((x < y) ? -1 : ((x > y) ? 1 : 0));\n\t\t\t *      },\n\t\t\t *      \"string-case-desc\": function(x,y) {\n\t\t\t *        return ((x < y) ? 1 : ((x > y) ? -1 : 0));\n\t\t\t *      }\n\t\t\t *    } );\n\t\t\t */\n\t\t\torder: {}\n\t\t},\n\t\n\t\t/**\n\t\t * Unique DataTables instance counter\n\t\t *\n\t\t * @type int\n\t\t * @private\n\t\t */\n\t\t_unique: 0,\n\t\n\t\n\t\t//\n\t\t// Depreciated\n\t\t// The following properties are retained for backwards compatiblity only.\n\t\t// The should not be used in new projects and will be removed in a future\n\t\t// version\n\t\t//\n\t\n\t\t/**\n\t\t * Version check function.\n\t\t *  @type function\n\t\t *  @depreciated Since 1.10\n\t\t */\n\t\tfnVersionCheck: DataTable.fnVersionCheck,\n\t\n\t\n\t\t/**\n\t\t * Index for what 'this' index API functions should use\n\t\t *  @type int\n\t\t *  @deprecated Since v1.10\n\t\t */\n\t\tiApiIndex: 0,\n\t\n\t\n\t\t/**\n\t\t * jQuery UI class container\n\t\t *  @type object\n\t\t *  @deprecated Since v1.10\n\t\t */\n\t\toJUIClasses: {},\n\t\n\t\n\t\t/**\n\t\t * Software version\n\t\t *  @type string\n\t\t *  @deprecated Since v1.10\n\t\t */\n\t\tsVersion: DataTable.version\n\t};\n\t\n\t\n\t//\n\t// Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts\n\t//\n\t$.extend( _ext, {\n\t\tafnFiltering: _ext.search,\n\t\taTypes:       _ext.type.detect,\n\t\tofnSearch:    _ext.type.search,\n\t\toSort:        _ext.type.order,\n\t\tafnSortData:  _ext.order,\n\t\taoFeatures:   _ext.feature,\n\t\toApi:         _ext.internal,\n\t\toStdClasses:  _ext.classes,\n\t\toPagination:  _ext.pager\n\t} );\n\t\n\t\n\t$.extend( DataTable.ext.classes, {\n\t\t\"sTable\": \"dataTable\",\n\t\t\"sNoFooter\": \"no-footer\",\n\t\n\t\t/* Paging buttons */\n\t\t\"sPageButton\": \"paginate_button\",\n\t\t\"sPageButtonActive\": \"current\",\n\t\t\"sPageButtonDisabled\": \"disabled\",\n\t\n\t\t/* Striping classes */\n\t\t\"sStripeOdd\": \"odd\",\n\t\t\"sStripeEven\": \"even\",\n\t\n\t\t/* Empty row */\n\t\t\"sRowEmpty\": \"dataTables_empty\",\n\t\n\t\t/* Features */\n\t\t\"sWrapper\": \"dataTables_wrapper\",\n\t\t\"sFilter\": \"dataTables_filter\",\n\t\t\"sInfo\": \"dataTables_info\",\n\t\t\"sPaging\": \"dataTables_paginate paging_\", /* Note that the type is postfixed */\n\t\t\"sLength\": \"dataTables_length\",\n\t\t\"sProcessing\": \"dataTables_processing\",\n\t\n\t\t/* Sorting */\n\t\t\"sSortAsc\": \"sorting_asc\",\n\t\t\"sSortDesc\": \"sorting_desc\",\n\t\t\"sSortable\": \"sorting\", /* Sortable in both directions */\n\t\t\"sSortableAsc\": \"sorting_asc_disabled\",\n\t\t\"sSortableDesc\": \"sorting_desc_disabled\",\n\t\t\"sSortableNone\": \"sorting_disabled\",\n\t\t\"sSortColumn\": \"sorting_\", /* Note that an int is postfixed for the sorting order */\n\t\n\t\t/* Filtering */\n\t\t\"sFilterInput\": \"\",\n\t\n\t\t/* Page length */\n\t\t\"sLengthSelect\": \"\",\n\t\n\t\t/* Scrolling */\n\t\t\"sScrollWrapper\": \"dataTables_scroll\",\n\t\t\"sScrollHead\": \"dataTables_scrollHead\",\n\t\t\"sScrollHeadInner\": \"dataTables_scrollHeadInner\",\n\t\t\"sScrollBody\": \"dataTables_scrollBody\",\n\t\t\"sScrollFoot\": \"dataTables_scrollFoot\",\n\t\t\"sScrollFootInner\": \"dataTables_scrollFootInner\",\n\t\n\t\t/* Misc */\n\t\t\"sHeaderTH\": \"\",\n\t\t\"sFooterTH\": \"\",\n\t\n\t\t// Deprecated\n\t\t\"sSortJUIAsc\": \"\",\n\t\t\"sSortJUIDesc\": \"\",\n\t\t\"sSortJUI\": \"\",\n\t\t\"sSortJUIAscAllowed\": \"\",\n\t\t\"sSortJUIDescAllowed\": \"\",\n\t\t\"sSortJUIWrapper\": \"\",\n\t\t\"sSortIcon\": \"\",\n\t\t\"sJUIHeader\": \"\",\n\t\t\"sJUIFooter\": \"\"\n\t} );\n\t\n\t\n\t(function() {\n\t\n\t// Reused strings for better compression. Closure compiler appears to have a\n\t// weird edge case where it is trying to expand strings rather than use the\n\t// variable version. This results in about 200 bytes being added, for very\n\t// little preference benefit since it this run on script load only.\n\tvar _empty = '';\n\t_empty = '';\n\t\n\tvar _stateDefault = _empty + 'ui-state-default';\n\tvar _sortIcon     = _empty + 'css_right ui-icon ui-icon-';\n\tvar _headerFooter = _empty + 'fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix';\n\t\n\t$.extend( DataTable.ext.oJUIClasses, DataTable.ext.classes, {\n\t\t/* Full numbers paging buttons */\n\t\t\"sPageButton\":         \"fg-button ui-button \"+_stateDefault,\n\t\t\"sPageButtonActive\":   \"ui-state-disabled\",\n\t\t\"sPageButtonDisabled\": \"ui-state-disabled\",\n\t\n\t\t/* Features */\n\t\t\"sPaging\": \"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi \"+\n\t\t\t\"ui-buttonset-multi paging_\", /* Note that the type is postfixed */\n\t\n\t\t/* Sorting */\n\t\t\"sSortAsc\":            _stateDefault+\" sorting_asc\",\n\t\t\"sSortDesc\":           _stateDefault+\" sorting_desc\",\n\t\t\"sSortable\":           _stateDefault+\" sorting\",\n\t\t\"sSortableAsc\":        _stateDefault+\" sorting_asc_disabled\",\n\t\t\"sSortableDesc\":       _stateDefault+\" sorting_desc_disabled\",\n\t\t\"sSortableNone\":       _stateDefault+\" sorting_disabled\",\n\t\t\"sSortJUIAsc\":         _sortIcon+\"triangle-1-n\",\n\t\t\"sSortJUIDesc\":        _sortIcon+\"triangle-1-s\",\n\t\t\"sSortJUI\":            _sortIcon+\"carat-2-n-s\",\n\t\t\"sSortJUIAscAllowed\":  _sortIcon+\"carat-1-n\",\n\t\t\"sSortJUIDescAllowed\": _sortIcon+\"carat-1-s\",\n\t\t\"sSortJUIWrapper\":     \"DataTables_sort_wrapper\",\n\t\t\"sSortIcon\":           \"DataTables_sort_icon\",\n\t\n\t\t/* Scrolling */\n\t\t\"sScrollHead\": \"dataTables_scrollHead \"+_stateDefault,\n\t\t\"sScrollFoot\": \"dataTables_scrollFoot \"+_stateDefault,\n\t\n\t\t/* Misc */\n\t\t\"sHeaderTH\":  _stateDefault,\n\t\t\"sFooterTH\":  _stateDefault,\n\t\t\"sJUIHeader\": _headerFooter+\" ui-corner-tl ui-corner-tr\",\n\t\t\"sJUIFooter\": _headerFooter+\" ui-corner-bl ui-corner-br\"\n\t} );\n\t\n\t}());\n\t\n\t\n\t\n\tvar extPagination = DataTable.ext.pager;\n\t\n\tfunction _numbers ( page, pages ) {\n\t\tvar\n\t\t\tnumbers = [],\n\t\t\tbuttons = extPagination.numbers_length,\n\t\t\thalf = Math.floor( buttons / 2 ),\n\t\t\ti = 1;\n\t\n\t\tif ( pages <= buttons ) {\n\t\t\tnumbers = _range( 0, pages );\n\t\t}\n\t\telse if ( page <= half ) {\n\t\t\tnumbers = _range( 0, buttons-2 );\n\t\t\tnumbers.push( 'ellipsis' );\n\t\t\tnumbers.push( pages-1 );\n\t\t}\n\t\telse if ( page >= pages - 1 - half ) {\n\t\t\tnumbers = _range( pages-(buttons-2), pages );\n\t\t\tnumbers.splice( 0, 0, 'ellipsis' ); // no unshift in ie6\n\t\t\tnumbers.splice( 0, 0, 0 );\n\t\t}\n\t\telse {\n\t\t\tnumbers = _range( page-half+2, page+half-1 );\n\t\t\tnumbers.push( 'ellipsis' );\n\t\t\tnumbers.push( pages-1 );\n\t\t\tnumbers.splice( 0, 0, 'ellipsis' );\n\t\t\tnumbers.splice( 0, 0, 0 );\n\t\t}\n\t\n\t\tnumbers.DT_el = 'span';\n\t\treturn numbers;\n\t}\n\t\n\t\n\t$.extend( extPagination, {\n\t\tsimple: function ( page, pages ) {\n\t\t\treturn [ 'previous', 'next' ];\n\t\t},\n\t\n\t\tfull: function ( page, pages ) {\n\t\t\treturn [  'first', 'previous', 'next', 'last' ];\n\t\t},\n\t\n\t\tnumbers: function ( page, pages ) {\n\t\t\treturn [ _numbers(page, pages) ];\n\t\t},\n\t\n\t\tsimple_numbers: function ( page, pages ) {\n\t\t\treturn [ 'previous', _numbers(page, pages), 'next' ];\n\t\t},\n\t\n\t\tfull_numbers: function ( page, pages ) {\n\t\t\treturn [ 'first', 'previous', _numbers(page, pages), 'next', 'last' ];\n\t\t},\n\t\t\n\t\tfirst_last_numbers: function (page, pages) {\n\t \t\treturn ['first', _numbers(page, pages), 'last'];\n\t \t},\n\t\n\t\t// For testing and plug-ins to use\n\t\t_numbers: _numbers,\n\t\n\t\t// Number of number buttons (including ellipsis) to show. _Must be odd!_\n\t\tnumbers_length: 7\n\t} );\n\t\n\t\n\t$.extend( true, DataTable.ext.renderer, {\n\t\tpageButton: {\n\t\t\t_: function ( settings, host, idx, buttons, page, pages ) {\n\t\t\t\tvar classes = settings.oClasses;\n\t\t\t\tvar lang = settings.oLanguage.oPaginate;\n\t\t\t\tvar aria = settings.oLanguage.oAria.paginate || {};\n\t\t\t\tvar btnDisplay, btnClass, counter=0;\n\t\n\t\t\t\tvar attach = function( container, buttons ) {\n\t\t\t\t\tvar i, ien, node, button;\n\t\t\t\t\tvar clickHandler = function ( e ) {\n\t\t\t\t\t\t_fnPageChange( settings, e.data.action, true );\n\t\t\t\t\t};\n\t\n\t\t\t\t\tfor ( i=0, ien=buttons.length ; i<ien ; i++ ) {\n\t\t\t\t\t\tbutton = buttons[i];\n\t\n\t\t\t\t\t\tif ( $.isArray( button ) ) {\n\t\t\t\t\t\t\tvar inner = $( '<'+(button.DT_el || 'div')+'/>' )\n\t\t\t\t\t\t\t\t.appendTo( container );\n\t\t\t\t\t\t\tattach( inner, button );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tbtnDisplay = null;\n\t\t\t\t\t\t\tbtnClass = '';\n\t\n\t\t\t\t\t\t\tswitch ( button ) {\n\t\t\t\t\t\t\t\tcase 'ellipsis':\n\t\t\t\t\t\t\t\t\tcontainer.append('<span class=\"ellipsis\">&#x2026;</span>');\n\t\t\t\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\t\t\t\tcase 'first':\n\t\t\t\t\t\t\t\t\tbtnDisplay = lang.sFirst;\n\t\t\t\t\t\t\t\t\tbtnClass = button + (page > 0 ?\n\t\t\t\t\t\t\t\t\t\t'' : ' '+classes.sPageButtonDisabled);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\t\t\t\tcase 'previous':\n\t\t\t\t\t\t\t\t\tbtnDisplay = lang.sPrevious;\n\t\t\t\t\t\t\t\t\tbtnClass = button + (page > 0 ?\n\t\t\t\t\t\t\t\t\t\t'' : ' '+classes.sPageButtonDisabled);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\t\t\t\tcase 'next':\n\t\t\t\t\t\t\t\t\tbtnDisplay = lang.sNext;\n\t\t\t\t\t\t\t\t\tbtnClass = button + (page < pages-1 ?\n\t\t\t\t\t\t\t\t\t\t'' : ' '+classes.sPageButtonDisabled);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\t\t\t\tcase 'last':\n\t\t\t\t\t\t\t\t\tbtnDisplay = lang.sLast;\n\t\t\t\t\t\t\t\t\tbtnClass = button + (page < pages-1 ?\n\t\t\t\t\t\t\t\t\t\t'' : ' '+classes.sPageButtonDisabled);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tbtnDisplay = button + 1;\n\t\t\t\t\t\t\t\t\tbtnClass = page === button ?\n\t\t\t\t\t\t\t\t\t\tclasses.sPageButtonActive : '';\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t\tif ( btnDisplay !== null ) {\n\t\t\t\t\t\t\t\tnode = $('<a>', {\n\t\t\t\t\t\t\t\t\t\t'class': classes.sPageButton+' '+btnClass,\n\t\t\t\t\t\t\t\t\t\t'aria-controls': settings.sTableId,\n\t\t\t\t\t\t\t\t\t\t'aria-label': aria[ button ],\n\t\t\t\t\t\t\t\t\t\t'data-dt-idx': counter,\n\t\t\t\t\t\t\t\t\t\t'tabindex': settings.iTabIndex,\n\t\t\t\t\t\t\t\t\t\t'id': idx === 0 && typeof button === 'string' ?\n\t\t\t\t\t\t\t\t\t\t\tsettings.sTableId +'_'+ button :\n\t\t\t\t\t\t\t\t\t\t\tnull\n\t\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t\t.html( btnDisplay )\n\t\t\t\t\t\t\t\t\t.appendTo( container );\n\t\n\t\t\t\t\t\t\t\t_fnBindAction(\n\t\t\t\t\t\t\t\t\tnode, {action: button}, clickHandler\n\t\t\t\t\t\t\t\t);\n\t\n\t\t\t\t\t\t\t\tcounter++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\n\t\t\t\t// IE9 throws an 'unknown error' if document.activeElement is used\n\t\t\t\t// inside an iframe or frame. Try / catch the error. Not good for\n\t\t\t\t// accessibility, but neither are frames.\n\t\t\t\tvar activeEl;\n\t\n\t\t\t\ttry {\n\t\t\t\t\t// Because this approach is destroying and recreating the paging\n\t\t\t\t\t// elements, focus is lost on the select button which is bad for\n\t\t\t\t\t// accessibility. So we want to restore focus once the draw has\n\t\t\t\t\t// completed\n\t\t\t\t\tactiveEl = $(host).find(document.activeElement).data('dt-idx');\n\t\t\t\t}\n\t\t\t\tcatch (e) {}\n\t\n\t\t\t\tattach( $(host).empty(), buttons );\n\t\n\t\t\t\tif ( activeEl !== undefined ) {\n\t\t\t\t\t$(host).find( '[data-dt-idx='+activeEl+']' ).focus();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} );\n\t\n\t\n\t\n\t// Built in type detection. See model.ext.aTypes for information about\n\t// what is required from this methods.\n\t$.extend( DataTable.ext.type.detect, [\n\t\t// Plain numbers - first since V8 detects some plain numbers as dates\n\t\t// e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...).\n\t\tfunction ( d, settings )\n\t\t{\n\t\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\t\treturn _isNumber( d, decimal ) ? 'num'+decimal : null;\n\t\t},\n\t\n\t\t// Dates (only those recognised by the browser's Date.parse)\n\t\tfunction ( d, settings )\n\t\t{\n\t\t\t// V8 tries _very_ hard to make a string passed into `Date.parse()`\n\t\t\t// valid, so we need to use a regex to restrict date formats. Use a\n\t\t\t// plug-in for anything other than ISO8601 style strings\n\t\t\tif ( d && !(d instanceof Date) && ! _re_date.test(d) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tvar parsed = Date.parse(d);\n\t\t\treturn (parsed !== null && !isNaN(parsed)) || _empty(d) ? 'date' : null;\n\t\t},\n\t\n\t\t// Formatted numbers\n\t\tfunction ( d, settings )\n\t\t{\n\t\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\t\treturn _isNumber( d, decimal, true ) ? 'num-fmt'+decimal : null;\n\t\t},\n\t\n\t\t// HTML numeric\n\t\tfunction ( d, settings )\n\t\t{\n\t\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\t\treturn _htmlNumeric( d, decimal ) ? 'html-num'+decimal : null;\n\t\t},\n\t\n\t\t// HTML numeric, formatted\n\t\tfunction ( d, settings )\n\t\t{\n\t\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\t\treturn _htmlNumeric( d, decimal, true ) ? 'html-num-fmt'+decimal : null;\n\t\t},\n\t\n\t\t// HTML (this is strict checking - there must be html)\n\t\tfunction ( d, settings )\n\t\t{\n\t\t\treturn _empty( d ) || (typeof d === 'string' && d.indexOf('<') !== -1) ?\n\t\t\t\t'html' : null;\n\t\t}\n\t] );\n\t\n\t\n\t\n\t// Filter formatting functions. See model.ext.ofnSearch for information about\n\t// what is required from these methods.\n\t// \n\t// Note that additional search methods are added for the html numbers and\n\t// html formatted numbers by `_addNumericSort()` when we know what the decimal\n\t// place is\n\t\n\t\n\t$.extend( DataTable.ext.type.search, {\n\t\thtml: function ( data ) {\n\t\t\treturn _empty(data) ?\n\t\t\t\tdata :\n\t\t\t\ttypeof data === 'string' ?\n\t\t\t\t\tdata\n\t\t\t\t\t\t.replace( _re_new_lines, \" \" )\n\t\t\t\t\t\t.replace( _re_html, \"\" ) :\n\t\t\t\t\t'';\n\t\t},\n\t\n\t\tstring: function ( data ) {\n\t\t\treturn _empty(data) ?\n\t\t\t\tdata :\n\t\t\t\ttypeof data === 'string' ?\n\t\t\t\t\tdata.replace( _re_new_lines, \" \" ) :\n\t\t\t\t\tdata;\n\t\t}\n\t} );\n\t\n\t\n\t\n\tvar __numericReplace = function ( d, decimalPlace, re1, re2 ) {\n\t\tif ( d !== 0 && (!d || d === '-') ) {\n\t\t\treturn -Infinity;\n\t\t}\n\t\n\t\t// If a decimal place other than `.` is used, it needs to be given to the\n\t\t// function so we can detect it and replace with a `.` which is the only\n\t\t// decimal place Javascript recognises - it is not locale aware.\n\t\tif ( decimalPlace ) {\n\t\t\td = _numToDecimal( d, decimalPlace );\n\t\t}\n\t\n\t\tif ( d.replace ) {\n\t\t\tif ( re1 ) {\n\t\t\t\td = d.replace( re1, '' );\n\t\t\t}\n\t\n\t\t\tif ( re2 ) {\n\t\t\t\td = d.replace( re2, '' );\n\t\t\t}\n\t\t}\n\t\n\t\treturn d * 1;\n\t};\n\t\n\t\n\t// Add the numeric 'deformatting' functions for sorting and search. This is done\n\t// in a function to provide an easy ability for the language options to add\n\t// additional methods if a non-period decimal place is used.\n\tfunction _addNumericSort ( decimalPlace ) {\n\t\t$.each(\n\t\t\t{\n\t\t\t\t// Plain numbers\n\t\t\t\t\"num\": function ( d ) {\n\t\t\t\t\treturn __numericReplace( d, decimalPlace );\n\t\t\t\t},\n\t\n\t\t\t\t// Formatted numbers\n\t\t\t\t\"num-fmt\": function ( d ) {\n\t\t\t\t\treturn __numericReplace( d, decimalPlace, _re_formatted_numeric );\n\t\t\t\t},\n\t\n\t\t\t\t// HTML numeric\n\t\t\t\t\"html-num\": function ( d ) {\n\t\t\t\t\treturn __numericReplace( d, decimalPlace, _re_html );\n\t\t\t\t},\n\t\n\t\t\t\t// HTML numeric, formatted\n\t\t\t\t\"html-num-fmt\": function ( d ) {\n\t\t\t\t\treturn __numericReplace( d, decimalPlace, _re_html, _re_formatted_numeric );\n\t\t\t\t}\n\t\t\t},\n\t\t\tfunction ( key, fn ) {\n\t\t\t\t// Add the ordering method\n\t\t\t\t_ext.type.order[ key+decimalPlace+'-pre' ] = fn;\n\t\n\t\t\t\t// For HTML types add a search formatter that will strip the HTML\n\t\t\t\tif ( key.match(/^html\\-/) ) {\n\t\t\t\t\t_ext.type.search[ key+decimalPlace ] = _ext.type.search.html;\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\t\n\t\n\t// Default sort methods\n\t$.extend( _ext.type.order, {\n\t\t// Dates\n\t\t\"date-pre\": function ( d ) {\n\t\t\treturn Date.parse( d ) || -Infinity;\n\t\t},\n\t\n\t\t// html\n\t\t\"html-pre\": function ( a ) {\n\t\t\treturn _empty(a) ?\n\t\t\t\t'' :\n\t\t\t\ta.replace ?\n\t\t\t\t\ta.replace( /<.*?>/g, \"\" ).toLowerCase() :\n\t\t\t\t\ta+'';\n\t\t},\n\t\n\t\t// string\n\t\t\"string-pre\": function ( a ) {\n\t\t\t// This is a little complex, but faster than always calling toString,\n\t\t\t// http://jsperf.com/tostring-v-check\n\t\t\treturn _empty(a) ?\n\t\t\t\t'' :\n\t\t\t\ttypeof a === 'string' ?\n\t\t\t\t\ta.toLowerCase() :\n\t\t\t\t\t! a.toString ?\n\t\t\t\t\t\t'' :\n\t\t\t\t\t\ta.toString();\n\t\t},\n\t\n\t\t// string-asc and -desc are retained only for compatibility with the old\n\t\t// sort methods\n\t\t\"string-asc\": function ( x, y ) {\n\t\t\treturn ((x < y) ? -1 : ((x > y) ? 1 : 0));\n\t\t},\n\t\n\t\t\"string-desc\": function ( x, y ) {\n\t\t\treturn ((x < y) ? 1 : ((x > y) ? -1 : 0));\n\t\t}\n\t} );\n\t\n\t\n\t// Numeric sorting types - order doesn't matter here\n\t_addNumericSort( '' );\n\t\n\t\n\t$.extend( true, DataTable.ext.renderer, {\n\t\theader: {\n\t\t\t_: function ( settings, cell, column, classes ) {\n\t\t\t\t// No additional mark-up required\n\t\t\t\t// Attach a sort listener to update on sort - note that using the\n\t\t\t\t// `DT` namespace will allow the event to be removed automatically\n\t\t\t\t// on destroy, while the `dt` namespaced event is the one we are\n\t\t\t\t// listening for\n\t\t\t\t$(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {\n\t\t\t\t\tif ( settings !== ctx ) { // need to check this this is the host\n\t\t\t\t\t\treturn;               // table, not a nested one\n\t\t\t\t\t}\n\t\n\t\t\t\t\tvar colIdx = column.idx;\n\t\n\t\t\t\t\tcell\n\t\t\t\t\t\t.removeClass(\n\t\t\t\t\t\t\tcolumn.sSortingClass +' '+\n\t\t\t\t\t\t\tclasses.sSortAsc +' '+\n\t\t\t\t\t\t\tclasses.sSortDesc\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.addClass( columns[ colIdx ] == 'asc' ?\n\t\t\t\t\t\t\tclasses.sSortAsc : columns[ colIdx ] == 'desc' ?\n\t\t\t\t\t\t\t\tclasses.sSortDesc :\n\t\t\t\t\t\t\t\tcolumn.sSortingClass\n\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t\t},\n\t\n\t\t\tjqueryui: function ( settings, cell, column, classes ) {\n\t\t\t\t$('<div/>')\n\t\t\t\t\t.addClass( classes.sSortJUIWrapper )\n\t\t\t\t\t.append( cell.contents() )\n\t\t\t\t\t.append( $('<span/>')\n\t\t\t\t\t\t.addClass( classes.sSortIcon+' '+column.sSortingClassJUI )\n\t\t\t\t\t)\n\t\t\t\t\t.appendTo( cell );\n\t\n\t\t\t\t// Attach a sort listener to update on sort\n\t\t\t\t$(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {\n\t\t\t\t\tif ( settings !== ctx ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\n\t\t\t\t\tvar colIdx = column.idx;\n\t\n\t\t\t\t\tcell\n\t\t\t\t\t\t.removeClass( classes.sSortAsc +\" \"+classes.sSortDesc )\n\t\t\t\t\t\t.addClass( columns[ colIdx ] == 'asc' ?\n\t\t\t\t\t\t\tclasses.sSortAsc : columns[ colIdx ] == 'desc' ?\n\t\t\t\t\t\t\t\tclasses.sSortDesc :\n\t\t\t\t\t\t\t\tcolumn.sSortingClass\n\t\t\t\t\t\t);\n\t\n\t\t\t\t\tcell\n\t\t\t\t\t\t.find( 'span.'+classes.sSortIcon )\n\t\t\t\t\t\t.removeClass(\n\t\t\t\t\t\t\tclasses.sSortJUIAsc +\" \"+\n\t\t\t\t\t\t\tclasses.sSortJUIDesc +\" \"+\n\t\t\t\t\t\t\tclasses.sSortJUI +\" \"+\n\t\t\t\t\t\t\tclasses.sSortJUIAscAllowed +\" \"+\n\t\t\t\t\t\t\tclasses.sSortJUIDescAllowed\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.addClass( columns[ colIdx ] == 'asc' ?\n\t\t\t\t\t\t\tclasses.sSortJUIAsc : columns[ colIdx ] == 'desc' ?\n\t\t\t\t\t\t\t\tclasses.sSortJUIDesc :\n\t\t\t\t\t\t\t\tcolumn.sSortingClassJUI\n\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t} );\n\t\n\t/*\n\t * Public helper functions. These aren't used internally by DataTables, or\n\t * called by any of the options passed into DataTables, but they can be used\n\t * externally by developers working with DataTables. They are helper functions\n\t * to make working with DataTables a little bit easier.\n\t */\n\t\n\tvar __htmlEscapeEntities = function ( d ) {\n\t\treturn typeof d === 'string' ?\n\t\t\td.replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;') :\n\t\t\td;\n\t};\n\t\n\t/**\n\t * Helpers for `columns.render`.\n\t *\n\t * The options defined here can be used with the `columns.render` initialisation\n\t * option to provide a display renderer. The following functions are defined:\n\t *\n\t * * `number` - Will format numeric data (defined by `columns.data`) for\n\t *   display, retaining the original unformatted data for sorting and filtering.\n\t *   It takes 5 parameters:\n\t *   * `string` - Thousands grouping separator\n\t *   * `string` - Decimal point indicator\n\t *   * `integer` - Number of decimal points to show\n\t *   * `string` (optional) - Prefix.\n\t *   * `string` (optional) - Postfix (/suffix).\n\t * * `text` - Escape HTML to help prevent XSS attacks. It has no optional\n\t *   parameters.\n\t *\n\t * @example\n\t *   // Column definition using the number renderer\n\t *   {\n\t *     data: \"salary\",\n\t *     render: $.fn.dataTable.render.number( '\\'', '.', 0, '$' )\n\t *   }\n\t *\n\t * @namespace\n\t */\n\tDataTable.render = {\n\t\tnumber: function ( thousands, decimal, precision, prefix, postfix ) {\n\t\t\treturn {\n\t\t\t\tdisplay: function ( d ) {\n\t\t\t\t\tif ( typeof d !== 'number' && typeof d !== 'string' ) {\n\t\t\t\t\t\treturn d;\n\t\t\t\t\t}\n\t\n\t\t\t\t\tvar negative = d < 0 ? '-' : '';\n\t\t\t\t\tvar flo = parseFloat( d );\n\t\n\t\t\t\t\t// If NaN then there isn't much formatting that we can do - just\n\t\t\t\t\t// return immediately, escaping any HTML (this was supposed to\n\t\t\t\t\t// be a number after all)\n\t\t\t\t\tif ( isNaN( flo ) ) {\n\t\t\t\t\t\treturn __htmlEscapeEntities( d );\n\t\t\t\t\t}\n\t\n\t\t\t\t\tflo = flo.toFixed( precision );\n\t\t\t\t\td = Math.abs( flo );\n\t\n\t\t\t\t\tvar intPart = parseInt( d, 10 );\n\t\t\t\t\tvar floatPart = precision ?\n\t\t\t\t\t\tdecimal+(d - intPart).toFixed( precision ).substring( 2 ):\n\t\t\t\t\t\t'';\n\t\n\t\t\t\t\treturn negative + (prefix||'') +\n\t\t\t\t\t\tintPart.toString().replace(\n\t\t\t\t\t\t\t/\\B(?=(\\d{3})+(?!\\d))/g, thousands\n\t\t\t\t\t\t) +\n\t\t\t\t\t\tfloatPart +\n\t\t\t\t\t\t(postfix||'');\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t\n\t\ttext: function () {\n\t\t\treturn {\n\t\t\t\tdisplay: __htmlEscapeEntities\n\t\t\t};\n\t\t}\n\t};\n\t\n\t\n\t/*\n\t * This is really a good bit rubbish this method of exposing the internal methods\n\t * publicly... - To be fixed in 2.0 using methods on the prototype\n\t */\n\t\n\t\n\t/**\n\t * Create a wrapper function for exporting an internal functions to an external API.\n\t *  @param {string} fn API function name\n\t *  @returns {function} wrapped function\n\t *  @memberof DataTable#internal\n\t */\n\tfunction _fnExternApiFunc (fn)\n\t{\n\t\treturn function() {\n\t\t\tvar args = [_fnSettingsFromNode( this[DataTable.ext.iApiIndex] )].concat(\n\t\t\t\tArray.prototype.slice.call(arguments)\n\t\t\t);\n\t\t\treturn DataTable.ext.internal[fn].apply( this, args );\n\t\t};\n\t}\n\t\n\t\n\t/**\n\t * Reference to internal functions for use by plug-in developers. Note that\n\t * these methods are references to internal functions and are considered to be\n\t * private. If you use these methods, be aware that they are liable to change\n\t * between versions.\n\t *  @namespace\n\t */\n\t$.extend( DataTable.ext.internal, {\n\t\t_fnExternApiFunc: _fnExternApiFunc,\n\t\t_fnBuildAjax: _fnBuildAjax,\n\t\t_fnAjaxUpdate: _fnAjaxUpdate,\n\t\t_fnAjaxParameters: _fnAjaxParameters,\n\t\t_fnAjaxUpdateDraw: _fnAjaxUpdateDraw,\n\t\t_fnAjaxDataSrc: _fnAjaxDataSrc,\n\t\t_fnAddColumn: _fnAddColumn,\n\t\t_fnColumnOptions: _fnColumnOptions,\n\t\t_fnAdjustColumnSizing: _fnAdjustColumnSizing,\n\t\t_fnVisibleToColumnIndex: _fnVisibleToColumnIndex,\n\t\t_fnColumnIndexToVisible: _fnColumnIndexToVisible,\n\t\t_fnVisbleColumns: _fnVisbleColumns,\n\t\t_fnGetColumns: _fnGetColumns,\n\t\t_fnColumnTypes: _fnColumnTypes,\n\t\t_fnApplyColumnDefs: _fnApplyColumnDefs,\n\t\t_fnHungarianMap: _fnHungarianMap,\n\t\t_fnCamelToHungarian: _fnCamelToHungarian,\n\t\t_fnLanguageCompat: _fnLanguageCompat,\n\t\t_fnBrowserDetect: _fnBrowserDetect,\n\t\t_fnAddData: _fnAddData,\n\t\t_fnAddTr: _fnAddTr,\n\t\t_fnNodeToDataIndex: _fnNodeToDataIndex,\n\t\t_fnNodeToColumnIndex: _fnNodeToColumnIndex,\n\t\t_fnGetCellData: _fnGetCellData,\n\t\t_fnSetCellData: _fnSetCellData,\n\t\t_fnSplitObjNotation: _fnSplitObjNotation,\n\t\t_fnGetObjectDataFn: _fnGetObjectDataFn,\n\t\t_fnSetObjectDataFn: _fnSetObjectDataFn,\n\t\t_fnGetDataMaster: _fnGetDataMaster,\n\t\t_fnClearTable: _fnClearTable,\n\t\t_fnDeleteIndex: _fnDeleteIndex,\n\t\t_fnInvalidate: _fnInvalidate,\n\t\t_fnGetRowElements: _fnGetRowElements,\n\t\t_fnCreateTr: _fnCreateTr,\n\t\t_fnBuildHead: _fnBuildHead,\n\t\t_fnDrawHead: _fnDrawHead,\n\t\t_fnDraw: _fnDraw,\n\t\t_fnReDraw: _fnReDraw,\n\t\t_fnAddOptionsHtml: _fnAddOptionsHtml,\n\t\t_fnDetectHeader: _fnDetectHeader,\n\t\t_fnGetUniqueThs: _fnGetUniqueThs,\n\t\t_fnFeatureHtmlFilter: _fnFeatureHtmlFilter,\n\t\t_fnFilterComplete: _fnFilterComplete,\n\t\t_fnFilterCustom: _fnFilterCustom,\n\t\t_fnFilterColumn: _fnFilterColumn,\n\t\t_fnFilter: _fnFilter,\n\t\t_fnFilterCreateSearch: _fnFilterCreateSearch,\n\t\t_fnEscapeRegex: _fnEscapeRegex,\n\t\t_fnFilterData: _fnFilterData,\n\t\t_fnFeatureHtmlInfo: _fnFeatureHtmlInfo,\n\t\t_fnUpdateInfo: _fnUpdateInfo,\n\t\t_fnInfoMacros: _fnInfoMacros,\n\t\t_fnInitialise: _fnInitialise,\n\t\t_fnInitComplete: _fnInitComplete,\n\t\t_fnLengthChange: _fnLengthChange,\n\t\t_fnFeatureHtmlLength: _fnFeatureHtmlLength,\n\t\t_fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate,\n\t\t_fnPageChange: _fnPageChange,\n\t\t_fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing,\n\t\t_fnProcessingDisplay: _fnProcessingDisplay,\n\t\t_fnFeatureHtmlTable: _fnFeatureHtmlTable,\n\t\t_fnScrollDraw: _fnScrollDraw,\n\t\t_fnApplyToChildren: _fnApplyToChildren,\n\t\t_fnCalculateColumnWidths: _fnCalculateColumnWidths,\n\t\t_fnThrottle: _fnThrottle,\n\t\t_fnConvertToWidth: _fnConvertToWidth,\n\t\t_fnGetWidestNode: _fnGetWidestNode,\n\t\t_fnGetMaxLenString: _fnGetMaxLenString,\n\t\t_fnStringToCss: _fnStringToCss,\n\t\t_fnSortFlatten: _fnSortFlatten,\n\t\t_fnSort: _fnSort,\n\t\t_fnSortAria: _fnSortAria,\n\t\t_fnSortListener: _fnSortListener,\n\t\t_fnSortAttachListener: _fnSortAttachListener,\n\t\t_fnSortingClasses: _fnSortingClasses,\n\t\t_fnSortData: _fnSortData,\n\t\t_fnSaveState: _fnSaveState,\n\t\t_fnLoadState: _fnLoadState,\n\t\t_fnSettingsFromNode: _fnSettingsFromNode,\n\t\t_fnLog: _fnLog,\n\t\t_fnMap: _fnMap,\n\t\t_fnBindAction: _fnBindAction,\n\t\t_fnCallbackReg: _fnCallbackReg,\n\t\t_fnCallbackFire: _fnCallbackFire,\n\t\t_fnLengthOverflow: _fnLengthOverflow,\n\t\t_fnRenderer: _fnRenderer,\n\t\t_fnDataSource: _fnDataSource,\n\t\t_fnRowAttributes: _fnRowAttributes,\n\t\t_fnCalculateEnd: function () {} // Used by a lot of plug-ins, but redundant\n\t\t                                // in 1.10, so this dead-end function is\n\t\t                                // added to prevent errors\n\t} );\n\t\n\n\t// jQuery access\n\t$.fn.dataTable = DataTable;\n\n\t// Provide access to the host jQuery object (circular reference)\n\tDataTable.$ = $;\n\n\t// Legacy aliases\n\t$.fn.dataTableSettings = DataTable.settings;\n\t$.fn.dataTableExt = DataTable.ext;\n\n\t// With a capital `D` we return a DataTables API instance rather than a\n\t// jQuery object\n\t$.fn.DataTable = function ( opts ) {\n\t\treturn $(this).dataTable( opts ).api();\n\t};\n\n\t// All properties that are available to $.fn.dataTable should also be\n\t// available on $.fn.DataTable\n\t$.each( DataTable, function ( prop, val ) {\n\t\t$.fn.DataTable[ prop ] = val;\n\t} );\n\n\n\t// Information about events fired by DataTables - for documentation.\n\t/**\n\t * Draw event, fired whenever the table is redrawn on the page, at the same\n\t * point as fnDrawCallback. This may be useful for binding events or\n\t * performing calculations when the table is altered at all.\n\t *  @name DataTable#draw.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * Search event, fired when the searching applied to the table (using the\n\t * built-in global search, or column filters) is altered.\n\t *  @name DataTable#search.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * Page change event, fired when the paging of the table is altered.\n\t *  @name DataTable#page.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * Order event, fired when the ordering applied to the table is altered.\n\t *  @name DataTable#order.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * DataTables initialisation complete event, fired when the table is fully\n\t * drawn, including Ajax data loaded, if Ajax data is required.\n\t *  @name DataTable#init.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} oSettings DataTables settings object\n\t *  @param {object} json The JSON object request from the server - only\n\t *    present if client-side Ajax sourced data is used</li></ol>\n\t */\n\n\t/**\n\t * State save event, fired when the table has changed state a new state save\n\t * is required. This event allows modification of the state saving object\n\t * prior to actually doing the save, including addition or other state\n\t * properties (for plug-ins) or modification of a DataTables core property.\n\t *  @name DataTable#stateSaveParams.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} oSettings DataTables settings object\n\t *  @param {object} json The state information to be saved\n\t */\n\n\t/**\n\t * State load event, fired when the table is loading state from the stored\n\t * data, but prior to the settings object being modified by the saved state\n\t * - allowing modification of the saved state is required or loading of\n\t * state for a plug-in.\n\t *  @name DataTable#stateLoadParams.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} oSettings DataTables settings object\n\t *  @param {object} json The saved state information\n\t */\n\n\t/**\n\t * State loaded event, fired when state has been loaded from stored data and\n\t * the settings object has been modified by the loaded data.\n\t *  @name DataTable#stateLoaded.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} oSettings DataTables settings object\n\t *  @param {object} json The saved state information\n\t */\n\n\t/**\n\t * Processing event, fired when DataTables is doing some kind of processing\n\t * (be it, order, searcg or anything else). It can be used to indicate to\n\t * the end user that there is something happening, or that something has\n\t * finished.\n\t *  @name DataTable#processing.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} oSettings DataTables settings object\n\t *  @param {boolean} bShow Flag for if DataTables is doing processing or not\n\t */\n\n\t/**\n\t * Ajax (XHR) event, fired whenever an Ajax request is completed from a\n\t * request to made to the server for new data. This event is called before\n\t * DataTables processed the returned data, so it can also be used to pre-\n\t * process the data returned from the server, if needed.\n\t *\n\t * Note that this trigger is called in `fnServerData`, if you override\n\t * `fnServerData` and which to use this event, you need to trigger it in you\n\t * success function.\n\t *  @name DataTable#xhr.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t *  @param {object} json JSON returned from the server\n\t *\n\t *  @example\n\t *     // Use a custom property returned from the server in another DOM element\n\t *     $('#table').dataTable().on('xhr.dt', function (e, settings, json) {\n\t *       $('#status').html( json.status );\n\t *     } );\n\t *\n\t *  @example\n\t *     // Pre-process the data returned from the server\n\t *     $('#table').dataTable().on('xhr.dt', function (e, settings, json) {\n\t *       for ( var i=0, ien=json.aaData.length ; i<ien ; i++ ) {\n\t *         json.aaData[i].sum = json.aaData[i].one + json.aaData[i].two;\n\t *       }\n\t *       // Note no return - manipulate the data directly in the JSON object.\n\t *     } );\n\t */\n\n\t/**\n\t * Destroy event, fired when the DataTable is destroyed by calling fnDestroy\n\t * or passing the bDestroy:true parameter in the initialisation object. This\n\t * can be used to remove bound events, added DOM nodes, etc.\n\t *  @name DataTable#destroy.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * Page length change event, fired when number of records to show on each\n\t * page (the length) is changed.\n\t *  @name DataTable#length.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t *  @param {integer} len New length\n\t */\n\n\t/**\n\t * Column sizing has changed.\n\t *  @name DataTable#column-sizing.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * Column visibility has changed.\n\t *  @name DataTable#column-visibility.dt\n\t *  @event\n\t *  @param {event} e jQuery event object\n\t *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t *  @param {int} column Column index\n\t *  @param {bool} vis `false` if column now hidden, or `true` if visible\n\t */\n\n\treturn $.fn.dataTable;\n}));\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n  this._events = this._events || {};\n  this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n  if (!isNumber(n) || n < 0 || isNaN(n))\n    throw TypeError('n must be a positive number');\n  this._maxListeners = n;\n  return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n  var er, handler, len, args, i, listeners;\n\n  if (!this._events)\n    this._events = {};\n\n  // If there is no 'error' event listener then throw.\n  if (type === 'error') {\n    if (!this._events.error ||\n        (isObject(this._events.error) && !this._events.error.length)) {\n      er = arguments[1];\n      if (er instanceof Error) {\n        throw er; // Unhandled 'error' event\n      } else {\n        // At least give some kind of context to the user\n        var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n        err.context = er;\n        throw err;\n      }\n    }\n  }\n\n  handler = this._events[type];\n\n  if (isUndefined(handler))\n    return false;\n\n  if (isFunction(handler)) {\n    switch (arguments.length) {\n      // fast cases\n      case 1:\n        handler.call(this);\n        break;\n      case 2:\n        handler.call(this, arguments[1]);\n        break;\n      case 3:\n        handler.call(this, arguments[1], arguments[2]);\n        break;\n      // slower\n      default:\n        args = Array.prototype.slice.call(arguments, 1);\n        handler.apply(this, args);\n    }\n  } else if (isObject(handler)) {\n    args = Array.prototype.slice.call(arguments, 1);\n    listeners = handler.slice();\n    len = listeners.length;\n    for (i = 0; i < len; i++)\n      listeners[i].apply(this, args);\n  }\n\n  return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n  var m;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events)\n    this._events = {};\n\n  // To avoid recursion in the case that type === \"newListener\"! Before\n  // adding it to the listeners, first emit \"newListener\".\n  if (this._events.newListener)\n    this.emit('newListener', type,\n              isFunction(listener.listener) ?\n              listener.listener : listener);\n\n  if (!this._events[type])\n    // Optimize the case of one listener. Don't need the extra array object.\n    this._events[type] = listener;\n  else if (isObject(this._events[type]))\n    // If we've already got an array, just append.\n    this._events[type].push(listener);\n  else\n    // Adding the second element, need to change to array.\n    this._events[type] = [this._events[type], listener];\n\n  // Check for listener leak\n  if (isObject(this._events[type]) && !this._events[type].warned) {\n    if (!isUndefined(this._maxListeners)) {\n      m = this._maxListeners;\n    } else {\n      m = EventEmitter.defaultMaxListeners;\n    }\n\n    if (m && m > 0 && this._events[type].length > m) {\n      this._events[type].warned = true;\n      console.error('(node) warning: possible EventEmitter memory ' +\n                    'leak detected. %d listeners added. ' +\n                    'Use emitter.setMaxListeners() to increase limit.',\n                    this._events[type].length);\n      if (typeof console.trace === 'function') {\n        // not supported in IE 10\n        console.trace();\n      }\n    }\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  var fired = false;\n\n  function g() {\n    this.removeListener(type, g);\n\n    if (!fired) {\n      fired = true;\n      listener.apply(this, arguments);\n    }\n  }\n\n  g.listener = listener;\n  this.on(type, g);\n\n  return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n  var list, position, length, i;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events || !this._events[type])\n    return this;\n\n  list = this._events[type];\n  length = list.length;\n  position = -1;\n\n  if (list === listener ||\n      (isFunction(list.listener) && list.listener === listener)) {\n    delete this._events[type];\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n\n  } else if (isObject(list)) {\n    for (i = length; i-- > 0;) {\n      if (list[i] === listener ||\n          (list[i].listener && list[i].listener === listener)) {\n        position = i;\n        break;\n      }\n    }\n\n    if (position < 0)\n      return this;\n\n    if (list.length === 1) {\n      list.length = 0;\n      delete this._events[type];\n    } else {\n      list.splice(position, 1);\n    }\n\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n  var key, listeners;\n\n  if (!this._events)\n    return this;\n\n  // not listening for removeListener, no need to emit\n  if (!this._events.removeListener) {\n    if (arguments.length === 0)\n      this._events = {};\n    else if (this._events[type])\n      delete this._events[type];\n    return this;\n  }\n\n  // emit removeListener for all listeners on all events\n  if (arguments.length === 0) {\n    for (key in this._events) {\n      if (key === 'removeListener') continue;\n      this.removeAllListeners(key);\n    }\n    this.removeAllListeners('removeListener');\n    this._events = {};\n    return this;\n  }\n\n  listeners = this._events[type];\n\n  if (isFunction(listeners)) {\n    this.removeListener(type, listeners);\n  } else if (listeners) {\n    // LIFO order\n    while (listeners.length)\n      this.removeListener(type, listeners[listeners.length - 1]);\n  }\n  delete this._events[type];\n\n  return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n  var ret;\n  if (!this._events || !this._events[type])\n    ret = [];\n  else if (isFunction(this._events[type]))\n    ret = [this._events[type]];\n  else\n    ret = this._events[type].slice();\n  return ret;\n};\n\nEventEmitter.prototype.listenerCount = function(type) {\n  if (this._events) {\n    var evlistener = this._events[type];\n\n    if (isFunction(evlistener))\n      return 1;\n    else if (evlistener)\n      return evlistener.length;\n  }\n  return 0;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  return emitter.listenerCount(type);\n};\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\n","/*\n Leaflet 1.0.3, a JS library for interactive maps. http://leafletjs.com\n (c) 2010-2016 Vladimir Agafonkin, (c) 2010-2011 CloudMade\n*/\n(function (window, document, undefined) {\r\nvar L = {\r\n\tversion: \"1.0.3\"\r\n};\r\n\r\nfunction expose() {\r\n\tvar oldL = window.L;\r\n\r\n\tL.noConflict = function () {\r\n\t\twindow.L = oldL;\r\n\t\treturn this;\r\n\t};\r\n\r\n\twindow.L = L;\r\n}\r\n\r\n// define Leaflet for Node module pattern loaders, including Browserify\r\nif (typeof module === 'object' && typeof module.exports === 'object') {\r\n\tmodule.exports = L;\r\n\r\n// define Leaflet as an AMD module\r\n} else if (typeof define === 'function' && define.amd) {\r\n\tdefine(L);\r\n}\r\n\r\n// define Leaflet as a global L variable, saving the original L to restore later if needed\r\nif (typeof window !== 'undefined') {\r\n\texpose();\r\n}\r\n\n\n\n/*\r\n * @namespace Util\r\n *\r\n * Various utility functions, used by Leaflet internally.\r\n */\r\n\r\nL.Util = {\r\n\r\n\t// @function extend(dest: Object, src?: Object): Object\r\n\t// Merges the properties of the `src` object (or multiple objects) into `dest` object and returns the latter. Has an `L.extend` shortcut.\r\n\textend: function (dest) {\r\n\t\tvar i, j, len, src;\r\n\r\n\t\tfor (j = 1, len = arguments.length; j < len; j++) {\r\n\t\t\tsrc = arguments[j];\r\n\t\t\tfor (i in src) {\r\n\t\t\t\tdest[i] = src[i];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn dest;\r\n\t},\r\n\r\n\t// @function create(proto: Object, properties?: Object): Object\r\n\t// Compatibility polyfill for [Object.create](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/create)\r\n\tcreate: Object.create || (function () {\r\n\t\tfunction F() {}\r\n\t\treturn function (proto) {\r\n\t\t\tF.prototype = proto;\r\n\t\t\treturn new F();\r\n\t\t};\r\n\t})(),\r\n\r\n\t// @function bind(fn: Function, …): Function\r\n\t// Returns a new function bound to the arguments passed, like [Function.prototype.bind](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).\r\n\t// Has a `L.bind()` shortcut.\r\n\tbind: function (fn, obj) {\r\n\t\tvar slice = Array.prototype.slice;\r\n\r\n\t\tif (fn.bind) {\r\n\t\t\treturn fn.bind.apply(fn, slice.call(arguments, 1));\r\n\t\t}\r\n\r\n\t\tvar args = slice.call(arguments, 2);\r\n\r\n\t\treturn function () {\r\n\t\t\treturn fn.apply(obj, args.length ? args.concat(slice.call(arguments)) : arguments);\r\n\t\t};\r\n\t},\r\n\r\n\t// @function stamp(obj: Object): Number\r\n\t// Returns the unique ID of an object, assiging it one if it doesn't have it.\r\n\tstamp: function (obj) {\r\n\t\t/*eslint-disable */\r\n\t\tobj._leaflet_id = obj._leaflet_id || ++L.Util.lastId;\r\n\t\treturn obj._leaflet_id;\r\n\t\t/*eslint-enable */\r\n\t},\r\n\r\n\t// @property lastId: Number\r\n\t// Last unique ID used by [`stamp()`](#util-stamp)\r\n\tlastId: 0,\r\n\r\n\t// @function throttle(fn: Function, time: Number, context: Object): Function\r\n\t// Returns a function which executes function `fn` with the given scope `context`\r\n\t// (so that the `this` keyword refers to `context` inside `fn`'s code). The function\r\n\t// `fn` will be called no more than one time per given amount of `time`. The arguments\r\n\t// received by the bound function will be any arguments passed when binding the\r\n\t// function, followed by any arguments passed when invoking the bound function.\r\n\t// Has an `L.bind` shortcut.\r\n\tthrottle: function (fn, time, context) {\r\n\t\tvar lock, args, wrapperFn, later;\r\n\r\n\t\tlater = function () {\r\n\t\t\t// reset lock and call if queued\r\n\t\t\tlock = false;\r\n\t\t\tif (args) {\r\n\t\t\t\twrapperFn.apply(context, args);\r\n\t\t\t\targs = false;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\twrapperFn = function () {\r\n\t\t\tif (lock) {\r\n\t\t\t\t// called too soon, queue to call later\r\n\t\t\t\targs = arguments;\r\n\r\n\t\t\t} else {\r\n\t\t\t\t// call and lock until later\r\n\t\t\t\tfn.apply(context, arguments);\r\n\t\t\t\tsetTimeout(later, time);\r\n\t\t\t\tlock = true;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn wrapperFn;\r\n\t},\r\n\r\n\t// @function wrapNum(num: Number, range: Number[], includeMax?: Boolean): Number\r\n\t// Returns the number `num` modulo `range` in such a way so it lies within\r\n\t// `range[0]` and `range[1]`. The returned value will be always smaller than\r\n\t// `range[1]` unless `includeMax` is set to `true`.\r\n\twrapNum: function (x, range, includeMax) {\r\n\t\tvar max = range[1],\r\n\t\t    min = range[0],\r\n\t\t    d = max - min;\r\n\t\treturn x === max && includeMax ? x : ((x - min) % d + d) % d + min;\r\n\t},\r\n\r\n\t// @function falseFn(): Function\r\n\t// Returns a function which always returns `false`.\r\n\tfalseFn: function () { return false; },\r\n\r\n\t// @function formatNum(num: Number, digits?: Number): Number\r\n\t// Returns the number `num` rounded to `digits` decimals, or to 5 decimals by default.\r\n\tformatNum: function (num, digits) {\r\n\t\tvar pow = Math.pow(10, digits || 5);\r\n\t\treturn Math.round(num * pow) / pow;\r\n\t},\r\n\r\n\t// @function trim(str: String): String\r\n\t// Compatibility polyfill for [String.prototype.trim](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/Trim)\r\n\ttrim: function (str) {\r\n\t\treturn str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g, '');\r\n\t},\r\n\r\n\t// @function splitWords(str: String): String[]\r\n\t// Trims and splits the string on whitespace and returns the array of parts.\r\n\tsplitWords: function (str) {\r\n\t\treturn L.Util.trim(str).split(/\\s+/);\r\n\t},\r\n\r\n\t// @function setOptions(obj: Object, options: Object): Object\r\n\t// Merges the given properties to the `options` of the `obj` object, returning the resulting options. See `Class options`. Has an `L.setOptions` shortcut.\r\n\tsetOptions: function (obj, options) {\r\n\t\tif (!obj.hasOwnProperty('options')) {\r\n\t\t\tobj.options = obj.options ? L.Util.create(obj.options) : {};\r\n\t\t}\r\n\t\tfor (var i in options) {\r\n\t\t\tobj.options[i] = options[i];\r\n\t\t}\r\n\t\treturn obj.options;\r\n\t},\r\n\r\n\t// @function getParamString(obj: Object, existingUrl?: String, uppercase?: Boolean): String\r\n\t// Converts an object into a parameter URL string, e.g. `{a: \"foo\", b: \"bar\"}`\r\n\t// translates to `'?a=foo&b=bar'`. If `existingUrl` is set, the parameters will\r\n\t// be appended at the end. If `uppercase` is `true`, the parameter names will\r\n\t// be uppercased (e.g. `'?A=foo&B=bar'`)\r\n\tgetParamString: function (obj, existingUrl, uppercase) {\r\n\t\tvar params = [];\r\n\t\tfor (var i in obj) {\r\n\t\t\tparams.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i]));\r\n\t\t}\r\n\t\treturn ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&');\r\n\t},\r\n\r\n\t// @function template(str: String, data: Object): String\r\n\t// Simple templating facility, accepts a template string of the form `'Hello {a}, {b}'`\r\n\t// and a data object like `{a: 'foo', b: 'bar'}`, returns evaluated string\r\n\t// `('Hello foo, bar')`. You can also specify functions instead of strings for\r\n\t// data values — they will be evaluated passing `data` as an argument.\r\n\ttemplate: function (str, data) {\r\n\t\treturn str.replace(L.Util.templateRe, function (str, key) {\r\n\t\t\tvar value = data[key];\r\n\r\n\t\t\tif (value === undefined) {\r\n\t\t\t\tthrow new Error('No value provided for variable ' + str);\r\n\r\n\t\t\t} else if (typeof value === 'function') {\r\n\t\t\t\tvalue = value(data);\r\n\t\t\t}\r\n\t\t\treturn value;\r\n\t\t});\r\n\t},\r\n\r\n\ttemplateRe: /\\{ *([\\w_\\-]+) *\\}/g,\r\n\r\n\t// @function isArray(obj): Boolean\r\n\t// Compatibility polyfill for [Array.isArray](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray)\r\n\tisArray: Array.isArray || function (obj) {\r\n\t\treturn (Object.prototype.toString.call(obj) === '[object Array]');\r\n\t},\r\n\r\n\t// @function indexOf(array: Array, el: Object): Number\r\n\t// Compatibility polyfill for [Array.prototype.indexOf](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)\r\n\tindexOf: function (array, el) {\r\n\t\tfor (var i = 0; i < array.length; i++) {\r\n\t\t\tif (array[i] === el) { return i; }\r\n\t\t}\r\n\t\treturn -1;\r\n\t},\r\n\r\n\t// @property emptyImageUrl: String\r\n\t// Data URI string containing a base64-encoded empty GIF image.\r\n\t// Used as a hack to free memory from unused images on WebKit-powered\r\n\t// mobile devices (by setting image `src` to this string).\r\n\temptyImageUrl: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='\r\n};\r\n\r\n(function () {\r\n\t// inspired by http://paulirish.com/2011/requestanimationframe-for-smart-animating/\r\n\r\n\tfunction getPrefixed(name) {\r\n\t\treturn window['webkit' + name] || window['moz' + name] || window['ms' + name];\r\n\t}\r\n\r\n\tvar lastTime = 0;\r\n\r\n\t// fallback for IE 7-8\r\n\tfunction timeoutDefer(fn) {\r\n\t\tvar time = +new Date(),\r\n\t\t    timeToCall = Math.max(0, 16 - (time - lastTime));\r\n\r\n\t\tlastTime = time + timeToCall;\r\n\t\treturn window.setTimeout(fn, timeToCall);\r\n\t}\r\n\r\n\tvar requestFn = window.requestAnimationFrame || getPrefixed('RequestAnimationFrame') || timeoutDefer,\r\n\t    cancelFn = window.cancelAnimationFrame || getPrefixed('CancelAnimationFrame') ||\r\n\t               getPrefixed('CancelRequestAnimationFrame') || function (id) { window.clearTimeout(id); };\r\n\r\n\r\n\t// @function requestAnimFrame(fn: Function, context?: Object, immediate?: Boolean): Number\r\n\t// Schedules `fn` to be executed when the browser repaints. `fn` is bound to\r\n\t// `context` if given. When `immediate` is set, `fn` is called immediately if\r\n\t// the browser doesn't have native support for\r\n\t// [`window.requestAnimationFrame`](https://developer.mozilla.org/docs/Web/API/window/requestAnimationFrame),\r\n\t// otherwise it's delayed. Returns a request ID that can be used to cancel the request.\r\n\tL.Util.requestAnimFrame = function (fn, context, immediate) {\r\n\t\tif (immediate && requestFn === timeoutDefer) {\r\n\t\t\tfn.call(context);\r\n\t\t} else {\r\n\t\t\treturn requestFn.call(window, L.bind(fn, context));\r\n\t\t}\r\n\t};\r\n\r\n\t// @function cancelAnimFrame(id: Number): undefined\r\n\t// Cancels a previous `requestAnimFrame`. See also [window.cancelAnimationFrame](https://developer.mozilla.org/docs/Web/API/window/cancelAnimationFrame).\r\n\tL.Util.cancelAnimFrame = function (id) {\r\n\t\tif (id) {\r\n\t\t\tcancelFn.call(window, id);\r\n\t\t}\r\n\t};\r\n})();\r\n\r\n// shortcuts for most used utility functions\r\nL.extend = L.Util.extend;\r\nL.bind = L.Util.bind;\r\nL.stamp = L.Util.stamp;\r\nL.setOptions = L.Util.setOptions;\r\n\n\n\n\r\n// @class Class\r\n// @aka L.Class\r\n\r\n// @section\r\n// @uninheritable\r\n\r\n// Thanks to John Resig and Dean Edwards for inspiration!\r\n\r\nL.Class = function () {};\r\n\r\nL.Class.extend = function (props) {\r\n\r\n\t// @function extend(props: Object): Function\r\n\t// [Extends the current class](#class-inheritance) given the properties to be included.\r\n\t// Returns a Javascript function that is a class constructor (to be called with `new`).\r\n\tvar NewClass = function () {\r\n\r\n\t\t// call the constructor\r\n\t\tif (this.initialize) {\r\n\t\t\tthis.initialize.apply(this, arguments);\r\n\t\t}\r\n\r\n\t\t// call all constructor hooks\r\n\t\tthis.callInitHooks();\r\n\t};\r\n\r\n\tvar parentProto = NewClass.__super__ = this.prototype;\r\n\r\n\tvar proto = L.Util.create(parentProto);\r\n\tproto.constructor = NewClass;\r\n\r\n\tNewClass.prototype = proto;\r\n\r\n\t// inherit parent's statics\r\n\tfor (var i in this) {\r\n\t\tif (this.hasOwnProperty(i) && i !== 'prototype') {\r\n\t\t\tNewClass[i] = this[i];\r\n\t\t}\r\n\t}\r\n\r\n\t// mix static properties into the class\r\n\tif (props.statics) {\r\n\t\tL.extend(NewClass, props.statics);\r\n\t\tdelete props.statics;\r\n\t}\r\n\r\n\t// mix includes into the prototype\r\n\tif (props.includes) {\r\n\t\tL.Util.extend.apply(null, [proto].concat(props.includes));\r\n\t\tdelete props.includes;\r\n\t}\r\n\r\n\t// merge options\r\n\tif (proto.options) {\r\n\t\tprops.options = L.Util.extend(L.Util.create(proto.options), props.options);\r\n\t}\r\n\r\n\t// mix given properties into the prototype\r\n\tL.extend(proto, props);\r\n\r\n\tproto._initHooks = [];\r\n\r\n\t// add method for calling all hooks\r\n\tproto.callInitHooks = function () {\r\n\r\n\t\tif (this._initHooksCalled) { return; }\r\n\r\n\t\tif (parentProto.callInitHooks) {\r\n\t\t\tparentProto.callInitHooks.call(this);\r\n\t\t}\r\n\r\n\t\tthis._initHooksCalled = true;\r\n\r\n\t\tfor (var i = 0, len = proto._initHooks.length; i < len; i++) {\r\n\t\t\tproto._initHooks[i].call(this);\r\n\t\t}\r\n\t};\r\n\r\n\treturn NewClass;\r\n};\r\n\r\n\r\n// @function include(properties: Object): this\r\n// [Includes a mixin](#class-includes) into the current class.\r\nL.Class.include = function (props) {\r\n\tL.extend(this.prototype, props);\r\n\treturn this;\r\n};\r\n\r\n// @function mergeOptions(options: Object): this\r\n// [Merges `options`](#class-options) into the defaults of the class.\r\nL.Class.mergeOptions = function (options) {\r\n\tL.extend(this.prototype.options, options);\r\n\treturn this;\r\n};\r\n\r\n// @function addInitHook(fn: Function): this\r\n// Adds a [constructor hook](#class-constructor-hooks) to the class.\r\nL.Class.addInitHook = function (fn) { // (Function) || (String, args...)\r\n\tvar args = Array.prototype.slice.call(arguments, 1);\r\n\r\n\tvar init = typeof fn === 'function' ? fn : function () {\r\n\t\tthis[fn].apply(this, args);\r\n\t};\r\n\r\n\tthis.prototype._initHooks = this.prototype._initHooks || [];\r\n\tthis.prototype._initHooks.push(init);\r\n\treturn this;\r\n};\r\n\n\n\n/*\r\n * @class Evented\r\n * @aka L.Evented\r\n * @inherits Class\r\n *\r\n * A set of methods shared between event-powered classes (like `Map` and `Marker`). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire `'click'` event).\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * map.on('click', function(e) {\r\n * \talert(e.latlng);\r\n * } );\r\n * ```\r\n *\r\n * Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function:\r\n *\r\n * ```js\r\n * function onClick(e) { ... }\r\n *\r\n * map.on('click', onClick);\r\n * map.off('click', onClick);\r\n * ```\r\n */\r\n\r\n\r\nL.Evented = L.Class.extend({\r\n\r\n\t/* @method on(type: String, fn: Function, context?: Object): this\r\n\t * Adds a listener function (`fn`) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. `'click dblclick'`).\r\n\t *\r\n\t * @alternative\r\n\t * @method on(eventMap: Object): this\r\n\t * Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`\r\n\t */\r\n\ton: function (types, fn, context) {\r\n\r\n\t\t// types can be a map of types/handlers\r\n\t\tif (typeof types === 'object') {\r\n\t\t\tfor (var type in types) {\r\n\t\t\t\t// we don't process space-separated events here for performance;\r\n\t\t\t\t// it's a hot path since Layer uses the on(obj) syntax\r\n\t\t\t\tthis._on(type, types[type], fn);\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\t// types can be a string of space-separated words\r\n\t\t\ttypes = L.Util.splitWords(types);\r\n\r\n\t\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n\t\t\t\tthis._on(types[i], fn, context);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/* @method off(type: String, fn?: Function, context?: Object): this\r\n\t * Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to `on`, you must pass the same context to `off` in order to remove the listener.\r\n\t *\r\n\t * @alternative\r\n\t * @method off(eventMap: Object): this\r\n\t * Removes a set of type/listener pairs.\r\n\t *\r\n\t * @alternative\r\n\t * @method off: this\r\n\t * Removes all listeners to all events on the object.\r\n\t */\r\n\toff: function (types, fn, context) {\r\n\r\n\t\tif (!types) {\r\n\t\t\t// clear all listeners if called without arguments\r\n\t\t\tdelete this._events;\r\n\r\n\t\t} else if (typeof types === 'object') {\r\n\t\t\tfor (var type in types) {\r\n\t\t\t\tthis._off(type, types[type], fn);\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\ttypes = L.Util.splitWords(types);\r\n\r\n\t\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n\t\t\t\tthis._off(types[i], fn, context);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// attach listener (without syntactic sugar now)\r\n\t_on: function (type, fn, context) {\r\n\t\tthis._events = this._events || {};\r\n\r\n\t\t/* get/init listeners for type */\r\n\t\tvar typeListeners = this._events[type];\r\n\t\tif (!typeListeners) {\r\n\t\t\ttypeListeners = [];\r\n\t\t\tthis._events[type] = typeListeners;\r\n\t\t}\r\n\r\n\t\tif (context === this) {\r\n\t\t\t// Less memory footprint.\r\n\t\t\tcontext = undefined;\r\n\t\t}\r\n\t\tvar newListener = {fn: fn, ctx: context},\r\n\t\t    listeners = typeListeners;\r\n\r\n\t\t// check if fn already there\r\n\t\tfor (var i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\tif (listeners[i].fn === fn && listeners[i].ctx === context) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlisteners.push(newListener);\r\n\t},\r\n\r\n\t_off: function (type, fn, context) {\r\n\t\tvar listeners,\r\n\t\t    i,\r\n\t\t    len;\r\n\r\n\t\tif (!this._events) { return; }\r\n\r\n\t\tlisteners = this._events[type];\r\n\r\n\t\tif (!listeners) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!fn) {\r\n\t\t\t// Set all removed listeners to noop so they are not called if remove happens in fire\r\n\t\t\tfor (i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\t\tlisteners[i].fn = L.Util.falseFn;\r\n\t\t\t}\r\n\t\t\t// clear all listeners for a type if function isn't specified\r\n\t\t\tdelete this._events[type];\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (context === this) {\r\n\t\t\tcontext = undefined;\r\n\t\t}\r\n\r\n\t\tif (listeners) {\r\n\r\n\t\t\t// find fn and remove it\r\n\t\t\tfor (i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\t\tvar l = listeners[i];\r\n\t\t\t\tif (l.ctx !== context) { continue; }\r\n\t\t\t\tif (l.fn === fn) {\r\n\r\n\t\t\t\t\t// set the removed listener to noop so that's not called if remove happens in fire\r\n\t\t\t\t\tl.fn = L.Util.falseFn;\r\n\r\n\t\t\t\t\tif (this._firingCount) {\r\n\t\t\t\t\t\t/* copy array in case events are being fired */\r\n\t\t\t\t\t\tthis._events[type] = listeners = listeners.slice();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlisteners.splice(i, 1);\r\n\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// @method fire(type: String, data?: Object, propagate?: Boolean): this\r\n\t// Fires an event of the specified type. You can optionally provide an data\r\n\t// object — the first argument of the listener function will contain its\r\n\t// properties. The event can optionally be propagated to event parents.\r\n\tfire: function (type, data, propagate) {\r\n\t\tif (!this.listens(type, propagate)) { return this; }\r\n\r\n\t\tvar event = L.Util.extend({}, data, {type: type, target: this});\r\n\r\n\t\tif (this._events) {\r\n\t\t\tvar listeners = this._events[type];\r\n\r\n\t\t\tif (listeners) {\r\n\t\t\t\tthis._firingCount = (this._firingCount + 1) || 1;\r\n\t\t\t\tfor (var i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\t\t\tvar l = listeners[i];\r\n\t\t\t\t\tl.fn.call(l.ctx || this, event);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis._firingCount--;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (propagate) {\r\n\t\t\t// propagate the event to parents (set with addEventParent)\r\n\t\t\tthis._propagateEvent(event);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method listens(type: String): Boolean\r\n\t// Returns `true` if a particular event type has any listeners attached to it.\r\n\tlistens: function (type, propagate) {\r\n\t\tvar listeners = this._events && this._events[type];\r\n\t\tif (listeners && listeners.length) { return true; }\r\n\r\n\t\tif (propagate) {\r\n\t\t\t// also check parents for listeners if event propagates\r\n\t\t\tfor (var id in this._eventParents) {\r\n\t\t\t\tif (this._eventParents[id].listens(type, propagate)) { return true; }\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\t// @method once(…): this\r\n\t// Behaves as [`on(…)`](#evented-on), except the listener will only get fired once and then removed.\r\n\tonce: function (types, fn, context) {\r\n\r\n\t\tif (typeof types === 'object') {\r\n\t\t\tfor (var type in types) {\r\n\t\t\t\tthis.once(type, types[type], fn);\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar handler = L.bind(function () {\r\n\t\t\tthis\r\n\t\t\t    .off(types, fn, context)\r\n\t\t\t    .off(types, handler, context);\r\n\t\t}, this);\r\n\r\n\t\t// add a listener that's executed once and removed after that\r\n\t\treturn this\r\n\t\t    .on(types, fn, context)\r\n\t\t    .on(types, handler, context);\r\n\t},\r\n\r\n\t// @method addEventParent(obj: Evented): this\r\n\t// Adds an event parent - an `Evented` that will receive propagated events\r\n\taddEventParent: function (obj) {\r\n\t\tthis._eventParents = this._eventParents || {};\r\n\t\tthis._eventParents[L.stamp(obj)] = obj;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method removeEventParent(obj: Evented): this\r\n\t// Removes an event parent, so it will stop receiving propagated events\r\n\tremoveEventParent: function (obj) {\r\n\t\tif (this._eventParents) {\r\n\t\t\tdelete this._eventParents[L.stamp(obj)];\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_propagateEvent: function (e) {\r\n\t\tfor (var id in this._eventParents) {\r\n\t\t\tthis._eventParents[id].fire(e.type, L.extend({layer: e.target}, e), true);\r\n\t\t}\r\n\t}\r\n});\r\n\r\nvar proto = L.Evented.prototype;\r\n\r\n// aliases; we should ditch those eventually\r\n\r\n// @method addEventListener(…): this\r\n// Alias to [`on(…)`](#evented-on)\r\nproto.addEventListener = proto.on;\r\n\r\n// @method removeEventListener(…): this\r\n// Alias to [`off(…)`](#evented-off)\r\n\r\n// @method clearAllEventListeners(…): this\r\n// Alias to [`off()`](#evented-off)\r\nproto.removeEventListener = proto.clearAllEventListeners = proto.off;\r\n\r\n// @method addOneTimeEventListener(…): this\r\n// Alias to [`once(…)`](#evented-once)\r\nproto.addOneTimeEventListener = proto.once;\r\n\r\n// @method fireEvent(…): this\r\n// Alias to [`fire(…)`](#evented-fire)\r\nproto.fireEvent = proto.fire;\r\n\r\n// @method hasEventListeners(…): Boolean\r\n// Alias to [`listens(…)`](#evented-listens)\r\nproto.hasEventListeners = proto.listens;\r\n\r\nL.Mixin = {Events: proto};\r\n\n\n\n/*\r\n * @namespace Browser\r\n * @aka L.Browser\r\n *\r\n * A namespace with static properties for browser/feature detection used by Leaflet internally.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * if (L.Browser.ielt9) {\r\n *   alert('Upgrade your browser, dude!');\r\n * }\r\n * ```\r\n */\r\n\r\n(function () {\r\n\r\n\tvar ua = navigator.userAgent.toLowerCase(),\r\n\t    doc = document.documentElement,\r\n\r\n\t    ie = 'ActiveXObject' in window,\r\n\r\n\t    webkit    = ua.indexOf('webkit') !== -1,\r\n\t    phantomjs = ua.indexOf('phantom') !== -1,\r\n\t    android23 = ua.search('android [23]') !== -1,\r\n\t    chrome    = ua.indexOf('chrome') !== -1,\r\n\t    gecko     = ua.indexOf('gecko') !== -1  && !webkit && !window.opera && !ie,\r\n\r\n\t    win = navigator.platform.indexOf('Win') === 0,\r\n\r\n\t    mobile = typeof orientation !== 'undefined' || ua.indexOf('mobile') !== -1,\r\n\t    msPointer = !window.PointerEvent && window.MSPointerEvent,\r\n\t    pointer = window.PointerEvent || msPointer,\r\n\r\n\t    ie3d = ie && ('transition' in doc.style),\r\n\t    webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23,\r\n\t    gecko3d = 'MozPerspective' in doc.style,\r\n\t    opera12 = 'OTransition' in doc.style;\r\n\r\n\r\n\tvar touch = !window.L_NO_TOUCH && (pointer || 'ontouchstart' in window ||\r\n\t\t\t(window.DocumentTouch && document instanceof window.DocumentTouch));\r\n\r\n\tL.Browser = {\r\n\r\n\t\t// @property ie: Boolean\r\n\t\t// `true` for all Internet Explorer versions (not Edge).\r\n\t\tie: ie,\r\n\r\n\t\t// @property ielt9: Boolean\r\n\t\t// `true` for Internet Explorer versions less than 9.\r\n\t\tielt9: ie && !document.addEventListener,\r\n\r\n\t\t// @property edge: Boolean\r\n\t\t// `true` for the Edge web browser.\r\n\t\tedge: 'msLaunchUri' in navigator && !('documentMode' in document),\r\n\r\n\t\t// @property webkit: Boolean\r\n\t\t// `true` for webkit-based browsers like Chrome and Safari (including mobile versions).\r\n\t\twebkit: webkit,\r\n\r\n\t\t// @property gecko: Boolean\r\n\t\t// `true` for gecko-based browsers like Firefox.\r\n\t\tgecko: gecko,\r\n\r\n\t\t// @property android: Boolean\r\n\t\t// `true` for any browser running on an Android platform.\r\n\t\tandroid: ua.indexOf('android') !== -1,\r\n\r\n\t\t// @property android23: Boolean\r\n\t\t// `true` for browsers running on Android 2 or Android 3.\r\n\t\tandroid23: android23,\r\n\r\n\t\t// @property chrome: Boolean\r\n\t\t// `true` for the Chrome browser.\r\n\t\tchrome: chrome,\r\n\r\n\t\t// @property safari: Boolean\r\n\t\t// `true` for the Safari browser.\r\n\t\tsafari: !chrome && ua.indexOf('safari') !== -1,\r\n\r\n\r\n\t\t// @property win: Boolean\r\n\t\t// `true` when the browser is running in a Windows platform\r\n\t\twin: win,\r\n\r\n\r\n\t\t// @property ie3d: Boolean\r\n\t\t// `true` for all Internet Explorer versions supporting CSS transforms.\r\n\t\tie3d: ie3d,\r\n\r\n\t\t// @property webkit3d: Boolean\r\n\t\t// `true` for webkit-based browsers supporting CSS transforms.\r\n\t\twebkit3d: webkit3d,\r\n\r\n\t\t// @property gecko3d: Boolean\r\n\t\t// `true` for gecko-based browsers supporting CSS transforms.\r\n\t\tgecko3d: gecko3d,\r\n\r\n\t\t// @property opera12: Boolean\r\n\t\t// `true` for the Opera browser supporting CSS transforms (version 12 or later).\r\n\t\topera12: opera12,\r\n\r\n\t\t// @property any3d: Boolean\r\n\t\t// `true` for all browsers supporting CSS transforms.\r\n\t\tany3d: !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d) && !opera12 && !phantomjs,\r\n\r\n\r\n\t\t// @property mobile: Boolean\r\n\t\t// `true` for all browsers running in a mobile device.\r\n\t\tmobile: mobile,\r\n\r\n\t\t// @property mobileWebkit: Boolean\r\n\t\t// `true` for all webkit-based browsers in a mobile device.\r\n\t\tmobileWebkit: mobile && webkit,\r\n\r\n\t\t// @property mobileWebkit3d: Boolean\r\n\t\t// `true` for all webkit-based browsers in a mobile device supporting CSS transforms.\r\n\t\tmobileWebkit3d: mobile && webkit3d,\r\n\r\n\t\t// @property mobileOpera: Boolean\r\n\t\t// `true` for the Opera browser in a mobile device.\r\n\t\tmobileOpera: mobile && window.opera,\r\n\r\n\t\t// @property mobileGecko: Boolean\r\n\t\t// `true` for gecko-based browsers running in a mobile device.\r\n\t\tmobileGecko: mobile && gecko,\r\n\r\n\r\n\t\t// @property touch: Boolean\r\n\t\t// `true` for all browsers supporting [touch events](https://developer.mozilla.org/docs/Web/API/Touch_events).\r\n\t\t// This does not necessarily mean that the browser is running in a computer with\r\n\t\t// a touchscreen, it only means that the browser is capable of understanding\r\n\t\t// touch events.\r\n\t\ttouch: !!touch,\r\n\r\n\t\t// @property msPointer: Boolean\r\n\t\t// `true` for browsers implementing the Microsoft touch events model (notably IE10).\r\n\t\tmsPointer: !!msPointer,\r\n\r\n\t\t// @property pointer: Boolean\r\n\t\t// `true` for all browsers supporting [pointer events](https://msdn.microsoft.com/en-us/library/dn433244%28v=vs.85%29.aspx).\r\n\t\tpointer: !!pointer,\r\n\r\n\r\n\t\t// @property retina: Boolean\r\n\t\t// `true` for browsers on a high-resolution \"retina\" screen.\r\n\t\tretina: (window.devicePixelRatio || (window.screen.deviceXDPI / window.screen.logicalXDPI)) > 1\r\n\t};\r\n\r\n}());\r\n\n\n\n/*\r\n * @class Point\r\n * @aka L.Point\r\n *\r\n * Represents a point with `x` and `y` coordinates in pixels.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var point = L.point(200, 300);\r\n * ```\r\n *\r\n * All Leaflet methods and options that accept `Point` objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:\r\n *\r\n * ```js\r\n * map.panBy([200, 300]);\r\n * map.panBy(L.point(200, 300));\r\n * ```\r\n */\r\n\r\nL.Point = function (x, y, round) {\r\n\t// @property x: Number; The `x` coordinate of the point\r\n\tthis.x = (round ? Math.round(x) : x);\r\n\t// @property y: Number; The `y` coordinate of the point\r\n\tthis.y = (round ? Math.round(y) : y);\r\n};\r\n\r\nL.Point.prototype = {\r\n\r\n\t// @method clone(): Point\r\n\t// Returns a copy of the current point.\r\n\tclone: function () {\r\n\t\treturn new L.Point(this.x, this.y);\r\n\t},\r\n\r\n\t// @method add(otherPoint: Point): Point\r\n\t// Returns the result of addition of the current and the given points.\r\n\tadd: function (point) {\r\n\t\t// non-destructive, returns a new point\r\n\t\treturn this.clone()._add(L.point(point));\r\n\t},\r\n\r\n\t_add: function (point) {\r\n\t\t// destructive, used directly for performance in situations where it's safe to modify existing point\r\n\t\tthis.x += point.x;\r\n\t\tthis.y += point.y;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method subtract(otherPoint: Point): Point\r\n\t// Returns the result of subtraction of the given point from the current.\r\n\tsubtract: function (point) {\r\n\t\treturn this.clone()._subtract(L.point(point));\r\n\t},\r\n\r\n\t_subtract: function (point) {\r\n\t\tthis.x -= point.x;\r\n\t\tthis.y -= point.y;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method divideBy(num: Number): Point\r\n\t// Returns the result of division of the current point by the given number.\r\n\tdivideBy: function (num) {\r\n\t\treturn this.clone()._divideBy(num);\r\n\t},\r\n\r\n\t_divideBy: function (num) {\r\n\t\tthis.x /= num;\r\n\t\tthis.y /= num;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method multiplyBy(num: Number): Point\r\n\t// Returns the result of multiplication of the current point by the given number.\r\n\tmultiplyBy: function (num) {\r\n\t\treturn this.clone()._multiplyBy(num);\r\n\t},\r\n\r\n\t_multiplyBy: function (num) {\r\n\t\tthis.x *= num;\r\n\t\tthis.y *= num;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method scaleBy(scale: Point): Point\r\n\t// Multiply each coordinate of the current point by each coordinate of\r\n\t// `scale`. In linear algebra terms, multiply the point by the\r\n\t// [scaling matrix](https://en.wikipedia.org/wiki/Scaling_%28geometry%29#Matrix_representation)\r\n\t// defined by `scale`.\r\n\tscaleBy: function (point) {\r\n\t\treturn new L.Point(this.x * point.x, this.y * point.y);\r\n\t},\r\n\r\n\t// @method unscaleBy(scale: Point): Point\r\n\t// Inverse of `scaleBy`. Divide each coordinate of the current point by\r\n\t// each coordinate of `scale`.\r\n\tunscaleBy: function (point) {\r\n\t\treturn new L.Point(this.x / point.x, this.y / point.y);\r\n\t},\r\n\r\n\t// @method round(): Point\r\n\t// Returns a copy of the current point with rounded coordinates.\r\n\tround: function () {\r\n\t\treturn this.clone()._round();\r\n\t},\r\n\r\n\t_round: function () {\r\n\t\tthis.x = Math.round(this.x);\r\n\t\tthis.y = Math.round(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method floor(): Point\r\n\t// Returns a copy of the current point with floored coordinates (rounded down).\r\n\tfloor: function () {\r\n\t\treturn this.clone()._floor();\r\n\t},\r\n\r\n\t_floor: function () {\r\n\t\tthis.x = Math.floor(this.x);\r\n\t\tthis.y = Math.floor(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method ceil(): Point\r\n\t// Returns a copy of the current point with ceiled coordinates (rounded up).\r\n\tceil: function () {\r\n\t\treturn this.clone()._ceil();\r\n\t},\r\n\r\n\t_ceil: function () {\r\n\t\tthis.x = Math.ceil(this.x);\r\n\t\tthis.y = Math.ceil(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method distanceTo(otherPoint: Point): Number\r\n\t// Returns the cartesian distance between the current and the given points.\r\n\tdistanceTo: function (point) {\r\n\t\tpoint = L.point(point);\r\n\r\n\t\tvar x = point.x - this.x,\r\n\t\t    y = point.y - this.y;\r\n\r\n\t\treturn Math.sqrt(x * x + y * y);\r\n\t},\r\n\r\n\t// @method equals(otherPoint: Point): Boolean\r\n\t// Returns `true` if the given point has the same coordinates.\r\n\tequals: function (point) {\r\n\t\tpoint = L.point(point);\r\n\r\n\t\treturn point.x === this.x &&\r\n\t\t       point.y === this.y;\r\n\t},\r\n\r\n\t// @method contains(otherPoint: Point): Boolean\r\n\t// Returns `true` if both coordinates of the given point are less than the corresponding current point coordinates (in absolute values).\r\n\tcontains: function (point) {\r\n\t\tpoint = L.point(point);\r\n\r\n\t\treturn Math.abs(point.x) <= Math.abs(this.x) &&\r\n\t\t       Math.abs(point.y) <= Math.abs(this.y);\r\n\t},\r\n\r\n\t// @method toString(): String\r\n\t// Returns a string representation of the point for debugging purposes.\r\n\ttoString: function () {\r\n\t\treturn 'Point(' +\r\n\t\t        L.Util.formatNum(this.x) + ', ' +\r\n\t\t        L.Util.formatNum(this.y) + ')';\r\n\t}\r\n};\r\n\r\n// @factory L.point(x: Number, y: Number, round?: Boolean)\r\n// Creates a Point object with the given `x` and `y` coordinates. If optional `round` is set to true, rounds the `x` and `y` values.\r\n\r\n// @alternative\r\n// @factory L.point(coords: Number[])\r\n// Expects an array of the form `[x, y]` instead.\r\n\r\n// @alternative\r\n// @factory L.point(coords: Object)\r\n// Expects a plain object of the form `{x: Number, y: Number}` instead.\r\nL.point = function (x, y, round) {\r\n\tif (x instanceof L.Point) {\r\n\t\treturn x;\r\n\t}\r\n\tif (L.Util.isArray(x)) {\r\n\t\treturn new L.Point(x[0], x[1]);\r\n\t}\r\n\tif (x === undefined || x === null) {\r\n\t\treturn x;\r\n\t}\r\n\tif (typeof x === 'object' && 'x' in x && 'y' in x) {\r\n\t\treturn new L.Point(x.x, x.y);\r\n\t}\r\n\treturn new L.Point(x, y, round);\r\n};\r\n\n\n\n/*\r\n * @class Bounds\r\n * @aka L.Bounds\r\n *\r\n * Represents a rectangular area in pixel coordinates.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var p1 = L.point(10, 10),\r\n * p2 = L.point(40, 60),\r\n * bounds = L.bounds(p1, p2);\r\n * ```\r\n *\r\n * All Leaflet methods that accept `Bounds` objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:\r\n *\r\n * ```js\r\n * otherBounds.intersects([[10, 10], [40, 60]]);\r\n * ```\r\n */\r\n\r\nL.Bounds = function (a, b) {\r\n\tif (!a) { return; }\r\n\r\n\tvar points = b ? [a, b] : a;\r\n\r\n\tfor (var i = 0, len = points.length; i < len; i++) {\r\n\t\tthis.extend(points[i]);\r\n\t}\r\n};\r\n\r\nL.Bounds.prototype = {\r\n\t// @method extend(point: Point): this\r\n\t// Extends the bounds to contain the given point.\r\n\textend: function (point) { // (Point)\r\n\t\tpoint = L.point(point);\r\n\r\n\t\t// @property min: Point\r\n\t\t// The top left corner of the rectangle.\r\n\t\t// @property max: Point\r\n\t\t// The bottom right corner of the rectangle.\r\n\t\tif (!this.min && !this.max) {\r\n\t\t\tthis.min = point.clone();\r\n\t\t\tthis.max = point.clone();\r\n\t\t} else {\r\n\t\t\tthis.min.x = Math.min(point.x, this.min.x);\r\n\t\t\tthis.max.x = Math.max(point.x, this.max.x);\r\n\t\t\tthis.min.y = Math.min(point.y, this.min.y);\r\n\t\t\tthis.max.y = Math.max(point.y, this.max.y);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getCenter(round?: Boolean): Point\r\n\t// Returns the center point of the bounds.\r\n\tgetCenter: function (round) {\r\n\t\treturn new L.Point(\r\n\t\t        (this.min.x + this.max.x) / 2,\r\n\t\t        (this.min.y + this.max.y) / 2, round);\r\n\t},\r\n\r\n\t// @method getBottomLeft(): Point\r\n\t// Returns the bottom-left point of the bounds.\r\n\tgetBottomLeft: function () {\r\n\t\treturn new L.Point(this.min.x, this.max.y);\r\n\t},\r\n\r\n\t// @method getTopRight(): Point\r\n\t// Returns the top-right point of the bounds.\r\n\tgetTopRight: function () { // -> Point\r\n\t\treturn new L.Point(this.max.x, this.min.y);\r\n\t},\r\n\r\n\t// @method getSize(): Point\r\n\t// Returns the size of the given bounds\r\n\tgetSize: function () {\r\n\t\treturn this.max.subtract(this.min);\r\n\t},\r\n\r\n\t// @method contains(otherBounds: Bounds): Boolean\r\n\t// Returns `true` if the rectangle contains the given one.\r\n\t// @alternative\r\n\t// @method contains(point: Point): Boolean\r\n\t// Returns `true` if the rectangle contains the given point.\r\n\tcontains: function (obj) {\r\n\t\tvar min, max;\r\n\r\n\t\tif (typeof obj[0] === 'number' || obj instanceof L.Point) {\r\n\t\t\tobj = L.point(obj);\r\n\t\t} else {\r\n\t\t\tobj = L.bounds(obj);\r\n\t\t}\r\n\r\n\t\tif (obj instanceof L.Bounds) {\r\n\t\t\tmin = obj.min;\r\n\t\t\tmax = obj.max;\r\n\t\t} else {\r\n\t\t\tmin = max = obj;\r\n\t\t}\r\n\r\n\t\treturn (min.x >= this.min.x) &&\r\n\t\t       (max.x <= this.max.x) &&\r\n\t\t       (min.y >= this.min.y) &&\r\n\t\t       (max.y <= this.max.y);\r\n\t},\r\n\r\n\t// @method intersects(otherBounds: Bounds): Boolean\r\n\t// Returns `true` if the rectangle intersects the given bounds. Two bounds\r\n\t// intersect if they have at least one point in common.\r\n\tintersects: function (bounds) { // (Bounds) -> Boolean\r\n\t\tbounds = L.bounds(bounds);\r\n\r\n\t\tvar min = this.min,\r\n\t\t    max = this.max,\r\n\t\t    min2 = bounds.min,\r\n\t\t    max2 = bounds.max,\r\n\t\t    xIntersects = (max2.x >= min.x) && (min2.x <= max.x),\r\n\t\t    yIntersects = (max2.y >= min.y) && (min2.y <= max.y);\r\n\r\n\t\treturn xIntersects && yIntersects;\r\n\t},\r\n\r\n\t// @method overlaps(otherBounds: Bounds): Boolean\r\n\t// Returns `true` if the rectangle overlaps the given bounds. Two bounds\r\n\t// overlap if their intersection is an area.\r\n\toverlaps: function (bounds) { // (Bounds) -> Boolean\r\n\t\tbounds = L.bounds(bounds);\r\n\r\n\t\tvar min = this.min,\r\n\t\t    max = this.max,\r\n\t\t    min2 = bounds.min,\r\n\t\t    max2 = bounds.max,\r\n\t\t    xOverlaps = (max2.x > min.x) && (min2.x < max.x),\r\n\t\t    yOverlaps = (max2.y > min.y) && (min2.y < max.y);\r\n\r\n\t\treturn xOverlaps && yOverlaps;\r\n\t},\r\n\r\n\tisValid: function () {\r\n\t\treturn !!(this.min && this.max);\r\n\t}\r\n};\r\n\r\n\r\n// @factory L.bounds(topLeft: Point, bottomRight: Point)\r\n// Creates a Bounds object from two coordinates (usually top-left and bottom-right corners).\r\n// @alternative\r\n// @factory L.bounds(points: Point[])\r\n// Creates a Bounds object from the points it contains\r\nL.bounds = function (a, b) {\r\n\tif (!a || a instanceof L.Bounds) {\r\n\t\treturn a;\r\n\t}\r\n\treturn new L.Bounds(a, b);\r\n};\r\n\n\n\n/*\r\n * @class Transformation\r\n * @aka L.Transformation\r\n *\r\n * Represents an affine transformation: a set of coefficients `a`, `b`, `c`, `d`\r\n * for transforming a point of a form `(x, y)` into `(a*x + b, c*y + d)` and doing\r\n * the reverse. Used by Leaflet in its projections code.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var transformation = new L.Transformation(2, 5, -1, 10),\r\n * \tp = L.point(1, 2),\r\n * \tp2 = transformation.transform(p), //  L.point(7, 8)\r\n * \tp3 = transformation.untransform(p2); //  L.point(1, 2)\r\n * ```\r\n */\r\n\r\n\r\n// factory new L.Transformation(a: Number, b: Number, c: Number, d: Number)\r\n// Creates a `Transformation` object with the given coefficients.\r\nL.Transformation = function (a, b, c, d) {\r\n\tthis._a = a;\r\n\tthis._b = b;\r\n\tthis._c = c;\r\n\tthis._d = d;\r\n};\r\n\r\nL.Transformation.prototype = {\r\n\t// @method transform(point: Point, scale?: Number): Point\r\n\t// Returns a transformed point, optionally multiplied by the given scale.\r\n\t// Only accepts actual `L.Point` instances, not arrays.\r\n\ttransform: function (point, scale) { // (Point, Number) -> Point\r\n\t\treturn this._transform(point.clone(), scale);\r\n\t},\r\n\r\n\t// destructive transform (faster)\r\n\t_transform: function (point, scale) {\r\n\t\tscale = scale || 1;\r\n\t\tpoint.x = scale * (this._a * point.x + this._b);\r\n\t\tpoint.y = scale * (this._c * point.y + this._d);\r\n\t\treturn point;\r\n\t},\r\n\r\n\t// @method untransform(point: Point, scale?: Number): Point\r\n\t// Returns the reverse transformation of the given point, optionally divided\r\n\t// by the given scale. Only accepts actual `L.Point` instances, not arrays.\r\n\tuntransform: function (point, scale) {\r\n\t\tscale = scale || 1;\r\n\t\treturn new L.Point(\r\n\t\t        (point.x / scale - this._b) / this._a,\r\n\t\t        (point.y / scale - this._d) / this._c);\r\n\t}\r\n};\r\n\n\n\n/*\r\n * @namespace DomUtil\r\n *\r\n * Utility functions to work with the [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model)\r\n * tree, used by Leaflet internally.\r\n *\r\n * Most functions expecting or returning a `HTMLElement` also work for\r\n * SVG elements. The only difference is that classes refer to CSS classes\r\n * in HTML and SVG classes in SVG.\r\n */\r\n\r\nL.DomUtil = {\r\n\r\n\t// @function get(id: String|HTMLElement): HTMLElement\r\n\t// Returns an element given its DOM id, or returns the element itself\r\n\t// if it was passed directly.\r\n\tget: function (id) {\r\n\t\treturn typeof id === 'string' ? document.getElementById(id) : id;\r\n\t},\r\n\r\n\t// @function getStyle(el: HTMLElement, styleAttrib: String): String\r\n\t// Returns the value for a certain style attribute on an element,\r\n\t// including computed values or values set through CSS.\r\n\tgetStyle: function (el, style) {\r\n\r\n\t\tvar value = el.style[style] || (el.currentStyle && el.currentStyle[style]);\r\n\r\n\t\tif ((!value || value === 'auto') && document.defaultView) {\r\n\t\t\tvar css = document.defaultView.getComputedStyle(el, null);\r\n\t\t\tvalue = css ? css[style] : null;\r\n\t\t}\r\n\r\n\t\treturn value === 'auto' ? null : value;\r\n\t},\r\n\r\n\t// @function create(tagName: String, className?: String, container?: HTMLElement): HTMLElement\r\n\t// Creates an HTML element with `tagName`, sets its class to `className`, and optionally appends it to `container` element.\r\n\tcreate: function (tagName, className, container) {\r\n\r\n\t\tvar el = document.createElement(tagName);\r\n\t\tel.className = className || '';\r\n\r\n\t\tif (container) {\r\n\t\t\tcontainer.appendChild(el);\r\n\t\t}\r\n\r\n\t\treturn el;\r\n\t},\r\n\r\n\t// @function remove(el: HTMLElement)\r\n\t// Removes `el` from its parent element\r\n\tremove: function (el) {\r\n\t\tvar parent = el.parentNode;\r\n\t\tif (parent) {\r\n\t\t\tparent.removeChild(el);\r\n\t\t}\r\n\t},\r\n\r\n\t// @function empty(el: HTMLElement)\r\n\t// Removes all of `el`'s children elements from `el`\r\n\tempty: function (el) {\r\n\t\twhile (el.firstChild) {\r\n\t\t\tel.removeChild(el.firstChild);\r\n\t\t}\r\n\t},\r\n\r\n\t// @function toFront(el: HTMLElement)\r\n\t// Makes `el` the last children of its parent, so it renders in front of the other children.\r\n\ttoFront: function (el) {\r\n\t\tel.parentNode.appendChild(el);\r\n\t},\r\n\r\n\t// @function toBack(el: HTMLElement)\r\n\t// Makes `el` the first children of its parent, so it renders back from the other children.\r\n\ttoBack: function (el) {\r\n\t\tvar parent = el.parentNode;\r\n\t\tparent.insertBefore(el, parent.firstChild);\r\n\t},\r\n\r\n\t// @function hasClass(el: HTMLElement, name: String): Boolean\r\n\t// Returns `true` if the element's class attribute contains `name`.\r\n\thasClass: function (el, name) {\r\n\t\tif (el.classList !== undefined) {\r\n\t\t\treturn el.classList.contains(name);\r\n\t\t}\r\n\t\tvar className = L.DomUtil.getClass(el);\r\n\t\treturn className.length > 0 && new RegExp('(^|\\\\s)' + name + '(\\\\s|$)').test(className);\r\n\t},\r\n\r\n\t// @function addClass(el: HTMLElement, name: String)\r\n\t// Adds `name` to the element's class attribute.\r\n\taddClass: function (el, name) {\r\n\t\tif (el.classList !== undefined) {\r\n\t\t\tvar classes = L.Util.splitWords(name);\r\n\t\t\tfor (var i = 0, len = classes.length; i < len; i++) {\r\n\t\t\t\tel.classList.add(classes[i]);\r\n\t\t\t}\r\n\t\t} else if (!L.DomUtil.hasClass(el, name)) {\r\n\t\t\tvar className = L.DomUtil.getClass(el);\r\n\t\t\tL.DomUtil.setClass(el, (className ? className + ' ' : '') + name);\r\n\t\t}\r\n\t},\r\n\r\n\t// @function removeClass(el: HTMLElement, name: String)\r\n\t// Removes `name` from the element's class attribute.\r\n\tremoveClass: function (el, name) {\r\n\t\tif (el.classList !== undefined) {\r\n\t\t\tel.classList.remove(name);\r\n\t\t} else {\r\n\t\t\tL.DomUtil.setClass(el, L.Util.trim((' ' + L.DomUtil.getClass(el) + ' ').replace(' ' + name + ' ', ' ')));\r\n\t\t}\r\n\t},\r\n\r\n\t// @function setClass(el: HTMLElement, name: String)\r\n\t// Sets the element's class.\r\n\tsetClass: function (el, name) {\r\n\t\tif (el.className.baseVal === undefined) {\r\n\t\t\tel.className = name;\r\n\t\t} else {\r\n\t\t\t// in case of SVG element\r\n\t\t\tel.className.baseVal = name;\r\n\t\t}\r\n\t},\r\n\r\n\t// @function getClass(el: HTMLElement): String\r\n\t// Returns the element's class.\r\n\tgetClass: function (el) {\r\n\t\treturn el.className.baseVal === undefined ? el.className : el.className.baseVal;\r\n\t},\r\n\r\n\t// @function setOpacity(el: HTMLElement, opacity: Number)\r\n\t// Set the opacity of an element (including old IE support).\r\n\t// `opacity` must be a number from `0` to `1`.\r\n\tsetOpacity: function (el, value) {\r\n\r\n\t\tif ('opacity' in el.style) {\r\n\t\t\tel.style.opacity = value;\r\n\r\n\t\t} else if ('filter' in el.style) {\r\n\t\t\tL.DomUtil._setOpacityIE(el, value);\r\n\t\t}\r\n\t},\r\n\r\n\t_setOpacityIE: function (el, value) {\r\n\t\tvar filter = false,\r\n\t\t    filterName = 'DXImageTransform.Microsoft.Alpha';\r\n\r\n\t\t// filters collection throws an error if we try to retrieve a filter that doesn't exist\r\n\t\ttry {\r\n\t\t\tfilter = el.filters.item(filterName);\r\n\t\t} catch (e) {\r\n\t\t\t// don't set opacity to 1 if we haven't already set an opacity,\r\n\t\t\t// it isn't needed and breaks transparent pngs.\r\n\t\t\tif (value === 1) { return; }\r\n\t\t}\r\n\r\n\t\tvalue = Math.round(value * 100);\r\n\r\n\t\tif (filter) {\r\n\t\t\tfilter.Enabled = (value !== 100);\r\n\t\t\tfilter.Opacity = value;\r\n\t\t} else {\r\n\t\t\tel.style.filter += ' progid:' + filterName + '(opacity=' + value + ')';\r\n\t\t}\r\n\t},\r\n\r\n\t// @function testProp(props: String[]): String|false\r\n\t// Goes through the array of style names and returns the first name\r\n\t// that is a valid style name for an element. If no such name is found,\r\n\t// it returns false. Useful for vendor-prefixed styles like `transform`.\r\n\ttestProp: function (props) {\r\n\r\n\t\tvar style = document.documentElement.style;\r\n\r\n\t\tfor (var i = 0; i < props.length; i++) {\r\n\t\t\tif (props[i] in style) {\r\n\t\t\t\treturn props[i];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\t// @function setTransform(el: HTMLElement, offset: Point, scale?: Number)\r\n\t// Resets the 3D CSS transform of `el` so it is translated by `offset` pixels\r\n\t// and optionally scaled by `scale`. Does not have an effect if the\r\n\t// browser doesn't support 3D CSS transforms.\r\n\tsetTransform: function (el, offset, scale) {\r\n\t\tvar pos = offset || new L.Point(0, 0);\r\n\r\n\t\tel.style[L.DomUtil.TRANSFORM] =\r\n\t\t\t(L.Browser.ie3d ?\r\n\t\t\t\t'translate(' + pos.x + 'px,' + pos.y + 'px)' :\r\n\t\t\t\t'translate3d(' + pos.x + 'px,' + pos.y + 'px,0)') +\r\n\t\t\t(scale ? ' scale(' + scale + ')' : '');\r\n\t},\r\n\r\n\t// @function setPosition(el: HTMLElement, position: Point)\r\n\t// Sets the position of `el` to coordinates specified by `position`,\r\n\t// using CSS translate or top/left positioning depending on the browser\r\n\t// (used by Leaflet internally to position its layers).\r\n\tsetPosition: function (el, point) { // (HTMLElement, Point[, Boolean])\r\n\r\n\t\t/*eslint-disable */\r\n\t\tel._leaflet_pos = point;\r\n\t\t/*eslint-enable */\r\n\r\n\t\tif (L.Browser.any3d) {\r\n\t\t\tL.DomUtil.setTransform(el, point);\r\n\t\t} else {\r\n\t\t\tel.style.left = point.x + 'px';\r\n\t\t\tel.style.top = point.y + 'px';\r\n\t\t}\r\n\t},\r\n\r\n\t// @function getPosition(el: HTMLElement): Point\r\n\t// Returns the coordinates of an element previously positioned with setPosition.\r\n\tgetPosition: function (el) {\r\n\t\t// this method is only used for elements previously positioned using setPosition,\r\n\t\t// so it's safe to cache the position for performance\r\n\r\n\t\treturn el._leaflet_pos || new L.Point(0, 0);\r\n\t}\r\n};\r\n\r\n\r\n(function () {\r\n\t// prefix style property names\r\n\r\n\t// @property TRANSFORM: String\r\n\t// Vendor-prefixed fransform style name (e.g. `'webkitTransform'` for WebKit).\r\n\tL.DomUtil.TRANSFORM = L.DomUtil.testProp(\r\n\t\t\t['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform']);\r\n\r\n\r\n\t// webkitTransition comes first because some browser versions that drop vendor prefix don't do\r\n\t// the same for the transitionend event, in particular the Android 4.1 stock browser\r\n\r\n\t// @property TRANSITION: String\r\n\t// Vendor-prefixed transform style name.\r\n\tvar transition = L.DomUtil.TRANSITION = L.DomUtil.testProp(\r\n\t\t\t['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']);\r\n\r\n\tL.DomUtil.TRANSITION_END =\r\n\t\t\ttransition === 'webkitTransition' || transition === 'OTransition' ? transition + 'End' : 'transitionend';\r\n\r\n\t// @function disableTextSelection()\r\n\t// Prevents the user from generating `selectstart` DOM events, usually generated\r\n\t// when the user drags the mouse through a page with text. Used internally\r\n\t// by Leaflet to override the behaviour of any click-and-drag interaction on\r\n\t// the map. Affects drag interactions on the whole document.\r\n\r\n\t// @function enableTextSelection()\r\n\t// Cancels the effects of a previous [`L.DomUtil.disableTextSelection`](#domutil-disabletextselection).\r\n\tif ('onselectstart' in document) {\r\n\t\tL.DomUtil.disableTextSelection = function () {\r\n\t\t\tL.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault);\r\n\t\t};\r\n\t\tL.DomUtil.enableTextSelection = function () {\r\n\t\t\tL.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault);\r\n\t\t};\r\n\r\n\t} else {\r\n\t\tvar userSelectProperty = L.DomUtil.testProp(\r\n\t\t\t['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']);\r\n\r\n\t\tL.DomUtil.disableTextSelection = function () {\r\n\t\t\tif (userSelectProperty) {\r\n\t\t\t\tvar style = document.documentElement.style;\r\n\t\t\t\tthis._userSelect = style[userSelectProperty];\r\n\t\t\t\tstyle[userSelectProperty] = 'none';\r\n\t\t\t}\r\n\t\t};\r\n\t\tL.DomUtil.enableTextSelection = function () {\r\n\t\t\tif (userSelectProperty) {\r\n\t\t\t\tdocument.documentElement.style[userSelectProperty] = this._userSelect;\r\n\t\t\t\tdelete this._userSelect;\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\r\n\t// @function disableImageDrag()\r\n\t// As [`L.DomUtil.disableTextSelection`](#domutil-disabletextselection), but\r\n\t// for `dragstart` DOM events, usually generated when the user drags an image.\r\n\tL.DomUtil.disableImageDrag = function () {\r\n\t\tL.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault);\r\n\t};\r\n\r\n\t// @function enableImageDrag()\r\n\t// Cancels the effects of a previous [`L.DomUtil.disableImageDrag`](#domutil-disabletextselection).\r\n\tL.DomUtil.enableImageDrag = function () {\r\n\t\tL.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault);\r\n\t};\r\n\r\n\t// @function preventOutline(el: HTMLElement)\r\n\t// Makes the [outline](https://developer.mozilla.org/docs/Web/CSS/outline)\r\n\t// of the element `el` invisible. Used internally by Leaflet to prevent\r\n\t// focusable elements from displaying an outline when the user performs a\r\n\t// drag interaction on them.\r\n\tL.DomUtil.preventOutline = function (element) {\r\n\t\twhile (element.tabIndex === -1) {\r\n\t\t\telement = element.parentNode;\r\n\t\t}\r\n\t\tif (!element || !element.style) { return; }\r\n\t\tL.DomUtil.restoreOutline();\r\n\t\tthis._outlineElement = element;\r\n\t\tthis._outlineStyle = element.style.outline;\r\n\t\telement.style.outline = 'none';\r\n\t\tL.DomEvent.on(window, 'keydown', L.DomUtil.restoreOutline, this);\r\n\t};\r\n\r\n\t// @function restoreOutline()\r\n\t// Cancels the effects of a previous [`L.DomUtil.preventOutline`]().\r\n\tL.DomUtil.restoreOutline = function () {\r\n\t\tif (!this._outlineElement) { return; }\r\n\t\tthis._outlineElement.style.outline = this._outlineStyle;\r\n\t\tdelete this._outlineElement;\r\n\t\tdelete this._outlineStyle;\r\n\t\tL.DomEvent.off(window, 'keydown', L.DomUtil.restoreOutline, this);\r\n\t};\r\n})();\r\n\n\n\n/* @class LatLng\r\n * @aka L.LatLng\r\n *\r\n * Represents a geographical point with a certain latitude and longitude.\r\n *\r\n * @example\r\n *\r\n * ```\r\n * var latlng = L.latLng(50.5, 30.5);\r\n * ```\r\n *\r\n * All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent:\r\n *\r\n * ```\r\n * map.panTo([50, 30]);\r\n * map.panTo({lon: 30, lat: 50});\r\n * map.panTo({lat: 50, lng: 30});\r\n * map.panTo(L.latLng(50, 30));\r\n * ```\r\n */\r\n\r\nL.LatLng = function (lat, lng, alt) {\r\n\tif (isNaN(lat) || isNaN(lng)) {\r\n\t\tthrow new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')');\r\n\t}\r\n\r\n\t// @property lat: Number\r\n\t// Latitude in degrees\r\n\tthis.lat = +lat;\r\n\r\n\t// @property lng: Number\r\n\t// Longitude in degrees\r\n\tthis.lng = +lng;\r\n\r\n\t// @property alt: Number\r\n\t// Altitude in meters (optional)\r\n\tif (alt !== undefined) {\r\n\t\tthis.alt = +alt;\r\n\t}\r\n};\r\n\r\nL.LatLng.prototype = {\r\n\t// @method equals(otherLatLng: LatLng, maxMargin?: Number): Boolean\r\n\t// Returns `true` if the given `LatLng` point is at the same position (within a small margin of error). The margin of error can be overriden by setting `maxMargin` to a small number.\r\n\tequals: function (obj, maxMargin) {\r\n\t\tif (!obj) { return false; }\r\n\r\n\t\tobj = L.latLng(obj);\r\n\r\n\t\tvar margin = Math.max(\r\n\t\t        Math.abs(this.lat - obj.lat),\r\n\t\t        Math.abs(this.lng - obj.lng));\r\n\r\n\t\treturn margin <= (maxMargin === undefined ? 1.0E-9 : maxMargin);\r\n\t},\r\n\r\n\t// @method toString(): String\r\n\t// Returns a string representation of the point (for debugging purposes).\r\n\ttoString: function (precision) {\r\n\t\treturn 'LatLng(' +\r\n\t\t        L.Util.formatNum(this.lat, precision) + ', ' +\r\n\t\t        L.Util.formatNum(this.lng, precision) + ')';\r\n\t},\r\n\r\n\t// @method distanceTo(otherLatLng: LatLng): Number\r\n\t// Returns the distance (in meters) to the given `LatLng` calculated using the [Haversine formula](http://en.wikipedia.org/wiki/Haversine_formula).\r\n\tdistanceTo: function (other) {\r\n\t\treturn L.CRS.Earth.distance(this, L.latLng(other));\r\n\t},\r\n\r\n\t// @method wrap(): LatLng\r\n\t// Returns a new `LatLng` object with the longitude wrapped so it's always between -180 and +180 degrees.\r\n\twrap: function () {\r\n\t\treturn L.CRS.Earth.wrapLatLng(this);\r\n\t},\r\n\r\n\t// @method toBounds(sizeInMeters: Number): LatLngBounds\r\n\t// Returns a new `LatLngBounds` object in which each boundary is `sizeInMeters/2` meters apart from the `LatLng`.\r\n\ttoBounds: function (sizeInMeters) {\r\n\t\tvar latAccuracy = 180 * sizeInMeters / 40075017,\r\n\t\t    lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat);\r\n\r\n\t\treturn L.latLngBounds(\r\n\t\t        [this.lat - latAccuracy, this.lng - lngAccuracy],\r\n\t\t        [this.lat + latAccuracy, this.lng + lngAccuracy]);\r\n\t},\r\n\r\n\tclone: function () {\r\n\t\treturn new L.LatLng(this.lat, this.lng, this.alt);\r\n\t}\r\n};\r\n\r\n\r\n\r\n// @factory L.latLng(latitude: Number, longitude: Number, altitude?: Number): LatLng\r\n// Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude).\r\n\r\n// @alternative\r\n// @factory L.latLng(coords: Array): LatLng\r\n// Expects an array of the form `[Number, Number]` or `[Number, Number, Number]` instead.\r\n\r\n// @alternative\r\n// @factory L.latLng(coords: Object): LatLng\r\n// Expects an plain object of the form `{lat: Number, lng: Number}` or `{lat: Number, lng: Number, alt: Number}` instead.\r\n\r\nL.latLng = function (a, b, c) {\r\n\tif (a instanceof L.LatLng) {\r\n\t\treturn a;\r\n\t}\r\n\tif (L.Util.isArray(a) && typeof a[0] !== 'object') {\r\n\t\tif (a.length === 3) {\r\n\t\t\treturn new L.LatLng(a[0], a[1], a[2]);\r\n\t\t}\r\n\t\tif (a.length === 2) {\r\n\t\t\treturn new L.LatLng(a[0], a[1]);\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\tif (a === undefined || a === null) {\r\n\t\treturn a;\r\n\t}\r\n\tif (typeof a === 'object' && 'lat' in a) {\r\n\t\treturn new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon, a.alt);\r\n\t}\r\n\tif (b === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\treturn new L.LatLng(a, b, c);\r\n};\r\n\n\n\n/*\r\n * @class LatLngBounds\r\n * @aka L.LatLngBounds\r\n *\r\n * Represents a rectangular geographical area on a map.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var corner1 = L.latLng(40.712, -74.227),\r\n * corner2 = L.latLng(40.774, -74.125),\r\n * bounds = L.latLngBounds(corner1, corner2);\r\n * ```\r\n *\r\n * All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:\r\n *\r\n * ```js\r\n * map.fitBounds([\r\n * \t[40.712, -74.227],\r\n * \t[40.774, -74.125]\r\n * ]);\r\n * ```\r\n *\r\n * Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners _outside_ the [-180, 180] degrees longitude range.\r\n */\r\n\r\nL.LatLngBounds = function (corner1, corner2) { // (LatLng, LatLng) or (LatLng[])\r\n\tif (!corner1) { return; }\r\n\r\n\tvar latlngs = corner2 ? [corner1, corner2] : corner1;\r\n\r\n\tfor (var i = 0, len = latlngs.length; i < len; i++) {\r\n\t\tthis.extend(latlngs[i]);\r\n\t}\r\n};\r\n\r\nL.LatLngBounds.prototype = {\r\n\r\n\t// @method extend(latlng: LatLng): this\r\n\t// Extend the bounds to contain the given point\r\n\r\n\t// @alternative\r\n\t// @method extend(otherBounds: LatLngBounds): this\r\n\t// Extend the bounds to contain the given bounds\r\n\textend: function (obj) {\r\n\t\tvar sw = this._southWest,\r\n\t\t    ne = this._northEast,\r\n\t\t    sw2, ne2;\r\n\r\n\t\tif (obj instanceof L.LatLng) {\r\n\t\t\tsw2 = obj;\r\n\t\t\tne2 = obj;\r\n\r\n\t\t} else if (obj instanceof L.LatLngBounds) {\r\n\t\t\tsw2 = obj._southWest;\r\n\t\t\tne2 = obj._northEast;\r\n\r\n\t\t\tif (!sw2 || !ne2) { return this; }\r\n\r\n\t\t} else {\r\n\t\t\treturn obj ? this.extend(L.latLng(obj) || L.latLngBounds(obj)) : this;\r\n\t\t}\r\n\r\n\t\tif (!sw && !ne) {\r\n\t\t\tthis._southWest = new L.LatLng(sw2.lat, sw2.lng);\r\n\t\t\tthis._northEast = new L.LatLng(ne2.lat, ne2.lng);\r\n\t\t} else {\r\n\t\t\tsw.lat = Math.min(sw2.lat, sw.lat);\r\n\t\t\tsw.lng = Math.min(sw2.lng, sw.lng);\r\n\t\t\tne.lat = Math.max(ne2.lat, ne.lat);\r\n\t\t\tne.lng = Math.max(ne2.lng, ne.lng);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method pad(bufferRatio: Number): LatLngBounds\r\n\t// Returns bigger bounds created by extending the current bounds by a given percentage in each direction.\r\n\tpad: function (bufferRatio) {\r\n\t\tvar sw = this._southWest,\r\n\t\t    ne = this._northEast,\r\n\t\t    heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio,\r\n\t\t    widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio;\r\n\r\n\t\treturn new L.LatLngBounds(\r\n\t\t        new L.LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer),\r\n\t\t        new L.LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer));\r\n\t},\r\n\r\n\t// @method getCenter(): LatLng\r\n\t// Returns the center point of the bounds.\r\n\tgetCenter: function () {\r\n\t\treturn new L.LatLng(\r\n\t\t        (this._southWest.lat + this._northEast.lat) / 2,\r\n\t\t        (this._southWest.lng + this._northEast.lng) / 2);\r\n\t},\r\n\r\n\t// @method getSouthWest(): LatLng\r\n\t// Returns the south-west point of the bounds.\r\n\tgetSouthWest: function () {\r\n\t\treturn this._southWest;\r\n\t},\r\n\r\n\t// @method getNorthEast(): LatLng\r\n\t// Returns the north-east point of the bounds.\r\n\tgetNorthEast: function () {\r\n\t\treturn this._northEast;\r\n\t},\r\n\r\n\t// @method getNorthWest(): LatLng\r\n\t// Returns the north-west point of the bounds.\r\n\tgetNorthWest: function () {\r\n\t\treturn new L.LatLng(this.getNorth(), this.getWest());\r\n\t},\r\n\r\n\t// @method getSouthEast(): LatLng\r\n\t// Returns the south-east point of the bounds.\r\n\tgetSouthEast: function () {\r\n\t\treturn new L.LatLng(this.getSouth(), this.getEast());\r\n\t},\r\n\r\n\t// @method getWest(): Number\r\n\t// Returns the west longitude of the bounds\r\n\tgetWest: function () {\r\n\t\treturn this._southWest.lng;\r\n\t},\r\n\r\n\t// @method getSouth(): Number\r\n\t// Returns the south latitude of the bounds\r\n\tgetSouth: function () {\r\n\t\treturn this._southWest.lat;\r\n\t},\r\n\r\n\t// @method getEast(): Number\r\n\t// Returns the east longitude of the bounds\r\n\tgetEast: function () {\r\n\t\treturn this._northEast.lng;\r\n\t},\r\n\r\n\t// @method getNorth(): Number\r\n\t// Returns the north latitude of the bounds\r\n\tgetNorth: function () {\r\n\t\treturn this._northEast.lat;\r\n\t},\r\n\r\n\t// @method contains(otherBounds: LatLngBounds): Boolean\r\n\t// Returns `true` if the rectangle contains the given one.\r\n\r\n\t// @alternative\r\n\t// @method contains (latlng: LatLng): Boolean\r\n\t// Returns `true` if the rectangle contains the given point.\r\n\tcontains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean\r\n\t\tif (typeof obj[0] === 'number' || obj instanceof L.LatLng || 'lat' in obj) {\r\n\t\t\tobj = L.latLng(obj);\r\n\t\t} else {\r\n\t\t\tobj = L.latLngBounds(obj);\r\n\t\t}\r\n\r\n\t\tvar sw = this._southWest,\r\n\t\t    ne = this._northEast,\r\n\t\t    sw2, ne2;\r\n\r\n\t\tif (obj instanceof L.LatLngBounds) {\r\n\t\t\tsw2 = obj.getSouthWest();\r\n\t\t\tne2 = obj.getNorthEast();\r\n\t\t} else {\r\n\t\t\tsw2 = ne2 = obj;\r\n\t\t}\r\n\r\n\t\treturn (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) &&\r\n\t\t       (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng);\r\n\t},\r\n\r\n\t// @method intersects(otherBounds: LatLngBounds): Boolean\r\n\t// Returns `true` if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common.\r\n\tintersects: function (bounds) {\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\tvar sw = this._southWest,\r\n\t\t    ne = this._northEast,\r\n\t\t    sw2 = bounds.getSouthWest(),\r\n\t\t    ne2 = bounds.getNorthEast(),\r\n\r\n\t\t    latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat),\r\n\t\t    lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng);\r\n\r\n\t\treturn latIntersects && lngIntersects;\r\n\t},\r\n\r\n\t// @method overlaps(otherBounds: Bounds): Boolean\r\n\t// Returns `true` if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area.\r\n\toverlaps: function (bounds) {\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\tvar sw = this._southWest,\r\n\t\t    ne = this._northEast,\r\n\t\t    sw2 = bounds.getSouthWest(),\r\n\t\t    ne2 = bounds.getNorthEast(),\r\n\r\n\t\t    latOverlaps = (ne2.lat > sw.lat) && (sw2.lat < ne.lat),\r\n\t\t    lngOverlaps = (ne2.lng > sw.lng) && (sw2.lng < ne.lng);\r\n\r\n\t\treturn latOverlaps && lngOverlaps;\r\n\t},\r\n\r\n\t// @method toBBoxString(): String\r\n\t// Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data.\r\n\ttoBBoxString: function () {\r\n\t\treturn [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(',');\r\n\t},\r\n\r\n\t// @method equals(otherBounds: LatLngBounds): Boolean\r\n\t// Returns `true` if the rectangle is equivalent (within a small margin of error) to the given bounds.\r\n\tequals: function (bounds) {\r\n\t\tif (!bounds) { return false; }\r\n\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\treturn this._southWest.equals(bounds.getSouthWest()) &&\r\n\t\t       this._northEast.equals(bounds.getNorthEast());\r\n\t},\r\n\r\n\t// @method isValid(): Boolean\r\n\t// Returns `true` if the bounds are properly initialized.\r\n\tisValid: function () {\r\n\t\treturn !!(this._southWest && this._northEast);\r\n\t}\r\n};\r\n\r\n// TODO International date line?\r\n\r\n// @factory L.latLngBounds(corner1: LatLng, corner2: LatLng)\r\n// Creates a `LatLngBounds` object by defining two diagonally opposite corners of the rectangle.\r\n\r\n// @alternative\r\n// @factory L.latLngBounds(latlngs: LatLng[])\r\n// Creates a `LatLngBounds` object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with [`fitBounds`](#map-fitbounds).\r\nL.latLngBounds = function (a, b) {\r\n\tif (a instanceof L.LatLngBounds) {\r\n\t\treturn a;\r\n\t}\r\n\treturn new L.LatLngBounds(a, b);\r\n};\r\n\n\n\n/*\r\n * @namespace Projection\r\n * @section\r\n * Leaflet comes with a set of already defined Projections out of the box:\r\n *\r\n * @projection L.Projection.LonLat\r\n *\r\n * Equirectangular, or Plate Carree projection — the most simple projection,\r\n * mostly used by GIS enthusiasts. Directly maps `x` as longitude, and `y` as\r\n * latitude. Also suitable for flat worlds, e.g. game maps. Used by the\r\n * `EPSG:3395` and `Simple` CRS.\r\n */\r\n\r\nL.Projection = {};\r\n\r\nL.Projection.LonLat = {\r\n\tproject: function (latlng) {\r\n\t\treturn new L.Point(latlng.lng, latlng.lat);\r\n\t},\r\n\r\n\tunproject: function (point) {\r\n\t\treturn new L.LatLng(point.y, point.x);\r\n\t},\r\n\r\n\tbounds: L.bounds([-180, -90], [180, 90])\r\n};\r\n\n\n\n/*\r\n * @namespace Projection\r\n * @projection L.Projection.SphericalMercator\r\n *\r\n * Spherical Mercator projection — the most common projection for online maps,\r\n * used by almost all free and commercial tile providers. Assumes that Earth is\r\n * a sphere. Used by the `EPSG:3857` CRS.\r\n */\r\n\r\nL.Projection.SphericalMercator = {\r\n\r\n\tR: 6378137,\r\n\tMAX_LATITUDE: 85.0511287798,\r\n\r\n\tproject: function (latlng) {\r\n\t\tvar d = Math.PI / 180,\r\n\t\t    max = this.MAX_LATITUDE,\r\n\t\t    lat = Math.max(Math.min(max, latlng.lat), -max),\r\n\t\t    sin = Math.sin(lat * d);\r\n\r\n\t\treturn new L.Point(\r\n\t\t\t\tthis.R * latlng.lng * d,\r\n\t\t\t\tthis.R * Math.log((1 + sin) / (1 - sin)) / 2);\r\n\t},\r\n\r\n\tunproject: function (point) {\r\n\t\tvar d = 180 / Math.PI;\r\n\r\n\t\treturn new L.LatLng(\r\n\t\t\t(2 * Math.atan(Math.exp(point.y / this.R)) - (Math.PI / 2)) * d,\r\n\t\t\tpoint.x * d / this.R);\r\n\t},\r\n\r\n\tbounds: (function () {\r\n\t\tvar d = 6378137 * Math.PI;\r\n\t\treturn L.bounds([-d, -d], [d, d]);\r\n\t})()\r\n};\r\n\n\n\n/*\r\n * @class CRS\r\n * @aka L.CRS\r\n * Abstract class that defines coordinate reference systems for projecting\r\n * geographical points into pixel (screen) coordinates and back (and to\r\n * coordinates in other units for [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services). See\r\n * [spatial reference system](http://en.wikipedia.org/wiki/Coordinate_reference_system).\r\n *\r\n * Leaflet defines the most usual CRSs by default. If you want to use a\r\n * CRS not defined by default, take a look at the\r\n * [Proj4Leaflet](https://github.com/kartena/Proj4Leaflet) plugin.\r\n */\r\n\r\nL.CRS = {\r\n\t// @method latLngToPoint(latlng: LatLng, zoom: Number): Point\r\n\t// Projects geographical coordinates into pixel coordinates for a given zoom.\r\n\tlatLngToPoint: function (latlng, zoom) {\r\n\t\tvar projectedPoint = this.projection.project(latlng),\r\n\t\t    scale = this.scale(zoom);\r\n\r\n\t\treturn this.transformation._transform(projectedPoint, scale);\r\n\t},\r\n\r\n\t// @method pointToLatLng(point: Point, zoom: Number): LatLng\r\n\t// The inverse of `latLngToPoint`. Projects pixel coordinates on a given\r\n\t// zoom into geographical coordinates.\r\n\tpointToLatLng: function (point, zoom) {\r\n\t\tvar scale = this.scale(zoom),\r\n\t\t    untransformedPoint = this.transformation.untransform(point, scale);\r\n\r\n\t\treturn this.projection.unproject(untransformedPoint);\r\n\t},\r\n\r\n\t// @method project(latlng: LatLng): Point\r\n\t// Projects geographical coordinates into coordinates in units accepted for\r\n\t// this CRS (e.g. meters for EPSG:3857, for passing it to WMS services).\r\n\tproject: function (latlng) {\r\n\t\treturn this.projection.project(latlng);\r\n\t},\r\n\r\n\t// @method unproject(point: Point): LatLng\r\n\t// Given a projected coordinate returns the corresponding LatLng.\r\n\t// The inverse of `project`.\r\n\tunproject: function (point) {\r\n\t\treturn this.projection.unproject(point);\r\n\t},\r\n\r\n\t// @method scale(zoom: Number): Number\r\n\t// Returns the scale used when transforming projected coordinates into\r\n\t// pixel coordinates for a particular zoom. For example, it returns\r\n\t// `256 * 2^zoom` for Mercator-based CRS.\r\n\tscale: function (zoom) {\r\n\t\treturn 256 * Math.pow(2, zoom);\r\n\t},\r\n\r\n\t// @method zoom(scale: Number): Number\r\n\t// Inverse of `scale()`, returns the zoom level corresponding to a scale\r\n\t// factor of `scale`.\r\n\tzoom: function (scale) {\r\n\t\treturn Math.log(scale / 256) / Math.LN2;\r\n\t},\r\n\r\n\t// @method getProjectedBounds(zoom: Number): Bounds\r\n\t// Returns the projection's bounds scaled and transformed for the provided `zoom`.\r\n\tgetProjectedBounds: function (zoom) {\r\n\t\tif (this.infinite) { return null; }\r\n\r\n\t\tvar b = this.projection.bounds,\r\n\t\t    s = this.scale(zoom),\r\n\t\t    min = this.transformation.transform(b.min, s),\r\n\t\t    max = this.transformation.transform(b.max, s);\r\n\r\n\t\treturn L.bounds(min, max);\r\n\t},\r\n\r\n\t// @method distance(latlng1: LatLng, latlng2: LatLng): Number\r\n\t// Returns the distance between two geographical coordinates.\r\n\r\n\t// @property code: String\r\n\t// Standard code name of the CRS passed into WMS services (e.g. `'EPSG:3857'`)\r\n\t//\r\n\t// @property wrapLng: Number[]\r\n\t// An array of two numbers defining whether the longitude (horizontal) coordinate\r\n\t// axis wraps around a given range and how. Defaults to `[-180, 180]` in most\r\n\t// geographical CRSs. If `undefined`, the longitude axis does not wrap around.\r\n\t//\r\n\t// @property wrapLat: Number[]\r\n\t// Like `wrapLng`, but for the latitude (vertical) axis.\r\n\r\n\t// wrapLng: [min, max],\r\n\t// wrapLat: [min, max],\r\n\r\n\t// @property infinite: Boolean\r\n\t// If true, the coordinate space will be unbounded (infinite in both axes)\r\n\tinfinite: false,\r\n\r\n\t// @method wrapLatLng(latlng: LatLng): LatLng\r\n\t// Returns a `LatLng` where lat and lng has been wrapped according to the\r\n\t// CRS's `wrapLat` and `wrapLng` properties, if they are outside the CRS's bounds.\r\n\t// Only accepts actual `L.LatLng` instances, not arrays.\r\n\twrapLatLng: function (latlng) {\r\n\t\tvar lng = this.wrapLng ? L.Util.wrapNum(latlng.lng, this.wrapLng, true) : latlng.lng,\r\n\t\t    lat = this.wrapLat ? L.Util.wrapNum(latlng.lat, this.wrapLat, true) : latlng.lat,\r\n\t\t    alt = latlng.alt;\r\n\r\n\t\treturn L.latLng(lat, lng, alt);\r\n\t},\r\n\r\n\t// @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds\r\n\t// Returns a `LatLngBounds` with the same size as the given one, ensuring\r\n\t// that its center is within the CRS's bounds.\r\n\t// Only accepts actual `L.LatLngBounds` instances, not arrays.\r\n\twrapLatLngBounds: function (bounds) {\r\n\t\tvar center = bounds.getCenter(),\r\n\t\t    newCenter = this.wrapLatLng(center),\r\n\t\t    latShift = center.lat - newCenter.lat,\r\n\t\t    lngShift = center.lng - newCenter.lng;\r\n\r\n\t\tif (latShift === 0 && lngShift === 0) {\r\n\t\t\treturn bounds;\r\n\t\t}\r\n\r\n\t\tvar sw = bounds.getSouthWest(),\r\n\t\t    ne = bounds.getNorthEast(),\r\n\t\t    newSw = L.latLng({lat: sw.lat - latShift, lng: sw.lng - lngShift}),\r\n\t\t    newNe = L.latLng({lat: ne.lat - latShift, lng: ne.lng - lngShift});\r\n\r\n\t\treturn new L.LatLngBounds(newSw, newNe);\r\n\t}\r\n};\r\n\n\n\n/*\n * @namespace CRS\n * @crs L.CRS.Simple\n *\n * A simple CRS that maps longitude and latitude into `x` and `y` directly.\n * May be used for maps of flat surfaces (e.g. game maps). Note that the `y`\n * axis should still be inverted (going from bottom to top). `distance()` returns\n * simple euclidean distance.\n */\n\nL.CRS.Simple = L.extend({}, L.CRS, {\n\tprojection: L.Projection.LonLat,\n\ttransformation: new L.Transformation(1, 0, -1, 0),\n\n\tscale: function (zoom) {\n\t\treturn Math.pow(2, zoom);\n\t},\n\n\tzoom: function (scale) {\n\t\treturn Math.log(scale) / Math.LN2;\n\t},\n\n\tdistance: function (latlng1, latlng2) {\n\t\tvar dx = latlng2.lng - latlng1.lng,\n\t\t    dy = latlng2.lat - latlng1.lat;\n\n\t\treturn Math.sqrt(dx * dx + dy * dy);\n\t},\n\n\tinfinite: true\n});\n\n\n\n/*\n * @namespace CRS\n * @crs L.CRS.Earth\n *\n * Serves as the base for CRS that are global such that they cover the earth.\n * Can only be used as the base for other CRS and cannot be used directly,\n * since it does not have a `code`, `projection` or `transformation`. `distance()` returns\n * meters.\n */\n\nL.CRS.Earth = L.extend({}, L.CRS, {\n\twrapLng: [-180, 180],\n\n\t// Mean Earth Radius, as recommended for use by\n\t// the International Union of Geodesy and Geophysics,\n\t// see http://rosettacode.org/wiki/Haversine_formula\n\tR: 6371000,\n\n\t// distance between two geographical points using spherical law of cosines approximation\n\tdistance: function (latlng1, latlng2) {\n\t\tvar rad = Math.PI / 180,\n\t\t    lat1 = latlng1.lat * rad,\n\t\t    lat2 = latlng2.lat * rad,\n\t\t    a = Math.sin(lat1) * Math.sin(lat2) +\n\t\t        Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlng2.lng - latlng1.lng) * rad);\n\n\t\treturn this.R * Math.acos(Math.min(a, 1));\n\t}\n});\n\n\n\n/*\r\n * @namespace CRS\r\n * @crs L.CRS.EPSG3857\r\n *\r\n * The most common CRS for online maps, used by almost all free and commercial\r\n * tile providers. Uses Spherical Mercator projection. Set in by default in\r\n * Map's `crs` option.\r\n */\r\n\r\nL.CRS.EPSG3857 = L.extend({}, L.CRS.Earth, {\r\n\tcode: 'EPSG:3857',\r\n\tprojection: L.Projection.SphericalMercator,\r\n\r\n\ttransformation: (function () {\r\n\t\tvar scale = 0.5 / (Math.PI * L.Projection.SphericalMercator.R);\r\n\t\treturn new L.Transformation(scale, 0.5, -scale, 0.5);\r\n\t}())\r\n});\r\n\r\nL.CRS.EPSG900913 = L.extend({}, L.CRS.EPSG3857, {\r\n\tcode: 'EPSG:900913'\r\n});\r\n\n\n\n/*\r\n * @namespace CRS\r\n * @crs L.CRS.EPSG4326\r\n *\r\n * A common CRS among GIS enthusiasts. Uses simple Equirectangular projection.\r\n *\r\n * Leaflet 1.0.x complies with the [TMS coordinate scheme for EPSG:4326](https://wiki.osgeo.org/wiki/Tile_Map_Service_Specification#global-geodetic),\r\n * which is a breaking change from 0.7.x behaviour.  If you are using a `TileLayer`\r\n * with this CRS, ensure that there are two 256x256 pixel tiles covering the\r\n * whole earth at zoom level zero, and that the tile coordinate origin is (-180,+90),\r\n * or (-180,-90) for `TileLayer`s with [the `tms` option](#tilelayer-tms) set.\r\n */\r\n\r\nL.CRS.EPSG4326 = L.extend({}, L.CRS.Earth, {\r\n\tcode: 'EPSG:4326',\r\n\tprojection: L.Projection.LonLat,\r\n\ttransformation: new L.Transformation(1 / 180, 1, -1 / 180, 0.5)\r\n});\r\n\n\n\n/*\r\n * @class Map\r\n * @aka L.Map\r\n * @inherits Evented\r\n *\r\n * The central class of the API — it is used to create a map on a page and manipulate it.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * // initialize the map on the \"map\" div with a given center and zoom\r\n * var map = L.map('map', {\r\n * \tcenter: [51.505, -0.09],\r\n * \tzoom: 13\r\n * });\r\n * ```\r\n *\r\n */\r\n\r\nL.Map = L.Evented.extend({\r\n\r\n\toptions: {\r\n\t\t// @section Map State Options\r\n\t\t// @option crs: CRS = L.CRS.EPSG3857\r\n\t\t// The [Coordinate Reference System](#crs) to use. Don't change this if you're not\r\n\t\t// sure what it means.\r\n\t\tcrs: L.CRS.EPSG3857,\r\n\r\n\t\t// @option center: LatLng = undefined\r\n\t\t// Initial geographic center of the map\r\n\t\tcenter: undefined,\r\n\r\n\t\t// @option zoom: Number = undefined\r\n\t\t// Initial map zoom level\r\n\t\tzoom: undefined,\r\n\r\n\t\t// @option minZoom: Number = undefined\r\n\t\t// Minimum zoom level of the map. Overrides any `minZoom` option set on map layers.\r\n\t\tminZoom: undefined,\r\n\r\n\t\t// @option maxZoom: Number = undefined\r\n\t\t// Maximum zoom level of the map. Overrides any `maxZoom` option set on map layers.\r\n\t\tmaxZoom: undefined,\r\n\r\n\t\t// @option layers: Layer[] = []\r\n\t\t// Array of layers that will be added to the map initially\r\n\t\tlayers: [],\r\n\r\n\t\t// @option maxBounds: LatLngBounds = null\r\n\t\t// When this option is set, the map restricts the view to the given\r\n\t\t// geographical bounds, bouncing the user back if the user tries to pan\r\n\t\t// outside the view. To set the restriction dynamically, use\r\n\t\t// [`setMaxBounds`](#map-setmaxbounds) method.\r\n\t\tmaxBounds: undefined,\r\n\r\n\t\t// @option renderer: Renderer = *\r\n\t\t// The default method for drawing vector layers on the map. `L.SVG`\r\n\t\t// or `L.Canvas` by default depending on browser support.\r\n\t\trenderer: undefined,\r\n\r\n\r\n\t\t// @section Animation Options\r\n\t\t// @option zoomAnimation: Boolean = true\r\n\t\t// Whether the map zoom animation is enabled. By default it's enabled\r\n\t\t// in all browsers that support CSS3 Transitions except Android.\r\n\t\tzoomAnimation: true,\r\n\r\n\t\t// @option zoomAnimationThreshold: Number = 4\r\n\t\t// Won't animate zoom if the zoom difference exceeds this value.\r\n\t\tzoomAnimationThreshold: 4,\r\n\r\n\t\t// @option fadeAnimation: Boolean = true\r\n\t\t// Whether the tile fade animation is enabled. By default it's enabled\r\n\t\t// in all browsers that support CSS3 Transitions except Android.\r\n\t\tfadeAnimation: true,\r\n\r\n\t\t// @option markerZoomAnimation: Boolean = true\r\n\t\t// Whether markers animate their zoom with the zoom animation, if disabled\r\n\t\t// they will disappear for the length of the animation. By default it's\r\n\t\t// enabled in all browsers that support CSS3 Transitions except Android.\r\n\t\tmarkerZoomAnimation: true,\r\n\r\n\t\t// @option transform3DLimit: Number = 2^23\r\n\t\t// Defines the maximum size of a CSS translation transform. The default\r\n\t\t// value should not be changed unless a web browser positions layers in\r\n\t\t// the wrong place after doing a large `panBy`.\r\n\t\ttransform3DLimit: 8388608, // Precision limit of a 32-bit float\r\n\r\n\t\t// @section Interaction Options\r\n\t\t// @option zoomSnap: Number = 1\r\n\t\t// Forces the map's zoom level to always be a multiple of this, particularly\r\n\t\t// right after a [`fitBounds()`](#map-fitbounds) or a pinch-zoom.\r\n\t\t// By default, the zoom level snaps to the nearest integer; lower values\r\n\t\t// (e.g. `0.5` or `0.1`) allow for greater granularity. A value of `0`\r\n\t\t// means the zoom level will not be snapped after `fitBounds` or a pinch-zoom.\r\n\t\tzoomSnap: 1,\r\n\r\n\t\t// @option zoomDelta: Number = 1\r\n\t\t// Controls how much the map's zoom level will change after a\r\n\t\t// [`zoomIn()`](#map-zoomin), [`zoomOut()`](#map-zoomout), pressing `+`\r\n\t\t// or `-` on the keyboard, or using the [zoom controls](#control-zoom).\r\n\t\t// Values smaller than `1` (e.g. `0.5`) allow for greater granularity.\r\n\t\tzoomDelta: 1,\r\n\r\n\t\t// @option trackResize: Boolean = true\r\n\t\t// Whether the map automatically handles browser window resize to update itself.\r\n\t\ttrackResize: true\r\n\t},\r\n\r\n\tinitialize: function (id, options) { // (HTMLElement or String, Object)\r\n\t\toptions = L.setOptions(this, options);\r\n\r\n\t\tthis._initContainer(id);\r\n\t\tthis._initLayout();\r\n\r\n\t\t// hack for https://github.com/Leaflet/Leaflet/issues/1980\r\n\t\tthis._onResize = L.bind(this._onResize, this);\r\n\r\n\t\tthis._initEvents();\r\n\r\n\t\tif (options.maxBounds) {\r\n\t\t\tthis.setMaxBounds(options.maxBounds);\r\n\t\t}\r\n\r\n\t\tif (options.zoom !== undefined) {\r\n\t\t\tthis._zoom = this._limitZoom(options.zoom);\r\n\t\t}\r\n\r\n\t\tif (options.center && options.zoom !== undefined) {\r\n\t\t\tthis.setView(L.latLng(options.center), options.zoom, {reset: true});\r\n\t\t}\r\n\r\n\t\tthis._handlers = [];\r\n\t\tthis._layers = {};\r\n\t\tthis._zoomBoundLayers = {};\r\n\t\tthis._sizeChanged = true;\r\n\r\n\t\tthis.callInitHooks();\r\n\r\n\t\t// don't animate on browsers without hardware-accelerated transitions or old Android/Opera\r\n\t\tthis._zoomAnimated = L.DomUtil.TRANSITION && L.Browser.any3d && !L.Browser.mobileOpera &&\r\n\t\t\t\tthis.options.zoomAnimation;\r\n\r\n\t\t// zoom transitions run with the same duration for all layers, so if one of transitionend events\r\n\t\t// happens after starting zoom animation (propagating to the map pane), we know that it ended globally\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tthis._createAnimProxy();\r\n\t\t\tL.DomEvent.on(this._proxy, L.DomUtil.TRANSITION_END, this._catchTransitionEnd, this);\r\n\t\t}\r\n\r\n\t\tthis._addLayers(this.options.layers);\r\n\t},\r\n\r\n\r\n\t// @section Methods for modifying map state\r\n\r\n\t// @method setView(center: LatLng, zoom: Number, options?: Zoom/pan options): this\r\n\t// Sets the view of the map (geographical center and zoom) with the given\r\n\t// animation options.\r\n\tsetView: function (center, zoom, options) {\r\n\r\n\t\tzoom = zoom === undefined ? this._zoom : this._limitZoom(zoom);\r\n\t\tcenter = this._limitCenter(L.latLng(center), zoom, this.options.maxBounds);\r\n\t\toptions = options || {};\r\n\r\n\t\tthis._stop();\r\n\r\n\t\tif (this._loaded && !options.reset && options !== true) {\r\n\r\n\t\t\tif (options.animate !== undefined) {\r\n\t\t\t\toptions.zoom = L.extend({animate: options.animate}, options.zoom);\r\n\t\t\t\toptions.pan = L.extend({animate: options.animate, duration: options.duration}, options.pan);\r\n\t\t\t}\r\n\r\n\t\t\t// try animating pan or zoom\r\n\t\t\tvar moved = (this._zoom !== zoom) ?\r\n\t\t\t\tthis._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) :\r\n\t\t\t\tthis._tryAnimatedPan(center, options.pan);\r\n\r\n\t\t\tif (moved) {\r\n\t\t\t\t// prevent resize handler call, the view will refresh after animation anyway\r\n\t\t\t\tclearTimeout(this._sizeTimer);\r\n\t\t\t\treturn this;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// animation didn't start, just reset the map view\r\n\t\tthis._resetView(center, zoom);\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method setZoom(zoom: Number, options: Zoom/pan options): this\r\n\t// Sets the zoom of the map.\r\n\tsetZoom: function (zoom, options) {\r\n\t\tif (!this._loaded) {\r\n\t\t\tthis._zoom = zoom;\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\treturn this.setView(this.getCenter(), zoom, {zoom: options});\r\n\t},\r\n\r\n\t// @method zoomIn(delta?: Number, options?: Zoom options): this\r\n\t// Increases the zoom of the map by `delta` ([`zoomDelta`](#map-zoomdelta) by default).\r\n\tzoomIn: function (delta, options) {\r\n\t\tdelta = delta || (L.Browser.any3d ? this.options.zoomDelta : 1);\r\n\t\treturn this.setZoom(this._zoom + delta, options);\r\n\t},\r\n\r\n\t// @method zoomOut(delta?: Number, options?: Zoom options): this\r\n\t// Decreases the zoom of the map by `delta` ([`zoomDelta`](#map-zoomdelta) by default).\r\n\tzoomOut: function (delta, options) {\r\n\t\tdelta = delta || (L.Browser.any3d ? this.options.zoomDelta : 1);\r\n\t\treturn this.setZoom(this._zoom - delta, options);\r\n\t},\r\n\r\n\t// @method setZoomAround(latlng: LatLng, zoom: Number, options: Zoom options): this\r\n\t// Zooms the map while keeping a specified geographical point on the map\r\n\t// stationary (e.g. used internally for scroll zoom and double-click zoom).\r\n\t// @alternative\r\n\t// @method setZoomAround(offset: Point, zoom: Number, options: Zoom options): this\r\n\t// Zooms the map while keeping a specified pixel on the map (relative to the top-left corner) stationary.\r\n\tsetZoomAround: function (latlng, zoom, options) {\r\n\t\tvar scale = this.getZoomScale(zoom),\r\n\t\t    viewHalf = this.getSize().divideBy(2),\r\n\t\t    containerPoint = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng),\r\n\r\n\t\t    centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale),\r\n\t\t    newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset));\r\n\r\n\t\treturn this.setView(newCenter, zoom, {zoom: options});\r\n\t},\r\n\r\n\t_getBoundsCenterZoom: function (bounds, options) {\r\n\r\n\t\toptions = options || {};\r\n\t\tbounds = bounds.getBounds ? bounds.getBounds() : L.latLngBounds(bounds);\r\n\r\n\t\tvar paddingTL = L.point(options.paddingTopLeft || options.padding || [0, 0]),\r\n\t\t    paddingBR = L.point(options.paddingBottomRight || options.padding || [0, 0]),\r\n\r\n\t\t    zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR));\r\n\r\n\t\tzoom = (typeof options.maxZoom === 'number') ? Math.min(options.maxZoom, zoom) : zoom;\r\n\r\n\t\tvar paddingOffset = paddingBR.subtract(paddingTL).divideBy(2),\r\n\r\n\t\t    swPoint = this.project(bounds.getSouthWest(), zoom),\r\n\t\t    nePoint = this.project(bounds.getNorthEast(), zoom),\r\n\t\t    center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom);\r\n\r\n\t\treturn {\r\n\t\t\tcenter: center,\r\n\t\t\tzoom: zoom\r\n\t\t};\r\n\t},\r\n\r\n\t// @method fitBounds(bounds: LatLngBounds, options?: fitBounds options): this\r\n\t// Sets a map view that contains the given geographical bounds with the\r\n\t// maximum zoom level possible.\r\n\tfitBounds: function (bounds, options) {\r\n\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\tif (!bounds.isValid()) {\r\n\t\t\tthrow new Error('Bounds are not valid.');\r\n\t\t}\r\n\r\n\t\tvar target = this._getBoundsCenterZoom(bounds, options);\r\n\t\treturn this.setView(target.center, target.zoom, options);\r\n\t},\r\n\r\n\t// @method fitWorld(options?: fitBounds options): this\r\n\t// Sets a map view that mostly contains the whole world with the maximum\r\n\t// zoom level possible.\r\n\tfitWorld: function (options) {\r\n\t\treturn this.fitBounds([[-90, -180], [90, 180]], options);\r\n\t},\r\n\r\n\t// @method panTo(latlng: LatLng, options?: Pan options): this\r\n\t// Pans the map to a given center.\r\n\tpanTo: function (center, options) { // (LatLng)\r\n\t\treturn this.setView(center, this._zoom, {pan: options});\r\n\t},\r\n\r\n\t// @method panBy(offset: Point): this\r\n\t// Pans the map by a given number of pixels (animated).\r\n\tpanBy: function (offset, options) {\r\n\t\toffset = L.point(offset).round();\r\n\t\toptions = options || {};\r\n\r\n\t\tif (!offset.x && !offset.y) {\r\n\t\t\treturn this.fire('moveend');\r\n\t\t}\r\n\t\t// If we pan too far, Chrome gets issues with tiles\r\n\t\t// and makes them disappear or appear in the wrong place (slightly offset) #2602\r\n\t\tif (options.animate !== true && !this.getSize().contains(offset)) {\r\n\t\t\tthis._resetView(this.unproject(this.project(this.getCenter()).add(offset)), this.getZoom());\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif (!this._panAnim) {\r\n\t\t\tthis._panAnim = new L.PosAnimation();\r\n\r\n\t\t\tthis._panAnim.on({\r\n\t\t\t\t'step': this._onPanTransitionStep,\r\n\t\t\t\t'end': this._onPanTransitionEnd\r\n\t\t\t}, this);\r\n\t\t}\r\n\r\n\t\t// don't fire movestart if animating inertia\r\n\t\tif (!options.noMoveStart) {\r\n\t\t\tthis.fire('movestart');\r\n\t\t}\r\n\r\n\t\t// animate pan unless animate: false specified\r\n\t\tif (options.animate !== false) {\r\n\t\t\tL.DomUtil.addClass(this._mapPane, 'leaflet-pan-anim');\r\n\r\n\t\t\tvar newPos = this._getMapPanePos().subtract(offset).round();\r\n\t\t\tthis._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity);\r\n\t\t} else {\r\n\t\t\tthis._rawPanBy(offset);\r\n\t\t\tthis.fire('move').fire('moveend');\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method flyTo(latlng: LatLng, zoom?: Number, options?: Zoom/pan options): this\r\n\t// Sets the view of the map (geographical center and zoom) performing a smooth\r\n\t// pan-zoom animation.\r\n\tflyTo: function (targetCenter, targetZoom, options) {\r\n\r\n\t\toptions = options || {};\r\n\t\tif (options.animate === false || !L.Browser.any3d) {\r\n\t\t\treturn this.setView(targetCenter, targetZoom, options);\r\n\t\t}\r\n\r\n\t\tthis._stop();\r\n\r\n\t\tvar from = this.project(this.getCenter()),\r\n\t\t    to = this.project(targetCenter),\r\n\t\t    size = this.getSize(),\r\n\t\t    startZoom = this._zoom;\r\n\r\n\t\ttargetCenter = L.latLng(targetCenter);\r\n\t\ttargetZoom = targetZoom === undefined ? startZoom : targetZoom;\r\n\r\n\t\tvar w0 = Math.max(size.x, size.y),\r\n\t\t    w1 = w0 * this.getZoomScale(startZoom, targetZoom),\r\n\t\t    u1 = (to.distanceTo(from)) || 1,\r\n\t\t    rho = 1.42,\r\n\t\t    rho2 = rho * rho;\r\n\r\n\t\tfunction r(i) {\r\n\t\t\tvar s1 = i ? -1 : 1,\r\n\t\t\t    s2 = i ? w1 : w0,\r\n\t\t\t    t1 = w1 * w1 - w0 * w0 + s1 * rho2 * rho2 * u1 * u1,\r\n\t\t\t    b1 = 2 * s2 * rho2 * u1,\r\n\t\t\t    b = t1 / b1,\r\n\t\t\t    sq = Math.sqrt(b * b + 1) - b;\r\n\r\n\t\t\t    // workaround for floating point precision bug when sq = 0, log = -Infinite,\r\n\t\t\t    // thus triggering an infinite loop in flyTo\r\n\t\t\t    var log = sq < 0.000000001 ? -18 : Math.log(sq);\r\n\r\n\t\t\treturn log;\r\n\t\t}\r\n\r\n\t\tfunction sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; }\r\n\t\tfunction cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; }\r\n\t\tfunction tanh(n) { return sinh(n) / cosh(n); }\r\n\r\n\t\tvar r0 = r(0);\r\n\r\n\t\tfunction w(s) { return w0 * (cosh(r0) / cosh(r0 + rho * s)); }\r\n\t\tfunction u(s) { return w0 * (cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2; }\r\n\r\n\t\tfunction easeOut(t) { return 1 - Math.pow(1 - t, 1.5); }\r\n\r\n\t\tvar start = Date.now(),\r\n\t\t    S = (r(1) - r0) / rho,\r\n\t\t    duration = options.duration ? 1000 * options.duration : 1000 * S * 0.8;\r\n\r\n\t\tfunction frame() {\r\n\t\t\tvar t = (Date.now() - start) / duration,\r\n\t\t\t    s = easeOut(t) * S;\r\n\r\n\t\t\tif (t <= 1) {\r\n\t\t\t\tthis._flyToFrame = L.Util.requestAnimFrame(frame, this);\r\n\r\n\t\t\t\tthis._move(\r\n\t\t\t\t\tthis.unproject(from.add(to.subtract(from).multiplyBy(u(s) / u1)), startZoom),\r\n\t\t\t\t\tthis.getScaleZoom(w0 / w(s), startZoom),\r\n\t\t\t\t\t{flyTo: true});\r\n\r\n\t\t\t} else {\r\n\t\t\t\tthis\r\n\t\t\t\t\t._move(targetCenter, targetZoom)\r\n\t\t\t\t\t._moveEnd(true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._moveStart(true);\r\n\r\n\t\tframe.call(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method flyToBounds(bounds: LatLngBounds, options?: fitBounds options): this\r\n\t// Sets the view of the map with a smooth animation like [`flyTo`](#map-flyto),\r\n\t// but takes a bounds parameter like [`fitBounds`](#map-fitbounds).\r\n\tflyToBounds: function (bounds, options) {\r\n\t\tvar target = this._getBoundsCenterZoom(bounds, options);\r\n\t\treturn this.flyTo(target.center, target.zoom, options);\r\n\t},\r\n\r\n\t// @method setMaxBounds(bounds: Bounds): this\r\n\t// Restricts the map view to the given bounds (see the [maxBounds](#map-maxbounds) option).\r\n\tsetMaxBounds: function (bounds) {\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\tif (!bounds.isValid()) {\r\n\t\t\tthis.options.maxBounds = null;\r\n\t\t\treturn this.off('moveend', this._panInsideMaxBounds);\r\n\t\t} else if (this.options.maxBounds) {\r\n\t\t\tthis.off('moveend', this._panInsideMaxBounds);\r\n\t\t}\r\n\r\n\t\tthis.options.maxBounds = bounds;\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\tthis._panInsideMaxBounds();\r\n\t\t}\r\n\r\n\t\treturn this.on('moveend', this._panInsideMaxBounds);\r\n\t},\r\n\r\n\t// @method setMinZoom(zoom: Number): this\r\n\t// Sets the lower limit for the available zoom levels (see the [minZoom](#map-minzoom) option).\r\n\tsetMinZoom: function (zoom) {\r\n\t\tthis.options.minZoom = zoom;\r\n\r\n\t\tif (this._loaded && this.getZoom() < this.options.minZoom) {\r\n\t\t\treturn this.setZoom(zoom);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method setMaxZoom(zoom: Number): this\r\n\t// Sets the upper limit for the available zoom levels (see the [maxZoom](#map-maxzoom) option).\r\n\tsetMaxZoom: function (zoom) {\r\n\t\tthis.options.maxZoom = zoom;\r\n\r\n\t\tif (this._loaded && (this.getZoom() > this.options.maxZoom)) {\r\n\t\t\treturn this.setZoom(zoom);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method panInsideBounds(bounds: LatLngBounds, options?: Pan options): this\r\n\t// Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any.\r\n\tpanInsideBounds: function (bounds, options) {\r\n\t\tthis._enforcingBounds = true;\r\n\t\tvar center = this.getCenter(),\r\n\t\t    newCenter = this._limitCenter(center, this._zoom, L.latLngBounds(bounds));\r\n\r\n\t\tif (!center.equals(newCenter)) {\r\n\t\t\tthis.panTo(newCenter, options);\r\n\t\t}\r\n\r\n\t\tthis._enforcingBounds = false;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method invalidateSize(options: Zoom/Pan options): this\r\n\t// Checks if the map container size changed and updates the map if so —\r\n\t// call it after you've changed the map size dynamically, also animating\r\n\t// pan by default. If `options.pan` is `false`, panning will not occur.\r\n\t// If `options.debounceMoveend` is `true`, it will delay `moveend` event so\r\n\t// that it doesn't happen often even if the method is called many\r\n\t// times in a row.\r\n\r\n\t// @alternative\r\n\t// @method invalidateSize(animate: Boolean): this\r\n\t// Checks if the map container size changed and updates the map if so —\r\n\t// call it after you've changed the map size dynamically, also animating\r\n\t// pan by default.\r\n\tinvalidateSize: function (options) {\r\n\t\tif (!this._loaded) { return this; }\r\n\r\n\t\toptions = L.extend({\r\n\t\t\tanimate: false,\r\n\t\t\tpan: true\r\n\t\t}, options === true ? {animate: true} : options);\r\n\r\n\t\tvar oldSize = this.getSize();\r\n\t\tthis._sizeChanged = true;\r\n\t\tthis._lastCenter = null;\r\n\r\n\t\tvar newSize = this.getSize(),\r\n\t\t    oldCenter = oldSize.divideBy(2).round(),\r\n\t\t    newCenter = newSize.divideBy(2).round(),\r\n\t\t    offset = oldCenter.subtract(newCenter);\r\n\r\n\t\tif (!offset.x && !offset.y) { return this; }\r\n\r\n\t\tif (options.animate && options.pan) {\r\n\t\t\tthis.panBy(offset);\r\n\r\n\t\t} else {\r\n\t\t\tif (options.pan) {\r\n\t\t\t\tthis._rawPanBy(offset);\r\n\t\t\t}\r\n\r\n\t\t\tthis.fire('move');\r\n\r\n\t\t\tif (options.debounceMoveend) {\r\n\t\t\t\tclearTimeout(this._sizeTimer);\r\n\t\t\t\tthis._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200);\r\n\t\t\t} else {\r\n\t\t\t\tthis.fire('moveend');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// @section Map state change events\r\n\t\t// @event resize: ResizeEvent\r\n\t\t// Fired when the map is resized.\r\n\t\treturn this.fire('resize', {\r\n\t\t\toldSize: oldSize,\r\n\t\t\tnewSize: newSize\r\n\t\t});\r\n\t},\r\n\r\n\t// @section Methods for modifying map state\r\n\t// @method stop(): this\r\n\t// Stops the currently running `panTo` or `flyTo` animation, if any.\r\n\tstop: function () {\r\n\t\tthis.setZoom(this._limitZoom(this._zoom));\r\n\t\tif (!this.options.zoomSnap) {\r\n\t\t\tthis.fire('viewreset');\r\n\t\t}\r\n\t\treturn this._stop();\r\n\t},\r\n\r\n\t// @section Geolocation methods\r\n\t// @method locate(options?: Locate options): this\r\n\t// Tries to locate the user using the Geolocation API, firing a [`locationfound`](#map-locationfound)\r\n\t// event with location data on success or a [`locationerror`](#map-locationerror) event on failure,\r\n\t// and optionally sets the map view to the user's location with respect to\r\n\t// detection accuracy (or to the world view if geolocation failed).\r\n\t// Note that, if your page doesn't use HTTPS, this method will fail in\r\n\t// modern browsers ([Chrome 50 and newer](https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins))\r\n\t// See `Locate options` for more details.\r\n\tlocate: function (options) {\r\n\r\n\t\toptions = this._locateOptions = L.extend({\r\n\t\t\ttimeout: 10000,\r\n\t\t\twatch: false\r\n\t\t\t// setView: false\r\n\t\t\t// maxZoom: <Number>\r\n\t\t\t// maximumAge: 0\r\n\t\t\t// enableHighAccuracy: false\r\n\t\t}, options);\r\n\r\n\t\tif (!('geolocation' in navigator)) {\r\n\t\t\tthis._handleGeolocationError({\r\n\t\t\t\tcode: 0,\r\n\t\t\t\tmessage: 'Geolocation not supported.'\r\n\t\t\t});\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar onResponse = L.bind(this._handleGeolocationResponse, this),\r\n\t\t    onError = L.bind(this._handleGeolocationError, this);\r\n\r\n\t\tif (options.watch) {\r\n\t\t\tthis._locationWatchId =\r\n\t\t\t        navigator.geolocation.watchPosition(onResponse, onError, options);\r\n\t\t} else {\r\n\t\t\tnavigator.geolocation.getCurrentPosition(onResponse, onError, options);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method stopLocate(): this\r\n\t// Stops watching location previously initiated by `map.locate({watch: true})`\r\n\t// and aborts resetting the map view if map.locate was called with\r\n\t// `{setView: true}`.\r\n\tstopLocate: function () {\r\n\t\tif (navigator.geolocation && navigator.geolocation.clearWatch) {\r\n\t\t\tnavigator.geolocation.clearWatch(this._locationWatchId);\r\n\t\t}\r\n\t\tif (this._locateOptions) {\r\n\t\t\tthis._locateOptions.setView = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_handleGeolocationError: function (error) {\r\n\t\tvar c = error.code,\r\n\t\t    message = error.message ||\r\n\t\t            (c === 1 ? 'permission denied' :\r\n\t\t            (c === 2 ? 'position unavailable' : 'timeout'));\r\n\r\n\t\tif (this._locateOptions.setView && !this._loaded) {\r\n\t\t\tthis.fitWorld();\r\n\t\t}\r\n\r\n\t\t// @section Location events\r\n\t\t// @event locationerror: ErrorEvent\r\n\t\t// Fired when geolocation (using the [`locate`](#map-locate) method) failed.\r\n\t\tthis.fire('locationerror', {\r\n\t\t\tcode: c,\r\n\t\t\tmessage: 'Geolocation error: ' + message + '.'\r\n\t\t});\r\n\t},\r\n\r\n\t_handleGeolocationResponse: function (pos) {\r\n\t\tvar lat = pos.coords.latitude,\r\n\t\t    lng = pos.coords.longitude,\r\n\t\t    latlng = new L.LatLng(lat, lng),\r\n\t\t    bounds = latlng.toBounds(pos.coords.accuracy),\r\n\t\t    options = this._locateOptions;\r\n\r\n\t\tif (options.setView) {\r\n\t\t\tvar zoom = this.getBoundsZoom(bounds);\r\n\t\t\tthis.setView(latlng, options.maxZoom ? Math.min(zoom, options.maxZoom) : zoom);\r\n\t\t}\r\n\r\n\t\tvar data = {\r\n\t\t\tlatlng: latlng,\r\n\t\t\tbounds: bounds,\r\n\t\t\ttimestamp: pos.timestamp\r\n\t\t};\r\n\r\n\t\tfor (var i in pos.coords) {\r\n\t\t\tif (typeof pos.coords[i] === 'number') {\r\n\t\t\t\tdata[i] = pos.coords[i];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// @event locationfound: LocationEvent\r\n\t\t// Fired when geolocation (using the [`locate`](#map-locate) method)\r\n\t\t// went successfully.\r\n\t\tthis.fire('locationfound', data);\r\n\t},\r\n\r\n\t// TODO handler.addTo\r\n\t// TODO Appropiate docs section?\r\n\t// @section Other Methods\r\n\t// @method addHandler(name: String, HandlerClass: Function): this\r\n\t// Adds a new `Handler` to the map, given its name and constructor function.\r\n\taddHandler: function (name, HandlerClass) {\r\n\t\tif (!HandlerClass) { return this; }\r\n\r\n\t\tvar handler = this[name] = new HandlerClass(this);\r\n\r\n\t\tthis._handlers.push(handler);\r\n\r\n\t\tif (this.options[name]) {\r\n\t\t\thandler.enable();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method remove(): this\r\n\t// Destroys the map and clears all related event listeners.\r\n\tremove: function () {\r\n\r\n\t\tthis._initEvents(true);\r\n\r\n\t\tif (this._containerId !== this._container._leaflet_id) {\r\n\t\t\tthrow new Error('Map container is being reused by another instance');\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\t// throws error in IE6-8\r\n\t\t\tdelete this._container._leaflet_id;\r\n\t\t\tdelete this._containerId;\r\n\t\t} catch (e) {\r\n\t\t\t/*eslint-disable */\r\n\t\t\tthis._container._leaflet_id = undefined;\r\n\t\t\t/*eslint-enable */\r\n\t\t\tthis._containerId = undefined;\r\n\t\t}\r\n\r\n\t\tL.DomUtil.remove(this._mapPane);\r\n\r\n\t\tif (this._clearControlPos) {\r\n\t\t\tthis._clearControlPos();\r\n\t\t}\r\n\r\n\t\tthis._clearHandlers();\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\t// @section Map state change events\r\n\t\t\t// @event unload: Event\r\n\t\t\t// Fired when the map is destroyed with [remove](#map-remove) method.\r\n\t\t\tthis.fire('unload');\r\n\t\t}\r\n\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tthis._layers[i].remove();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @section Other Methods\r\n\t// @method createPane(name: String, container?: HTMLElement): HTMLElement\r\n\t// Creates a new [map pane](#map-pane) with the given name if it doesn't exist already,\r\n\t// then returns it. The pane is created as a children of `container`, or\r\n\t// as a children of the main map pane if not set.\r\n\tcreatePane: function (name, container) {\r\n\t\tvar className = 'leaflet-pane' + (name ? ' leaflet-' + name.replace('Pane', '') + '-pane' : ''),\r\n\t\t    pane = L.DomUtil.create('div', className, container || this._mapPane);\r\n\r\n\t\tif (name) {\r\n\t\t\tthis._panes[name] = pane;\r\n\t\t}\r\n\t\treturn pane;\r\n\t},\r\n\r\n\t// @section Methods for Getting Map State\r\n\r\n\t// @method getCenter(): LatLng\r\n\t// Returns the geographical center of the map view\r\n\tgetCenter: function () {\r\n\t\tthis._checkIfLoaded();\r\n\r\n\t\tif (this._lastCenter && !this._moved()) {\r\n\t\t\treturn this._lastCenter;\r\n\t\t}\r\n\t\treturn this.layerPointToLatLng(this._getCenterLayerPoint());\r\n\t},\r\n\r\n\t// @method getZoom(): Number\r\n\t// Returns the current zoom level of the map view\r\n\tgetZoom: function () {\r\n\t\treturn this._zoom;\r\n\t},\r\n\r\n\t// @method getBounds(): LatLngBounds\r\n\t// Returns the geographical bounds visible in the current map view\r\n\tgetBounds: function () {\r\n\t\tvar bounds = this.getPixelBounds(),\r\n\t\t    sw = this.unproject(bounds.getBottomLeft()),\r\n\t\t    ne = this.unproject(bounds.getTopRight());\r\n\r\n\t\treturn new L.LatLngBounds(sw, ne);\r\n\t},\r\n\r\n\t// @method getMinZoom(): Number\r\n\t// Returns the minimum zoom level of the map (if set in the `minZoom` option of the map or of any layers), or `0` by default.\r\n\tgetMinZoom: function () {\r\n\t\treturn this.options.minZoom === undefined ? this._layersMinZoom || 0 : this.options.minZoom;\r\n\t},\r\n\r\n\t// @method getMaxZoom(): Number\r\n\t// Returns the maximum zoom level of the map (if set in the `maxZoom` option of the map or of any layers).\r\n\tgetMaxZoom: function () {\r\n\t\treturn this.options.maxZoom === undefined ?\r\n\t\t\t(this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) :\r\n\t\t\tthis.options.maxZoom;\r\n\t},\r\n\r\n\t// @method getBoundsZoom(bounds: LatLngBounds, inside?: Boolean): Number\r\n\t// Returns the maximum zoom level on which the given bounds fit to the map\r\n\t// view in its entirety. If `inside` (optional) is set to `true`, the method\r\n\t// instead returns the minimum zoom level on which the map view fits into\r\n\t// the given bounds in its entirety.\r\n\tgetBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\t\tpadding = L.point(padding || [0, 0]);\r\n\r\n\t\tvar zoom = this.getZoom() || 0,\r\n\t\t    min = this.getMinZoom(),\r\n\t\t    max = this.getMaxZoom(),\r\n\t\t    nw = bounds.getNorthWest(),\r\n\t\t    se = bounds.getSouthEast(),\r\n\t\t    size = this.getSize().subtract(padding),\r\n\t\t    boundsSize = L.bounds(this.project(se, zoom), this.project(nw, zoom)).getSize(),\r\n\t\t    snap = L.Browser.any3d ? this.options.zoomSnap : 1;\r\n\r\n\t\tvar scale = Math.min(size.x / boundsSize.x, size.y / boundsSize.y);\r\n\t\tzoom = this.getScaleZoom(scale, zoom);\r\n\r\n\t\tif (snap) {\r\n\t\t\tzoom = Math.round(zoom / (snap / 100)) * (snap / 100); // don't jump if within 1% of a snap level\r\n\t\t\tzoom = inside ? Math.ceil(zoom / snap) * snap : Math.floor(zoom / snap) * snap;\r\n\t\t}\r\n\r\n\t\treturn Math.max(min, Math.min(max, zoom));\r\n\t},\r\n\r\n\t// @method getSize(): Point\r\n\t// Returns the current size of the map container (in pixels).\r\n\tgetSize: function () {\r\n\t\tif (!this._size || this._sizeChanged) {\r\n\t\t\tthis._size = new L.Point(\r\n\t\t\t\tthis._container.clientWidth || 0,\r\n\t\t\t\tthis._container.clientHeight || 0);\r\n\r\n\t\t\tthis._sizeChanged = false;\r\n\t\t}\r\n\t\treturn this._size.clone();\r\n\t},\r\n\r\n\t// @method getPixelBounds(): Bounds\r\n\t// Returns the bounds of the current map view in projected pixel\r\n\t// coordinates (sometimes useful in layer and overlay implementations).\r\n\tgetPixelBounds: function (center, zoom) {\r\n\t\tvar topLeftPoint = this._getTopLeftPoint(center, zoom);\r\n\t\treturn new L.Bounds(topLeftPoint, topLeftPoint.add(this.getSize()));\r\n\t},\r\n\r\n\t// TODO: Check semantics - isn't the pixel origin the 0,0 coord relative to\r\n\t// the map pane? \"left point of the map layer\" can be confusing, specially\r\n\t// since there can be negative offsets.\r\n\t// @method getPixelOrigin(): Point\r\n\t// Returns the projected pixel coordinates of the top left point of\r\n\t// the map layer (useful in custom layer and overlay implementations).\r\n\tgetPixelOrigin: function () {\r\n\t\tthis._checkIfLoaded();\r\n\t\treturn this._pixelOrigin;\r\n\t},\r\n\r\n\t// @method getPixelWorldBounds(zoom?: Number): Bounds\r\n\t// Returns the world's bounds in pixel coordinates for zoom level `zoom`.\r\n\t// If `zoom` is omitted, the map's current zoom level is used.\r\n\tgetPixelWorldBounds: function (zoom) {\r\n\t\treturn this.options.crs.getProjectedBounds(zoom === undefined ? this.getZoom() : zoom);\r\n\t},\r\n\r\n\t// @section Other Methods\r\n\r\n\t// @method getPane(pane: String|HTMLElement): HTMLElement\r\n\t// Returns a [map pane](#map-pane), given its name or its HTML element (its identity).\r\n\tgetPane: function (pane) {\r\n\t\treturn typeof pane === 'string' ? this._panes[pane] : pane;\r\n\t},\r\n\r\n\t// @method getPanes(): Object\r\n\t// Returns a plain object containing the names of all [panes](#map-pane) as keys and\r\n\t// the panes as values.\r\n\tgetPanes: function () {\r\n\t\treturn this._panes;\r\n\t},\r\n\r\n\t// @method getContainer: HTMLElement\r\n\t// Returns the HTML element that contains the map.\r\n\tgetContainer: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\r\n\t// @section Conversion Methods\r\n\r\n\t// @method getZoomScale(toZoom: Number, fromZoom: Number): Number\r\n\t// Returns the scale factor to be applied to a map transition from zoom level\r\n\t// `fromZoom` to `toZoom`. Used internally to help with zoom animations.\r\n\tgetZoomScale: function (toZoom, fromZoom) {\r\n\t\t// TODO replace with universal implementation after refactoring projections\r\n\t\tvar crs = this.options.crs;\r\n\t\tfromZoom = fromZoom === undefined ? this._zoom : fromZoom;\r\n\t\treturn crs.scale(toZoom) / crs.scale(fromZoom);\r\n\t},\r\n\r\n\t// @method getScaleZoom(scale: Number, fromZoom: Number): Number\r\n\t// Returns the zoom level that the map would end up at, if it is at `fromZoom`\r\n\t// level and everything is scaled by a factor of `scale`. Inverse of\r\n\t// [`getZoomScale`](#map-getZoomScale).\r\n\tgetScaleZoom: function (scale, fromZoom) {\r\n\t\tvar crs = this.options.crs;\r\n\t\tfromZoom = fromZoom === undefined ? this._zoom : fromZoom;\r\n\t\tvar zoom = crs.zoom(scale * crs.scale(fromZoom));\r\n\t\treturn isNaN(zoom) ? Infinity : zoom;\r\n\t},\r\n\r\n\t// @method project(latlng: LatLng, zoom: Number): Point\r\n\t// Projects a geographical coordinate `LatLng` according to the projection\r\n\t// of the map's CRS, then scales it according to `zoom` and the CRS's\r\n\t// `Transformation`. The result is pixel coordinate relative to\r\n\t// the CRS origin.\r\n\tproject: function (latlng, zoom) {\r\n\t\tzoom = zoom === undefined ? this._zoom : zoom;\r\n\t\treturn this.options.crs.latLngToPoint(L.latLng(latlng), zoom);\r\n\t},\r\n\r\n\t// @method unproject(point: Point, zoom: Number): LatLng\r\n\t// Inverse of [`project`](#map-project).\r\n\tunproject: function (point, zoom) {\r\n\t\tzoom = zoom === undefined ? this._zoom : zoom;\r\n\t\treturn this.options.crs.pointToLatLng(L.point(point), zoom);\r\n\t},\r\n\r\n\t// @method layerPointToLatLng(point: Point): LatLng\r\n\t// Given a pixel coordinate relative to the [origin pixel](#map-getpixelorigin),\r\n\t// returns the corresponding geographical coordinate (for the current zoom level).\r\n\tlayerPointToLatLng: function (point) {\r\n\t\tvar projectedPoint = L.point(point).add(this.getPixelOrigin());\r\n\t\treturn this.unproject(projectedPoint);\r\n\t},\r\n\r\n\t// @method latLngToLayerPoint(latlng: LatLng): Point\r\n\t// Given a geographical coordinate, returns the corresponding pixel coordinate\r\n\t// relative to the [origin pixel](#map-getpixelorigin).\r\n\tlatLngToLayerPoint: function (latlng) {\r\n\t\tvar projectedPoint = this.project(L.latLng(latlng))._round();\r\n\t\treturn projectedPoint._subtract(this.getPixelOrigin());\r\n\t},\r\n\r\n\t// @method wrapLatLng(latlng: LatLng): LatLng\r\n\t// Returns a `LatLng` where `lat` and `lng` has been wrapped according to the\r\n\t// map's CRS's `wrapLat` and `wrapLng` properties, if they are outside the\r\n\t// CRS's bounds.\r\n\t// By default this means longitude is wrapped around the dateline so its\r\n\t// value is between -180 and +180 degrees.\r\n\twrapLatLng: function (latlng) {\r\n\t\treturn this.options.crs.wrapLatLng(L.latLng(latlng));\r\n\t},\r\n\r\n\t// @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds\r\n\t// Returns a `LatLngBounds` with the same size as the given one, ensuring that\r\n\t// its center is within the CRS's bounds.\r\n\t// By default this means the center longitude is wrapped around the dateline so its\r\n\t// value is between -180 and +180 degrees, and the majority of the bounds\r\n\t// overlaps the CRS's bounds.\r\n\twrapLatLngBounds: function (latlng) {\r\n\t\treturn this.options.crs.wrapLatLngBounds(L.latLngBounds(latlng));\r\n\t},\r\n\r\n\t// @method distance(latlng1: LatLng, latlng2: LatLng): Number\r\n\t// Returns the distance between two geographical coordinates according to\r\n\t// the map's CRS. By default this measures distance in meters.\r\n\tdistance: function (latlng1, latlng2) {\r\n\t\treturn this.options.crs.distance(L.latLng(latlng1), L.latLng(latlng2));\r\n\t},\r\n\r\n\t// @method containerPointToLayerPoint(point: Point): Point\r\n\t// Given a pixel coordinate relative to the map container, returns the corresponding\r\n\t// pixel coordinate relative to the [origin pixel](#map-getpixelorigin).\r\n\tcontainerPointToLayerPoint: function (point) { // (Point)\r\n\t\treturn L.point(point).subtract(this._getMapPanePos());\r\n\t},\r\n\r\n\t// @method layerPointToContainerPoint(point: Point): Point\r\n\t// Given a pixel coordinate relative to the [origin pixel](#map-getpixelorigin),\r\n\t// returns the corresponding pixel coordinate relative to the map container.\r\n\tlayerPointToContainerPoint: function (point) { // (Point)\r\n\t\treturn L.point(point).add(this._getMapPanePos());\r\n\t},\r\n\r\n\t// @method containerPointToLatLng(point: Point): LatLng\r\n\t// Given a pixel coordinate relative to the map container, returns\r\n\t// the corresponding geographical coordinate (for the current zoom level).\r\n\tcontainerPointToLatLng: function (point) {\r\n\t\tvar layerPoint = this.containerPointToLayerPoint(L.point(point));\r\n\t\treturn this.layerPointToLatLng(layerPoint);\r\n\t},\r\n\r\n\t// @method latLngToContainerPoint(latlng: LatLng): Point\r\n\t// Given a geographical coordinate, returns the corresponding pixel coordinate\r\n\t// relative to the map container.\r\n\tlatLngToContainerPoint: function (latlng) {\r\n\t\treturn this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng)));\r\n\t},\r\n\r\n\t// @method mouseEventToContainerPoint(ev: MouseEvent): Point\r\n\t// Given a MouseEvent object, returns the pixel coordinate relative to the\r\n\t// map container where the event took place.\r\n\tmouseEventToContainerPoint: function (e) {\r\n\t\treturn L.DomEvent.getMousePosition(e, this._container);\r\n\t},\r\n\r\n\t// @method mouseEventToLayerPoint(ev: MouseEvent): Point\r\n\t// Given a MouseEvent object, returns the pixel coordinate relative to\r\n\t// the [origin pixel](#map-getpixelorigin) where the event took place.\r\n\tmouseEventToLayerPoint: function (e) {\r\n\t\treturn this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e));\r\n\t},\r\n\r\n\t// @method mouseEventToLatLng(ev: MouseEvent): LatLng\r\n\t// Given a MouseEvent object, returns geographical coordinate where the\r\n\t// event took place.\r\n\tmouseEventToLatLng: function (e) { // (MouseEvent)\r\n\t\treturn this.layerPointToLatLng(this.mouseEventToLayerPoint(e));\r\n\t},\r\n\r\n\r\n\t// map initialization methods\r\n\r\n\t_initContainer: function (id) {\r\n\t\tvar container = this._container = L.DomUtil.get(id);\r\n\r\n\t\tif (!container) {\r\n\t\t\tthrow new Error('Map container not found.');\r\n\t\t} else if (container._leaflet_id) {\r\n\t\t\tthrow new Error('Map container is already initialized.');\r\n\t\t}\r\n\r\n\t\tL.DomEvent.addListener(container, 'scroll', this._onScroll, this);\r\n\t\tthis._containerId = L.Util.stamp(container);\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar container = this._container;\r\n\r\n\t\tthis._fadeAnimated = this.options.fadeAnimation && L.Browser.any3d;\r\n\r\n\t\tL.DomUtil.addClass(container, 'leaflet-container' +\r\n\t\t\t(L.Browser.touch ? ' leaflet-touch' : '') +\r\n\t\t\t(L.Browser.retina ? ' leaflet-retina' : '') +\r\n\t\t\t(L.Browser.ielt9 ? ' leaflet-oldie' : '') +\r\n\t\t\t(L.Browser.safari ? ' leaflet-safari' : '') +\r\n\t\t\t(this._fadeAnimated ? ' leaflet-fade-anim' : ''));\r\n\r\n\t\tvar position = L.DomUtil.getStyle(container, 'position');\r\n\r\n\t\tif (position !== 'absolute' && position !== 'relative' && position !== 'fixed') {\r\n\t\t\tcontainer.style.position = 'relative';\r\n\t\t}\r\n\r\n\t\tthis._initPanes();\r\n\r\n\t\tif (this._initControlPos) {\r\n\t\t\tthis._initControlPos();\r\n\t\t}\r\n\t},\r\n\r\n\t_initPanes: function () {\r\n\t\tvar panes = this._panes = {};\r\n\t\tthis._paneRenderers = {};\r\n\r\n\t\t// @section\r\n\t\t//\r\n\t\t// Panes are DOM elements used to control the ordering of layers on the map. You\r\n\t\t// can access panes with [`map.getPane`](#map-getpane) or\r\n\t\t// [`map.getPanes`](#map-getpanes) methods. New panes can be created with the\r\n\t\t// [`map.createPane`](#map-createpane) method.\r\n\t\t//\r\n\t\t// Every map has the following default panes that differ only in zIndex.\r\n\t\t//\r\n\t\t// @pane mapPane: HTMLElement = 'auto'\r\n\t\t// Pane that contains all other map panes\r\n\r\n\t\tthis._mapPane = this.createPane('mapPane', this._container);\r\n\t\tL.DomUtil.setPosition(this._mapPane, new L.Point(0, 0));\r\n\r\n\t\t// @pane tilePane: HTMLElement = 200\r\n\t\t// Pane for `GridLayer`s and `TileLayer`s\r\n\t\tthis.createPane('tilePane');\r\n\t\t// @pane overlayPane: HTMLElement = 400\r\n\t\t// Pane for vector overlays (`Path`s), like `Polyline`s and `Polygon`s\r\n\t\tthis.createPane('shadowPane');\r\n\t\t// @pane shadowPane: HTMLElement = 500\r\n\t\t// Pane for overlay shadows (e.g. `Marker` shadows)\r\n\t\tthis.createPane('overlayPane');\r\n\t\t// @pane markerPane: HTMLElement = 600\r\n\t\t// Pane for `Icon`s of `Marker`s\r\n\t\tthis.createPane('markerPane');\r\n\t\t// @pane tooltipPane: HTMLElement = 650\r\n\t\t// Pane for tooltip.\r\n\t\tthis.createPane('tooltipPane');\r\n\t\t// @pane popupPane: HTMLElement = 700\r\n\t\t// Pane for `Popup`s.\r\n\t\tthis.createPane('popupPane');\r\n\r\n\t\tif (!this.options.markerZoomAnimation) {\r\n\t\t\tL.DomUtil.addClass(panes.markerPane, 'leaflet-zoom-hide');\r\n\t\t\tL.DomUtil.addClass(panes.shadowPane, 'leaflet-zoom-hide');\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t// private methods that modify map state\r\n\r\n\t// @section Map state change events\r\n\t_resetView: function (center, zoom) {\r\n\t\tL.DomUtil.setPosition(this._mapPane, new L.Point(0, 0));\r\n\r\n\t\tvar loading = !this._loaded;\r\n\t\tthis._loaded = true;\r\n\t\tzoom = this._limitZoom(zoom);\r\n\r\n\t\tthis.fire('viewprereset');\r\n\r\n\t\tvar zoomChanged = this._zoom !== zoom;\r\n\t\tthis\r\n\t\t\t._moveStart(zoomChanged)\r\n\t\t\t._move(center, zoom)\r\n\t\t\t._moveEnd(zoomChanged);\r\n\r\n\t\t// @event viewreset: Event\r\n\t\t// Fired when the map needs to redraw its content (this usually happens\r\n\t\t// on map zoom or load). Very useful for creating custom overlays.\r\n\t\tthis.fire('viewreset');\r\n\r\n\t\t// @event load: Event\r\n\t\t// Fired when the map is initialized (when its center and zoom are set\r\n\t\t// for the first time).\r\n\t\tif (loading) {\r\n\t\t\tthis.fire('load');\r\n\t\t}\r\n\t},\r\n\r\n\t_moveStart: function (zoomChanged) {\r\n\t\t// @event zoomstart: Event\r\n\t\t// Fired when the map zoom is about to change (e.g. before zoom animation).\r\n\t\t// @event movestart: Event\r\n\t\t// Fired when the view of the map starts changing (e.g. user starts dragging the map).\r\n\t\tif (zoomChanged) {\r\n\t\t\tthis.fire('zoomstart');\r\n\t\t}\r\n\t\treturn this.fire('movestart');\r\n\t},\r\n\r\n\t_move: function (center, zoom, data) {\r\n\t\tif (zoom === undefined) {\r\n\t\t\tzoom = this._zoom;\r\n\t\t}\r\n\t\tvar zoomChanged = this._zoom !== zoom;\r\n\r\n\t\tthis._zoom = zoom;\r\n\t\tthis._lastCenter = center;\r\n\t\tthis._pixelOrigin = this._getNewPixelOrigin(center);\r\n\r\n\t\t// @event zoom: Event\r\n\t\t// Fired repeatedly during any change in zoom level, including zoom\r\n\t\t// and fly animations.\r\n\t\tif (zoomChanged || (data && data.pinch)) {\t// Always fire 'zoom' if pinching because #3530\r\n\t\t\tthis.fire('zoom', data);\r\n\t\t}\r\n\r\n\t\t// @event move: Event\r\n\t\t// Fired repeatedly during any movement of the map, including pan and\r\n\t\t// fly animations.\r\n\t\treturn this.fire('move', data);\r\n\t},\r\n\r\n\t_moveEnd: function (zoomChanged) {\r\n\t\t// @event zoomend: Event\r\n\t\t// Fired when the map has changed, after any animations.\r\n\t\tif (zoomChanged) {\r\n\t\t\tthis.fire('zoomend');\r\n\t\t}\r\n\r\n\t\t// @event moveend: Event\r\n\t\t// Fired when the center of the map stops changing (e.g. user stopped\r\n\t\t// dragging the map).\r\n\t\treturn this.fire('moveend');\r\n\t},\r\n\r\n\t_stop: function () {\r\n\t\tL.Util.cancelAnimFrame(this._flyToFrame);\r\n\t\tif (this._panAnim) {\r\n\t\t\tthis._panAnim.stop();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_rawPanBy: function (offset) {\r\n\t\tL.DomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset));\r\n\t},\r\n\r\n\t_getZoomSpan: function () {\r\n\t\treturn this.getMaxZoom() - this.getMinZoom();\r\n\t},\r\n\r\n\t_panInsideMaxBounds: function () {\r\n\t\tif (!this._enforcingBounds) {\r\n\t\t\tthis.panInsideBounds(this.options.maxBounds);\r\n\t\t}\r\n\t},\r\n\r\n\t_checkIfLoaded: function () {\r\n\t\tif (!this._loaded) {\r\n\t\t\tthrow new Error('Set map center and zoom first.');\r\n\t\t}\r\n\t},\r\n\r\n\t// DOM event handling\r\n\r\n\t// @section Interaction events\r\n\t_initEvents: function (remove) {\r\n\t\tif (!L.DomEvent) { return; }\r\n\r\n\t\tthis._targets = {};\r\n\t\tthis._targets[L.stamp(this._container)] = this;\r\n\r\n\t\tvar onOff = remove ? 'off' : 'on';\r\n\r\n\t\t// @event click: MouseEvent\r\n\t\t// Fired when the user clicks (or taps) the map.\r\n\t\t// @event dblclick: MouseEvent\r\n\t\t// Fired when the user double-clicks (or double-taps) the map.\r\n\t\t// @event mousedown: MouseEvent\r\n\t\t// Fired when the user pushes the mouse button on the map.\r\n\t\t// @event mouseup: MouseEvent\r\n\t\t// Fired when the user releases the mouse button on the map.\r\n\t\t// @event mouseover: MouseEvent\r\n\t\t// Fired when the mouse enters the map.\r\n\t\t// @event mouseout: MouseEvent\r\n\t\t// Fired when the mouse leaves the map.\r\n\t\t// @event mousemove: MouseEvent\r\n\t\t// Fired while the mouse moves over the map.\r\n\t\t// @event contextmenu: MouseEvent\r\n\t\t// Fired when the user pushes the right mouse button on the map, prevents\r\n\t\t// default browser context menu from showing if there are listeners on\r\n\t\t// this event. Also fired on mobile when the user holds a single touch\r\n\t\t// for a second (also called long press).\r\n\t\t// @event keypress: KeyboardEvent\r\n\t\t// Fired when the user presses a key from the keyboard while the map is focused.\r\n\t\tL.DomEvent[onOff](this._container, 'click dblclick mousedown mouseup ' +\r\n\t\t\t'mouseover mouseout mousemove contextmenu keypress', this._handleDOMEvent, this);\r\n\r\n\t\tif (this.options.trackResize) {\r\n\t\t\tL.DomEvent[onOff](window, 'resize', this._onResize, this);\r\n\t\t}\r\n\r\n\t\tif (L.Browser.any3d && this.options.transform3DLimit) {\r\n\t\t\tthis[onOff]('moveend', this._onMoveEnd);\r\n\t\t}\r\n\t},\r\n\r\n\t_onResize: function () {\r\n\t\tL.Util.cancelAnimFrame(this._resizeRequest);\r\n\t\tthis._resizeRequest = L.Util.requestAnimFrame(\r\n\t\t        function () { this.invalidateSize({debounceMoveend: true}); }, this);\r\n\t},\r\n\r\n\t_onScroll: function () {\r\n\t\tthis._container.scrollTop  = 0;\r\n\t\tthis._container.scrollLeft = 0;\r\n\t},\r\n\r\n\t_onMoveEnd: function () {\r\n\t\tvar pos = this._getMapPanePos();\r\n\t\tif (Math.max(Math.abs(pos.x), Math.abs(pos.y)) >= this.options.transform3DLimit) {\r\n\t\t\t// https://bugzilla.mozilla.org/show_bug.cgi?id=1203873 but Webkit also have\r\n\t\t\t// a pixel offset on very high values, see: http://jsfiddle.net/dg6r5hhb/\r\n\t\t\tthis._resetView(this.getCenter(), this.getZoom());\r\n\t\t}\r\n\t},\r\n\r\n\t_findEventTargets: function (e, type) {\r\n\t\tvar targets = [],\r\n\t\t    target,\r\n\t\t    isHover = type === 'mouseout' || type === 'mouseover',\r\n\t\t    src = e.target || e.srcElement,\r\n\t\t    dragging = false;\r\n\r\n\t\twhile (src) {\r\n\t\t\ttarget = this._targets[L.stamp(src)];\r\n\t\t\tif (target && (type === 'click' || type === 'preclick') && !e._simulated && this._draggableMoved(target)) {\r\n\t\t\t\t// Prevent firing click after you just dragged an object.\r\n\t\t\t\tdragging = true;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif (target && target.listens(type, true)) {\r\n\t\t\t\tif (isHover && !L.DomEvent._isExternalTarget(src, e)) { break; }\r\n\t\t\t\ttargets.push(target);\r\n\t\t\t\tif (isHover) { break; }\r\n\t\t\t}\r\n\t\t\tif (src === this._container) { break; }\r\n\t\t\tsrc = src.parentNode;\r\n\t\t}\r\n\t\tif (!targets.length && !dragging && !isHover && L.DomEvent._isExternalTarget(src, e)) {\r\n\t\t\ttargets = [this];\r\n\t\t}\r\n\t\treturn targets;\r\n\t},\r\n\r\n\t_handleDOMEvent: function (e) {\r\n\t\tif (!this._loaded || L.DomEvent._skipped(e)) { return; }\r\n\r\n\t\tvar type = e.type === 'keypress' && e.keyCode === 13 ? 'click' : e.type;\r\n\r\n\t\tif (type === 'mousedown') {\r\n\t\t\t// prevents outline when clicking on keyboard-focusable element\r\n\t\t\tL.DomUtil.preventOutline(e.target || e.srcElement);\r\n\t\t}\r\n\r\n\t\tthis._fireDOMEvent(e, type);\r\n\t},\r\n\r\n\t_fireDOMEvent: function (e, type, targets) {\r\n\r\n\t\tif (e.type === 'click') {\r\n\t\t\t// Fire a synthetic 'preclick' event which propagates up (mainly for closing popups).\r\n\t\t\t// @event preclick: MouseEvent\r\n\t\t\t// Fired before mouse click on the map (sometimes useful when you\r\n\t\t\t// want something to happen on click before any existing click\r\n\t\t\t// handlers start running).\r\n\t\t\tvar synth = L.Util.extend({}, e);\r\n\t\t\tsynth.type = 'preclick';\r\n\t\t\tthis._fireDOMEvent(synth, synth.type, targets);\r\n\t\t}\r\n\r\n\t\tif (e._stopped) { return; }\r\n\r\n\t\t// Find the layer the event is propagating from and its parents.\r\n\t\ttargets = (targets || []).concat(this._findEventTargets(e, type));\r\n\r\n\t\tif (!targets.length) { return; }\r\n\r\n\t\tvar target = targets[0];\r\n\t\tif (type === 'contextmenu' && target.listens(type, true)) {\r\n\t\t\tL.DomEvent.preventDefault(e);\r\n\t\t}\r\n\r\n\t\tvar data = {\r\n\t\t\toriginalEvent: e\r\n\t\t};\r\n\r\n\t\tif (e.type !== 'keypress') {\r\n\t\t\tvar isMarker = target instanceof L.Marker;\r\n\t\t\tdata.containerPoint = isMarker ?\r\n\t\t\t\t\tthis.latLngToContainerPoint(target.getLatLng()) : this.mouseEventToContainerPoint(e);\r\n\t\t\tdata.layerPoint = this.containerPointToLayerPoint(data.containerPoint);\r\n\t\t\tdata.latlng = isMarker ? target.getLatLng() : this.layerPointToLatLng(data.layerPoint);\r\n\t\t}\r\n\r\n\t\tfor (var i = 0; i < targets.length; i++) {\r\n\t\t\ttargets[i].fire(type, data, true);\r\n\t\t\tif (data.originalEvent._stopped ||\r\n\t\t\t\t(targets[i].options.nonBubblingEvents && L.Util.indexOf(targets[i].options.nonBubblingEvents, type) !== -1)) { return; }\r\n\t\t}\r\n\t},\r\n\r\n\t_draggableMoved: function (obj) {\r\n\t\tobj = obj.dragging && obj.dragging.enabled() ? obj : this;\r\n\t\treturn (obj.dragging && obj.dragging.moved()) || (this.boxZoom && this.boxZoom.moved());\r\n\t},\r\n\r\n\t_clearHandlers: function () {\r\n\t\tfor (var i = 0, len = this._handlers.length; i < len; i++) {\r\n\t\t\tthis._handlers[i].disable();\r\n\t\t}\r\n\t},\r\n\r\n\t// @section Other Methods\r\n\r\n\t// @method whenReady(fn: Function, context?: Object): this\r\n\t// Runs the given function `fn` when the map gets initialized with\r\n\t// a view (center and zoom) and at least one layer, or immediately\r\n\t// if it's already initialized, optionally passing a function context.\r\n\twhenReady: function (callback, context) {\r\n\t\tif (this._loaded) {\r\n\t\t\tcallback.call(context || this, {target: this});\r\n\t\t} else {\r\n\t\t\tthis.on('load', callback, context);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\r\n\t// private methods for getting map state\r\n\r\n\t_getMapPanePos: function () {\r\n\t\treturn L.DomUtil.getPosition(this._mapPane) || new L.Point(0, 0);\r\n\t},\r\n\r\n\t_moved: function () {\r\n\t\tvar pos = this._getMapPanePos();\r\n\t\treturn pos && !pos.equals([0, 0]);\r\n\t},\r\n\r\n\t_getTopLeftPoint: function (center, zoom) {\r\n\t\tvar pixelOrigin = center && zoom !== undefined ?\r\n\t\t\tthis._getNewPixelOrigin(center, zoom) :\r\n\t\t\tthis.getPixelOrigin();\r\n\t\treturn pixelOrigin.subtract(this._getMapPanePos());\r\n\t},\r\n\r\n\t_getNewPixelOrigin: function (center, zoom) {\r\n\t\tvar viewHalf = this.getSize()._divideBy(2);\r\n\t\treturn this.project(center, zoom)._subtract(viewHalf)._add(this._getMapPanePos())._round();\r\n\t},\r\n\r\n\t_latLngToNewLayerPoint: function (latlng, zoom, center) {\r\n\t\tvar topLeft = this._getNewPixelOrigin(center, zoom);\r\n\t\treturn this.project(latlng, zoom)._subtract(topLeft);\r\n\t},\r\n\r\n\t_latLngBoundsToNewLayerBounds: function (latLngBounds, zoom, center) {\r\n\t\tvar topLeft = this._getNewPixelOrigin(center, zoom);\r\n\t\treturn L.bounds([\r\n\t\t\tthis.project(latLngBounds.getSouthWest(), zoom)._subtract(topLeft),\r\n\t\t\tthis.project(latLngBounds.getNorthWest(), zoom)._subtract(topLeft),\r\n\t\t\tthis.project(latLngBounds.getSouthEast(), zoom)._subtract(topLeft),\r\n\t\t\tthis.project(latLngBounds.getNorthEast(), zoom)._subtract(topLeft)\r\n\t\t]);\r\n\t},\r\n\r\n\t// layer point of the current center\r\n\t_getCenterLayerPoint: function () {\r\n\t\treturn this.containerPointToLayerPoint(this.getSize()._divideBy(2));\r\n\t},\r\n\r\n\t// offset of the specified place to the current center in pixels\r\n\t_getCenterOffset: function (latlng) {\r\n\t\treturn this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint());\r\n\t},\r\n\r\n\t// adjust center for view to get inside bounds\r\n\t_limitCenter: function (center, zoom, bounds) {\r\n\r\n\t\tif (!bounds) { return center; }\r\n\r\n\t\tvar centerPoint = this.project(center, zoom),\r\n\t\t    viewHalf = this.getSize().divideBy(2),\r\n\t\t    viewBounds = new L.Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)),\r\n\t\t    offset = this._getBoundsOffset(viewBounds, bounds, zoom);\r\n\r\n\t\t// If offset is less than a pixel, ignore.\r\n\t\t// This prevents unstable projections from getting into\r\n\t\t// an infinite loop of tiny offsets.\r\n\t\tif (offset.round().equals([0, 0])) {\r\n\t\t\treturn center;\r\n\t\t}\r\n\r\n\t\treturn this.unproject(centerPoint.add(offset), zoom);\r\n\t},\r\n\r\n\t// adjust offset for view to get inside bounds\r\n\t_limitOffset: function (offset, bounds) {\r\n\t\tif (!bounds) { return offset; }\r\n\r\n\t\tvar viewBounds = this.getPixelBounds(),\r\n\t\t    newBounds = new L.Bounds(viewBounds.min.add(offset), viewBounds.max.add(offset));\r\n\r\n\t\treturn offset.add(this._getBoundsOffset(newBounds, bounds));\r\n\t},\r\n\r\n\t// returns offset needed for pxBounds to get inside maxBounds at a specified zoom\r\n\t_getBoundsOffset: function (pxBounds, maxBounds, zoom) {\r\n\t\tvar projectedMaxBounds = L.bounds(\r\n\t\t        this.project(maxBounds.getNorthEast(), zoom),\r\n\t\t        this.project(maxBounds.getSouthWest(), zoom)\r\n\t\t    ),\r\n\t\t    minOffset = projectedMaxBounds.min.subtract(pxBounds.min),\r\n\t\t    maxOffset = projectedMaxBounds.max.subtract(pxBounds.max),\r\n\r\n\t\t    dx = this._rebound(minOffset.x, -maxOffset.x),\r\n\t\t    dy = this._rebound(minOffset.y, -maxOffset.y);\r\n\r\n\t\treturn new L.Point(dx, dy);\r\n\t},\r\n\r\n\t_rebound: function (left, right) {\r\n\t\treturn left + right > 0 ?\r\n\t\t\tMath.round(left - right) / 2 :\r\n\t\t\tMath.max(0, Math.ceil(left)) - Math.max(0, Math.floor(right));\r\n\t},\r\n\r\n\t_limitZoom: function (zoom) {\r\n\t\tvar min = this.getMinZoom(),\r\n\t\t    max = this.getMaxZoom(),\r\n\t\t    snap = L.Browser.any3d ? this.options.zoomSnap : 1;\r\n\t\tif (snap) {\r\n\t\t\tzoom = Math.round(zoom / snap) * snap;\r\n\t\t}\r\n\t\treturn Math.max(min, Math.min(max, zoom));\r\n\t},\r\n\r\n\t_onPanTransitionStep: function () {\r\n\t\tthis.fire('move');\r\n\t},\r\n\r\n\t_onPanTransitionEnd: function () {\r\n\t\tL.DomUtil.removeClass(this._mapPane, 'leaflet-pan-anim');\r\n\t\tthis.fire('moveend');\r\n\t},\r\n\r\n\t_tryAnimatedPan: function (center, options) {\r\n\t\t// difference between the new and current centers in pixels\r\n\t\tvar offset = this._getCenterOffset(center)._floor();\r\n\r\n\t\t// don't animate too far unless animate: true specified in options\r\n\t\tif ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; }\r\n\r\n\t\tthis.panBy(offset, options);\r\n\r\n\t\treturn true;\r\n\t},\r\n\r\n\t_createAnimProxy: function () {\r\n\r\n\t\tvar proxy = this._proxy = L.DomUtil.create('div', 'leaflet-proxy leaflet-zoom-animated');\r\n\t\tthis._panes.mapPane.appendChild(proxy);\r\n\r\n\t\tthis.on('zoomanim', function (e) {\r\n\t\t\tvar prop = L.DomUtil.TRANSFORM,\r\n\t\t\t    transform = proxy.style[prop];\r\n\r\n\t\t\tL.DomUtil.setTransform(proxy, this.project(e.center, e.zoom), this.getZoomScale(e.zoom, 1));\r\n\r\n\t\t\t// workaround for case when transform is the same and so transitionend event is not fired\r\n\t\t\tif (transform === proxy.style[prop] && this._animatingZoom) {\r\n\t\t\t\tthis._onZoomTransitionEnd();\r\n\t\t\t}\r\n\t\t}, this);\r\n\r\n\t\tthis.on('load moveend', function () {\r\n\t\t\tvar c = this.getCenter(),\r\n\t\t\t    z = this.getZoom();\r\n\t\t\tL.DomUtil.setTransform(proxy, this.project(c, z), this.getZoomScale(z, 1));\r\n\t\t}, this);\r\n\t},\r\n\r\n\t_catchTransitionEnd: function (e) {\r\n\t\tif (this._animatingZoom && e.propertyName.indexOf('transform') >= 0) {\r\n\t\t\tthis._onZoomTransitionEnd();\r\n\t\t}\r\n\t},\r\n\r\n\t_nothingToAnimate: function () {\r\n\t\treturn !this._container.getElementsByClassName('leaflet-zoom-animated').length;\r\n\t},\r\n\r\n\t_tryAnimatedZoom: function (center, zoom, options) {\r\n\r\n\t\tif (this._animatingZoom) { return true; }\r\n\r\n\t\toptions = options || {};\r\n\r\n\t\t// don't animate if disabled, not supported or zoom difference is too large\r\n\t\tif (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() ||\r\n\t\t        Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; }\r\n\r\n\t\t// offset is the pixel coords of the zoom origin relative to the current center\r\n\t\tvar scale = this.getZoomScale(zoom),\r\n\t\t    offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale);\r\n\r\n\t\t// don't animate if the zoom origin isn't within one screen from the current center, unless forced\r\n\t\tif (options.animate !== true && !this.getSize().contains(offset)) { return false; }\r\n\r\n\t\tL.Util.requestAnimFrame(function () {\r\n\t\t\tthis\r\n\t\t\t    ._moveStart(true)\r\n\t\t\t    ._animateZoom(center, zoom, true);\r\n\t\t}, this);\r\n\r\n\t\treturn true;\r\n\t},\r\n\r\n\t_animateZoom: function (center, zoom, startAnim, noUpdate) {\r\n\t\tif (startAnim) {\r\n\t\t\tthis._animatingZoom = true;\r\n\r\n\t\t\t// remember what center/zoom to set after animation\r\n\t\t\tthis._animateToCenter = center;\r\n\t\t\tthis._animateToZoom = zoom;\r\n\r\n\t\t\tL.DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim');\r\n\t\t}\r\n\r\n\t\t// @event zoomanim: ZoomAnimEvent\r\n\t\t// Fired on every frame of a zoom animation\r\n\t\tthis.fire('zoomanim', {\r\n\t\t\tcenter: center,\r\n\t\t\tzoom: zoom,\r\n\t\t\tnoUpdate: noUpdate\r\n\t\t});\r\n\r\n\t\t// Work around webkit not firing 'transitionend', see https://github.com/Leaflet/Leaflet/issues/3689, 2693\r\n\t\tsetTimeout(L.bind(this._onZoomTransitionEnd, this), 250);\r\n\t},\r\n\r\n\t_onZoomTransitionEnd: function () {\r\n\t\tif (!this._animatingZoom) { return; }\r\n\r\n\t\tL.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim');\r\n\r\n\t\tthis._animatingZoom = false;\r\n\r\n\t\tthis._move(this._animateToCenter, this._animateToZoom);\r\n\r\n\t\t// This anim frame should prevent an obscure iOS webkit tile loading race condition.\r\n\t\tL.Util.requestAnimFrame(function () {\r\n\t\t\tthis._moveEnd(true);\r\n\t\t}, this);\r\n\t}\r\n});\r\n\r\n// @section\r\n\r\n// @factory L.map(id: String, options?: Map options)\r\n// Instantiates a map object given the DOM ID of a `<div>` element\r\n// and optionally an object literal with `Map options`.\r\n//\r\n// @alternative\r\n// @factory L.map(el: HTMLElement, options?: Map options)\r\n// Instantiates a map object given an instance of a `<div>` HTML element\r\n// and optionally an object literal with `Map options`.\r\nL.map = function (id, options) {\r\n\treturn new L.Map(id, options);\r\n};\r\n\n\n\n\n/*\n * @class Layer\n * @inherits Evented\n * @aka L.Layer\n * @aka ILayer\n *\n * A set of methods from the Layer base class that all Leaflet layers use.\n * Inherits all methods, options and events from `L.Evented`.\n *\n * @example\n *\n * ```js\n * var layer = L.Marker(latlng).addTo(map);\n * layer.addTo(map);\n * layer.remove();\n * ```\n *\n * @event add: Event\n * Fired after the layer is added to a map\n *\n * @event remove: Event\n * Fired after the layer is removed from a map\n */\n\n\nL.Layer = L.Evented.extend({\n\n\t// Classes extending `L.Layer` will inherit the following options:\n\toptions: {\n\t\t// @option pane: String = 'overlayPane'\n\t\t// By default the layer will be added to the map's [overlay pane](#map-overlaypane). Overriding this option will cause the layer to be placed on another pane by default.\n\t\tpane: 'overlayPane',\n\t\tnonBubblingEvents: [],  // Array of events that should not be bubbled to DOM parents (like the map),\n\n\t\t// @option attribution: String = null\n\t\t// String to be shown in the attribution control, describes the layer data, e.g. \"© Mapbox\".\n\t\tattribution: null\n\t},\n\n\t/* @section\n\t * Classes extending `L.Layer` will inherit the following methods:\n\t *\n\t * @method addTo(map: Map): this\n\t * Adds the layer to the given map\n\t */\n\taddTo: function (map) {\n\t\tmap.addLayer(this);\n\t\treturn this;\n\t},\n\n\t// @method remove: this\n\t// Removes the layer from the map it is currently active on.\n\tremove: function () {\n\t\treturn this.removeFrom(this._map || this._mapToAdd);\n\t},\n\n\t// @method removeFrom(map: Map): this\n\t// Removes the layer from the given map\n\tremoveFrom: function (obj) {\n\t\tif (obj) {\n\t\t\tobj.removeLayer(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method getPane(name? : String): HTMLElement\n\t// Returns the `HTMLElement` representing the named pane on the map. If `name` is omitted, returns the pane for this layer.\n\tgetPane: function (name) {\n\t\treturn this._map.getPane(name ? (this.options[name] || name) : this.options.pane);\n\t},\n\n\taddInteractiveTarget: function (targetEl) {\n\t\tthis._map._targets[L.stamp(targetEl)] = this;\n\t\treturn this;\n\t},\n\n\tremoveInteractiveTarget: function (targetEl) {\n\t\tdelete this._map._targets[L.stamp(targetEl)];\n\t\treturn this;\n\t},\n\n\t// @method getAttribution: String\n\t// Used by the `attribution control`, returns the [attribution option](#gridlayer-attribution).\n\tgetAttribution: function () {\n\t\treturn this.options.attribution;\n\t},\n\n\t_layerAdd: function (e) {\n\t\tvar map = e.target;\n\n\t\t// check in case layer gets added and then removed before the map is ready\n\t\tif (!map.hasLayer(this)) { return; }\n\n\t\tthis._map = map;\n\t\tthis._zoomAnimated = map._zoomAnimated;\n\n\t\tif (this.getEvents) {\n\t\t\tvar events = this.getEvents();\n\t\t\tmap.on(events, this);\n\t\t\tthis.once('remove', function () {\n\t\t\t\tmap.off(events, this);\n\t\t\t}, this);\n\t\t}\n\n\t\tthis.onAdd(map);\n\n\t\tif (this.getAttribution && map.attributionControl) {\n\t\t\tmap.attributionControl.addAttribution(this.getAttribution());\n\t\t}\n\n\t\tthis.fire('add');\n\t\tmap.fire('layeradd', {layer: this});\n\t}\n});\n\n/* @section Extension methods\n * @uninheritable\n *\n * Every layer should extend from `L.Layer` and (re-)implement the following methods.\n *\n * @method onAdd(map: Map): this\n * Should contain code that creates DOM elements for the layer, adds them to `map panes` where they should belong and puts listeners on relevant map events. Called on [`map.addLayer(layer)`](#map-addlayer).\n *\n * @method onRemove(map: Map): this\n * Should contain all clean up code that removes the layer's elements from the DOM and removes listeners previously added in [`onAdd`](#layer-onadd). Called on [`map.removeLayer(layer)`](#map-removelayer).\n *\n * @method getEvents(): Object\n * This optional method should return an object like `{ viewreset: this._reset }` for [`addEventListener`](#evented-addeventlistener). The event handlers in this object will be automatically added and removed from the map with your layer.\n *\n * @method getAttribution(): String\n * This optional method should return a string containing HTML to be shown on the `Attribution control` whenever the layer is visible.\n *\n * @method beforeAdd(map: Map): this\n * Optional method. Called on [`map.addLayer(layer)`](#map-addlayer), before the layer is added to the map, before events are initialized, without waiting until the map is in a usable state. Use for early initialization only.\n */\n\n\n/* @namespace Map\n * @section Layer events\n *\n * @event layeradd: LayerEvent\n * Fired when a new layer is added to the map.\n *\n * @event layerremove: LayerEvent\n * Fired when some layer is removed from the map\n *\n * @section Methods for Layers and Controls\n */\nL.Map.include({\n\t// @method addLayer(layer: Layer): this\n\t// Adds the given layer to the map\n\taddLayer: function (layer) {\n\t\tvar id = L.stamp(layer);\n\t\tif (this._layers[id]) { return this; }\n\t\tthis._layers[id] = layer;\n\n\t\tlayer._mapToAdd = this;\n\n\t\tif (layer.beforeAdd) {\n\t\t\tlayer.beforeAdd(this);\n\t\t}\n\n\t\tthis.whenReady(layer._layerAdd, layer);\n\n\t\treturn this;\n\t},\n\n\t// @method removeLayer(layer: Layer): this\n\t// Removes the given layer from the map.\n\tremoveLayer: function (layer) {\n\t\tvar id = L.stamp(layer);\n\n\t\tif (!this._layers[id]) { return this; }\n\n\t\tif (this._loaded) {\n\t\t\tlayer.onRemove(this);\n\t\t}\n\n\t\tif (layer.getAttribution && this.attributionControl) {\n\t\t\tthis.attributionControl.removeAttribution(layer.getAttribution());\n\t\t}\n\n\t\tdelete this._layers[id];\n\n\t\tif (this._loaded) {\n\t\t\tthis.fire('layerremove', {layer: layer});\n\t\t\tlayer.fire('remove');\n\t\t}\n\n\t\tlayer._map = layer._mapToAdd = null;\n\n\t\treturn this;\n\t},\n\n\t// @method hasLayer(layer: Layer): Boolean\n\t// Returns `true` if the given layer is currently added to the map\n\thasLayer: function (layer) {\n\t\treturn !!layer && (L.stamp(layer) in this._layers);\n\t},\n\n\t/* @method eachLayer(fn: Function, context?: Object): this\n\t * Iterates over the layers of the map, optionally specifying context of the iterator function.\n\t * ```\n\t * map.eachLayer(function(layer){\n\t *     layer.bindPopup('Hello');\n\t * });\n\t * ```\n\t */\n\teachLayer: function (method, context) {\n\t\tfor (var i in this._layers) {\n\t\t\tmethod.call(context, this._layers[i]);\n\t\t}\n\t\treturn this;\n\t},\n\n\t_addLayers: function (layers) {\n\t\tlayers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : [];\n\n\t\tfor (var i = 0, len = layers.length; i < len; i++) {\n\t\t\tthis.addLayer(layers[i]);\n\t\t}\n\t},\n\n\t_addZoomLimit: function (layer) {\n\t\tif (isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom)) {\n\t\t\tthis._zoomBoundLayers[L.stamp(layer)] = layer;\n\t\t\tthis._updateZoomLevels();\n\t\t}\n\t},\n\n\t_removeZoomLimit: function (layer) {\n\t\tvar id = L.stamp(layer);\n\n\t\tif (this._zoomBoundLayers[id]) {\n\t\t\tdelete this._zoomBoundLayers[id];\n\t\t\tthis._updateZoomLevels();\n\t\t}\n\t},\n\n\t_updateZoomLevels: function () {\n\t\tvar minZoom = Infinity,\n\t\t    maxZoom = -Infinity,\n\t\t    oldZoomSpan = this._getZoomSpan();\n\n\t\tfor (var i in this._zoomBoundLayers) {\n\t\t\tvar options = this._zoomBoundLayers[i].options;\n\n\t\t\tminZoom = options.minZoom === undefined ? minZoom : Math.min(minZoom, options.minZoom);\n\t\t\tmaxZoom = options.maxZoom === undefined ? maxZoom : Math.max(maxZoom, options.maxZoom);\n\t\t}\n\n\t\tthis._layersMaxZoom = maxZoom === -Infinity ? undefined : maxZoom;\n\t\tthis._layersMinZoom = minZoom === Infinity ? undefined : minZoom;\n\n\t\t// @section Map state change events\n\t\t// @event zoomlevelschange: Event\n\t\t// Fired when the number of zoomlevels on the map is changed due\n\t\t// to adding or removing a layer.\n\t\tif (oldZoomSpan !== this._getZoomSpan()) {\n\t\t\tthis.fire('zoomlevelschange');\n\t\t}\n\n\t\tif (this.options.maxZoom === undefined && this._layersMaxZoom && this.getZoom() > this._layersMaxZoom) {\n\t\t\tthis.setZoom(this._layersMaxZoom);\n\t\t}\n\t\tif (this.options.minZoom === undefined && this._layersMinZoom && this.getZoom() < this._layersMinZoom) {\n\t\t\tthis.setZoom(this._layersMinZoom);\n\t\t}\n\t}\n});\n\n\n\n/*\r\n * @namespace DomEvent\r\n * Utility functions to work with the [DOM events](https://developer.mozilla.org/docs/Web/API/Event), used by Leaflet internally.\r\n */\r\n\r\n// Inspired by John Resig, Dean Edwards and YUI addEvent implementations.\r\n\r\n\r\n\r\nvar eventsKey = '_leaflet_events';\r\n\r\nL.DomEvent = {\r\n\r\n\t// @function on(el: HTMLElement, types: String, fn: Function, context?: Object): this\r\n\t// Adds a listener function (`fn`) to a particular DOM event type of the\r\n\t// element `el`. You can optionally specify the context of the listener\r\n\t// (object the `this` keyword will point to). You can also pass several\r\n\t// space-separated types (e.g. `'click dblclick'`).\r\n\r\n\t// @alternative\r\n\t// @function on(el: HTMLElement, eventMap: Object, context?: Object): this\r\n\t// Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`\r\n\ton: function (obj, types, fn, context) {\r\n\r\n\t\tif (typeof types === 'object') {\r\n\t\t\tfor (var type in types) {\r\n\t\t\t\tthis._on(obj, type, types[type], fn);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\ttypes = L.Util.splitWords(types);\r\n\r\n\t\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n\t\t\t\tthis._on(obj, types[i], fn, context);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @function off(el: HTMLElement, types: String, fn: Function, context?: Object): this\r\n\t// Removes a previously added listener function. If no function is specified,\r\n\t// it will remove all the listeners of that particular DOM event from the element.\r\n\t// Note that if you passed a custom context to on, you must pass the same\r\n\t// context to `off` in order to remove the listener.\r\n\r\n\t// @alternative\r\n\t// @function off(el: HTMLElement, eventMap: Object, context?: Object): this\r\n\t// Removes a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`\r\n\toff: function (obj, types, fn, context) {\r\n\r\n\t\tif (typeof types === 'object') {\r\n\t\t\tfor (var type in types) {\r\n\t\t\t\tthis._off(obj, type, types[type], fn);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\ttypes = L.Util.splitWords(types);\r\n\r\n\t\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n\t\t\t\tthis._off(obj, types[i], fn, context);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_on: function (obj, type, fn, context) {\r\n\t\tvar id = type + L.stamp(fn) + (context ? '_' + L.stamp(context) : '');\r\n\r\n\t\tif (obj[eventsKey] && obj[eventsKey][id]) { return this; }\r\n\r\n\t\tvar handler = function (e) {\r\n\t\t\treturn fn.call(context || obj, e || window.event);\r\n\t\t};\r\n\r\n\t\tvar originalHandler = handler;\r\n\r\n\t\tif (L.Browser.pointer && type.indexOf('touch') === 0) {\r\n\t\t\tthis.addPointerListener(obj, type, handler, id);\r\n\r\n\t\t} else if (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener &&\r\n\t\t           !(L.Browser.pointer && L.Browser.chrome)) {\r\n\t\t\t// Chrome >55 does not need the synthetic dblclicks from addDoubleTapListener\r\n\t\t\t// See #5180\r\n\t\t\tthis.addDoubleTapListener(obj, handler, id);\r\n\r\n\t\t} else if ('addEventListener' in obj) {\r\n\r\n\t\t\tif (type === 'mousewheel') {\r\n\t\t\t\tobj.addEventListener('onwheel' in obj ? 'wheel' : 'mousewheel', handler, false);\r\n\r\n\t\t\t} else if ((type === 'mouseenter') || (type === 'mouseleave')) {\r\n\t\t\t\thandler = function (e) {\r\n\t\t\t\t\te = e || window.event;\r\n\t\t\t\t\tif (L.DomEvent._isExternalTarget(obj, e)) {\r\n\t\t\t\t\t\toriginalHandler(e);\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\tobj.addEventListener(type === 'mouseenter' ? 'mouseover' : 'mouseout', handler, false);\r\n\r\n\t\t\t} else {\r\n\t\t\t\tif (type === 'click' && L.Browser.android) {\r\n\t\t\t\t\thandler = function (e) {\r\n\t\t\t\t\t\treturn L.DomEvent._filterClick(e, originalHandler);\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t\tobj.addEventListener(type, handler, false);\r\n\t\t\t}\r\n\r\n\t\t} else if ('attachEvent' in obj) {\r\n\t\t\tobj.attachEvent('on' + type, handler);\r\n\t\t}\r\n\r\n\t\tobj[eventsKey] = obj[eventsKey] || {};\r\n\t\tobj[eventsKey][id] = handler;\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_off: function (obj, type, fn, context) {\r\n\r\n\t\tvar id = type + L.stamp(fn) + (context ? '_' + L.stamp(context) : ''),\r\n\t\t    handler = obj[eventsKey] && obj[eventsKey][id];\r\n\r\n\t\tif (!handler) { return this; }\r\n\r\n\t\tif (L.Browser.pointer && type.indexOf('touch') === 0) {\r\n\t\t\tthis.removePointerListener(obj, type, id);\r\n\r\n\t\t} else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) {\r\n\t\t\tthis.removeDoubleTapListener(obj, id);\r\n\r\n\t\t} else if ('removeEventListener' in obj) {\r\n\r\n\t\t\tif (type === 'mousewheel') {\r\n\t\t\t\tobj.removeEventListener('onwheel' in obj ? 'wheel' : 'mousewheel', handler, false);\r\n\r\n\t\t\t} else {\r\n\t\t\t\tobj.removeEventListener(\r\n\t\t\t\t\ttype === 'mouseenter' ? 'mouseover' :\r\n\t\t\t\t\ttype === 'mouseleave' ? 'mouseout' : type, handler, false);\r\n\t\t\t}\r\n\r\n\t\t} else if ('detachEvent' in obj) {\r\n\t\t\tobj.detachEvent('on' + type, handler);\r\n\t\t}\r\n\r\n\t\tobj[eventsKey][id] = null;\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @function stopPropagation(ev: DOMEvent): this\r\n\t// Stop the given event from propagation to parent elements. Used inside the listener functions:\r\n\t// ```js\r\n\t// L.DomEvent.on(div, 'click', function (ev) {\r\n\t// \tL.DomEvent.stopPropagation(ev);\r\n\t// });\r\n\t// ```\r\n\tstopPropagation: function (e) {\r\n\r\n\t\tif (e.stopPropagation) {\r\n\t\t\te.stopPropagation();\r\n\t\t} else if (e.originalEvent) {  // In case of Leaflet event.\r\n\t\t\te.originalEvent._stopped = true;\r\n\t\t} else {\r\n\t\t\te.cancelBubble = true;\r\n\t\t}\r\n\t\tL.DomEvent._skipped(e);\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @function disableScrollPropagation(el: HTMLElement): this\r\n\t// Adds `stopPropagation` to the element's `'mousewheel'` events (plus browser variants).\r\n\tdisableScrollPropagation: function (el) {\r\n\t\treturn L.DomEvent.on(el, 'mousewheel', L.DomEvent.stopPropagation);\r\n\t},\r\n\r\n\t// @function disableClickPropagation(el: HTMLElement): this\r\n\t// Adds `stopPropagation` to the element's `'click'`, `'doubleclick'`,\r\n\t// `'mousedown'` and `'touchstart'` events (plus browser variants).\r\n\tdisableClickPropagation: function (el) {\r\n\t\tvar stop = L.DomEvent.stopPropagation;\r\n\r\n\t\tL.DomEvent.on(el, L.Draggable.START.join(' '), stop);\r\n\r\n\t\treturn L.DomEvent.on(el, {\r\n\t\t\tclick: L.DomEvent._fakeStop,\r\n\t\t\tdblclick: stop\r\n\t\t});\r\n\t},\r\n\r\n\t// @function preventDefault(ev: DOMEvent): this\r\n\t// Prevents the default action of the DOM Event `ev` from happening (such as\r\n\t// following a link in the href of the a element, or doing a POST request\r\n\t// with page reload when a `<form>` is submitted).\r\n\t// Use it inside listener functions.\r\n\tpreventDefault: function (e) {\r\n\r\n\t\tif (e.preventDefault) {\r\n\t\t\te.preventDefault();\r\n\t\t} else {\r\n\t\t\te.returnValue = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @function stop(ev): this\r\n\t// Does `stopPropagation` and `preventDefault` at the same time.\r\n\tstop: function (e) {\r\n\t\treturn L.DomEvent\r\n\t\t\t.preventDefault(e)\r\n\t\t\t.stopPropagation(e);\r\n\t},\r\n\r\n\t// @function getMousePosition(ev: DOMEvent, container?: HTMLElement): Point\r\n\t// Gets normalized mouse position from a DOM event relative to the\r\n\t// `container` or to the whole page if not specified.\r\n\tgetMousePosition: function (e, container) {\r\n\t\tif (!container) {\r\n\t\t\treturn new L.Point(e.clientX, e.clientY);\r\n\t\t}\r\n\r\n\t\tvar rect = container.getBoundingClientRect();\r\n\r\n\t\treturn new L.Point(\r\n\t\t\te.clientX - rect.left - container.clientLeft,\r\n\t\t\te.clientY - rect.top - container.clientTop);\r\n\t},\r\n\r\n\t// Chrome on Win scrolls double the pixels as in other platforms (see #4538),\r\n\t// and Firefox scrolls device pixels, not CSS pixels\r\n\t_wheelPxFactor: (L.Browser.win && L.Browser.chrome) ? 2 :\r\n\t                L.Browser.gecko ? window.devicePixelRatio :\r\n\t                1,\r\n\r\n\t// @function getWheelDelta(ev: DOMEvent): Number\r\n\t// Gets normalized wheel delta from a mousewheel DOM event, in vertical\r\n\t// pixels scrolled (negative if scrolling down).\r\n\t// Events from pointing devices without precise scrolling are mapped to\r\n\t// a best guess of 60 pixels.\r\n\tgetWheelDelta: function (e) {\r\n\t\treturn (L.Browser.edge) ? e.wheelDeltaY / 2 : // Don't trust window-geometry-based delta\r\n\t\t       (e.deltaY && e.deltaMode === 0) ? -e.deltaY / L.DomEvent._wheelPxFactor : // Pixels\r\n\t\t       (e.deltaY && e.deltaMode === 1) ? -e.deltaY * 20 : // Lines\r\n\t\t       (e.deltaY && e.deltaMode === 2) ? -e.deltaY * 60 : // Pages\r\n\t\t       (e.deltaX || e.deltaZ) ? 0 :\t// Skip horizontal/depth wheel events\r\n\t\t       e.wheelDelta ? (e.wheelDeltaY || e.wheelDelta) / 2 : // Legacy IE pixels\r\n\t\t       (e.detail && Math.abs(e.detail) < 32765) ? -e.detail * 20 : // Legacy Moz lines\r\n\t\t       e.detail ? e.detail / -32765 * 60 : // Legacy Moz pages\r\n\t\t       0;\r\n\t},\r\n\r\n\t_skipEvents: {},\r\n\r\n\t_fakeStop: function (e) {\r\n\t\t// fakes stopPropagation by setting a special event flag, checked/reset with L.DomEvent._skipped(e)\r\n\t\tL.DomEvent._skipEvents[e.type] = true;\r\n\t},\r\n\r\n\t_skipped: function (e) {\r\n\t\tvar skipped = this._skipEvents[e.type];\r\n\t\t// reset when checking, as it's only used in map container and propagates outside of the map\r\n\t\tthis._skipEvents[e.type] = false;\r\n\t\treturn skipped;\r\n\t},\r\n\r\n\t// check if element really left/entered the event target (for mouseenter/mouseleave)\r\n\t_isExternalTarget: function (el, e) {\r\n\r\n\t\tvar related = e.relatedTarget;\r\n\r\n\t\tif (!related) { return true; }\r\n\r\n\t\ttry {\r\n\t\t\twhile (related && (related !== el)) {\r\n\t\t\t\trelated = related.parentNode;\r\n\t\t\t}\r\n\t\t} catch (err) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn (related !== el);\r\n\t},\r\n\r\n\t// this is a horrible workaround for a bug in Android where a single touch triggers two click events\r\n\t_filterClick: function (e, handler) {\r\n\t\tvar timeStamp = (e.timeStamp || (e.originalEvent && e.originalEvent.timeStamp)),\r\n\t\t    elapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick);\r\n\r\n\t\t// are they closer together than 500ms yet more than 100ms?\r\n\t\t// Android typically triggers them ~300ms apart while multiple listeners\r\n\t\t// on the same event should be triggered far faster;\r\n\t\t// or check if click is simulated on the element, and if it is, reject any non-simulated events\r\n\r\n\t\tif ((elapsed && elapsed > 100 && elapsed < 500) || (e.target._simulatedClick && !e._simulated)) {\r\n\t\t\tL.DomEvent.stop(e);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tL.DomEvent._lastClick = timeStamp;\r\n\r\n\t\thandler(e);\r\n\t}\r\n};\r\n\r\n// @function addListener(…): this\r\n// Alias to [`L.DomEvent.on`](#domevent-on)\r\nL.DomEvent.addListener = L.DomEvent.on;\r\n\r\n// @function removeListener(…): this\r\n// Alias to [`L.DomEvent.off`](#domevent-off)\r\nL.DomEvent.removeListener = L.DomEvent.off;\r\n\n\n\n/*\n * @class PosAnimation\n * @aka L.PosAnimation\n * @inherits Evented\n * Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9.\n *\n * @example\n * ```js\n * var fx = new L.PosAnimation();\n * fx.run(el, [300, 500], 0.5);\n * ```\n *\n * @constructor L.PosAnimation()\n * Creates a `PosAnimation` object.\n *\n */\n\nL.PosAnimation = L.Evented.extend({\n\n\t// @method run(el: HTMLElement, newPos: Point, duration?: Number, easeLinearity?: Number)\n\t// Run an animation of a given element to a new position, optionally setting\n\t// duration in seconds (`0.25` by default) and easing linearity factor (3rd\n\t// argument of the [cubic bezier curve](http://cubic-bezier.com/#0,0,.5,1),\n\t// `0.5` by default).\n\trun: function (el, newPos, duration, easeLinearity) {\n\t\tthis.stop();\n\n\t\tthis._el = el;\n\t\tthis._inProgress = true;\n\t\tthis._duration = duration || 0.25;\n\t\tthis._easeOutPower = 1 / Math.max(easeLinearity || 0.5, 0.2);\n\n\t\tthis._startPos = L.DomUtil.getPosition(el);\n\t\tthis._offset = newPos.subtract(this._startPos);\n\t\tthis._startTime = +new Date();\n\n\t\t// @event start: Event\n\t\t// Fired when the animation starts\n\t\tthis.fire('start');\n\n\t\tthis._animate();\n\t},\n\n\t// @method stop()\n\t// Stops the animation (if currently running).\n\tstop: function () {\n\t\tif (!this._inProgress) { return; }\n\n\t\tthis._step(true);\n\t\tthis._complete();\n\t},\n\n\t_animate: function () {\n\t\t// animation loop\n\t\tthis._animId = L.Util.requestAnimFrame(this._animate, this);\n\t\tthis._step();\n\t},\n\n\t_step: function (round) {\n\t\tvar elapsed = (+new Date()) - this._startTime,\n\t\t    duration = this._duration * 1000;\n\n\t\tif (elapsed < duration) {\n\t\t\tthis._runFrame(this._easeOut(elapsed / duration), round);\n\t\t} else {\n\t\t\tthis._runFrame(1);\n\t\t\tthis._complete();\n\t\t}\n\t},\n\n\t_runFrame: function (progress, round) {\n\t\tvar pos = this._startPos.add(this._offset.multiplyBy(progress));\n\t\tif (round) {\n\t\t\tpos._round();\n\t\t}\n\t\tL.DomUtil.setPosition(this._el, pos);\n\n\t\t// @event step: Event\n\t\t// Fired continuously during the animation.\n\t\tthis.fire('step');\n\t},\n\n\t_complete: function () {\n\t\tL.Util.cancelAnimFrame(this._animId);\n\n\t\tthis._inProgress = false;\n\t\t// @event end: Event\n\t\t// Fired when the animation ends.\n\t\tthis.fire('end');\n\t},\n\n\t_easeOut: function (t) {\n\t\treturn 1 - Math.pow(1 - t, this._easeOutPower);\n\t}\n});\n\n\n\n/*\r\n * @namespace Projection\r\n * @projection L.Projection.Mercator\r\n *\r\n * Elliptical Mercator projection — more complex than Spherical Mercator. Takes into account that Earth is a geoid, not a perfect sphere. Used by the EPSG:3395 CRS.\r\n */\r\n\r\nL.Projection.Mercator = {\r\n\tR: 6378137,\r\n\tR_MINOR: 6356752.314245179,\r\n\r\n\tbounds: L.bounds([-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]),\r\n\r\n\tproject: function (latlng) {\r\n\t\tvar d = Math.PI / 180,\r\n\t\t    r = this.R,\r\n\t\t    y = latlng.lat * d,\r\n\t\t    tmp = this.R_MINOR / r,\r\n\t\t    e = Math.sqrt(1 - tmp * tmp),\r\n\t\t    con = e * Math.sin(y);\r\n\r\n\t\tvar ts = Math.tan(Math.PI / 4 - y / 2) / Math.pow((1 - con) / (1 + con), e / 2);\r\n\t\ty = -r * Math.log(Math.max(ts, 1E-10));\r\n\r\n\t\treturn new L.Point(latlng.lng * d * r, y);\r\n\t},\r\n\r\n\tunproject: function (point) {\r\n\t\tvar d = 180 / Math.PI,\r\n\t\t    r = this.R,\r\n\t\t    tmp = this.R_MINOR / r,\r\n\t\t    e = Math.sqrt(1 - tmp * tmp),\r\n\t\t    ts = Math.exp(-point.y / r),\r\n\t\t    phi = Math.PI / 2 - 2 * Math.atan(ts);\r\n\r\n\t\tfor (var i = 0, dphi = 0.1, con; i < 15 && Math.abs(dphi) > 1e-7; i++) {\r\n\t\t\tcon = e * Math.sin(phi);\r\n\t\t\tcon = Math.pow((1 - con) / (1 + con), e / 2);\r\n\t\t\tdphi = Math.PI / 2 - 2 * Math.atan(ts * con) - phi;\r\n\t\t\tphi += dphi;\r\n\t\t}\r\n\r\n\t\treturn new L.LatLng(phi * d, point.x * d / r);\r\n\t}\r\n};\r\n\n\n\n/*\r\n * @namespace CRS\r\n * @crs L.CRS.EPSG3395\r\n *\r\n * Rarely used by some commercial tile providers. Uses Elliptical Mercator projection.\r\n */\r\n\r\nL.CRS.EPSG3395 = L.extend({}, L.CRS.Earth, {\r\n\tcode: 'EPSG:3395',\r\n\tprojection: L.Projection.Mercator,\r\n\r\n\ttransformation: (function () {\r\n\t\tvar scale = 0.5 / (Math.PI * L.Projection.Mercator.R);\r\n\t\treturn new L.Transformation(scale, 0.5, -scale, 0.5);\r\n\t}())\r\n});\r\n\n\n\n/*\n * @class GridLayer\n * @inherits Layer\n * @aka L.GridLayer\n *\n * Generic class for handling a tiled grid of HTML elements. This is the base class for all tile layers and replaces `TileLayer.Canvas`.\n * GridLayer can be extended to create a tiled grid of HTML elements like `<canvas>`, `<img>` or `<div>`. GridLayer will handle creating and animating these DOM elements for you.\n *\n *\n * @section Synchronous usage\n * @example\n *\n * To create a custom layer, extend GridLayer and implement the `createTile()` method, which will be passed a `Point` object with the `x`, `y`, and `z` (zoom level) coordinates to draw your tile.\n *\n * ```js\n * var CanvasLayer = L.GridLayer.extend({\n *     createTile: function(coords){\n *         // create a <canvas> element for drawing\n *         var tile = L.DomUtil.create('canvas', 'leaflet-tile');\n *\n *         // setup tile width and height according to the options\n *         var size = this.getTileSize();\n *         tile.width = size.x;\n *         tile.height = size.y;\n *\n *         // get a canvas context and draw something on it using coords.x, coords.y and coords.z\n *         var ctx = tile.getContext('2d');\n *\n *         // return the tile so it can be rendered on screen\n *         return tile;\n *     }\n * });\n * ```\n *\n * @section Asynchronous usage\n * @example\n *\n * Tile creation can also be asynchronous, this is useful when using a third-party drawing library. Once the tile is finished drawing it can be passed to the `done()` callback.\n *\n * ```js\n * var CanvasLayer = L.GridLayer.extend({\n *     createTile: function(coords, done){\n *         var error;\n *\n *         // create a <canvas> element for drawing\n *         var tile = L.DomUtil.create('canvas', 'leaflet-tile');\n *\n *         // setup tile width and height according to the options\n *         var size = this.getTileSize();\n *         tile.width = size.x;\n *         tile.height = size.y;\n *\n *         // draw something asynchronously and pass the tile to the done() callback\n *         setTimeout(function() {\n *             done(error, tile);\n *         }, 1000);\n *\n *         return tile;\n *     }\n * });\n * ```\n *\n * @section\n */\n\n\nL.GridLayer = L.Layer.extend({\n\n\t// @section\n\t// @aka GridLayer options\n\toptions: {\n\t\t// @option tileSize: Number|Point = 256\n\t\t// Width and height of tiles in the grid. Use a number if width and height are equal, or `L.point(width, height)` otherwise.\n\t\ttileSize: 256,\n\n\t\t// @option opacity: Number = 1.0\n\t\t// Opacity of the tiles. Can be used in the `createTile()` function.\n\t\topacity: 1,\n\n\t\t// @option updateWhenIdle: Boolean = depends\n\t\t// If `false`, new tiles are loaded during panning, otherwise only after it (for better performance). `true` by default on mobile browsers, otherwise `false`.\n\t\tupdateWhenIdle: L.Browser.mobile,\n\n\t\t// @option updateWhenZooming: Boolean = true\n\t\t// By default, a smooth zoom animation (during a [touch zoom](#map-touchzoom) or a [`flyTo()`](#map-flyto)) will update grid layers every integer zoom level. Setting this option to `false` will update the grid layer only when the smooth animation ends.\n\t\tupdateWhenZooming: true,\n\n\t\t// @option updateInterval: Number = 200\n\t\t// Tiles will not update more than once every `updateInterval` milliseconds when panning.\n\t\tupdateInterval: 200,\n\n\t\t// @option zIndex: Number = 1\n\t\t// The explicit zIndex of the tile layer.\n\t\tzIndex: 1,\n\n\t\t// @option bounds: LatLngBounds = undefined\n\t\t// If set, tiles will only be loaded inside the set `LatLngBounds`.\n\t\tbounds: null,\n\n\t\t// @option minZoom: Number = 0\n\t\t// The minimum zoom level that tiles will be loaded at. By default the entire map.\n\t\tminZoom: 0,\n\n\t\t// @option maxZoom: Number = undefined\n\t\t// The maximum zoom level that tiles will be loaded at.\n\t\tmaxZoom: undefined,\n\n\t\t// @option noWrap: Boolean = false\n\t\t// Whether the layer is wrapped around the antimeridian. If `true`, the\n\t\t// GridLayer will only be displayed once at low zoom levels. Has no\n\t\t// effect when the [map CRS](#map-crs) doesn't wrap around. Can be used\n\t\t// in combination with [`bounds`](#gridlayer-bounds) to prevent requesting\n\t\t// tiles outside the CRS limits.\n\t\tnoWrap: false,\n\n\t\t// @option pane: String = 'tilePane'\n\t\t// `Map pane` where the grid layer will be added.\n\t\tpane: 'tilePane',\n\n\t\t// @option className: String = ''\n\t\t// A custom class name to assign to the tile layer. Empty by default.\n\t\tclassName: '',\n\n\t\t// @option keepBuffer: Number = 2\n\t\t// When panning the map, keep this many rows and columns of tiles before unloading them.\n\t\tkeepBuffer: 2\n\t},\n\n\tinitialize: function (options) {\n\t\tL.setOptions(this, options);\n\t},\n\n\tonAdd: function () {\n\t\tthis._initContainer();\n\n\t\tthis._levels = {};\n\t\tthis._tiles = {};\n\n\t\tthis._resetView();\n\t\tthis._update();\n\t},\n\n\tbeforeAdd: function (map) {\n\t\tmap._addZoomLimit(this);\n\t},\n\n\tonRemove: function (map) {\n\t\tthis._removeAllTiles();\n\t\tL.DomUtil.remove(this._container);\n\t\tmap._removeZoomLimit(this);\n\t\tthis._container = null;\n\t\tthis._tileZoom = null;\n\t},\n\n\t// @method bringToFront: this\n\t// Brings the tile layer to the top of all tile layers.\n\tbringToFront: function () {\n\t\tif (this._map) {\n\t\t\tL.DomUtil.toFront(this._container);\n\t\t\tthis._setAutoZIndex(Math.max);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method bringToBack: this\n\t// Brings the tile layer to the bottom of all tile layers.\n\tbringToBack: function () {\n\t\tif (this._map) {\n\t\t\tL.DomUtil.toBack(this._container);\n\t\t\tthis._setAutoZIndex(Math.min);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method getContainer: HTMLElement\n\t// Returns the HTML element that contains the tiles for this layer.\n\tgetContainer: function () {\n\t\treturn this._container;\n\t},\n\n\t// @method setOpacity(opacity: Number): this\n\t// Changes the [opacity](#gridlayer-opacity) of the grid layer.\n\tsetOpacity: function (opacity) {\n\t\tthis.options.opacity = opacity;\n\t\tthis._updateOpacity();\n\t\treturn this;\n\t},\n\n\t// @method setZIndex(zIndex: Number): this\n\t// Changes the [zIndex](#gridlayer-zindex) of the grid layer.\n\tsetZIndex: function (zIndex) {\n\t\tthis.options.zIndex = zIndex;\n\t\tthis._updateZIndex();\n\n\t\treturn this;\n\t},\n\n\t// @method isLoading: Boolean\n\t// Returns `true` if any tile in the grid layer has not finished loading.\n\tisLoading: function () {\n\t\treturn this._loading;\n\t},\n\n\t// @method redraw: this\n\t// Causes the layer to clear all the tiles and request them again.\n\tredraw: function () {\n\t\tif (this._map) {\n\t\t\tthis._removeAllTiles();\n\t\t\tthis._update();\n\t\t}\n\t\treturn this;\n\t},\n\n\tgetEvents: function () {\n\t\tvar events = {\n\t\t\tviewprereset: this._invalidateAll,\n\t\t\tviewreset: this._resetView,\n\t\t\tzoom: this._resetView,\n\t\t\tmoveend: this._onMoveEnd\n\t\t};\n\n\t\tif (!this.options.updateWhenIdle) {\n\t\t\t// update tiles on move, but not more often than once per given interval\n\t\t\tif (!this._onMove) {\n\t\t\t\tthis._onMove = L.Util.throttle(this._onMoveEnd, this.options.updateInterval, this);\n\t\t\t}\n\n\t\t\tevents.move = this._onMove;\n\t\t}\n\n\t\tif (this._zoomAnimated) {\n\t\t\tevents.zoomanim = this._animateZoom;\n\t\t}\n\n\t\treturn events;\n\t},\n\n\t// @section Extension methods\n\t// Layers extending `GridLayer` shall reimplement the following method.\n\t// @method createTile(coords: Object, done?: Function): HTMLElement\n\t// Called only internally, must be overriden by classes extending `GridLayer`.\n\t// Returns the `HTMLElement` corresponding to the given `coords`. If the `done` callback\n\t// is specified, it must be called when the tile has finished loading and drawing.\n\tcreateTile: function () {\n\t\treturn document.createElement('div');\n\t},\n\n\t// @section\n\t// @method getTileSize: Point\n\t// Normalizes the [tileSize option](#gridlayer-tilesize) into a point. Used by the `createTile()` method.\n\tgetTileSize: function () {\n\t\tvar s = this.options.tileSize;\n\t\treturn s instanceof L.Point ? s : new L.Point(s, s);\n\t},\n\n\t_updateZIndex: function () {\n\t\tif (this._container && this.options.zIndex !== undefined && this.options.zIndex !== null) {\n\t\t\tthis._container.style.zIndex = this.options.zIndex;\n\t\t}\n\t},\n\n\t_setAutoZIndex: function (compare) {\n\t\t// go through all other layers of the same pane, set zIndex to max + 1 (front) or min - 1 (back)\n\n\t\tvar layers = this.getPane().children,\n\t\t    edgeZIndex = -compare(-Infinity, Infinity); // -Infinity for max, Infinity for min\n\n\t\tfor (var i = 0, len = layers.length, zIndex; i < len; i++) {\n\n\t\t\tzIndex = layers[i].style.zIndex;\n\n\t\t\tif (layers[i] !== this._container && zIndex) {\n\t\t\t\tedgeZIndex = compare(edgeZIndex, +zIndex);\n\t\t\t}\n\t\t}\n\n\t\tif (isFinite(edgeZIndex)) {\n\t\t\tthis.options.zIndex = edgeZIndex + compare(-1, 1);\n\t\t\tthis._updateZIndex();\n\t\t}\n\t},\n\n\t_updateOpacity: function () {\n\t\tif (!this._map) { return; }\n\n\t\t// IE doesn't inherit filter opacity properly, so we're forced to set it on tiles\n\t\tif (L.Browser.ielt9) { return; }\n\n\t\tL.DomUtil.setOpacity(this._container, this.options.opacity);\n\n\t\tvar now = +new Date(),\n\t\t    nextFrame = false,\n\t\t    willPrune = false;\n\n\t\tfor (var key in this._tiles) {\n\t\t\tvar tile = this._tiles[key];\n\t\t\tif (!tile.current || !tile.loaded) { continue; }\n\n\t\t\tvar fade = Math.min(1, (now - tile.loaded) / 200);\n\n\t\t\tL.DomUtil.setOpacity(tile.el, fade);\n\t\t\tif (fade < 1) {\n\t\t\t\tnextFrame = true;\n\t\t\t} else {\n\t\t\t\tif (tile.active) { willPrune = true; }\n\t\t\t\ttile.active = true;\n\t\t\t}\n\t\t}\n\n\t\tif (willPrune && !this._noPrune) { this._pruneTiles(); }\n\n\t\tif (nextFrame) {\n\t\t\tL.Util.cancelAnimFrame(this._fadeFrame);\n\t\t\tthis._fadeFrame = L.Util.requestAnimFrame(this._updateOpacity, this);\n\t\t}\n\t},\n\n\t_initContainer: function () {\n\t\tif (this._container) { return; }\n\n\t\tthis._container = L.DomUtil.create('div', 'leaflet-layer ' + (this.options.className || ''));\n\t\tthis._updateZIndex();\n\n\t\tif (this.options.opacity < 1) {\n\t\t\tthis._updateOpacity();\n\t\t}\n\n\t\tthis.getPane().appendChild(this._container);\n\t},\n\n\t_updateLevels: function () {\n\n\t\tvar zoom = this._tileZoom,\n\t\t    maxZoom = this.options.maxZoom;\n\n\t\tif (zoom === undefined) { return undefined; }\n\n\t\tfor (var z in this._levels) {\n\t\t\tif (this._levels[z].el.children.length || z === zoom) {\n\t\t\t\tthis._levels[z].el.style.zIndex = maxZoom - Math.abs(zoom - z);\n\t\t\t} else {\n\t\t\t\tL.DomUtil.remove(this._levels[z].el);\n\t\t\t\tthis._removeTilesAtZoom(z);\n\t\t\t\tdelete this._levels[z];\n\t\t\t}\n\t\t}\n\n\t\tvar level = this._levels[zoom],\n\t\t    map = this._map;\n\n\t\tif (!level) {\n\t\t\tlevel = this._levels[zoom] = {};\n\n\t\t\tlevel.el = L.DomUtil.create('div', 'leaflet-tile-container leaflet-zoom-animated', this._container);\n\t\t\tlevel.el.style.zIndex = maxZoom;\n\n\t\t\tlevel.origin = map.project(map.unproject(map.getPixelOrigin()), zoom).round();\n\t\t\tlevel.zoom = zoom;\n\n\t\t\tthis._setZoomTransform(level, map.getCenter(), map.getZoom());\n\n\t\t\t// force the browser to consider the newly added element for transition\n\t\t\tL.Util.falseFn(level.el.offsetWidth);\n\t\t}\n\n\t\tthis._level = level;\n\n\t\treturn level;\n\t},\n\n\t_pruneTiles: function () {\n\t\tif (!this._map) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar key, tile;\n\n\t\tvar zoom = this._map.getZoom();\n\t\tif (zoom > this.options.maxZoom ||\n\t\t\tzoom < this.options.minZoom) {\n\t\t\tthis._removeAllTiles();\n\t\t\treturn;\n\t\t}\n\n\t\tfor (key in this._tiles) {\n\t\t\ttile = this._tiles[key];\n\t\t\ttile.retain = tile.current;\n\t\t}\n\n\t\tfor (key in this._tiles) {\n\t\t\ttile = this._tiles[key];\n\t\t\tif (tile.current && !tile.active) {\n\t\t\t\tvar coords = tile.coords;\n\t\t\t\tif (!this._retainParent(coords.x, coords.y, coords.z, coords.z - 5)) {\n\t\t\t\t\tthis._retainChildren(coords.x, coords.y, coords.z, coords.z + 2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (key in this._tiles) {\n\t\t\tif (!this._tiles[key].retain) {\n\t\t\t\tthis._removeTile(key);\n\t\t\t}\n\t\t}\n\t},\n\n\t_removeTilesAtZoom: function (zoom) {\n\t\tfor (var key in this._tiles) {\n\t\t\tif (this._tiles[key].coords.z !== zoom) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis._removeTile(key);\n\t\t}\n\t},\n\n\t_removeAllTiles: function () {\n\t\tfor (var key in this._tiles) {\n\t\t\tthis._removeTile(key);\n\t\t}\n\t},\n\n\t_invalidateAll: function () {\n\t\tfor (var z in this._levels) {\n\t\t\tL.DomUtil.remove(this._levels[z].el);\n\t\t\tdelete this._levels[z];\n\t\t}\n\t\tthis._removeAllTiles();\n\n\t\tthis._tileZoom = null;\n\t},\n\n\t_retainParent: function (x, y, z, minZoom) {\n\t\tvar x2 = Math.floor(x / 2),\n\t\t    y2 = Math.floor(y / 2),\n\t\t    z2 = z - 1,\n\t\t    coords2 = new L.Point(+x2, +y2);\n\t\tcoords2.z = +z2;\n\n\t\tvar key = this._tileCoordsToKey(coords2),\n\t\t    tile = this._tiles[key];\n\n\t\tif (tile && tile.active) {\n\t\t\ttile.retain = true;\n\t\t\treturn true;\n\n\t\t} else if (tile && tile.loaded) {\n\t\t\ttile.retain = true;\n\t\t}\n\n\t\tif (z2 > minZoom) {\n\t\t\treturn this._retainParent(x2, y2, z2, minZoom);\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_retainChildren: function (x, y, z, maxZoom) {\n\n\t\tfor (var i = 2 * x; i < 2 * x + 2; i++) {\n\t\t\tfor (var j = 2 * y; j < 2 * y + 2; j++) {\n\n\t\t\t\tvar coords = new L.Point(i, j);\n\t\t\t\tcoords.z = z + 1;\n\n\t\t\t\tvar key = this._tileCoordsToKey(coords),\n\t\t\t\t    tile = this._tiles[key];\n\n\t\t\t\tif (tile && tile.active) {\n\t\t\t\t\ttile.retain = true;\n\t\t\t\t\tcontinue;\n\n\t\t\t\t} else if (tile && tile.loaded) {\n\t\t\t\t\ttile.retain = true;\n\t\t\t\t}\n\n\t\t\t\tif (z + 1 < maxZoom) {\n\t\t\t\t\tthis._retainChildren(i, j, z + 1, maxZoom);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t_resetView: function (e) {\n\t\tvar animating = e && (e.pinch || e.flyTo);\n\t\tthis._setView(this._map.getCenter(), this._map.getZoom(), animating, animating);\n\t},\n\n\t_animateZoom: function (e) {\n\t\tthis._setView(e.center, e.zoom, true, e.noUpdate);\n\t},\n\n\t_setView: function (center, zoom, noPrune, noUpdate) {\n\t\tvar tileZoom = Math.round(zoom);\n\t\tif ((this.options.maxZoom !== undefined && tileZoom > this.options.maxZoom) ||\n\t\t    (this.options.minZoom !== undefined && tileZoom < this.options.minZoom)) {\n\t\t\ttileZoom = undefined;\n\t\t}\n\n\t\tvar tileZoomChanged = this.options.updateWhenZooming && (tileZoom !== this._tileZoom);\n\n\t\tif (!noUpdate || tileZoomChanged) {\n\n\t\t\tthis._tileZoom = tileZoom;\n\n\t\t\tif (this._abortLoading) {\n\t\t\t\tthis._abortLoading();\n\t\t\t}\n\n\t\t\tthis._updateLevels();\n\t\t\tthis._resetGrid();\n\n\t\t\tif (tileZoom !== undefined) {\n\t\t\t\tthis._update(center);\n\t\t\t}\n\n\t\t\tif (!noPrune) {\n\t\t\t\tthis._pruneTiles();\n\t\t\t}\n\n\t\t\t// Flag to prevent _updateOpacity from pruning tiles during\n\t\t\t// a zoom anim or a pinch gesture\n\t\t\tthis._noPrune = !!noPrune;\n\t\t}\n\n\t\tthis._setZoomTransforms(center, zoom);\n\t},\n\n\t_setZoomTransforms: function (center, zoom) {\n\t\tfor (var i in this._levels) {\n\t\t\tthis._setZoomTransform(this._levels[i], center, zoom);\n\t\t}\n\t},\n\n\t_setZoomTransform: function (level, center, zoom) {\n\t\tvar scale = this._map.getZoomScale(zoom, level.zoom),\n\t\t    translate = level.origin.multiplyBy(scale)\n\t\t        .subtract(this._map._getNewPixelOrigin(center, zoom)).round();\n\n\t\tif (L.Browser.any3d) {\n\t\t\tL.DomUtil.setTransform(level.el, translate, scale);\n\t\t} else {\n\t\t\tL.DomUtil.setPosition(level.el, translate);\n\t\t}\n\t},\n\n\t_resetGrid: function () {\n\t\tvar map = this._map,\n\t\t    crs = map.options.crs,\n\t\t    tileSize = this._tileSize = this.getTileSize(),\n\t\t    tileZoom = this._tileZoom;\n\n\t\tvar bounds = this._map.getPixelWorldBounds(this._tileZoom);\n\t\tif (bounds) {\n\t\t\tthis._globalTileRange = this._pxBoundsToTileRange(bounds);\n\t\t}\n\n\t\tthis._wrapX = crs.wrapLng && !this.options.noWrap && [\n\t\t\tMath.floor(map.project([0, crs.wrapLng[0]], tileZoom).x / tileSize.x),\n\t\t\tMath.ceil(map.project([0, crs.wrapLng[1]], tileZoom).x / tileSize.y)\n\t\t];\n\t\tthis._wrapY = crs.wrapLat && !this.options.noWrap && [\n\t\t\tMath.floor(map.project([crs.wrapLat[0], 0], tileZoom).y / tileSize.x),\n\t\t\tMath.ceil(map.project([crs.wrapLat[1], 0], tileZoom).y / tileSize.y)\n\t\t];\n\t},\n\n\t_onMoveEnd: function () {\n\t\tif (!this._map || this._map._animatingZoom) { return; }\n\n\t\tthis._update();\n\t},\n\n\t_getTiledPixelBounds: function (center) {\n\t\tvar map = this._map,\n\t\t    mapZoom = map._animatingZoom ? Math.max(map._animateToZoom, map.getZoom()) : map.getZoom(),\n\t\t    scale = map.getZoomScale(mapZoom, this._tileZoom),\n\t\t    pixelCenter = map.project(center, this._tileZoom).floor(),\n\t\t    halfSize = map.getSize().divideBy(scale * 2);\n\n\t\treturn new L.Bounds(pixelCenter.subtract(halfSize), pixelCenter.add(halfSize));\n\t},\n\n\t// Private method to load tiles in the grid's active zoom level according to map bounds\n\t_update: function (center) {\n\t\tvar map = this._map;\n\t\tif (!map) { return; }\n\t\tvar zoom = map.getZoom();\n\n\t\tif (center === undefined) { center = map.getCenter(); }\n\t\tif (this._tileZoom === undefined) { return; }\t// if out of minzoom/maxzoom\n\n\t\tvar pixelBounds = this._getTiledPixelBounds(center),\n\t\t    tileRange = this._pxBoundsToTileRange(pixelBounds),\n\t\t    tileCenter = tileRange.getCenter(),\n\t\t    queue = [],\n\t\t    margin = this.options.keepBuffer,\n\t\t    noPruneRange = new L.Bounds(tileRange.getBottomLeft().subtract([margin, -margin]),\n\t\t                              tileRange.getTopRight().add([margin, -margin]));\n\n\t\tfor (var key in this._tiles) {\n\t\t\tvar c = this._tiles[key].coords;\n\t\t\tif (c.z !== this._tileZoom || !noPruneRange.contains(L.point(c.x, c.y))) {\n\t\t\t\tthis._tiles[key].current = false;\n\t\t\t}\n\t\t}\n\n\t\t// _update just loads more tiles. If the tile zoom level differs too much\n\t\t// from the map's, let _setView reset levels and prune old tiles.\n\t\tif (Math.abs(zoom - this._tileZoom) > 1) { this._setView(center, zoom); return; }\n\n\t\t// create a queue of coordinates to load tiles from\n\t\tfor (var j = tileRange.min.y; j <= tileRange.max.y; j++) {\n\t\t\tfor (var i = tileRange.min.x; i <= tileRange.max.x; i++) {\n\t\t\t\tvar coords = new L.Point(i, j);\n\t\t\t\tcoords.z = this._tileZoom;\n\n\t\t\t\tif (!this._isValidTile(coords)) { continue; }\n\n\t\t\t\tvar tile = this._tiles[this._tileCoordsToKey(coords)];\n\t\t\t\tif (tile) {\n\t\t\t\t\ttile.current = true;\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push(coords);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// sort tile queue to load tiles in order of their distance to center\n\t\tqueue.sort(function (a, b) {\n\t\t\treturn a.distanceTo(tileCenter) - b.distanceTo(tileCenter);\n\t\t});\n\n\t\tif (queue.length !== 0) {\n\t\t\t// if it's the first batch of tiles to load\n\t\t\tif (!this._loading) {\n\t\t\t\tthis._loading = true;\n\t\t\t\t// @event loading: Event\n\t\t\t\t// Fired when the grid layer starts loading tiles.\n\t\t\t\tthis.fire('loading');\n\t\t\t}\n\n\t\t\t// create DOM fragment to append tiles in one batch\n\t\t\tvar fragment = document.createDocumentFragment();\n\n\t\t\tfor (i = 0; i < queue.length; i++) {\n\t\t\t\tthis._addTile(queue[i], fragment);\n\t\t\t}\n\n\t\t\tthis._level.el.appendChild(fragment);\n\t\t}\n\t},\n\n\t_isValidTile: function (coords) {\n\t\tvar crs = this._map.options.crs;\n\n\t\tif (!crs.infinite) {\n\t\t\t// don't load tile if it's out of bounds and not wrapped\n\t\t\tvar bounds = this._globalTileRange;\n\t\t\tif ((!crs.wrapLng && (coords.x < bounds.min.x || coords.x > bounds.max.x)) ||\n\t\t\t    (!crs.wrapLat && (coords.y < bounds.min.y || coords.y > bounds.max.y))) { return false; }\n\t\t}\n\n\t\tif (!this.options.bounds) { return true; }\n\n\t\t// don't load tile if it doesn't intersect the bounds in options\n\t\tvar tileBounds = this._tileCoordsToBounds(coords);\n\t\treturn L.latLngBounds(this.options.bounds).overlaps(tileBounds);\n\t},\n\n\t_keyToBounds: function (key) {\n\t\treturn this._tileCoordsToBounds(this._keyToTileCoords(key));\n\t},\n\n\t// converts tile coordinates to its geographical bounds\n\t_tileCoordsToBounds: function (coords) {\n\n\t\tvar map = this._map,\n\t\t    tileSize = this.getTileSize(),\n\n\t\t    nwPoint = coords.scaleBy(tileSize),\n\t\t    sePoint = nwPoint.add(tileSize),\n\n\t\t    nw = map.unproject(nwPoint, coords.z),\n\t\t    se = map.unproject(sePoint, coords.z),\n\t\t    bounds = new L.LatLngBounds(nw, se);\n\n\t\tif (!this.options.noWrap) {\n\t\t\tmap.wrapLatLngBounds(bounds);\n\t\t}\n\n\t\treturn bounds;\n\t},\n\n\t// converts tile coordinates to key for the tile cache\n\t_tileCoordsToKey: function (coords) {\n\t\treturn coords.x + ':' + coords.y + ':' + coords.z;\n\t},\n\n\t// converts tile cache key to coordinates\n\t_keyToTileCoords: function (key) {\n\t\tvar k = key.split(':'),\n\t\t    coords = new L.Point(+k[0], +k[1]);\n\t\tcoords.z = +k[2];\n\t\treturn coords;\n\t},\n\n\t_removeTile: function (key) {\n\t\tvar tile = this._tiles[key];\n\t\tif (!tile) { return; }\n\n\t\tL.DomUtil.remove(tile.el);\n\n\t\tdelete this._tiles[key];\n\n\t\t// @event tileunload: TileEvent\n\t\t// Fired when a tile is removed (e.g. when a tile goes off the screen).\n\t\tthis.fire('tileunload', {\n\t\t\ttile: tile.el,\n\t\t\tcoords: this._keyToTileCoords(key)\n\t\t});\n\t},\n\n\t_initTile: function (tile) {\n\t\tL.DomUtil.addClass(tile, 'leaflet-tile');\n\n\t\tvar tileSize = this.getTileSize();\n\t\ttile.style.width = tileSize.x + 'px';\n\t\ttile.style.height = tileSize.y + 'px';\n\n\t\ttile.onselectstart = L.Util.falseFn;\n\t\ttile.onmousemove = L.Util.falseFn;\n\n\t\t// update opacity on tiles in IE7-8 because of filter inheritance problems\n\t\tif (L.Browser.ielt9 && this.options.opacity < 1) {\n\t\t\tL.DomUtil.setOpacity(tile, this.options.opacity);\n\t\t}\n\n\t\t// without this hack, tiles disappear after zoom on Chrome for Android\n\t\t// https://github.com/Leaflet/Leaflet/issues/2078\n\t\tif (L.Browser.android && !L.Browser.android23) {\n\t\t\ttile.style.WebkitBackfaceVisibility = 'hidden';\n\t\t}\n\t},\n\n\t_addTile: function (coords, container) {\n\t\tvar tilePos = this._getTilePos(coords),\n\t\t    key = this._tileCoordsToKey(coords);\n\n\t\tvar tile = this.createTile(this._wrapCoords(coords), L.bind(this._tileReady, this, coords));\n\n\t\tthis._initTile(tile);\n\n\t\t// if createTile is defined with a second argument (\"done\" callback),\n\t\t// we know that tile is async and will be ready later; otherwise\n\t\tif (this.createTile.length < 2) {\n\t\t\t// mark tile as ready, but delay one frame for opacity animation to happen\n\t\t\tL.Util.requestAnimFrame(L.bind(this._tileReady, this, coords, null, tile));\n\t\t}\n\n\t\tL.DomUtil.setPosition(tile, tilePos);\n\n\t\t// save tile in cache\n\t\tthis._tiles[key] = {\n\t\t\tel: tile,\n\t\t\tcoords: coords,\n\t\t\tcurrent: true\n\t\t};\n\n\t\tcontainer.appendChild(tile);\n\t\t// @event tileloadstart: TileEvent\n\t\t// Fired when a tile is requested and starts loading.\n\t\tthis.fire('tileloadstart', {\n\t\t\ttile: tile,\n\t\t\tcoords: coords\n\t\t});\n\t},\n\n\t_tileReady: function (coords, err, tile) {\n\t\tif (!this._map) { return; }\n\n\t\tif (err) {\n\t\t\t// @event tileerror: TileErrorEvent\n\t\t\t// Fired when there is an error loading a tile.\n\t\t\tthis.fire('tileerror', {\n\t\t\t\terror: err,\n\t\t\t\ttile: tile,\n\t\t\t\tcoords: coords\n\t\t\t});\n\t\t}\n\n\t\tvar key = this._tileCoordsToKey(coords);\n\n\t\ttile = this._tiles[key];\n\t\tif (!tile) { return; }\n\n\t\ttile.loaded = +new Date();\n\t\tif (this._map._fadeAnimated) {\n\t\t\tL.DomUtil.setOpacity(tile.el, 0);\n\t\t\tL.Util.cancelAnimFrame(this._fadeFrame);\n\t\t\tthis._fadeFrame = L.Util.requestAnimFrame(this._updateOpacity, this);\n\t\t} else {\n\t\t\ttile.active = true;\n\t\t\tthis._pruneTiles();\n\t\t}\n\n\t\tif (!err) {\n\t\t\tL.DomUtil.addClass(tile.el, 'leaflet-tile-loaded');\n\n\t\t\t// @event tileload: TileEvent\n\t\t\t// Fired when a tile loads.\n\t\t\tthis.fire('tileload', {\n\t\t\t\ttile: tile.el,\n\t\t\t\tcoords: coords\n\t\t\t});\n\t\t}\n\n\t\tif (this._noTilesToLoad()) {\n\t\t\tthis._loading = false;\n\t\t\t// @event load: Event\n\t\t\t// Fired when the grid layer loaded all visible tiles.\n\t\t\tthis.fire('load');\n\n\t\t\tif (L.Browser.ielt9 || !this._map._fadeAnimated) {\n\t\t\t\tL.Util.requestAnimFrame(this._pruneTiles, this);\n\t\t\t} else {\n\t\t\t\t// Wait a bit more than 0.2 secs (the duration of the tile fade-in)\n\t\t\t\t// to trigger a pruning.\n\t\t\t\tsetTimeout(L.bind(this._pruneTiles, this), 250);\n\t\t\t}\n\t\t}\n\t},\n\n\t_getTilePos: function (coords) {\n\t\treturn coords.scaleBy(this.getTileSize()).subtract(this._level.origin);\n\t},\n\n\t_wrapCoords: function (coords) {\n\t\tvar newCoords = new L.Point(\n\t\t\tthis._wrapX ? L.Util.wrapNum(coords.x, this._wrapX) : coords.x,\n\t\t\tthis._wrapY ? L.Util.wrapNum(coords.y, this._wrapY) : coords.y);\n\t\tnewCoords.z = coords.z;\n\t\treturn newCoords;\n\t},\n\n\t_pxBoundsToTileRange: function (bounds) {\n\t\tvar tileSize = this.getTileSize();\n\t\treturn new L.Bounds(\n\t\t\tbounds.min.unscaleBy(tileSize).floor(),\n\t\t\tbounds.max.unscaleBy(tileSize).ceil().subtract([1, 1]));\n\t},\n\n\t_noTilesToLoad: function () {\n\t\tfor (var key in this._tiles) {\n\t\t\tif (!this._tiles[key].loaded) { return false; }\n\t\t}\n\t\treturn true;\n\t}\n});\n\n// @factory L.gridLayer(options?: GridLayer options)\n// Creates a new instance of GridLayer with the supplied options.\nL.gridLayer = function (options) {\n\treturn new L.GridLayer(options);\n};\n\n\n\n/*\r\n * @class TileLayer\r\n * @inherits GridLayer\r\n * @aka L.TileLayer\r\n * Used to load and display tile layers on the map. Extends `GridLayer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png?{foo}', {foo: 'bar'}).addTo(map);\r\n * ```\r\n *\r\n * @section URL template\r\n * @example\r\n *\r\n * A string of the following form:\r\n *\r\n * ```\r\n * 'http://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png'\r\n * ```\r\n *\r\n * `{s}` means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; `a`, `b` or `c` by default, can be omitted), `{z}` — zoom level, `{x}` and `{y}` — tile coordinates. `{r}` can be used to add @2x to the URL to load retina tiles.\r\n *\r\n * You can use custom keys in the template, which will be [evaluated](#util-template) from TileLayer options, like this:\r\n *\r\n * ```\r\n * L.tileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'});\r\n * ```\r\n */\r\n\r\n\r\nL.TileLayer = L.GridLayer.extend({\r\n\r\n\t// @section\r\n\t// @aka TileLayer options\r\n\toptions: {\r\n\t\t// @option minZoom: Number = 0\r\n\t\t// Minimum zoom number.\r\n\t\tminZoom: 0,\r\n\r\n\t\t// @option maxZoom: Number = 18\r\n\t\t// Maximum zoom number.\r\n\t\tmaxZoom: 18,\r\n\r\n\t\t// @option maxNativeZoom: Number = null\r\n\t\t// Maximum zoom number the tile source has available. If it is specified,\r\n\t\t// the tiles on all zoom levels higher than `maxNativeZoom` will be loaded\r\n\t\t// from `maxNativeZoom` level and auto-scaled.\r\n\t\tmaxNativeZoom: null,\r\n\r\n\t\t// @option minNativeZoom: Number = null\r\n\t\t// Minimum zoom number the tile source has available. If it is specified,\r\n\t\t// the tiles on all zoom levels lower than `minNativeZoom` will be loaded\r\n\t\t// from `minNativeZoom` level and auto-scaled.\r\n\t\tminNativeZoom: null,\r\n\r\n\t\t// @option subdomains: String|String[] = 'abc'\r\n\t\t// Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.\r\n\t\tsubdomains: 'abc',\r\n\r\n\t\t// @option errorTileUrl: String = ''\r\n\t\t// URL to the tile image to show in place of the tile that failed to load.\r\n\t\terrorTileUrl: '',\r\n\r\n\t\t// @option zoomOffset: Number = 0\r\n\t\t// The zoom number used in tile URLs will be offset with this value.\r\n\t\tzoomOffset: 0,\r\n\r\n\t\t// @option tms: Boolean = false\r\n\t\t// If `true`, inverses Y axis numbering for tiles (turn this on for [TMS](https://en.wikipedia.org/wiki/Tile_Map_Service) services).\r\n\t\ttms: false,\r\n\r\n\t\t// @option zoomReverse: Boolean = false\r\n\t\t// If set to true, the zoom number used in tile URLs will be reversed (`maxZoom - zoom` instead of `zoom`)\r\n\t\tzoomReverse: false,\r\n\r\n\t\t// @option detectRetina: Boolean = false\r\n\t\t// If `true` and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.\r\n\t\tdetectRetina: false,\r\n\r\n\t\t// @option crossOrigin: Boolean = false\r\n\t\t// If true, all tiles will have their crossOrigin attribute set to ''. This is needed if you want to access tile pixel data.\r\n\t\tcrossOrigin: false\r\n\t},\r\n\r\n\tinitialize: function (url, options) {\r\n\r\n\t\tthis._url = url;\r\n\r\n\t\toptions = L.setOptions(this, options);\r\n\r\n\t\t// detecting retina displays, adjusting tileSize and zoom levels\r\n\t\tif (options.detectRetina && L.Browser.retina && options.maxZoom > 0) {\r\n\r\n\t\t\toptions.tileSize = Math.floor(options.tileSize / 2);\r\n\r\n\t\t\tif (!options.zoomReverse) {\r\n\t\t\t\toptions.zoomOffset++;\r\n\t\t\t\toptions.maxZoom--;\r\n\t\t\t} else {\r\n\t\t\t\toptions.zoomOffset--;\r\n\t\t\t\toptions.minZoom++;\r\n\t\t\t}\r\n\r\n\t\t\toptions.minZoom = Math.max(0, options.minZoom);\r\n\t\t}\r\n\r\n\t\tif (typeof options.subdomains === 'string') {\r\n\t\t\toptions.subdomains = options.subdomains.split('');\r\n\t\t}\r\n\r\n\t\t// for https://github.com/Leaflet/Leaflet/issues/137\r\n\t\tif (!L.Browser.android) {\r\n\t\t\tthis.on('tileunload', this._onTileRemove);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method setUrl(url: String, noRedraw?: Boolean): this\r\n\t// Updates the layer's URL template and redraws it (unless `noRedraw` is set to `true`).\r\n\tsetUrl: function (url, noRedraw) {\r\n\t\tthis._url = url;\r\n\r\n\t\tif (!noRedraw) {\r\n\t\t\tthis.redraw();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method createTile(coords: Object, done?: Function): HTMLElement\r\n\t// Called only internally, overrides GridLayer's [`createTile()`](#gridlayer-createtile)\r\n\t// to return an `<img>` HTML element with the appropiate image URL given `coords`. The `done`\r\n\t// callback is called when the tile has been loaded.\r\n\tcreateTile: function (coords, done) {\r\n\t\tvar tile = document.createElement('img');\r\n\r\n\t\tL.DomEvent.on(tile, 'load', L.bind(this._tileOnLoad, this, done, tile));\r\n\t\tL.DomEvent.on(tile, 'error', L.bind(this._tileOnError, this, done, tile));\r\n\r\n\t\tif (this.options.crossOrigin) {\r\n\t\t\ttile.crossOrigin = '';\r\n\t\t}\r\n\r\n\t\t/*\r\n\t\t Alt tag is set to empty string to keep screen readers from reading URL and for compliance reasons\r\n\t\t http://www.w3.org/TR/WCAG20-TECHS/H67\r\n\t\t*/\r\n\t\ttile.alt = '';\r\n\r\n\t\t/*\r\n\t\t Set role=\"presentation\" to force screen readers to ignore this\r\n\t\t https://www.w3.org/TR/wai-aria/roles#textalternativecomputation\r\n\t\t*/\r\n\t\ttile.setAttribute('role', 'presentation');\r\n\r\n\t\ttile.src = this.getTileUrl(coords);\r\n\r\n\t\treturn tile;\r\n\t},\r\n\r\n\t// @section Extension methods\r\n\t// @uninheritable\r\n\t// Layers extending `TileLayer` might reimplement the following method.\r\n\t// @method getTileUrl(coords: Object): String\r\n\t// Called only internally, returns the URL for a tile given its coordinates.\r\n\t// Classes extending `TileLayer` can override this function to provide custom tile URL naming schemes.\r\n\tgetTileUrl: function (coords) {\r\n\t\tvar data = {\r\n\t\t\tr: L.Browser.retina ? '@2x' : '',\r\n\t\t\ts: this._getSubdomain(coords),\r\n\t\t\tx: coords.x,\r\n\t\t\ty: coords.y,\r\n\t\t\tz: this._getZoomForUrl()\r\n\t\t};\r\n\t\tif (this._map && !this._map.options.crs.infinite) {\r\n\t\t\tvar invertedY = this._globalTileRange.max.y - coords.y;\r\n\t\t\tif (this.options.tms) {\r\n\t\t\t\tdata['y'] = invertedY;\r\n\t\t\t}\r\n\t\t\tdata['-y'] = invertedY;\r\n\t\t}\r\n\r\n\t\treturn L.Util.template(this._url, L.extend(data, this.options));\r\n\t},\r\n\r\n\t_tileOnLoad: function (done, tile) {\r\n\t\t// For https://github.com/Leaflet/Leaflet/issues/3332\r\n\t\tif (L.Browser.ielt9) {\r\n\t\t\tsetTimeout(L.bind(done, this, null, tile), 0);\r\n\t\t} else {\r\n\t\t\tdone(null, tile);\r\n\t\t}\r\n\t},\r\n\r\n\t_tileOnError: function (done, tile, e) {\r\n\t\tvar errorUrl = this.options.errorTileUrl;\r\n\t\tif (errorUrl && tile.src !== errorUrl) {\r\n\t\t\ttile.src = errorUrl;\r\n\t\t}\r\n\t\tdone(e, tile);\r\n\t},\r\n\r\n\tgetTileSize: function () {\r\n\t\tvar map = this._map,\r\n\t\ttileSize = L.GridLayer.prototype.getTileSize.call(this),\r\n\t\tzoom = this._tileZoom + this.options.zoomOffset,\r\n\t\tminNativeZoom = this.options.minNativeZoom,\r\n\t\tmaxNativeZoom = this.options.maxNativeZoom;\r\n\r\n\t\t// decrease tile size when scaling below minNativeZoom\r\n\t\tif (minNativeZoom !== null && zoom < minNativeZoom) {\r\n\t\t\treturn tileSize.divideBy(map.getZoomScale(minNativeZoom, zoom)).round();\r\n\t\t}\r\n\r\n\t\t// increase tile size when scaling above maxNativeZoom\r\n\t\tif (maxNativeZoom !== null && zoom > maxNativeZoom) {\r\n\t\t\treturn tileSize.divideBy(map.getZoomScale(maxNativeZoom, zoom)).round();\r\n\t\t}\r\n\r\n\t\treturn tileSize;\r\n\t},\r\n\r\n\t_onTileRemove: function (e) {\r\n\t\te.tile.onload = null;\r\n\t},\r\n\r\n\t_getZoomForUrl: function () {\r\n\t\tvar zoom = this._tileZoom,\r\n\t\tmaxZoom = this.options.maxZoom,\r\n\t\tzoomReverse = this.options.zoomReverse,\r\n\t\tzoomOffset = this.options.zoomOffset,\r\n\t\tminNativeZoom = this.options.minNativeZoom,\r\n\t\tmaxNativeZoom = this.options.maxNativeZoom;\r\n\r\n\t\tif (zoomReverse) {\r\n\t\t\tzoom = maxZoom - zoom;\r\n\t\t}\r\n\r\n\t\tzoom += zoomOffset;\r\n\r\n\t\tif (minNativeZoom !== null && zoom < minNativeZoom) {\r\n\t\t\treturn minNativeZoom;\r\n\t\t}\r\n\r\n\t\tif (maxNativeZoom !== null && zoom > maxNativeZoom) {\r\n\t\t\treturn maxNativeZoom;\r\n\t\t}\r\n\r\n\t\treturn zoom;\r\n\t},\r\n\r\n\t_getSubdomain: function (tilePoint) {\r\n\t\tvar index = Math.abs(tilePoint.x + tilePoint.y) % this.options.subdomains.length;\r\n\t\treturn this.options.subdomains[index];\r\n\t},\r\n\r\n\t// stops loading all tiles in the background layer\r\n\t_abortLoading: function () {\r\n\t\tvar i, tile;\r\n\t\tfor (i in this._tiles) {\r\n\t\t\tif (this._tiles[i].coords.z !== this._tileZoom) {\r\n\t\t\t\ttile = this._tiles[i].el;\r\n\r\n\t\t\t\ttile.onload = L.Util.falseFn;\r\n\t\t\t\ttile.onerror = L.Util.falseFn;\r\n\r\n\t\t\t\tif (!tile.complete) {\r\n\t\t\t\t\ttile.src = L.Util.emptyImageUrl;\r\n\t\t\t\t\tL.DomUtil.remove(tile);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n});\r\n\r\n\r\n// @factory L.tilelayer(urlTemplate: String, options?: TileLayer options)\r\n// Instantiates a tile layer object given a `URL template` and optionally an options object.\r\n\r\nL.tileLayer = function (url, options) {\r\n\treturn new L.TileLayer(url, options);\r\n};\r\n\n\n\n/*\r\n * @class TileLayer.WMS\r\n * @inherits TileLayer\r\n * @aka L.TileLayer.WMS\r\n * Used to display [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services as tile layers on the map. Extends `TileLayer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var nexrad = L.tileLayer.wms(\"http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi\", {\r\n * \tlayers: 'nexrad-n0r-900913',\r\n * \tformat: 'image/png',\r\n * \ttransparent: true,\r\n * \tattribution: \"Weather data © 2012 IEM Nexrad\"\r\n * });\r\n * ```\r\n */\r\n\r\nL.TileLayer.WMS = L.TileLayer.extend({\r\n\r\n\t// @section\r\n\t// @aka TileLayer.WMS options\r\n\t// If any custom options not documented here are used, they will be sent to the\r\n\t// WMS server as extra parameters in each request URL. This can be useful for\r\n\t// [non-standard vendor WMS parameters](http://docs.geoserver.org/stable/en/user/services/wms/vendor.html).\r\n\tdefaultWmsParams: {\r\n\t\tservice: 'WMS',\r\n\t\trequest: 'GetMap',\r\n\r\n\t\t// @option layers: String = ''\r\n\t\t// **(required)** Comma-separated list of WMS layers to show.\r\n\t\tlayers: '',\r\n\r\n\t\t// @option styles: String = ''\r\n\t\t// Comma-separated list of WMS styles.\r\n\t\tstyles: '',\r\n\r\n\t\t// @option format: String = 'image/jpeg'\r\n\t\t// WMS image format (use `'image/png'` for layers with transparency).\r\n\t\tformat: 'image/jpeg',\r\n\r\n\t\t// @option transparent: Boolean = false\r\n\t\t// If `true`, the WMS service will return images with transparency.\r\n\t\ttransparent: false,\r\n\r\n\t\t// @option version: String = '1.1.1'\r\n\t\t// Version of the WMS service to use\r\n\t\tversion: '1.1.1'\r\n\t},\r\n\r\n\toptions: {\r\n\t\t// @option crs: CRS = null\r\n\t\t// Coordinate Reference System to use for the WMS requests, defaults to\r\n\t\t// map CRS. Don't change this if you're not sure what it means.\r\n\t\tcrs: null,\r\n\r\n\t\t// @option uppercase: Boolean = false\r\n\t\t// If `true`, WMS request parameter keys will be uppercase.\r\n\t\tuppercase: false\r\n\t},\r\n\r\n\tinitialize: function (url, options) {\r\n\r\n\t\tthis._url = url;\r\n\r\n\t\tvar wmsParams = L.extend({}, this.defaultWmsParams);\r\n\r\n\t\t// all keys that are not TileLayer options go to WMS params\r\n\t\tfor (var i in options) {\r\n\t\t\tif (!(i in this.options)) {\r\n\t\t\t\twmsParams[i] = options[i];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\toptions = L.setOptions(this, options);\r\n\r\n\t\twmsParams.width = wmsParams.height = options.tileSize * (options.detectRetina && L.Browser.retina ? 2 : 1);\r\n\r\n\t\tthis.wmsParams = wmsParams;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\r\n\t\tthis._crs = this.options.crs || map.options.crs;\r\n\t\tthis._wmsVersion = parseFloat(this.wmsParams.version);\r\n\r\n\t\tvar projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs';\r\n\t\tthis.wmsParams[projectionKey] = this._crs.code;\r\n\r\n\t\tL.TileLayer.prototype.onAdd.call(this, map);\r\n\t},\r\n\r\n\tgetTileUrl: function (coords) {\r\n\r\n\t\tvar tileBounds = this._tileCoordsToBounds(coords),\r\n\t\t    nw = this._crs.project(tileBounds.getNorthWest()),\r\n\t\t    se = this._crs.project(tileBounds.getSouthEast()),\r\n\r\n\t\t    bbox = (this._wmsVersion >= 1.3 && this._crs === L.CRS.EPSG4326 ?\r\n\t\t\t    [se.y, nw.x, nw.y, se.x] :\r\n\t\t\t    [nw.x, se.y, se.x, nw.y]).join(','),\r\n\r\n\t\t    url = L.TileLayer.prototype.getTileUrl.call(this, coords);\r\n\r\n\t\treturn url +\r\n\t\t\tL.Util.getParamString(this.wmsParams, url, this.options.uppercase) +\r\n\t\t\t(this.options.uppercase ? '&BBOX=' : '&bbox=') + bbox;\r\n\t},\r\n\r\n\t// @method setParams(params: Object, noRedraw?: Boolean): this\r\n\t// Merges an object with the new parameters and re-requests tiles on the current screen (unless `noRedraw` was set to true).\r\n\tsetParams: function (params, noRedraw) {\r\n\r\n\t\tL.extend(this.wmsParams, params);\r\n\r\n\t\tif (!noRedraw) {\r\n\t\t\tthis.redraw();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n});\r\n\r\n\r\n// @factory L.tileLayer.wms(baseUrl: String, options: TileLayer.WMS options)\r\n// Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.\r\nL.tileLayer.wms = function (url, options) {\r\n\treturn new L.TileLayer.WMS(url, options);\r\n};\r\n\n\n\n/*\r\n * @class ImageOverlay\r\n * @aka L.ImageOverlay\r\n * @inherits Interactive layer\r\n *\r\n * Used to load and display a single image over specific bounds of the map. Extends `Layer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg',\r\n * \timageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]];\r\n * L.imageOverlay(imageUrl, imageBounds).addTo(map);\r\n * ```\r\n */\r\n\r\nL.ImageOverlay = L.Layer.extend({\r\n\r\n\t// @section\r\n\t// @aka ImageOverlay options\r\n\toptions: {\r\n\t\t// @option opacity: Number = 1.0\r\n\t\t// The opacity of the image overlay.\r\n\t\topacity: 1,\r\n\r\n\t\t// @option alt: String = ''\r\n\t\t// Text for the `alt` attribute of the image (useful for accessibility).\r\n\t\talt: '',\r\n\r\n\t\t// @option interactive: Boolean = false\r\n\t\t// If `true`, the image overlay will emit [mouse events](#interactive-layer) when clicked or hovered.\r\n\t\tinteractive: false,\r\n\r\n\t\t// @option crossOrigin: Boolean = false\r\n\t\t// If true, the image will have its crossOrigin attribute set to ''. This is needed if you want to access image pixel data.\r\n\t\tcrossOrigin: false\r\n\t},\r\n\r\n\tinitialize: function (url, bounds, options) { // (String, LatLngBounds, Object)\r\n\t\tthis._url = url;\r\n\t\tthis._bounds = L.latLngBounds(bounds);\r\n\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tonAdd: function () {\r\n\t\tif (!this._image) {\r\n\t\t\tthis._initImage();\r\n\r\n\t\t\tif (this.options.opacity < 1) {\r\n\t\t\t\tthis._updateOpacity();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (this.options.interactive) {\r\n\t\t\tL.DomUtil.addClass(this._image, 'leaflet-interactive');\r\n\t\t\tthis.addInteractiveTarget(this._image);\r\n\t\t}\r\n\r\n\t\tthis.getPane().appendChild(this._image);\r\n\t\tthis._reset();\r\n\t},\r\n\r\n\tonRemove: function () {\r\n\t\tL.DomUtil.remove(this._image);\r\n\t\tif (this.options.interactive) {\r\n\t\t\tthis.removeInteractiveTarget(this._image);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method setOpacity(opacity: Number): this\r\n\t// Sets the opacity of the overlay.\r\n\tsetOpacity: function (opacity) {\r\n\t\tthis.options.opacity = opacity;\r\n\r\n\t\tif (this._image) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetStyle: function (styleOpts) {\r\n\t\tif (styleOpts.opacity) {\r\n\t\t\tthis.setOpacity(styleOpts.opacity);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method bringToFront(): this\r\n\t// Brings the layer to the top of all overlays.\r\n\tbringToFront: function () {\r\n\t\tif (this._map) {\r\n\t\t\tL.DomUtil.toFront(this._image);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method bringToBack(): this\r\n\t// Brings the layer to the bottom of all overlays.\r\n\tbringToBack: function () {\r\n\t\tif (this._map) {\r\n\t\t\tL.DomUtil.toBack(this._image);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method setUrl(url: String): this\r\n\t// Changes the URL of the image.\r\n\tsetUrl: function (url) {\r\n\t\tthis._url = url;\r\n\r\n\t\tif (this._image) {\r\n\t\t\tthis._image.src = url;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method setBounds(bounds: LatLngBounds): this\r\n\t// Update the bounds that this ImageOverlay covers\r\n\tsetBounds: function (bounds) {\r\n\t\tthis._bounds = bounds;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._reset();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetEvents: function () {\r\n\t\tvar events = {\r\n\t\t\tzoom: this._reset,\r\n\t\t\tviewreset: this._reset\r\n\t\t};\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tevents.zoomanim = this._animateZoom;\r\n\t\t}\r\n\r\n\t\treturn events;\r\n\t},\r\n\r\n\t// @method getBounds(): LatLngBounds\r\n\t// Get the bounds that this ImageOverlay covers\r\n\tgetBounds: function () {\r\n\t\treturn this._bounds;\r\n\t},\r\n\r\n\t// @method getElement(): HTMLElement\r\n\t// Get the img element that represents the ImageOverlay on the map\r\n\tgetElement: function () {\r\n\t\treturn this._image;\r\n\t},\r\n\r\n\t_initImage: function () {\r\n\t\tvar img = this._image = L.DomUtil.create('img',\r\n\t\t\t\t'leaflet-image-layer ' + (this._zoomAnimated ? 'leaflet-zoom-animated' : ''));\r\n\r\n\t\timg.onselectstart = L.Util.falseFn;\r\n\t\timg.onmousemove = L.Util.falseFn;\r\n\r\n\t\timg.onload = L.bind(this.fire, this, 'load');\r\n\r\n\t\tif (this.options.crossOrigin) {\r\n\t\t\timg.crossOrigin = '';\r\n\t\t}\r\n\r\n\t\timg.src = this._url;\r\n\t\timg.alt = this.options.alt;\r\n\t},\r\n\r\n\t_animateZoom: function (e) {\r\n\t\tvar scale = this._map.getZoomScale(e.zoom),\r\n\t\t    offset = this._map._latLngBoundsToNewLayerBounds(this._bounds, e.zoom, e.center).min;\r\n\r\n\t\tL.DomUtil.setTransform(this._image, offset, scale);\r\n\t},\r\n\r\n\t_reset: function () {\r\n\t\tvar image = this._image,\r\n\t\t    bounds = new L.Bounds(\r\n\t\t        this._map.latLngToLayerPoint(this._bounds.getNorthWest()),\r\n\t\t        this._map.latLngToLayerPoint(this._bounds.getSouthEast())),\r\n\t\t    size = bounds.getSize();\r\n\r\n\t\tL.DomUtil.setPosition(image, bounds.min);\r\n\r\n\t\timage.style.width  = size.x + 'px';\r\n\t\timage.style.height = size.y + 'px';\r\n\t},\r\n\r\n\t_updateOpacity: function () {\r\n\t\tL.DomUtil.setOpacity(this._image, this.options.opacity);\r\n\t}\r\n});\r\n\r\n// @factory L.imageOverlay(imageUrl: String, bounds: LatLngBounds, options?: ImageOverlay options)\r\n// Instantiates an image overlay object given the URL of the image and the\r\n// geographical bounds it is tied to.\r\nL.imageOverlay = function (url, bounds, options) {\r\n\treturn new L.ImageOverlay(url, bounds, options);\r\n};\r\n\n\n\n/*\r\n * @class Icon\r\n * @aka L.Icon\r\n * @inherits Layer\r\n *\r\n * Represents an icon to provide when creating a marker.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var myIcon = L.icon({\r\n *     iconUrl: 'my-icon.png',\r\n *     iconRetinaUrl: 'my-icon@2x.png',\r\n *     iconSize: [38, 95],\r\n *     iconAnchor: [22, 94],\r\n *     popupAnchor: [-3, -76],\r\n *     shadowUrl: 'my-icon-shadow.png',\r\n *     shadowRetinaUrl: 'my-icon-shadow@2x.png',\r\n *     shadowSize: [68, 95],\r\n *     shadowAnchor: [22, 94]\r\n * });\r\n *\r\n * L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);\r\n * ```\r\n *\r\n * `L.Icon.Default` extends `L.Icon` and is the blue icon Leaflet uses for markers by default.\r\n *\r\n */\r\n\r\nL.Icon = L.Class.extend({\r\n\r\n\t/* @section\r\n\t * @aka Icon options\r\n\t *\r\n\t * @option iconUrl: String = null\r\n\t * **(required)** The URL to the icon image (absolute or relative to your script path).\r\n\t *\r\n\t * @option iconRetinaUrl: String = null\r\n\t * The URL to a retina sized version of the icon image (absolute or relative to your\r\n\t * script path). Used for Retina screen devices.\r\n\t *\r\n\t * @option iconSize: Point = null\r\n\t * Size of the icon image in pixels.\r\n\t *\r\n\t * @option iconAnchor: Point = null\r\n\t * The coordinates of the \"tip\" of the icon (relative to its top left corner). The icon\r\n\t * will be aligned so that this point is at the marker's geographical location. Centered\r\n\t * by default if size is specified, also can be set in CSS with negative margins.\r\n\t *\r\n\t * @option popupAnchor: Point = null\r\n\t * The coordinates of the point from which popups will \"open\", relative to the icon anchor.\r\n\t *\r\n\t * @option shadowUrl: String = null\r\n\t * The URL to the icon shadow image. If not specified, no shadow image will be created.\r\n\t *\r\n\t * @option shadowRetinaUrl: String = null\r\n\t *\r\n\t * @option shadowSize: Point = null\r\n\t * Size of the shadow image in pixels.\r\n\t *\r\n\t * @option shadowAnchor: Point = null\r\n\t * The coordinates of the \"tip\" of the shadow (relative to its top left corner) (the same\r\n\t * as iconAnchor if not specified).\r\n\t *\r\n\t * @option className: String = ''\r\n\t * A custom class name to assign to both icon and shadow images. Empty by default.\r\n\t */\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\t// @method createIcon(oldIcon?: HTMLElement): HTMLElement\r\n\t// Called internally when the icon has to be shown, returns a `<img>` HTML element\r\n\t// styled according to the options.\r\n\tcreateIcon: function (oldIcon) {\r\n\t\treturn this._createIcon('icon', oldIcon);\r\n\t},\r\n\r\n\t// @method createShadow(oldIcon?: HTMLElement): HTMLElement\r\n\t// As `createIcon`, but for the shadow beneath it.\r\n\tcreateShadow: function (oldIcon) {\r\n\t\treturn this._createIcon('shadow', oldIcon);\r\n\t},\r\n\r\n\t_createIcon: function (name, oldIcon) {\r\n\t\tvar src = this._getIconUrl(name);\r\n\r\n\t\tif (!src) {\r\n\t\t\tif (name === 'icon') {\r\n\t\t\t\tthrow new Error('iconUrl not set in Icon options (see the docs).');\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tvar img = this._createImg(src, oldIcon && oldIcon.tagName === 'IMG' ? oldIcon : null);\r\n\t\tthis._setIconStyles(img, name);\r\n\r\n\t\treturn img;\r\n\t},\r\n\r\n\t_setIconStyles: function (img, name) {\r\n\t\tvar options = this.options;\r\n\t\tvar sizeOption = options[name + 'Size'];\r\n\r\n\t\tif (typeof sizeOption === 'number') {\r\n\t\t\tsizeOption = [sizeOption, sizeOption];\r\n\t\t}\r\n\r\n\t\tvar size = L.point(sizeOption),\r\n\t\t    anchor = L.point(name === 'shadow' && options.shadowAnchor || options.iconAnchor ||\r\n\t\t            size && size.divideBy(2, true));\r\n\r\n\t\timg.className = 'leaflet-marker-' + name + ' ' + (options.className || '');\r\n\r\n\t\tif (anchor) {\r\n\t\t\timg.style.marginLeft = (-anchor.x) + 'px';\r\n\t\t\timg.style.marginTop  = (-anchor.y) + 'px';\r\n\t\t}\r\n\r\n\t\tif (size) {\r\n\t\t\timg.style.width  = size.x + 'px';\r\n\t\t\timg.style.height = size.y + 'px';\r\n\t\t}\r\n\t},\r\n\r\n\t_createImg: function (src, el) {\r\n\t\tel = el || document.createElement('img');\r\n\t\tel.src = src;\r\n\t\treturn el;\r\n\t},\r\n\r\n\t_getIconUrl: function (name) {\r\n\t\treturn L.Browser.retina && this.options[name + 'RetinaUrl'] || this.options[name + 'Url'];\r\n\t}\r\n});\r\n\r\n\r\n// @factory L.icon(options: Icon options)\r\n// Creates an icon instance with the given options.\r\nL.icon = function (options) {\r\n\treturn new L.Icon(options);\r\n};\r\n\n\n\n/*\n * @miniclass Icon.Default (Icon)\n * @aka L.Icon.Default\n * @section\n *\n * A trivial subclass of `Icon`, represents the icon to use in `Marker`s when\n * no icon is specified. Points to the blue marker image distributed with Leaflet\n * releases.\n *\n * In order to customize the default icon, just change the properties of `L.Icon.Default.prototype.options`\n * (which is a set of `Icon options`).\n *\n * If you want to _completely_ replace the default icon, override the\n * `L.Marker.prototype.options.icon` with your own icon instead.\n */\n\nL.Icon.Default = L.Icon.extend({\n\n\toptions: {\n\t\ticonUrl:       'marker-icon.png',\n\t\ticonRetinaUrl: 'marker-icon-2x.png',\n\t\tshadowUrl:     'marker-shadow.png',\n\t\ticonSize:    [25, 41],\n\t\ticonAnchor:  [12, 41],\n\t\tpopupAnchor: [1, -34],\n\t\ttooltipAnchor: [16, -28],\n\t\tshadowSize:  [41, 41]\n\t},\n\n\t_getIconUrl: function (name) {\n\t\tif (!L.Icon.Default.imagePath) {\t// Deprecated, backwards-compatibility only\n\t\t\tL.Icon.Default.imagePath = this._detectIconPath();\n\t\t}\n\n\t\t// @option imagePath: String\n\t\t// `L.Icon.Default` will try to auto-detect the absolute location of the\n\t\t// blue icon images. If you are placing these images in a non-standard\n\t\t// way, set this option to point to the right absolute path.\n\t\treturn (this.options.imagePath || L.Icon.Default.imagePath) + L.Icon.prototype._getIconUrl.call(this, name);\n\t},\n\n\t_detectIconPath: function () {\n\t\tvar el = L.DomUtil.create('div',  'leaflet-default-icon-path', document.body);\n\t\tvar path = L.DomUtil.getStyle(el, 'background-image') ||\n\t\t           L.DomUtil.getStyle(el, 'backgroundImage');\t// IE8\n\n\t\tdocument.body.removeChild(el);\n\n\t\treturn path.indexOf('url') === 0 ?\n\t\t\tpath.replace(/^url\\([\\\"\\']?/, '').replace(/marker-icon\\.png[\\\"\\']?\\)$/, '') : '';\n\t}\n});\n\n\n\n/*\r\n * @class Marker\r\n * @inherits Interactive layer\r\n * @aka L.Marker\r\n * L.Marker is used to display clickable/draggable icons on the map. Extends `Layer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.marker([50.5, 30.5]).addTo(map);\r\n * ```\r\n */\r\n\r\nL.Marker = L.Layer.extend({\r\n\r\n\t// @section\r\n\t// @aka Marker options\r\n\toptions: {\r\n\t\t// @option icon: Icon = *\r\n\t\t// Icon class to use for rendering the marker. See [Icon documentation](#L.Icon) for details on how to customize the marker icon. If not specified, a new `L.Icon.Default` is used.\r\n\t\ticon: new L.Icon.Default(),\r\n\r\n\t\t// Option inherited from \"Interactive layer\" abstract class\r\n\t\tinteractive: true,\r\n\r\n\t\t// @option draggable: Boolean = false\r\n\t\t// Whether the marker is draggable with mouse/touch or not.\r\n\t\tdraggable: false,\r\n\r\n\t\t// @option keyboard: Boolean = true\r\n\t\t// Whether the marker can be tabbed to with a keyboard and clicked by pressing enter.\r\n\t\tkeyboard: true,\r\n\r\n\t\t// @option title: String = ''\r\n\t\t// Text for the browser tooltip that appear on marker hover (no tooltip by default).\r\n\t\ttitle: '',\r\n\r\n\t\t// @option alt: String = ''\r\n\t\t// Text for the `alt` attribute of the icon image (useful for accessibility).\r\n\t\talt: '',\r\n\r\n\t\t// @option zIndexOffset: Number = 0\r\n\t\t// By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like `1000` (or high negative value, respectively).\r\n\t\tzIndexOffset: 0,\r\n\r\n\t\t// @option opacity: Number = 1.0\r\n\t\t// The opacity of the marker.\r\n\t\topacity: 1,\r\n\r\n\t\t// @option riseOnHover: Boolean = false\r\n\t\t// If `true`, the marker will get on top of others when you hover the mouse over it.\r\n\t\triseOnHover: false,\r\n\r\n\t\t// @option riseOffset: Number = 250\r\n\t\t// The z-index offset used for the `riseOnHover` feature.\r\n\t\triseOffset: 250,\r\n\r\n\t\t// @option pane: String = 'markerPane'\r\n\t\t// `Map pane` where the markers icon will be added.\r\n\t\tpane: 'markerPane',\r\n\r\n\t\t// FIXME: shadowPane is no longer a valid option\r\n\t\tnonBubblingEvents: ['click', 'dblclick', 'mouseover', 'mouseout', 'contextmenu']\r\n\t},\r\n\r\n\t/* @section\r\n\t *\r\n\t * In addition to [shared layer methods](#Layer) like `addTo()` and `remove()` and [popup methods](#Popup) like bindPopup() you can also use the following methods:\r\n\t */\r\n\r\n\tinitialize: function (latlng, options) {\r\n\t\tL.setOptions(this, options);\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._zoomAnimated = this._zoomAnimated && map.options.markerZoomAnimation;\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tmap.on('zoomanim', this._animateZoom, this);\r\n\t\t}\r\n\r\n\t\tthis._initIcon();\r\n\t\tthis.update();\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tif (this.dragging && this.dragging.enabled()) {\r\n\t\t\tthis.options.draggable = true;\r\n\t\t\tthis.dragging.removeHooks();\r\n\t\t}\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tmap.off('zoomanim', this._animateZoom, this);\r\n\t\t}\r\n\r\n\t\tthis._removeIcon();\r\n\t\tthis._removeShadow();\r\n\t},\r\n\r\n\tgetEvents: function () {\r\n\t\treturn {\r\n\t\t\tzoom: this.update,\r\n\t\t\tviewreset: this.update\r\n\t\t};\r\n\t},\r\n\r\n\t// @method getLatLng: LatLng\r\n\t// Returns the current geographical position of the marker.\r\n\tgetLatLng: function () {\r\n\t\treturn this._latlng;\r\n\t},\r\n\r\n\t// @method setLatLng(latlng: LatLng): this\r\n\t// Changes the marker position to the given point.\r\n\tsetLatLng: function (latlng) {\r\n\t\tvar oldLatLng = this._latlng;\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t\tthis.update();\r\n\r\n\t\t// @event move: Event\r\n\t\t// Fired when the marker is moved via [`setLatLng`](#marker-setlatlng) or by [dragging](#marker-dragging). Old and new coordinates are included in event arguments as `oldLatLng`, `latlng`.\r\n\t\treturn this.fire('move', {oldLatLng: oldLatLng, latlng: this._latlng});\r\n\t},\r\n\r\n\t// @method setZIndexOffset(offset: Number): this\r\n\t// Changes the [zIndex offset](#marker-zindexoffset) of the marker.\r\n\tsetZIndexOffset: function (offset) {\r\n\t\tthis.options.zIndexOffset = offset;\r\n\t\treturn this.update();\r\n\t},\r\n\r\n\t// @method setIcon(icon: Icon): this\r\n\t// Changes the marker icon.\r\n\tsetIcon: function (icon) {\r\n\r\n\t\tthis.options.icon = icon;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._initIcon();\r\n\t\t\tthis.update();\r\n\t\t}\r\n\r\n\t\tif (this._popup) {\r\n\t\t\tthis.bindPopup(this._popup, this._popup.options);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetElement: function () {\r\n\t\treturn this._icon;\r\n\t},\r\n\r\n\tupdate: function () {\r\n\r\n\t\tif (this._icon) {\r\n\t\t\tvar pos = this._map.latLngToLayerPoint(this._latlng).round();\r\n\t\t\tthis._setPos(pos);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initIcon: function () {\r\n\t\tvar options = this.options,\r\n\t\t    classToAdd = 'leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide');\r\n\r\n\t\tvar icon = options.icon.createIcon(this._icon),\r\n\t\t    addIcon = false;\r\n\r\n\t\t// if we're not reusing the icon, remove the old one and init new one\r\n\t\tif (icon !== this._icon) {\r\n\t\t\tif (this._icon) {\r\n\t\t\t\tthis._removeIcon();\r\n\t\t\t}\r\n\t\t\taddIcon = true;\r\n\r\n\t\t\tif (options.title) {\r\n\t\t\t\ticon.title = options.title;\r\n\t\t\t}\r\n\t\t\tif (options.alt) {\r\n\t\t\t\ticon.alt = options.alt;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tL.DomUtil.addClass(icon, classToAdd);\r\n\r\n\t\tif (options.keyboard) {\r\n\t\t\ticon.tabIndex = '0';\r\n\t\t}\r\n\r\n\t\tthis._icon = icon;\r\n\r\n\t\tif (options.riseOnHover) {\r\n\t\t\tthis.on({\r\n\t\t\t\tmouseover: this._bringToFront,\r\n\t\t\t\tmouseout: this._resetZIndex\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tvar newShadow = options.icon.createShadow(this._shadow),\r\n\t\t    addShadow = false;\r\n\r\n\t\tif (newShadow !== this._shadow) {\r\n\t\t\tthis._removeShadow();\r\n\t\t\taddShadow = true;\r\n\t\t}\r\n\r\n\t\tif (newShadow) {\r\n\t\t\tL.DomUtil.addClass(newShadow, classToAdd);\r\n\t\t\tnewShadow.alt = '';\r\n\t\t}\r\n\t\tthis._shadow = newShadow;\r\n\r\n\r\n\t\tif (options.opacity < 1) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\r\n\r\n\t\tif (addIcon) {\r\n\t\t\tthis.getPane().appendChild(this._icon);\r\n\t\t}\r\n\t\tthis._initInteraction();\r\n\t\tif (newShadow && addShadow) {\r\n\t\t\tthis.getPane('shadowPane').appendChild(this._shadow);\r\n\t\t}\r\n\t},\r\n\r\n\t_removeIcon: function () {\r\n\t\tif (this.options.riseOnHover) {\r\n\t\t\tthis.off({\r\n\t\t\t\tmouseover: this._bringToFront,\r\n\t\t\t\tmouseout: this._resetZIndex\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tL.DomUtil.remove(this._icon);\r\n\t\tthis.removeInteractiveTarget(this._icon);\r\n\r\n\t\tthis._icon = null;\r\n\t},\r\n\r\n\t_removeShadow: function () {\r\n\t\tif (this._shadow) {\r\n\t\t\tL.DomUtil.remove(this._shadow);\r\n\t\t}\r\n\t\tthis._shadow = null;\r\n\t},\r\n\r\n\t_setPos: function (pos) {\r\n\t\tL.DomUtil.setPosition(this._icon, pos);\r\n\r\n\t\tif (this._shadow) {\r\n\t\t\tL.DomUtil.setPosition(this._shadow, pos);\r\n\t\t}\r\n\r\n\t\tthis._zIndex = pos.y + this.options.zIndexOffset;\r\n\r\n\t\tthis._resetZIndex();\r\n\t},\r\n\r\n\t_updateZIndex: function (offset) {\r\n\t\tthis._icon.style.zIndex = this._zIndex + offset;\r\n\t},\r\n\r\n\t_animateZoom: function (opt) {\r\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round();\r\n\r\n\t\tthis._setPos(pos);\r\n\t},\r\n\r\n\t_initInteraction: function () {\r\n\r\n\t\tif (!this.options.interactive) { return; }\r\n\r\n\t\tL.DomUtil.addClass(this._icon, 'leaflet-interactive');\r\n\r\n\t\tthis.addInteractiveTarget(this._icon);\r\n\r\n\t\tif (L.Handler.MarkerDrag) {\r\n\t\t\tvar draggable = this.options.draggable;\r\n\t\t\tif (this.dragging) {\r\n\t\t\t\tdraggable = this.dragging.enabled();\r\n\t\t\t\tthis.dragging.disable();\r\n\t\t\t}\r\n\r\n\t\t\tthis.dragging = new L.Handler.MarkerDrag(this);\r\n\r\n\t\t\tif (draggable) {\r\n\t\t\t\tthis.dragging.enable();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// @method setOpacity(opacity: Number): this\r\n\t// Changes the opacity of the marker.\r\n\tsetOpacity: function (opacity) {\r\n\t\tthis.options.opacity = opacity;\r\n\t\tif (this._map) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_updateOpacity: function () {\r\n\t\tvar opacity = this.options.opacity;\r\n\r\n\t\tL.DomUtil.setOpacity(this._icon, opacity);\r\n\r\n\t\tif (this._shadow) {\r\n\t\t\tL.DomUtil.setOpacity(this._shadow, opacity);\r\n\t\t}\r\n\t},\r\n\r\n\t_bringToFront: function () {\r\n\t\tthis._updateZIndex(this.options.riseOffset);\r\n\t},\r\n\r\n\t_resetZIndex: function () {\r\n\t\tthis._updateZIndex(0);\r\n\t},\r\n\r\n\t_getPopupAnchor: function () {\r\n\t\treturn this.options.icon.options.popupAnchor || [0, 0];\r\n\t},\r\n\r\n\t_getTooltipAnchor: function () {\r\n\t\treturn this.options.icon.options.tooltipAnchor || [0, 0];\r\n\t}\r\n});\r\n\r\n\r\n// factory L.marker(latlng: LatLng, options? : Marker options)\r\n\r\n// @factory L.marker(latlng: LatLng, options? : Marker options)\r\n// Instantiates a Marker object given a geographical point and optionally an options object.\r\nL.marker = function (latlng, options) {\r\n\treturn new L.Marker(latlng, options);\r\n};\r\n\n\n\n/*\n * @class DivIcon\n * @aka L.DivIcon\n * @inherits Icon\n *\n * Represents a lightweight icon for markers that uses a simple `<div>`\n * element instead of an image. Inherits from `Icon` but ignores the `iconUrl` and shadow options.\n *\n * @example\n * ```js\n * var myIcon = L.divIcon({className: 'my-div-icon'});\n * // you can set .my-div-icon styles in CSS\n *\n * L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);\n * ```\n *\n * By default, it has a 'leaflet-div-icon' CSS class and is styled as a little white square with a shadow.\n */\n\nL.DivIcon = L.Icon.extend({\n\toptions: {\n\t\t// @section\n\t\t// @aka DivIcon options\n\t\ticonSize: [12, 12], // also can be set through CSS\n\n\t\t// iconAnchor: (Point),\n\t\t// popupAnchor: (Point),\n\n\t\t// @option html: String = ''\n\t\t// Custom HTML code to put inside the div element, empty by default.\n\t\thtml: false,\n\n\t\t// @option bgPos: Point = [0, 0]\n\t\t// Optional relative position of the background, in pixels\n\t\tbgPos: null,\n\n\t\tclassName: 'leaflet-div-icon'\n\t},\n\n\tcreateIcon: function (oldIcon) {\n\t\tvar div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'),\n\t\t    options = this.options;\n\n\t\tdiv.innerHTML = options.html !== false ? options.html : '';\n\n\t\tif (options.bgPos) {\n\t\t\tvar bgPos = L.point(options.bgPos);\n\t\t\tdiv.style.backgroundPosition = (-bgPos.x) + 'px ' + (-bgPos.y) + 'px';\n\t\t}\n\t\tthis._setIconStyles(div, 'icon');\n\n\t\treturn div;\n\t},\n\n\tcreateShadow: function () {\n\t\treturn null;\n\t}\n});\n\n// @factory L.divIcon(options: DivIcon options)\n// Creates a `DivIcon` instance with the given options.\nL.divIcon = function (options) {\n\treturn new L.DivIcon(options);\n};\n\n\n\n/*\r\n * @class DivOverlay\r\n * @inherits Layer\r\n * @aka L.DivOverlay\r\n * Base model for L.Popup and L.Tooltip. Inherit from it for custom popup like plugins.\r\n */\r\n\r\n// @namespace DivOverlay\r\nL.DivOverlay = L.Layer.extend({\r\n\r\n\t// @section\r\n\t// @aka DivOverlay options\r\n\toptions: {\r\n\t\t// @option offset: Point = Point(0, 7)\r\n\t\t// The offset of the popup position. Useful to control the anchor\r\n\t\t// of the popup when opening it on some overlays.\r\n\t\toffset: [0, 7],\r\n\r\n\t\t// @option className: String = ''\r\n\t\t// A custom CSS class name to assign to the popup.\r\n\t\tclassName: '',\r\n\r\n\t\t// @option pane: String = 'popupPane'\r\n\t\t// `Map pane` where the popup will be added.\r\n\t\tpane: 'popupPane'\r\n\t},\r\n\r\n\tinitialize: function (options, source) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._source = source;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._zoomAnimated = map._zoomAnimated;\r\n\r\n\t\tif (!this._container) {\r\n\t\t\tthis._initLayout();\r\n\t\t}\r\n\r\n\t\tif (map._fadeAnimated) {\r\n\t\t\tL.DomUtil.setOpacity(this._container, 0);\r\n\t\t}\r\n\r\n\t\tclearTimeout(this._removeTimeout);\r\n\t\tthis.getPane().appendChild(this._container);\r\n\t\tthis.update();\r\n\r\n\t\tif (map._fadeAnimated) {\r\n\t\t\tL.DomUtil.setOpacity(this._container, 1);\r\n\t\t}\r\n\r\n\t\tthis.bringToFront();\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tif (map._fadeAnimated) {\r\n\t\t\tL.DomUtil.setOpacity(this._container, 0);\r\n\t\t\tthis._removeTimeout = setTimeout(L.bind(L.DomUtil.remove, L.DomUtil, this._container), 200);\r\n\t\t} else {\r\n\t\t\tL.DomUtil.remove(this._container);\r\n\t\t}\r\n\t},\r\n\r\n\t// @namespace Popup\r\n\t// @method getLatLng: LatLng\r\n\t// Returns the geographical point of popup.\r\n\tgetLatLng: function () {\r\n\t\treturn this._latlng;\r\n\t},\r\n\r\n\t// @method setLatLng(latlng: LatLng): this\r\n\t// Sets the geographical point where the popup will open.\r\n\tsetLatLng: function (latlng) {\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t\tif (this._map) {\r\n\t\t\tthis._updatePosition();\r\n\t\t\tthis._adjustPan();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getContent: String|HTMLElement\r\n\t// Returns the content of the popup.\r\n\tgetContent: function () {\r\n\t\treturn this._content;\r\n\t},\r\n\r\n\t// @method setContent(htmlContent: String|HTMLElement|Function): this\r\n\t// Sets the HTML content of the popup. If a function is passed the source layer will be passed to the function. The function should return a `String` or `HTMLElement` to be used in the popup.\r\n\tsetContent: function (content) {\r\n\t\tthis._content = content;\r\n\t\tthis.update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getElement: String|HTMLElement\r\n\t// Alias for [getContent()](#popup-getcontent)\r\n\tgetElement: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\t// @method update: null\r\n\t// Updates the popup content, layout and position. Useful for updating the popup after something inside changed, e.g. image loaded.\r\n\tupdate: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tthis._container.style.visibility = 'hidden';\r\n\r\n\t\tthis._updateContent();\r\n\t\tthis._updateLayout();\r\n\t\tthis._updatePosition();\r\n\r\n\t\tthis._container.style.visibility = '';\r\n\r\n\t\tthis._adjustPan();\r\n\t},\r\n\r\n\tgetEvents: function () {\r\n\t\tvar events = {\r\n\t\t\tzoom: this._updatePosition,\r\n\t\t\tviewreset: this._updatePosition\r\n\t\t};\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tevents.zoomanim = this._animateZoom;\r\n\t\t}\r\n\t\treturn events;\r\n\t},\r\n\r\n\t// @method isOpen: Boolean\r\n\t// Returns `true` when the popup is visible on the map.\r\n\tisOpen: function () {\r\n\t\treturn !!this._map && this._map.hasLayer(this);\r\n\t},\r\n\r\n\t// @method bringToFront: this\r\n\t// Brings this popup in front of other popups (in the same map pane).\r\n\tbringToFront: function () {\r\n\t\tif (this._map) {\r\n\t\t\tL.DomUtil.toFront(this._container);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method bringToBack: this\r\n\t// Brings this popup to the back of other popups (in the same map pane).\r\n\tbringToBack: function () {\r\n\t\tif (this._map) {\r\n\t\t\tL.DomUtil.toBack(this._container);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_updateContent: function () {\r\n\t\tif (!this._content) { return; }\r\n\r\n\t\tvar node = this._contentNode;\r\n\t\tvar content = (typeof this._content === 'function') ? this._content(this._source || this) : this._content;\r\n\r\n\t\tif (typeof content === 'string') {\r\n\t\t\tnode.innerHTML = content;\r\n\t\t} else {\r\n\t\t\twhile (node.hasChildNodes()) {\r\n\t\t\t\tnode.removeChild(node.firstChild);\r\n\t\t\t}\r\n\t\t\tnode.appendChild(content);\r\n\t\t}\r\n\t\tthis.fire('contentupdate');\r\n\t},\r\n\r\n\t_updatePosition: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tvar pos = this._map.latLngToLayerPoint(this._latlng),\r\n\t\t    offset = L.point(this.options.offset),\r\n\t\t    anchor = this._getAnchor();\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tL.DomUtil.setPosition(this._container, pos.add(anchor));\r\n\t\t} else {\r\n\t\t\toffset = offset.add(pos).add(anchor);\r\n\t\t}\r\n\r\n\t\tvar bottom = this._containerBottom = -offset.y,\r\n\t\t    left = this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x;\r\n\r\n\t\t// bottom position the popup in case the height of the popup changes (images loading etc)\r\n\t\tthis._container.style.bottom = bottom + 'px';\r\n\t\tthis._container.style.left = left + 'px';\r\n\t},\r\n\r\n\t_getAnchor: function () {\r\n\t\treturn [0, 0];\r\n\t}\r\n\r\n});\r\n\n\n\n/*\r\n * @class Popup\r\n * @inherits DivOverlay\r\n * @aka L.Popup\r\n * Used to open popups in certain places of the map. Use [Map.openPopup](#map-openpopup) to\r\n * open popups while making sure that only one popup is open at one time\r\n * (recommended for usability), or use [Map.addLayer](#map-addlayer) to open as many as you want.\r\n *\r\n * @example\r\n *\r\n * If you want to just bind a popup to marker click and then open it, it's really easy:\r\n *\r\n * ```js\r\n * marker.bindPopup(popupContent).openPopup();\r\n * ```\r\n * Path overlays like polylines also have a `bindPopup` method.\r\n * Here's a more complicated way to open a popup on a map:\r\n *\r\n * ```js\r\n * var popup = L.popup()\r\n * \t.setLatLng(latlng)\r\n * \t.setContent('<p>Hello world!<br />This is a nice popup.</p>')\r\n * \t.openOn(map);\r\n * ```\r\n */\r\n\r\n\r\n// @namespace Popup\r\nL.Popup = L.DivOverlay.extend({\r\n\r\n\t// @section\r\n\t// @aka Popup options\r\n\toptions: {\r\n\t\t// @option maxWidth: Number = 300\r\n\t\t// Max width of the popup, in pixels.\r\n\t\tmaxWidth: 300,\r\n\r\n\t\t// @option minWidth: Number = 50\r\n\t\t// Min width of the popup, in pixels.\r\n\t\tminWidth: 50,\r\n\r\n\t\t// @option maxHeight: Number = null\r\n\t\t// If set, creates a scrollable container of the given height\r\n\t\t// inside a popup if its content exceeds it.\r\n\t\tmaxHeight: null,\r\n\r\n\t\t// @option autoPan: Boolean = true\r\n\t\t// Set it to `false` if you don't want the map to do panning animation\r\n\t\t// to fit the opened popup.\r\n\t\tautoPan: true,\r\n\r\n\t\t// @option autoPanPaddingTopLeft: Point = null\r\n\t\t// The margin between the popup and the top left corner of the map\r\n\t\t// view after autopanning was performed.\r\n\t\tautoPanPaddingTopLeft: null,\r\n\r\n\t\t// @option autoPanPaddingBottomRight: Point = null\r\n\t\t// The margin between the popup and the bottom right corner of the map\r\n\t\t// view after autopanning was performed.\r\n\t\tautoPanPaddingBottomRight: null,\r\n\r\n\t\t// @option autoPanPadding: Point = Point(5, 5)\r\n\t\t// Equivalent of setting both top left and bottom right autopan padding to the same value.\r\n\t\tautoPanPadding: [5, 5],\r\n\r\n\t\t// @option keepInView: Boolean = false\r\n\t\t// Set it to `true` if you want to prevent users from panning the popup\r\n\t\t// off of the screen while it is open.\r\n\t\tkeepInView: false,\r\n\r\n\t\t// @option closeButton: Boolean = true\r\n\t\t// Controls the presence of a close button in the popup.\r\n\t\tcloseButton: true,\r\n\r\n\t\t// @option autoClose: Boolean = true\r\n\t\t// Set it to `false` if you want to override the default behavior of\r\n\t\t// the popup closing when user clicks the map (set globally by\r\n\t\t// the Map's [closePopupOnClick](#map-closepopuponclick) option).\r\n\t\tautoClose: true,\r\n\r\n\t\t// @option className: String = ''\r\n\t\t// A custom CSS class name to assign to the popup.\r\n\t\tclassName: ''\r\n\t},\r\n\r\n\t// @namespace Popup\r\n\t// @method openOn(map: Map): this\r\n\t// Adds the popup to the map and closes the previous one. The same as `map.openPopup(popup)`.\r\n\topenOn: function (map) {\r\n\t\tmap.openPopup(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tL.DivOverlay.prototype.onAdd.call(this, map);\r\n\r\n\t\t// @namespace Map\r\n\t\t// @section Popup events\r\n\t\t// @event popupopen: PopupEvent\r\n\t\t// Fired when a popup is opened in the map\r\n\t\tmap.fire('popupopen', {popup: this});\r\n\r\n\t\tif (this._source) {\r\n\t\t\t// @namespace Layer\r\n\t\t\t// @section Popup events\r\n\t\t\t// @event popupopen: PopupEvent\r\n\t\t\t// Fired when a popup bound to this layer is opened\r\n\t\t\tthis._source.fire('popupopen', {popup: this}, true);\r\n\t\t\t// For non-path layers, we toggle the popup when clicking\r\n\t\t\t// again the layer, so prevent the map to reopen it.\r\n\t\t\tif (!(this._source instanceof L.Path)) {\r\n\t\t\t\tthis._source.on('preclick', L.DomEvent.stopPropagation);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tL.DivOverlay.prototype.onRemove.call(this, map);\r\n\r\n\t\t// @namespace Map\r\n\t\t// @section Popup events\r\n\t\t// @event popupclose: PopupEvent\r\n\t\t// Fired when a popup in the map is closed\r\n\t\tmap.fire('popupclose', {popup: this});\r\n\r\n\t\tif (this._source) {\r\n\t\t\t// @namespace Layer\r\n\t\t\t// @section Popup events\r\n\t\t\t// @event popupclose: PopupEvent\r\n\t\t\t// Fired when a popup bound to this layer is closed\r\n\t\t\tthis._source.fire('popupclose', {popup: this}, true);\r\n\t\t\tif (!(this._source instanceof L.Path)) {\r\n\t\t\t\tthis._source.off('preclick', L.DomEvent.stopPropagation);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tgetEvents: function () {\r\n\t\tvar events = L.DivOverlay.prototype.getEvents.call(this);\r\n\r\n\t\tif ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) {\r\n\t\t\tevents.preclick = this._close;\r\n\t\t}\r\n\r\n\t\tif (this.options.keepInView) {\r\n\t\t\tevents.moveend = this._adjustPan;\r\n\t\t}\r\n\r\n\t\treturn events;\r\n\t},\r\n\r\n\t_close: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis._map.closePopup(this);\r\n\t\t}\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar prefix = 'leaflet-popup',\r\n\t\t    container = this._container = L.DomUtil.create('div',\r\n\t\t\tprefix + ' ' + (this.options.className || '') +\r\n\t\t\t' leaflet-zoom-animated');\r\n\r\n\t\tif (this.options.closeButton) {\r\n\t\t\tvar closeButton = this._closeButton = L.DomUtil.create('a', prefix + '-close-button', container);\r\n\t\t\tcloseButton.href = '#close';\r\n\t\t\tcloseButton.innerHTML = '&#215;';\r\n\r\n\t\t\tL.DomEvent.on(closeButton, 'click', this._onCloseButtonClick, this);\r\n\t\t}\r\n\r\n\t\tvar wrapper = this._wrapper = L.DomUtil.create('div', prefix + '-content-wrapper', container);\r\n\t\tthis._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper);\r\n\r\n\t\tL.DomEvent\r\n\t\t\t.disableClickPropagation(wrapper)\r\n\t\t\t.disableScrollPropagation(this._contentNode)\r\n\t\t\t.on(wrapper, 'contextmenu', L.DomEvent.stopPropagation);\r\n\r\n\t\tthis._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container);\r\n\t\tthis._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer);\r\n\t},\r\n\r\n\t_updateLayout: function () {\r\n\t\tvar container = this._contentNode,\r\n\t\t    style = container.style;\r\n\r\n\t\tstyle.width = '';\r\n\t\tstyle.whiteSpace = 'nowrap';\r\n\r\n\t\tvar width = container.offsetWidth;\r\n\t\twidth = Math.min(width, this.options.maxWidth);\r\n\t\twidth = Math.max(width, this.options.minWidth);\r\n\r\n\t\tstyle.width = (width + 1) + 'px';\r\n\t\tstyle.whiteSpace = '';\r\n\r\n\t\tstyle.height = '';\r\n\r\n\t\tvar height = container.offsetHeight,\r\n\t\t    maxHeight = this.options.maxHeight,\r\n\t\t    scrolledClass = 'leaflet-popup-scrolled';\r\n\r\n\t\tif (maxHeight && height > maxHeight) {\r\n\t\t\tstyle.height = maxHeight + 'px';\r\n\t\t\tL.DomUtil.addClass(container, scrolledClass);\r\n\t\t} else {\r\n\t\t\tL.DomUtil.removeClass(container, scrolledClass);\r\n\t\t}\r\n\r\n\t\tthis._containerWidth = this._container.offsetWidth;\r\n\t},\r\n\r\n\t_animateZoom: function (e) {\r\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center),\r\n\t\t    anchor = this._getAnchor();\r\n\t\tL.DomUtil.setPosition(this._container, pos.add(anchor));\r\n\t},\r\n\r\n\t_adjustPan: function () {\r\n\t\tif (!this.options.autoPan || (this._map._panAnim && this._map._panAnim._inProgress)) { return; }\r\n\r\n\t\tvar map = this._map,\r\n\t\t    marginBottom = parseInt(L.DomUtil.getStyle(this._container, 'marginBottom'), 10) || 0,\r\n\t\t    containerHeight = this._container.offsetHeight + marginBottom,\r\n\t\t    containerWidth = this._containerWidth,\r\n\t\t    layerPos = new L.Point(this._containerLeft, -containerHeight - this._containerBottom);\r\n\r\n\t\tlayerPos._add(L.DomUtil.getPosition(this._container));\r\n\r\n\t\tvar containerPos = map.layerPointToContainerPoint(layerPos),\r\n\t\t    padding = L.point(this.options.autoPanPadding),\r\n\t\t    paddingTL = L.point(this.options.autoPanPaddingTopLeft || padding),\r\n\t\t    paddingBR = L.point(this.options.autoPanPaddingBottomRight || padding),\r\n\t\t    size = map.getSize(),\r\n\t\t    dx = 0,\r\n\t\t    dy = 0;\r\n\r\n\t\tif (containerPos.x + containerWidth + paddingBR.x > size.x) { // right\r\n\t\t\tdx = containerPos.x + containerWidth - size.x + paddingBR.x;\r\n\t\t}\r\n\t\tif (containerPos.x - dx - paddingTL.x < 0) { // left\r\n\t\t\tdx = containerPos.x - paddingTL.x;\r\n\t\t}\r\n\t\tif (containerPos.y + containerHeight + paddingBR.y > size.y) { // bottom\r\n\t\t\tdy = containerPos.y + containerHeight - size.y + paddingBR.y;\r\n\t\t}\r\n\t\tif (containerPos.y - dy - paddingTL.y < 0) { // top\r\n\t\t\tdy = containerPos.y - paddingTL.y;\r\n\t\t}\r\n\r\n\t\t// @namespace Map\r\n\t\t// @section Popup events\r\n\t\t// @event autopanstart: Event\r\n\t\t// Fired when the map starts autopanning when opening a popup.\r\n\t\tif (dx || dy) {\r\n\t\t\tmap\r\n\t\t\t    .fire('autopanstart')\r\n\t\t\t    .panBy([dx, dy]);\r\n\t\t}\r\n\t},\r\n\r\n\t_onCloseButtonClick: function (e) {\r\n\t\tthis._close();\r\n\t\tL.DomEvent.stop(e);\r\n\t},\r\n\r\n\t_getAnchor: function () {\r\n\t\t// Where should we anchor the popup on the source layer?\r\n\t\treturn L.point(this._source && this._source._getPopupAnchor ? this._source._getPopupAnchor() : [0, 0]);\r\n\t}\r\n\r\n});\r\n\r\n// @namespace Popup\r\n// @factory L.popup(options?: Popup options, source?: Layer)\r\n// Instantiates a `Popup` object given an optional `options` object that describes its appearance and location and an optional `source` object that is used to tag the popup with a reference to the Layer to which it refers.\r\nL.popup = function (options, source) {\r\n\treturn new L.Popup(options, source);\r\n};\r\n\r\n\r\n/* @namespace Map\r\n * @section Interaction Options\r\n * @option closePopupOnClick: Boolean = true\r\n * Set it to `false` if you don't want popups to close when user clicks the map.\r\n */\r\nL.Map.mergeOptions({\r\n\tclosePopupOnClick: true\r\n});\r\n\r\n\r\n// @namespace Map\r\n// @section Methods for Layers and Controls\r\nL.Map.include({\r\n\t// @method openPopup(popup: Popup): this\r\n\t// Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability).\r\n\t// @alternative\r\n\t// @method openPopup(content: String|HTMLElement, latlng: LatLng, options?: Popup options): this\r\n\t// Creates a popup with the specified content and options and opens it in the given point on a map.\r\n\topenPopup: function (popup, latlng, options) {\r\n\t\tif (!(popup instanceof L.Popup)) {\r\n\t\t\tpopup = new L.Popup(options).setContent(popup);\r\n\t\t}\r\n\r\n\t\tif (latlng) {\r\n\t\t\tpopup.setLatLng(latlng);\r\n\t\t}\r\n\r\n\t\tif (this.hasLayer(popup)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif (this._popup && this._popup.options.autoClose) {\r\n\t\t\tthis.closePopup();\r\n\t\t}\r\n\r\n\t\tthis._popup = popup;\r\n\t\treturn this.addLayer(popup);\r\n\t},\r\n\r\n\t// @method closePopup(popup?: Popup): this\r\n\t// Closes the popup previously opened with [openPopup](#map-openpopup) (or the given one).\r\n\tclosePopup: function (popup) {\r\n\t\tif (!popup || popup === this._popup) {\r\n\t\t\tpopup = this._popup;\r\n\t\t\tthis._popup = null;\r\n\t\t}\r\n\t\tif (popup) {\r\n\t\t\tthis.removeLayer(popup);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n});\r\n\r\n/*\r\n * @namespace Layer\r\n * @section Popup methods example\r\n *\r\n * All layers share a set of methods convenient for binding popups to it.\r\n *\r\n * ```js\r\n * var layer = L.Polygon(latlngs).bindPopup('Hi There!').addTo(map);\r\n * layer.openPopup();\r\n * layer.closePopup();\r\n * ```\r\n *\r\n * Popups will also be automatically opened when the layer is clicked on and closed when the layer is removed from the map or another popup is opened.\r\n */\r\n\r\n// @section Popup methods\r\nL.Layer.include({\r\n\r\n\t// @method bindPopup(content: String|HTMLElement|Function|Popup, options?: Popup options): this\r\n\t// Binds a popup to the layer with the passed `content` and sets up the\r\n\t// neccessary event listeners. If a `Function` is passed it will receive\r\n\t// the layer as the first argument and should return a `String` or `HTMLElement`.\r\n\tbindPopup: function (content, options) {\r\n\r\n\t\tif (content instanceof L.Popup) {\r\n\t\t\tL.setOptions(content, options);\r\n\t\t\tthis._popup = content;\r\n\t\t\tcontent._source = this;\r\n\t\t} else {\r\n\t\t\tif (!this._popup || options) {\r\n\t\t\t\tthis._popup = new L.Popup(options, this);\r\n\t\t\t}\r\n\t\t\tthis._popup.setContent(content);\r\n\t\t}\r\n\r\n\t\tif (!this._popupHandlersAdded) {\r\n\t\t\tthis.on({\r\n\t\t\t\tclick: this._openPopup,\r\n\t\t\t\tremove: this.closePopup,\r\n\t\t\t\tmove: this._movePopup\r\n\t\t\t});\r\n\t\t\tthis._popupHandlersAdded = true;\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method unbindPopup(): this\r\n\t// Removes the popup previously bound with `bindPopup`.\r\n\tunbindPopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis.off({\r\n\t\t\t\tclick: this._openPopup,\r\n\t\t\t\tremove: this.closePopup,\r\n\t\t\t\tmove: this._movePopup\r\n\t\t\t});\r\n\t\t\tthis._popupHandlersAdded = false;\r\n\t\t\tthis._popup = null;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method openPopup(latlng?: LatLng): this\r\n\t// Opens the bound popup at the specificed `latlng` or at the default popup anchor if no `latlng` is passed.\r\n\topenPopup: function (layer, latlng) {\r\n\t\tif (!(layer instanceof L.Layer)) {\r\n\t\t\tlatlng = layer;\r\n\t\t\tlayer = this;\r\n\t\t}\r\n\r\n\t\tif (layer instanceof L.FeatureGroup) {\r\n\t\t\tfor (var id in this._layers) {\r\n\t\t\t\tlayer = this._layers[id];\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!latlng) {\r\n\t\t\tlatlng = layer.getCenter ? layer.getCenter() : layer.getLatLng();\r\n\t\t}\r\n\r\n\t\tif (this._popup && this._map) {\r\n\t\t\t// set popup source to this layer\r\n\t\t\tthis._popup._source = layer;\r\n\r\n\t\t\t// update the popup (content, layout, ect...)\r\n\t\t\tthis._popup.update();\r\n\r\n\t\t\t// open the popup on the map\r\n\t\t\tthis._map.openPopup(this._popup, latlng);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method closePopup(): this\r\n\t// Closes the popup bound to this layer if it is open.\r\n\tclosePopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup._close();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method togglePopup(): this\r\n\t// Opens or closes the popup bound to this layer depending on its current state.\r\n\ttogglePopup: function (target) {\r\n\t\tif (this._popup) {\r\n\t\t\tif (this._popup._map) {\r\n\t\t\t\tthis.closePopup();\r\n\t\t\t} else {\r\n\t\t\t\tthis.openPopup(target);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method isPopupOpen(): boolean\r\n\t// Returns `true` if the popup bound to this layer is currently open.\r\n\tisPopupOpen: function () {\r\n\t\treturn (this._popup ? this._popup.isOpen() : false);\r\n\t},\r\n\r\n\t// @method setPopupContent(content: String|HTMLElement|Popup): this\r\n\t// Sets the content of the popup bound to this layer.\r\n\tsetPopupContent: function (content) {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup.setContent(content);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getPopup(): Popup\r\n\t// Returns the popup bound to this layer.\r\n\tgetPopup: function () {\r\n\t\treturn this._popup;\r\n\t},\r\n\r\n\t_openPopup: function (e) {\r\n\t\tvar layer = e.layer || e.target;\r\n\r\n\t\tif (!this._popup) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!this._map) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// prevent map click\r\n\t\tL.DomEvent.stop(e);\r\n\r\n\t\t// if this inherits from Path its a vector and we can just\r\n\t\t// open the popup at the new location\r\n\t\tif (layer instanceof L.Path) {\r\n\t\t\tthis.openPopup(e.layer || e.target, e.latlng);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// otherwise treat it like a marker and figure out\r\n\t\t// if we should toggle it open/closed\r\n\t\tif (this._map.hasLayer(this._popup) && this._popup._source === layer) {\r\n\t\t\tthis.closePopup();\r\n\t\t} else {\r\n\t\t\tthis.openPopup(layer, e.latlng);\r\n\t\t}\r\n\t},\r\n\r\n\t_movePopup: function (e) {\r\n\t\tthis._popup.setLatLng(e.latlng);\r\n\t}\r\n});\r\n\n\n\n/*\n * @class Tooltip\n * @inherits DivOverlay\n * @aka L.Tooltip\n * Used to display small texts on top of map layers.\n *\n * @example\n *\n * ```js\n * marker.bindTooltip(\"my tooltip text\").openTooltip();\n * ```\n * Note about tooltip offset. Leaflet takes two options in consideration\n * for computing tooltip offseting:\n * - the `offset` Tooltip option: it defaults to [0, 0], and it's specific to one tooltip.\n *   Add a positive x offset to move the tooltip to the right, and a positive y offset to\n *   move it to the bottom. Negatives will move to the left and top.\n * - the `tooltipAnchor` Icon option: this will only be considered for Marker. You\n *   should adapt this value if you use a custom icon.\n */\n\n\n// @namespace Tooltip\nL.Tooltip = L.DivOverlay.extend({\n\n\t// @section\n\t// @aka Tooltip options\n\toptions: {\n\t\t// @option pane: String = 'tooltipPane'\n\t\t// `Map pane` where the tooltip will be added.\n\t\tpane: 'tooltipPane',\n\n\t\t// @option offset: Point = Point(0, 0)\n\t\t// Optional offset of the tooltip position.\n\t\toffset: [0, 0],\n\n\t\t// @option direction: String = 'auto'\n\t\t// Direction where to open the tooltip. Possible values are: `right`, `left`,\n\t\t// `top`, `bottom`, `center`, `auto`.\n\t\t// `auto` will dynamicaly switch between `right` and `left` according to the tooltip\n\t\t// position on the map.\n\t\tdirection: 'auto',\n\n\t\t// @option permanent: Boolean = false\n\t\t// Whether to open the tooltip permanently or only on mouseover.\n\t\tpermanent: false,\n\n\t\t// @option sticky: Boolean = false\n\t\t// If true, the tooltip will follow the mouse instead of being fixed at the feature center.\n\t\tsticky: false,\n\n\t\t// @option interactive: Boolean = false\n\t\t// If true, the tooltip will listen to the feature events.\n\t\tinteractive: false,\n\n\t\t// @option opacity: Number = 0.9\n\t\t// Tooltip container opacity.\n\t\topacity: 0.9\n\t},\n\n\tonAdd: function (map) {\n\t\tL.DivOverlay.prototype.onAdd.call(this, map);\n\t\tthis.setOpacity(this.options.opacity);\n\n\t\t// @namespace Map\n\t\t// @section Tooltip events\n\t\t// @event tooltipopen: TooltipEvent\n\t\t// Fired when a tooltip is opened in the map.\n\t\tmap.fire('tooltipopen', {tooltip: this});\n\n\t\tif (this._source) {\n\t\t\t// @namespace Layer\n\t\t\t// @section Tooltip events\n\t\t\t// @event tooltipopen: TooltipEvent\n\t\t\t// Fired when a tooltip bound to this layer is opened.\n\t\t\tthis._source.fire('tooltipopen', {tooltip: this}, true);\n\t\t}\n\t},\n\n\tonRemove: function (map) {\n\t\tL.DivOverlay.prototype.onRemove.call(this, map);\n\n\t\t// @namespace Map\n\t\t// @section Tooltip events\n\t\t// @event tooltipclose: TooltipEvent\n\t\t// Fired when a tooltip in the map is closed.\n\t\tmap.fire('tooltipclose', {tooltip: this});\n\n\t\tif (this._source) {\n\t\t\t// @namespace Layer\n\t\t\t// @section Tooltip events\n\t\t\t// @event tooltipclose: TooltipEvent\n\t\t\t// Fired when a tooltip bound to this layer is closed.\n\t\t\tthis._source.fire('tooltipclose', {tooltip: this}, true);\n\t\t}\n\t},\n\n\tgetEvents: function () {\n\t\tvar events = L.DivOverlay.prototype.getEvents.call(this);\n\n\t\tif (L.Browser.touch && !this.options.permanent) {\n\t\t\tevents.preclick = this._close;\n\t\t}\n\n\t\treturn events;\n\t},\n\n\t_close: function () {\n\t\tif (this._map) {\n\t\t\tthis._map.closeTooltip(this);\n\t\t}\n\t},\n\n\t_initLayout: function () {\n\t\tvar prefix = 'leaflet-tooltip',\n\t\t    className = prefix + ' ' + (this.options.className || '') + ' leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide');\n\n\t\tthis._contentNode = this._container = L.DomUtil.create('div', className);\n\t},\n\n\t_updateLayout: function () {},\n\n\t_adjustPan: function () {},\n\n\t_setPosition: function (pos) {\n\t\tvar map = this._map,\n\t\t    container = this._container,\n\t\t    centerPoint = map.latLngToContainerPoint(map.getCenter()),\n\t\t    tooltipPoint = map.layerPointToContainerPoint(pos),\n\t\t    direction = this.options.direction,\n\t\t    tooltipWidth = container.offsetWidth,\n\t\t    tooltipHeight = container.offsetHeight,\n\t\t    offset = L.point(this.options.offset),\n\t\t    anchor = this._getAnchor();\n\n\t\tif (direction === 'top') {\n\t\t\tpos = pos.add(L.point(-tooltipWidth / 2 + offset.x, -tooltipHeight + offset.y + anchor.y, true));\n\t\t} else if (direction === 'bottom') {\n\t\t\tpos = pos.subtract(L.point(tooltipWidth / 2 - offset.x, -offset.y, true));\n\t\t} else if (direction === 'center') {\n\t\t\tpos = pos.subtract(L.point(tooltipWidth / 2 + offset.x, tooltipHeight / 2 - anchor.y + offset.y, true));\n\t\t} else if (direction === 'right' || direction === 'auto' && tooltipPoint.x < centerPoint.x) {\n\t\t\tdirection = 'right';\n\t\t\tpos = pos.add(L.point(offset.x + anchor.x, anchor.y - tooltipHeight / 2 + offset.y, true));\n\t\t} else {\n\t\t\tdirection = 'left';\n\t\t\tpos = pos.subtract(L.point(tooltipWidth + anchor.x - offset.x, tooltipHeight / 2 - anchor.y - offset.y, true));\n\t\t}\n\n\t\tL.DomUtil.removeClass(container, 'leaflet-tooltip-right');\n\t\tL.DomUtil.removeClass(container, 'leaflet-tooltip-left');\n\t\tL.DomUtil.removeClass(container, 'leaflet-tooltip-top');\n\t\tL.DomUtil.removeClass(container, 'leaflet-tooltip-bottom');\n\t\tL.DomUtil.addClass(container, 'leaflet-tooltip-' + direction);\n\t\tL.DomUtil.setPosition(container, pos);\n\t},\n\n\t_updatePosition: function () {\n\t\tvar pos = this._map.latLngToLayerPoint(this._latlng);\n\t\tthis._setPosition(pos);\n\t},\n\n\tsetOpacity: function (opacity) {\n\t\tthis.options.opacity = opacity;\n\n\t\tif (this._container) {\n\t\t\tL.DomUtil.setOpacity(this._container, opacity);\n\t\t}\n\t},\n\n\t_animateZoom: function (e) {\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center);\n\t\tthis._setPosition(pos);\n\t},\n\n\t_getAnchor: function () {\n\t\t// Where should we anchor the tooltip on the source layer?\n\t\treturn L.point(this._source && this._source._getTooltipAnchor && !this.options.sticky ? this._source._getTooltipAnchor() : [0, 0]);\n\t}\n\n});\n\n// @namespace Tooltip\n// @factory L.tooltip(options?: Tooltip options, source?: Layer)\n// Instantiates a Tooltip object given an optional `options` object that describes its appearance and location and an optional `source` object that is used to tag the tooltip with a reference to the Layer to which it refers.\nL.tooltip = function (options, source) {\n\treturn new L.Tooltip(options, source);\n};\n\n// @namespace Map\n// @section Methods for Layers and Controls\nL.Map.include({\n\n\t// @method openTooltip(tooltip: Tooltip): this\n\t// Opens the specified tooltip.\n\t// @alternative\n\t// @method openTooltip(content: String|HTMLElement, latlng: LatLng, options?: Tooltip options): this\n\t// Creates a tooltip with the specified content and options and open it.\n\topenTooltip: function (tooltip, latlng, options) {\n\t\tif (!(tooltip instanceof L.Tooltip)) {\n\t\t\ttooltip = new L.Tooltip(options).setContent(tooltip);\n\t\t}\n\n\t\tif (latlng) {\n\t\t\ttooltip.setLatLng(latlng);\n\t\t}\n\n\t\tif (this.hasLayer(tooltip)) {\n\t\t\treturn this;\n\t\t}\n\n\t\treturn this.addLayer(tooltip);\n\t},\n\n\t// @method closeTooltip(tooltip?: Tooltip): this\n\t// Closes the tooltip given as parameter.\n\tcloseTooltip: function (tooltip) {\n\t\tif (tooltip) {\n\t\t\tthis.removeLayer(tooltip);\n\t\t}\n\t\treturn this;\n\t}\n\n});\n\n/*\n * @namespace Layer\n * @section Tooltip methods example\n *\n * All layers share a set of methods convenient for binding tooltips to it.\n *\n * ```js\n * var layer = L.Polygon(latlngs).bindTooltip('Hi There!').addTo(map);\n * layer.openTooltip();\n * layer.closeTooltip();\n * ```\n */\n\n// @section Tooltip methods\nL.Layer.include({\n\n\t// @method bindTooltip(content: String|HTMLElement|Function|Tooltip, options?: Tooltip options): this\n\t// Binds a tooltip to the layer with the passed `content` and sets up the\n\t// neccessary event listeners. If a `Function` is passed it will receive\n\t// the layer as the first argument and should return a `String` or `HTMLElement`.\n\tbindTooltip: function (content, options) {\n\n\t\tif (content instanceof L.Tooltip) {\n\t\t\tL.setOptions(content, options);\n\t\t\tthis._tooltip = content;\n\t\t\tcontent._source = this;\n\t\t} else {\n\t\t\tif (!this._tooltip || options) {\n\t\t\t\tthis._tooltip = L.tooltip(options, this);\n\t\t\t}\n\t\t\tthis._tooltip.setContent(content);\n\n\t\t}\n\n\t\tthis._initTooltipInteractions();\n\n\t\tif (this._tooltip.options.permanent && this._map && this._map.hasLayer(this)) {\n\t\t\tthis.openTooltip();\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t// @method unbindTooltip(): this\n\t// Removes the tooltip previously bound with `bindTooltip`.\n\tunbindTooltip: function () {\n\t\tif (this._tooltip) {\n\t\t\tthis._initTooltipInteractions(true);\n\t\t\tthis.closeTooltip();\n\t\t\tthis._tooltip = null;\n\t\t}\n\t\treturn this;\n\t},\n\n\t_initTooltipInteractions: function (remove) {\n\t\tif (!remove && this._tooltipHandlersAdded) { return; }\n\t\tvar onOff = remove ? 'off' : 'on',\n\t\t    events = {\n\t\t\tremove: this.closeTooltip,\n\t\t\tmove: this._moveTooltip\n\t\t    };\n\t\tif (!this._tooltip.options.permanent) {\n\t\t\tevents.mouseover = this._openTooltip;\n\t\t\tevents.mouseout = this.closeTooltip;\n\t\t\tif (this._tooltip.options.sticky) {\n\t\t\t\tevents.mousemove = this._moveTooltip;\n\t\t\t}\n\t\t\tif (L.Browser.touch) {\n\t\t\t\tevents.click = this._openTooltip;\n\t\t\t}\n\t\t} else {\n\t\t\tevents.add = this._openTooltip;\n\t\t}\n\t\tthis[onOff](events);\n\t\tthis._tooltipHandlersAdded = !remove;\n\t},\n\n\t// @method openTooltip(latlng?: LatLng): this\n\t// Opens the bound tooltip at the specificed `latlng` or at the default tooltip anchor if no `latlng` is passed.\n\topenTooltip: function (layer, latlng) {\n\t\tif (!(layer instanceof L.Layer)) {\n\t\t\tlatlng = layer;\n\t\t\tlayer = this;\n\t\t}\n\n\t\tif (layer instanceof L.FeatureGroup) {\n\t\t\tfor (var id in this._layers) {\n\t\t\t\tlayer = this._layers[id];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!latlng) {\n\t\t\tlatlng = layer.getCenter ? layer.getCenter() : layer.getLatLng();\n\t\t}\n\n\t\tif (this._tooltip && this._map) {\n\n\t\t\t// set tooltip source to this layer\n\t\t\tthis._tooltip._source = layer;\n\n\t\t\t// update the tooltip (content, layout, ect...)\n\t\t\tthis._tooltip.update();\n\n\t\t\t// open the tooltip on the map\n\t\t\tthis._map.openTooltip(this._tooltip, latlng);\n\n\t\t\t// Tooltip container may not be defined if not permanent and never\n\t\t\t// opened.\n\t\t\tif (this._tooltip.options.interactive && this._tooltip._container) {\n\t\t\t\tL.DomUtil.addClass(this._tooltip._container, 'leaflet-clickable');\n\t\t\t\tthis.addInteractiveTarget(this._tooltip._container);\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t// @method closeTooltip(): this\n\t// Closes the tooltip bound to this layer if it is open.\n\tcloseTooltip: function () {\n\t\tif (this._tooltip) {\n\t\t\tthis._tooltip._close();\n\t\t\tif (this._tooltip.options.interactive && this._tooltip._container) {\n\t\t\t\tL.DomUtil.removeClass(this._tooltip._container, 'leaflet-clickable');\n\t\t\t\tthis.removeInteractiveTarget(this._tooltip._container);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method toggleTooltip(): this\n\t// Opens or closes the tooltip bound to this layer depending on its current state.\n\ttoggleTooltip: function (target) {\n\t\tif (this._tooltip) {\n\t\t\tif (this._tooltip._map) {\n\t\t\t\tthis.closeTooltip();\n\t\t\t} else {\n\t\t\t\tthis.openTooltip(target);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method isTooltipOpen(): boolean\n\t// Returns `true` if the tooltip bound to this layer is currently open.\n\tisTooltipOpen: function () {\n\t\treturn this._tooltip.isOpen();\n\t},\n\n\t// @method setTooltipContent(content: String|HTMLElement|Tooltip): this\n\t// Sets the content of the tooltip bound to this layer.\n\tsetTooltipContent: function (content) {\n\t\tif (this._tooltip) {\n\t\t\tthis._tooltip.setContent(content);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method getTooltip(): Tooltip\n\t// Returns the tooltip bound to this layer.\n\tgetTooltip: function () {\n\t\treturn this._tooltip;\n\t},\n\n\t_openTooltip: function (e) {\n\t\tvar layer = e.layer || e.target;\n\n\t\tif (!this._tooltip || !this._map) {\n\t\t\treturn;\n\t\t}\n\t\tthis.openTooltip(layer, this._tooltip.options.sticky ? e.latlng : undefined);\n\t},\n\n\t_moveTooltip: function (e) {\n\t\tvar latlng = e.latlng, containerPoint, layerPoint;\n\t\tif (this._tooltip.options.sticky && e.originalEvent) {\n\t\t\tcontainerPoint = this._map.mouseEventToContainerPoint(e.originalEvent);\n\t\t\tlayerPoint = this._map.containerPointToLayerPoint(containerPoint);\n\t\t\tlatlng = this._map.layerPointToLatLng(layerPoint);\n\t\t}\n\t\tthis._tooltip.setLatLng(latlng);\n\t}\n});\n\n\n\n/*\r\n * @class LayerGroup\r\n * @aka L.LayerGroup\r\n * @inherits Layer\r\n *\r\n * Used to group several layers and handle them as one. If you add it to the map,\r\n * any layers added or removed from the group will be added/removed on the map as\r\n * well. Extends `Layer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.layerGroup([marker1, marker2])\r\n * \t.addLayer(polyline)\r\n * \t.addTo(map);\r\n * ```\r\n */\r\n\r\nL.LayerGroup = L.Layer.extend({\r\n\r\n\tinitialize: function (layers) {\r\n\t\tthis._layers = {};\r\n\r\n\t\tvar i, len;\r\n\r\n\t\tif (layers) {\r\n\t\t\tfor (i = 0, len = layers.length; i < len; i++) {\r\n\t\t\t\tthis.addLayer(layers[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// @method addLayer(layer: Layer): this\r\n\t// Adds the given layer to the group.\r\n\taddLayer: function (layer) {\r\n\t\tvar id = this.getLayerId(layer);\r\n\r\n\t\tthis._layers[id] = layer;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._map.addLayer(layer);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method removeLayer(layer: Layer): this\r\n\t// Removes the given layer from the group.\r\n\t// @alternative\r\n\t// @method removeLayer(id: Number): this\r\n\t// Removes the layer with the given internal ID from the group.\r\n\tremoveLayer: function (layer) {\r\n\t\tvar id = layer in this._layers ? layer : this.getLayerId(layer);\r\n\r\n\t\tif (this._map && this._layers[id]) {\r\n\t\t\tthis._map.removeLayer(this._layers[id]);\r\n\t\t}\r\n\r\n\t\tdelete this._layers[id];\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method hasLayer(layer: Layer): Boolean\r\n\t// Returns `true` if the given layer is currently added to the group.\r\n\thasLayer: function (layer) {\r\n\t\treturn !!layer && (layer in this._layers || this.getLayerId(layer) in this._layers);\r\n\t},\r\n\r\n\t// @method clearLayers(): this\r\n\t// Removes all the layers from the group.\r\n\tclearLayers: function () {\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tthis.removeLayer(this._layers[i]);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method invoke(methodName: String, …): this\r\n\t// Calls `methodName` on every layer contained in this group, passing any\r\n\t// additional parameters. Has no effect if the layers contained do not\r\n\t// implement `methodName`.\r\n\tinvoke: function (methodName) {\r\n\t\tvar args = Array.prototype.slice.call(arguments, 1),\r\n\t\t    i, layer;\r\n\r\n\t\tfor (i in this._layers) {\r\n\t\t\tlayer = this._layers[i];\r\n\r\n\t\t\tif (layer[methodName]) {\r\n\t\t\t\tlayer[methodName].apply(layer, args);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tmap.addLayer(this._layers[i]);\r\n\t\t}\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tmap.removeLayer(this._layers[i]);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method eachLayer(fn: Function, context?: Object): this\r\n\t// Iterates over the layers of the group, optionally specifying context of the iterator function.\r\n\t// ```js\r\n\t// group.eachLayer(function (layer) {\r\n\t// \tlayer.bindPopup('Hello');\r\n\t// });\r\n\t// ```\r\n\teachLayer: function (method, context) {\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tmethod.call(context, this._layers[i]);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getLayer(id: Number): Layer\r\n\t// Returns the layer with the given internal ID.\r\n\tgetLayer: function (id) {\r\n\t\treturn this._layers[id];\r\n\t},\r\n\r\n\t// @method getLayers(): Layer[]\r\n\t// Returns an array of all the layers added to the group.\r\n\tgetLayers: function () {\r\n\t\tvar layers = [];\r\n\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tlayers.push(this._layers[i]);\r\n\t\t}\r\n\t\treturn layers;\r\n\t},\r\n\r\n\t// @method setZIndex(zIndex: Number): this\r\n\t// Calls `setZIndex` on every layer contained in this group, passing the z-index.\r\n\tsetZIndex: function (zIndex) {\r\n\t\treturn this.invoke('setZIndex', zIndex);\r\n\t},\r\n\r\n\t// @method getLayerId(layer: Layer): Number\r\n\t// Returns the internal ID for a layer\r\n\tgetLayerId: function (layer) {\r\n\t\treturn L.stamp(layer);\r\n\t}\r\n});\r\n\r\n\r\n// @factory L.layerGroup(layers: Layer[])\r\n// Create a layer group, optionally given an initial set of layers.\r\nL.layerGroup = function (layers) {\r\n\treturn new L.LayerGroup(layers);\r\n};\r\n\n\n\n/*\r\n * @class FeatureGroup\r\n * @aka L.FeatureGroup\r\n * @inherits LayerGroup\r\n *\r\n * Extended `LayerGroup` that makes it easier to do the same thing to all its member layers:\r\n *  * [`bindPopup`](#layer-bindpopup) binds a popup to all of the layers at once (likewise with [`bindTooltip`](#layer-bindtooltip))\r\n *  * Events are propagated to the `FeatureGroup`, so if the group has an event\r\n * handler, it will handle events from any of the layers. This includes mouse events\r\n * and custom events.\r\n *  * Has `layeradd` and `layerremove` events\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.featureGroup([marker1, marker2, polyline])\r\n * \t.bindPopup('Hello world!')\r\n * \t.on('click', function() { alert('Clicked on a member of the group!'); })\r\n * \t.addTo(map);\r\n * ```\r\n */\r\n\r\nL.FeatureGroup = L.LayerGroup.extend({\r\n\r\n\taddLayer: function (layer) {\r\n\t\tif (this.hasLayer(layer)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tlayer.addEventParent(this);\r\n\r\n\t\tL.LayerGroup.prototype.addLayer.call(this, layer);\r\n\r\n\t\t// @event layeradd: LayerEvent\r\n\t\t// Fired when a layer is added to this `FeatureGroup`\r\n\t\treturn this.fire('layeradd', {layer: layer});\r\n\t},\r\n\r\n\tremoveLayer: function (layer) {\r\n\t\tif (!this.hasLayer(layer)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\tif (layer in this._layers) {\r\n\t\t\tlayer = this._layers[layer];\r\n\t\t}\r\n\r\n\t\tlayer.removeEventParent(this);\r\n\r\n\t\tL.LayerGroup.prototype.removeLayer.call(this, layer);\r\n\r\n\t\t// @event layerremove: LayerEvent\r\n\t\t// Fired when a layer is removed from this `FeatureGroup`\r\n\t\treturn this.fire('layerremove', {layer: layer});\r\n\t},\r\n\r\n\t// @method setStyle(style: Path options): this\r\n\t// Sets the given path options to each layer of the group that has a `setStyle` method.\r\n\tsetStyle: function (style) {\r\n\t\treturn this.invoke('setStyle', style);\r\n\t},\r\n\r\n\t// @method bringToFront(): this\r\n\t// Brings the layer group to the top of all other layers\r\n\tbringToFront: function () {\r\n\t\treturn this.invoke('bringToFront');\r\n\t},\r\n\r\n\t// @method bringToBack(): this\r\n\t// Brings the layer group to the top of all other layers\r\n\tbringToBack: function () {\r\n\t\treturn this.invoke('bringToBack');\r\n\t},\r\n\r\n\t// @method getBounds(): LatLngBounds\r\n\t// Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).\r\n\tgetBounds: function () {\r\n\t\tvar bounds = new L.LatLngBounds();\r\n\r\n\t\tfor (var id in this._layers) {\r\n\t\t\tvar layer = this._layers[id];\r\n\t\t\tbounds.extend(layer.getBounds ? layer.getBounds() : layer.getLatLng());\r\n\t\t}\r\n\t\treturn bounds;\r\n\t}\r\n});\r\n\r\n// @factory L.featureGroup(layers: Layer[])\r\n// Create a feature group, optionally given an initial set of layers.\r\nL.featureGroup = function (layers) {\r\n\treturn new L.FeatureGroup(layers);\r\n};\r\n\n\n\n/*\n * @class Renderer\n * @inherits Layer\n * @aka L.Renderer\n *\n * Base class for vector renderer implementations (`SVG`, `Canvas`). Handles the\n * DOM container of the renderer, its bounds, and its zoom animation.\n *\n * A `Renderer` works as an implicit layer group for all `Path`s - the renderer\n * itself can be added or removed to the map. All paths use a renderer, which can\n * be implicit (the map will decide the type of renderer and use it automatically)\n * or explicit (using the [`renderer`](#path-renderer) option of the path).\n *\n * Do not use this class directly, use `SVG` and `Canvas` instead.\n *\n * @event update: Event\n * Fired when the renderer updates its bounds, center and zoom, for example when\n * its map has moved\n */\n\nL.Renderer = L.Layer.extend({\n\n\t// @section\n\t// @aka Renderer options\n\toptions: {\n\t\t// @option padding: Number = 0.1\n\t\t// How much to extend the clip area around the map view (relative to its size)\n\t\t// e.g. 0.1 would be 10% of map view in each direction\n\t\tpadding: 0.1\n\t},\n\n\tinitialize: function (options) {\n\t\tL.setOptions(this, options);\n\t\tL.stamp(this);\n\t\tthis._layers = this._layers || {};\n\t},\n\n\tonAdd: function () {\n\t\tif (!this._container) {\n\t\t\tthis._initContainer(); // defined by renderer implementations\n\n\t\t\tif (this._zoomAnimated) {\n\t\t\t\tL.DomUtil.addClass(this._container, 'leaflet-zoom-animated');\n\t\t\t}\n\t\t}\n\n\t\tthis.getPane().appendChild(this._container);\n\t\tthis._update();\n\t\tthis.on('update', this._updatePaths, this);\n\t},\n\n\tonRemove: function () {\n\t\tL.DomUtil.remove(this._container);\n\t\tthis.off('update', this._updatePaths, this);\n\t},\n\n\tgetEvents: function () {\n\t\tvar events = {\n\t\t\tviewreset: this._reset,\n\t\t\tzoom: this._onZoom,\n\t\t\tmoveend: this._update,\n\t\t\tzoomend: this._onZoomEnd\n\t\t};\n\t\tif (this._zoomAnimated) {\n\t\t\tevents.zoomanim = this._onAnimZoom;\n\t\t}\n\t\treturn events;\n\t},\n\n\t_onAnimZoom: function (ev) {\n\t\tthis._updateTransform(ev.center, ev.zoom);\n\t},\n\n\t_onZoom: function () {\n\t\tthis._updateTransform(this._map.getCenter(), this._map.getZoom());\n\t},\n\n\t_updateTransform: function (center, zoom) {\n\t\tvar scale = this._map.getZoomScale(zoom, this._zoom),\n\t\t    position = L.DomUtil.getPosition(this._container),\n\t\t    viewHalf = this._map.getSize().multiplyBy(0.5 + this.options.padding),\n\t\t    currentCenterPoint = this._map.project(this._center, zoom),\n\t\t    destCenterPoint = this._map.project(center, zoom),\n\t\t    centerOffset = destCenterPoint.subtract(currentCenterPoint),\n\n\t\t    topLeftOffset = viewHalf.multiplyBy(-scale).add(position).add(viewHalf).subtract(centerOffset);\n\n\t\tif (L.Browser.any3d) {\n\t\t\tL.DomUtil.setTransform(this._container, topLeftOffset, scale);\n\t\t} else {\n\t\t\tL.DomUtil.setPosition(this._container, topLeftOffset);\n\t\t}\n\t},\n\n\t_reset: function () {\n\t\tthis._update();\n\t\tthis._updateTransform(this._center, this._zoom);\n\n\t\tfor (var id in this._layers) {\n\t\t\tthis._layers[id]._reset();\n\t\t}\n\t},\n\n\t_onZoomEnd: function () {\n\t\tfor (var id in this._layers) {\n\t\t\tthis._layers[id]._project();\n\t\t}\n\t},\n\n\t_updatePaths: function () {\n\t\tfor (var id in this._layers) {\n\t\t\tthis._layers[id]._update();\n\t\t}\n\t},\n\n\t_update: function () {\n\t\t// Update pixel bounds of renderer container (for positioning/sizing/clipping later)\n\t\t// Subclasses are responsible of firing the 'update' event.\n\t\tvar p = this.options.padding,\n\t\t    size = this._map.getSize(),\n\t\t    min = this._map.containerPointToLayerPoint(size.multiplyBy(-p)).round();\n\n\t\tthis._bounds = new L.Bounds(min, min.add(size.multiplyBy(1 + p * 2)).round());\n\n\t\tthis._center = this._map.getCenter();\n\t\tthis._zoom = this._map.getZoom();\n\t}\n});\n\n\nL.Map.include({\n\t// @namespace Map; @method getRenderer(layer: Path): Renderer\n\t// Returns the instance of `Renderer` that should be used to render the given\n\t// `Path`. It will ensure that the `renderer` options of the map and paths\n\t// are respected, and that the renderers do exist on the map.\n\tgetRenderer: function (layer) {\n\t\t// @namespace Path; @option renderer: Renderer\n\t\t// Use this specific instance of `Renderer` for this path. Takes\n\t\t// precedence over the map's [default renderer](#map-renderer).\n\t\tvar renderer = layer.options.renderer || this._getPaneRenderer(layer.options.pane) || this.options.renderer || this._renderer;\n\n\t\tif (!renderer) {\n\t\t\t// @namespace Map; @option preferCanvas: Boolean = false\n\t\t\t// Whether `Path`s should be rendered on a `Canvas` renderer.\n\t\t\t// By default, all `Path`s are rendered in a `SVG` renderer.\n\t\t\trenderer = this._renderer = (this.options.preferCanvas && L.canvas()) || L.svg();\n\t\t}\n\n\t\tif (!this.hasLayer(renderer)) {\n\t\t\tthis.addLayer(renderer);\n\t\t}\n\t\treturn renderer;\n\t},\n\n\t_getPaneRenderer: function (name) {\n\t\tif (name === 'overlayPane' || name === undefined) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar renderer = this._paneRenderers[name];\n\t\tif (renderer === undefined) {\n\t\t\trenderer = (L.SVG && L.svg({pane: name})) || (L.Canvas && L.canvas({pane: name}));\n\t\t\tthis._paneRenderers[name] = renderer;\n\t\t}\n\t\treturn renderer;\n\t}\n});\n\n\n\n/*\n * @class Path\n * @aka L.Path\n * @inherits Interactive layer\n *\n * An abstract class that contains options and constants shared between vector\n * overlays (Polygon, Polyline, Circle). Do not use it directly. Extends `Layer`.\n */\n\nL.Path = L.Layer.extend({\n\n\t// @section\n\t// @aka Path options\n\toptions: {\n\t\t// @option stroke: Boolean = true\n\t\t// Whether to draw stroke along the path. Set it to `false` to disable borders on polygons or circles.\n\t\tstroke: true,\n\n\t\t// @option color: String = '#3388ff'\n\t\t// Stroke color\n\t\tcolor: '#3388ff',\n\n\t\t// @option weight: Number = 3\n\t\t// Stroke width in pixels\n\t\tweight: 3,\n\n\t\t// @option opacity: Number = 1.0\n\t\t// Stroke opacity\n\t\topacity: 1,\n\n\t\t// @option lineCap: String= 'round'\n\t\t// A string that defines [shape to be used at the end](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-linecap) of the stroke.\n\t\tlineCap: 'round',\n\n\t\t// @option lineJoin: String = 'round'\n\t\t// A string that defines [shape to be used at the corners](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-linejoin) of the stroke.\n\t\tlineJoin: 'round',\n\n\t\t// @option dashArray: String = null\n\t\t// A string that defines the stroke [dash pattern](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dasharray). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility).\n\t\tdashArray: null,\n\n\t\t// @option dashOffset: String = null\n\t\t// A string that defines the [distance into the dash pattern to start the dash](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dashoffset). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility).\n\t\tdashOffset: null,\n\n\t\t// @option fill: Boolean = depends\n\t\t// Whether to fill the path with color. Set it to `false` to disable filling on polygons or circles.\n\t\tfill: false,\n\n\t\t// @option fillColor: String = *\n\t\t// Fill color. Defaults to the value of the [`color`](#path-color) option\n\t\tfillColor: null,\n\n\t\t// @option fillOpacity: Number = 0.2\n\t\t// Fill opacity.\n\t\tfillOpacity: 0.2,\n\n\t\t// @option fillRule: String = 'evenodd'\n\t\t// A string that defines [how the inside of a shape](https://developer.mozilla.org/docs/Web/SVG/Attribute/fill-rule) is determined.\n\t\tfillRule: 'evenodd',\n\n\t\t// className: '',\n\n\t\t// Option inherited from \"Interactive layer\" abstract class\n\t\tinteractive: true\n\t},\n\n\tbeforeAdd: function (map) {\n\t\t// Renderer is set here because we need to call renderer.getEvents\n\t\t// before this.getEvents.\n\t\tthis._renderer = map.getRenderer(this);\n\t},\n\n\tonAdd: function () {\n\t\tthis._renderer._initPath(this);\n\t\tthis._reset();\n\t\tthis._renderer._addPath(this);\n\t},\n\n\tonRemove: function () {\n\t\tthis._renderer._removePath(this);\n\t},\n\n\t// @method redraw(): this\n\t// Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.\n\tredraw: function () {\n\t\tif (this._map) {\n\t\t\tthis._renderer._updatePath(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method setStyle(style: Path options): this\n\t// Changes the appearance of a Path based on the options in the `Path options` object.\n\tsetStyle: function (style) {\n\t\tL.setOptions(this, style);\n\t\tif (this._renderer) {\n\t\t\tthis._renderer._updateStyle(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method bringToFront(): this\n\t// Brings the layer to the top of all path layers.\n\tbringToFront: function () {\n\t\tif (this._renderer) {\n\t\t\tthis._renderer._bringToFront(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method bringToBack(): this\n\t// Brings the layer to the bottom of all path layers.\n\tbringToBack: function () {\n\t\tif (this._renderer) {\n\t\t\tthis._renderer._bringToBack(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\tgetElement: function () {\n\t\treturn this._path;\n\t},\n\n\t_reset: function () {\n\t\t// defined in children classes\n\t\tthis._project();\n\t\tthis._update();\n\t},\n\n\t_clickTolerance: function () {\n\t\t// used when doing hit detection for Canvas layers\n\t\treturn (this.options.stroke ? this.options.weight / 2 : 0) + (L.Browser.touch ? 10 : 0);\n\t}\n});\n\n\n\n/*\r\n * @namespace LineUtil\r\n *\r\n * Various utility functions for polyine points processing, used by Leaflet internally to make polylines lightning-fast.\r\n */\r\n\r\nL.LineUtil = {\r\n\r\n\t// Simplify polyline with vertex reduction and Douglas-Peucker simplification.\r\n\t// Improves rendering performance dramatically by lessening the number of points to draw.\r\n\r\n\t// @function simplify(points: Point[], tolerance: Number): Point[]\r\n\t// Dramatically reduces the number of points in a polyline while retaining\r\n\t// its shape and returns a new array of simplified points, using the\r\n\t// [Douglas-Peucker algorithm](http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm).\r\n\t// Used for a huge performance boost when processing/displaying Leaflet polylines for\r\n\t// each zoom level and also reducing visual noise. tolerance affects the amount of\r\n\t// simplification (lesser value means higher quality but slower and with more points).\r\n\t// Also released as a separated micro-library [Simplify.js](http://mourner.github.com/simplify-js/).\r\n\tsimplify: function (points, tolerance) {\r\n\t\tif (!tolerance || !points.length) {\r\n\t\t\treturn points.slice();\r\n\t\t}\r\n\r\n\t\tvar sqTolerance = tolerance * tolerance;\r\n\r\n\t\t// stage 1: vertex reduction\r\n\t\tpoints = this._reducePoints(points, sqTolerance);\r\n\r\n\t\t// stage 2: Douglas-Peucker simplification\r\n\t\tpoints = this._simplifyDP(points, sqTolerance);\r\n\r\n\t\treturn points;\r\n\t},\r\n\r\n\t// @function pointToSegmentDistance(p: Point, p1: Point, p2: Point): Number\r\n\t// Returns the distance between point `p` and segment `p1` to `p2`.\r\n\tpointToSegmentDistance:  function (p, p1, p2) {\r\n\t\treturn Math.sqrt(this._sqClosestPointOnSegment(p, p1, p2, true));\r\n\t},\r\n\r\n\t// @function closestPointOnSegment(p: Point, p1: Point, p2: Point): Number\r\n\t// Returns the closest point from a point `p` on a segment `p1` to `p2`.\r\n\tclosestPointOnSegment: function (p, p1, p2) {\r\n\t\treturn this._sqClosestPointOnSegment(p, p1, p2);\r\n\t},\r\n\r\n\t// Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm\r\n\t_simplifyDP: function (points, sqTolerance) {\r\n\r\n\t\tvar len = points.length,\r\n\t\t    ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array,\r\n\t\t    markers = new ArrayConstructor(len);\r\n\r\n\t\tmarkers[0] = markers[len - 1] = 1;\r\n\r\n\t\tthis._simplifyDPStep(points, markers, sqTolerance, 0, len - 1);\r\n\r\n\t\tvar i,\r\n\t\t    newPoints = [];\r\n\r\n\t\tfor (i = 0; i < len; i++) {\r\n\t\t\tif (markers[i]) {\r\n\t\t\t\tnewPoints.push(points[i]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn newPoints;\r\n\t},\r\n\r\n\t_simplifyDPStep: function (points, markers, sqTolerance, first, last) {\r\n\r\n\t\tvar maxSqDist = 0,\r\n\t\t    index, i, sqDist;\r\n\r\n\t\tfor (i = first + 1; i <= last - 1; i++) {\r\n\t\t\tsqDist = this._sqClosestPointOnSegment(points[i], points[first], points[last], true);\r\n\r\n\t\t\tif (sqDist > maxSqDist) {\r\n\t\t\t\tindex = i;\r\n\t\t\t\tmaxSqDist = sqDist;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (maxSqDist > sqTolerance) {\r\n\t\t\tmarkers[index] = 1;\r\n\r\n\t\t\tthis._simplifyDPStep(points, markers, sqTolerance, first, index);\r\n\t\t\tthis._simplifyDPStep(points, markers, sqTolerance, index, last);\r\n\t\t}\r\n\t},\r\n\r\n\t// reduce points that are too close to each other to a single point\r\n\t_reducePoints: function (points, sqTolerance) {\r\n\t\tvar reducedPoints = [points[0]];\r\n\r\n\t\tfor (var i = 1, prev = 0, len = points.length; i < len; i++) {\r\n\t\t\tif (this._sqDist(points[i], points[prev]) > sqTolerance) {\r\n\t\t\t\treducedPoints.push(points[i]);\r\n\t\t\t\tprev = i;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (prev < len - 1) {\r\n\t\t\treducedPoints.push(points[len - 1]);\r\n\t\t}\r\n\t\treturn reducedPoints;\r\n\t},\r\n\r\n\r\n\t// @function clipSegment(a: Point, b: Point, bounds: Bounds, useLastCode?: Boolean, round?: Boolean): Point[]|Boolean\r\n\t// Clips the segment a to b by rectangular bounds with the\r\n\t// [Cohen-Sutherland algorithm](https://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm)\r\n\t// (modifying the segment points directly!). Used by Leaflet to only show polyline\r\n\t// points that are on the screen or near, increasing performance.\r\n\tclipSegment: function (a, b, bounds, useLastCode, round) {\r\n\t\tvar codeA = useLastCode ? this._lastCode : this._getBitCode(a, bounds),\r\n\t\t    codeB = this._getBitCode(b, bounds),\r\n\r\n\t\t    codeOut, p, newCode;\r\n\r\n\t\t// save 2nd code to avoid calculating it on the next segment\r\n\t\tthis._lastCode = codeB;\r\n\r\n\t\twhile (true) {\r\n\t\t\t// if a,b is inside the clip window (trivial accept)\r\n\t\t\tif (!(codeA | codeB)) {\r\n\t\t\t\treturn [a, b];\r\n\t\t\t}\r\n\r\n\t\t\t// if a,b is outside the clip window (trivial reject)\r\n\t\t\tif (codeA & codeB) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// other cases\r\n\t\t\tcodeOut = codeA || codeB;\r\n\t\t\tp = this._getEdgeIntersection(a, b, codeOut, bounds, round);\r\n\t\t\tnewCode = this._getBitCode(p, bounds);\r\n\r\n\t\t\tif (codeOut === codeA) {\r\n\t\t\t\ta = p;\r\n\t\t\t\tcodeA = newCode;\r\n\t\t\t} else {\r\n\t\t\t\tb = p;\r\n\t\t\t\tcodeB = newCode;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_getEdgeIntersection: function (a, b, code, bounds, round) {\r\n\t\tvar dx = b.x - a.x,\r\n\t\t    dy = b.y - a.y,\r\n\t\t    min = bounds.min,\r\n\t\t    max = bounds.max,\r\n\t\t    x, y;\r\n\r\n\t\tif (code & 8) { // top\r\n\t\t\tx = a.x + dx * (max.y - a.y) / dy;\r\n\t\t\ty = max.y;\r\n\r\n\t\t} else if (code & 4) { // bottom\r\n\t\t\tx = a.x + dx * (min.y - a.y) / dy;\r\n\t\t\ty = min.y;\r\n\r\n\t\t} else if (code & 2) { // right\r\n\t\t\tx = max.x;\r\n\t\t\ty = a.y + dy * (max.x - a.x) / dx;\r\n\r\n\t\t} else if (code & 1) { // left\r\n\t\t\tx = min.x;\r\n\t\t\ty = a.y + dy * (min.x - a.x) / dx;\r\n\t\t}\r\n\r\n\t\treturn new L.Point(x, y, round);\r\n\t},\r\n\r\n\t_getBitCode: function (p, bounds) {\r\n\t\tvar code = 0;\r\n\r\n\t\tif (p.x < bounds.min.x) { // left\r\n\t\t\tcode |= 1;\r\n\t\t} else if (p.x > bounds.max.x) { // right\r\n\t\t\tcode |= 2;\r\n\t\t}\r\n\r\n\t\tif (p.y < bounds.min.y) { // bottom\r\n\t\t\tcode |= 4;\r\n\t\t} else if (p.y > bounds.max.y) { // top\r\n\t\t\tcode |= 8;\r\n\t\t}\r\n\r\n\t\treturn code;\r\n\t},\r\n\r\n\t// square distance (to avoid unnecessary Math.sqrt calls)\r\n\t_sqDist: function (p1, p2) {\r\n\t\tvar dx = p2.x - p1.x,\r\n\t\t    dy = p2.y - p1.y;\r\n\t\treturn dx * dx + dy * dy;\r\n\t},\r\n\r\n\t// return closest point on segment or distance to that point\r\n\t_sqClosestPointOnSegment: function (p, p1, p2, sqDist) {\r\n\t\tvar x = p1.x,\r\n\t\t    y = p1.y,\r\n\t\t    dx = p2.x - x,\r\n\t\t    dy = p2.y - y,\r\n\t\t    dot = dx * dx + dy * dy,\r\n\t\t    t;\r\n\r\n\t\tif (dot > 0) {\r\n\t\t\tt = ((p.x - x) * dx + (p.y - y) * dy) / dot;\r\n\r\n\t\t\tif (t > 1) {\r\n\t\t\t\tx = p2.x;\r\n\t\t\t\ty = p2.y;\r\n\t\t\t} else if (t > 0) {\r\n\t\t\t\tx += dx * t;\r\n\t\t\t\ty += dy * t;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tdx = p.x - x;\r\n\t\tdy = p.y - y;\r\n\r\n\t\treturn sqDist ? dx * dx + dy * dy : new L.Point(x, y);\r\n\t}\r\n};\r\n\n\n\n/*\n * @class Polyline\n * @aka L.Polyline\n * @inherits Path\n *\n * A class for drawing polyline overlays on a map. Extends `Path`.\n *\n * @example\n *\n * ```js\n * // create a red polyline from an array of LatLng points\n * var latlngs = [\n * \t[45.51, -122.68],\n * \t[37.77, -122.43],\n * \t[34.04, -118.2]\n * ];\n *\n * var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);\n *\n * // zoom the map to the polyline\n * map.fitBounds(polyline.getBounds());\n * ```\n *\n * You can also pass a multi-dimensional array to represent a `MultiPolyline` shape:\n *\n * ```js\n * // create a red polyline from an array of arrays of LatLng points\n * var latlngs = [\n * \t[[45.51, -122.68],\n * \t [37.77, -122.43],\n * \t [34.04, -118.2]],\n * \t[[40.78, -73.91],\n * \t [41.83, -87.62],\n * \t [32.76, -96.72]]\n * ];\n * ```\n */\n\nL.Polyline = L.Path.extend({\n\n\t// @section\n\t// @aka Polyline options\n\toptions: {\n\t\t// @option smoothFactor: Number = 1.0\n\t\t// How much to simplify the polyline on each zoom level. More means\n\t\t// better performance and smoother look, and less means more accurate representation.\n\t\tsmoothFactor: 1.0,\n\n\t\t// @option noClip: Boolean = false\n\t\t// Disable polyline clipping.\n\t\tnoClip: false\n\t},\n\n\tinitialize: function (latlngs, options) {\n\t\tL.setOptions(this, options);\n\t\tthis._setLatLngs(latlngs);\n\t},\n\n\t// @method getLatLngs(): LatLng[]\n\t// Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.\n\tgetLatLngs: function () {\n\t\treturn this._latlngs;\n\t},\n\n\t// @method setLatLngs(latlngs: LatLng[]): this\n\t// Replaces all the points in the polyline with the given array of geographical points.\n\tsetLatLngs: function (latlngs) {\n\t\tthis._setLatLngs(latlngs);\n\t\treturn this.redraw();\n\t},\n\n\t// @method isEmpty(): Boolean\n\t// Returns `true` if the Polyline has no LatLngs.\n\tisEmpty: function () {\n\t\treturn !this._latlngs.length;\n\t},\n\n\tclosestLayerPoint: function (p) {\n\t\tvar minDistance = Infinity,\n\t\t    minPoint = null,\n\t\t    closest = L.LineUtil._sqClosestPointOnSegment,\n\t\t    p1, p2;\n\n\t\tfor (var j = 0, jLen = this._parts.length; j < jLen; j++) {\n\t\t\tvar points = this._parts[j];\n\n\t\t\tfor (var i = 1, len = points.length; i < len; i++) {\n\t\t\t\tp1 = points[i - 1];\n\t\t\t\tp2 = points[i];\n\n\t\t\t\tvar sqDist = closest(p, p1, p2, true);\n\n\t\t\t\tif (sqDist < minDistance) {\n\t\t\t\t\tminDistance = sqDist;\n\t\t\t\t\tminPoint = closest(p, p1, p2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (minPoint) {\n\t\t\tminPoint.distance = Math.sqrt(minDistance);\n\t\t}\n\t\treturn minPoint;\n\t},\n\n\t// @method getCenter(): LatLng\n\t// Returns the center ([centroid](http://en.wikipedia.org/wiki/Centroid)) of the polyline.\n\tgetCenter: function () {\n\t\t// throws error when not yet added to map as this center calculation requires projected coordinates\n\t\tif (!this._map) {\n\t\t\tthrow new Error('Must add layer to map before using getCenter()');\n\t\t}\n\n\t\tvar i, halfDist, segDist, dist, p1, p2, ratio,\n\t\t    points = this._rings[0],\n\t\t    len = points.length;\n\n\t\tif (!len) { return null; }\n\n\t\t// polyline centroid algorithm; only uses the first ring if there are multiple\n\n\t\tfor (i = 0, halfDist = 0; i < len - 1; i++) {\n\t\t\thalfDist += points[i].distanceTo(points[i + 1]) / 2;\n\t\t}\n\n\t\t// The line is so small in the current view that all points are on the same pixel.\n\t\tif (halfDist === 0) {\n\t\t\treturn this._map.layerPointToLatLng(points[0]);\n\t\t}\n\n\t\tfor (i = 0, dist = 0; i < len - 1; i++) {\n\t\t\tp1 = points[i];\n\t\t\tp2 = points[i + 1];\n\t\t\tsegDist = p1.distanceTo(p2);\n\t\t\tdist += segDist;\n\n\t\t\tif (dist > halfDist) {\n\t\t\t\tratio = (dist - halfDist) / segDist;\n\t\t\t\treturn this._map.layerPointToLatLng([\n\t\t\t\t\tp2.x - ratio * (p2.x - p1.x),\n\t\t\t\t\tp2.y - ratio * (p2.y - p1.y)\n\t\t\t\t]);\n\t\t\t}\n\t\t}\n\t},\n\n\t// @method getBounds(): LatLngBounds\n\t// Returns the `LatLngBounds` of the path.\n\tgetBounds: function () {\n\t\treturn this._bounds;\n\t},\n\n\t// @method addLatLng(latlng: LatLng, latlngs? LatLng[]): this\n\t// Adds a given point to the polyline. By default, adds to the first ring of\n\t// the polyline in case of a multi-polyline, but can be overridden by passing\n\t// a specific ring as a LatLng array (that you can earlier access with [`getLatLngs`](#polyline-getlatlngs)).\n\taddLatLng: function (latlng, latlngs) {\n\t\tlatlngs = latlngs || this._defaultShape();\n\t\tlatlng = L.latLng(latlng);\n\t\tlatlngs.push(latlng);\n\t\tthis._bounds.extend(latlng);\n\t\treturn this.redraw();\n\t},\n\n\t_setLatLngs: function (latlngs) {\n\t\tthis._bounds = new L.LatLngBounds();\n\t\tthis._latlngs = this._convertLatLngs(latlngs);\n\t},\n\n\t_defaultShape: function () {\n\t\treturn L.Polyline._flat(this._latlngs) ? this._latlngs : this._latlngs[0];\n\t},\n\n\t// recursively convert latlngs input into actual LatLng instances; calculate bounds along the way\n\t_convertLatLngs: function (latlngs) {\n\t\tvar result = [],\n\t\t    flat = L.Polyline._flat(latlngs);\n\n\t\tfor (var i = 0, len = latlngs.length; i < len; i++) {\n\t\t\tif (flat) {\n\t\t\t\tresult[i] = L.latLng(latlngs[i]);\n\t\t\t\tthis._bounds.extend(result[i]);\n\t\t\t} else {\n\t\t\t\tresult[i] = this._convertLatLngs(latlngs[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t},\n\n\t_project: function () {\n\t\tvar pxBounds = new L.Bounds();\n\t\tthis._rings = [];\n\t\tthis._projectLatlngs(this._latlngs, this._rings, pxBounds);\n\n\t\tvar w = this._clickTolerance(),\n\t\t    p = new L.Point(w, w);\n\n\t\tif (this._bounds.isValid() && pxBounds.isValid()) {\n\t\t\tpxBounds.min._subtract(p);\n\t\t\tpxBounds.max._add(p);\n\t\t\tthis._pxBounds = pxBounds;\n\t\t}\n\t},\n\n\t// recursively turns latlngs into a set of rings with projected coordinates\n\t_projectLatlngs: function (latlngs, result, projectedBounds) {\n\t\tvar flat = latlngs[0] instanceof L.LatLng,\n\t\t    len = latlngs.length,\n\t\t    i, ring;\n\n\t\tif (flat) {\n\t\t\tring = [];\n\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\tring[i] = this._map.latLngToLayerPoint(latlngs[i]);\n\t\t\t\tprojectedBounds.extend(ring[i]);\n\t\t\t}\n\t\t\tresult.push(ring);\n\t\t} else {\n\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\tthis._projectLatlngs(latlngs[i], result, projectedBounds);\n\t\t\t}\n\t\t}\n\t},\n\n\t// clip polyline by renderer bounds so that we have less to render for performance\n\t_clipPoints: function () {\n\t\tvar bounds = this._renderer._bounds;\n\n\t\tthis._parts = [];\n\t\tif (!this._pxBounds || !this._pxBounds.intersects(bounds)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.options.noClip) {\n\t\t\tthis._parts = this._rings;\n\t\t\treturn;\n\t\t}\n\n\t\tvar parts = this._parts,\n\t\t    i, j, k, len, len2, segment, points;\n\n\t\tfor (i = 0, k = 0, len = this._rings.length; i < len; i++) {\n\t\t\tpoints = this._rings[i];\n\n\t\t\tfor (j = 0, len2 = points.length; j < len2 - 1; j++) {\n\t\t\t\tsegment = L.LineUtil.clipSegment(points[j], points[j + 1], bounds, j, true);\n\n\t\t\t\tif (!segment) { continue; }\n\n\t\t\t\tparts[k] = parts[k] || [];\n\t\t\t\tparts[k].push(segment[0]);\n\n\t\t\t\t// if segment goes out of screen, or it's the last one, it's the end of the line part\n\t\t\t\tif ((segment[1] !== points[j + 1]) || (j === len2 - 2)) {\n\t\t\t\t\tparts[k].push(segment[1]);\n\t\t\t\t\tk++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// simplify each clipped part of the polyline for performance\n\t_simplifyPoints: function () {\n\t\tvar parts = this._parts,\n\t\t    tolerance = this.options.smoothFactor;\n\n\t\tfor (var i = 0, len = parts.length; i < len; i++) {\n\t\t\tparts[i] = L.LineUtil.simplify(parts[i], tolerance);\n\t\t}\n\t},\n\n\t_update: function () {\n\t\tif (!this._map) { return; }\n\n\t\tthis._clipPoints();\n\t\tthis._simplifyPoints();\n\t\tthis._updatePath();\n\t},\n\n\t_updatePath: function () {\n\t\tthis._renderer._updatePoly(this);\n\t}\n});\n\n// @factory L.polyline(latlngs: LatLng[], options?: Polyline options)\n// Instantiates a polyline object given an array of geographical points and\n// optionally an options object. You can create a `Polyline` object with\n// multiple separate lines (`MultiPolyline`) by passing an array of arrays\n// of geographic points.\nL.polyline = function (latlngs, options) {\n\treturn new L.Polyline(latlngs, options);\n};\n\nL.Polyline._flat = function (latlngs) {\n\t// true if it's a flat array of latlngs; false if nested\n\treturn !L.Util.isArray(latlngs[0]) || (typeof latlngs[0][0] !== 'object' && typeof latlngs[0][0] !== 'undefined');\n};\n\n\n\n/*\r\n * @namespace PolyUtil\r\n * Various utility functions for polygon geometries.\r\n */\r\n\r\nL.PolyUtil = {};\r\n\r\n/* @function clipPolygon(points: Point[], bounds: Bounds, round?: Boolean): Point[]\r\n * Clips the polygon geometry defined by the given `points` by the given bounds (using the [Sutherland-Hodgeman algorithm](https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm)).\r\n * Used by Leaflet to only show polygon points that are on the screen or near, increasing\r\n * performance. Note that polygon points needs different algorithm for clipping\r\n * than polyline, so there's a seperate method for it.\r\n */\r\nL.PolyUtil.clipPolygon = function (points, bounds, round) {\r\n\tvar clippedPoints,\r\n\t    edges = [1, 4, 2, 8],\r\n\t    i, j, k,\r\n\t    a, b,\r\n\t    len, edge, p,\r\n\t    lu = L.LineUtil;\r\n\r\n\tfor (i = 0, len = points.length; i < len; i++) {\r\n\t\tpoints[i]._code = lu._getBitCode(points[i], bounds);\r\n\t}\r\n\r\n\t// for each edge (left, bottom, right, top)\r\n\tfor (k = 0; k < 4; k++) {\r\n\t\tedge = edges[k];\r\n\t\tclippedPoints = [];\r\n\r\n\t\tfor (i = 0, len = points.length, j = len - 1; i < len; j = i++) {\r\n\t\t\ta = points[i];\r\n\t\t\tb = points[j];\r\n\r\n\t\t\t// if a is inside the clip window\r\n\t\t\tif (!(a._code & edge)) {\r\n\t\t\t\t// if b is outside the clip window (a->b goes out of screen)\r\n\t\t\t\tif (b._code & edge) {\r\n\t\t\t\t\tp = lu._getEdgeIntersection(b, a, edge, bounds, round);\r\n\t\t\t\t\tp._code = lu._getBitCode(p, bounds);\r\n\t\t\t\t\tclippedPoints.push(p);\r\n\t\t\t\t}\r\n\t\t\t\tclippedPoints.push(a);\r\n\r\n\t\t\t// else if b is inside the clip window (a->b enters the screen)\r\n\t\t\t} else if (!(b._code & edge)) {\r\n\t\t\t\tp = lu._getEdgeIntersection(b, a, edge, bounds, round);\r\n\t\t\t\tp._code = lu._getBitCode(p, bounds);\r\n\t\t\t\tclippedPoints.push(p);\r\n\t\t\t}\r\n\t\t}\r\n\t\tpoints = clippedPoints;\r\n\t}\r\n\r\n\treturn points;\r\n};\r\n\n\n\n/*\n * @class Polygon\n * @aka L.Polygon\n * @inherits Polyline\n *\n * A class for drawing polygon overlays on a map. Extends `Polyline`.\n *\n * Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.\n *\n *\n * @example\n *\n * ```js\n * // create a red polygon from an array of LatLng points\n * var latlngs = [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]];\n *\n * var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);\n *\n * // zoom the map to the polygon\n * map.fitBounds(polygon.getBounds());\n * ```\n *\n * You can also pass an array of arrays of latlngs, with the first array representing the outer shape and the other arrays representing holes in the outer shape:\n *\n * ```js\n * var latlngs = [\n *   [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring\n *   [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole\n * ];\n * ```\n *\n * Additionally, you can pass a multi-dimensional array to represent a MultiPolygon shape.\n *\n * ```js\n * var latlngs = [\n *   [ // first polygon\n *     [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring\n *     [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole\n *   ],\n *   [ // second polygon\n *     [[41, -111.03],[45, -111.04],[45, -104.05],[41, -104.05]]\n *   ]\n * ];\n * ```\n */\n\nL.Polygon = L.Polyline.extend({\n\n\toptions: {\n\t\tfill: true\n\t},\n\n\tisEmpty: function () {\n\t\treturn !this._latlngs.length || !this._latlngs[0].length;\n\t},\n\n\tgetCenter: function () {\n\t\t// throws error when not yet added to map as this center calculation requires projected coordinates\n\t\tif (!this._map) {\n\t\t\tthrow new Error('Must add layer to map before using getCenter()');\n\t\t}\n\n\t\tvar i, j, p1, p2, f, area, x, y, center,\n\t\t    points = this._rings[0],\n\t\t    len = points.length;\n\n\t\tif (!len) { return null; }\n\n\t\t// polygon centroid algorithm; only uses the first ring if there are multiple\n\n\t\tarea = x = y = 0;\n\n\t\tfor (i = 0, j = len - 1; i < len; j = i++) {\n\t\t\tp1 = points[i];\n\t\t\tp2 = points[j];\n\n\t\t\tf = p1.y * p2.x - p2.y * p1.x;\n\t\t\tx += (p1.x + p2.x) * f;\n\t\t\ty += (p1.y + p2.y) * f;\n\t\t\tarea += f * 3;\n\t\t}\n\n\t\tif (area === 0) {\n\t\t\t// Polygon is so small that all points are on same pixel.\n\t\t\tcenter = points[0];\n\t\t} else {\n\t\t\tcenter = [x / area, y / area];\n\t\t}\n\t\treturn this._map.layerPointToLatLng(center);\n\t},\n\n\t_convertLatLngs: function (latlngs) {\n\t\tvar result = L.Polyline.prototype._convertLatLngs.call(this, latlngs),\n\t\t    len = result.length;\n\n\t\t// remove last point if it equals first one\n\t\tif (len >= 2 && result[0] instanceof L.LatLng && result[0].equals(result[len - 1])) {\n\t\t\tresult.pop();\n\t\t}\n\t\treturn result;\n\t},\n\n\t_setLatLngs: function (latlngs) {\n\t\tL.Polyline.prototype._setLatLngs.call(this, latlngs);\n\t\tif (L.Polyline._flat(this._latlngs)) {\n\t\t\tthis._latlngs = [this._latlngs];\n\t\t}\n\t},\n\n\t_defaultShape: function () {\n\t\treturn L.Polyline._flat(this._latlngs[0]) ? this._latlngs[0] : this._latlngs[0][0];\n\t},\n\n\t_clipPoints: function () {\n\t\t// polygons need a different clipping algorithm so we redefine that\n\n\t\tvar bounds = this._renderer._bounds,\n\t\t    w = this.options.weight,\n\t\t    p = new L.Point(w, w);\n\n\t\t// increase clip padding by stroke width to avoid stroke on clip edges\n\t\tbounds = new L.Bounds(bounds.min.subtract(p), bounds.max.add(p));\n\n\t\tthis._parts = [];\n\t\tif (!this._pxBounds || !this._pxBounds.intersects(bounds)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.options.noClip) {\n\t\t\tthis._parts = this._rings;\n\t\t\treturn;\n\t\t}\n\n\t\tfor (var i = 0, len = this._rings.length, clipped; i < len; i++) {\n\t\t\tclipped = L.PolyUtil.clipPolygon(this._rings[i], bounds, true);\n\t\t\tif (clipped.length) {\n\t\t\t\tthis._parts.push(clipped);\n\t\t\t}\n\t\t}\n\t},\n\n\t_updatePath: function () {\n\t\tthis._renderer._updatePoly(this, true);\n\t}\n});\n\n\n// @factory L.polygon(latlngs: LatLng[], options?: Polyline options)\nL.polygon = function (latlngs, options) {\n\treturn new L.Polygon(latlngs, options);\n};\n\n\n\n/*\n * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object.\n */\n\n/*\n * @class Rectangle\n * @aka L.Retangle\n * @inherits Polygon\n *\n * A class for drawing rectangle overlays on a map. Extends `Polygon`.\n *\n * @example\n *\n * ```js\n * // define rectangle geographical bounds\n * var bounds = [[54.559322, -5.767822], [56.1210604, -3.021240]];\n *\n * // create an orange rectangle\n * L.rectangle(bounds, {color: \"#ff7800\", weight: 1}).addTo(map);\n *\n * // zoom the map to the rectangle bounds\n * map.fitBounds(bounds);\n * ```\n *\n */\n\n\nL.Rectangle = L.Polygon.extend({\n\tinitialize: function (latLngBounds, options) {\n\t\tL.Polygon.prototype.initialize.call(this, this._boundsToLatLngs(latLngBounds), options);\n\t},\n\n\t// @method setBounds(latLngBounds: LatLngBounds): this\n\t// Redraws the rectangle with the passed bounds.\n\tsetBounds: function (latLngBounds) {\n\t\treturn this.setLatLngs(this._boundsToLatLngs(latLngBounds));\n\t},\n\n\t_boundsToLatLngs: function (latLngBounds) {\n\t\tlatLngBounds = L.latLngBounds(latLngBounds);\n\t\treturn [\n\t\t\tlatLngBounds.getSouthWest(),\n\t\t\tlatLngBounds.getNorthWest(),\n\t\t\tlatLngBounds.getNorthEast(),\n\t\t\tlatLngBounds.getSouthEast()\n\t\t];\n\t}\n});\n\n\n// @factory L.rectangle(latLngBounds: LatLngBounds, options?: Polyline options)\nL.rectangle = function (latLngBounds, options) {\n\treturn new L.Rectangle(latLngBounds, options);\n};\n\n\n\n/*\n * @class CircleMarker\n * @aka L.CircleMarker\n * @inherits Path\n *\n * A circle of a fixed size with radius specified in pixels. Extends `Path`.\n */\n\nL.CircleMarker = L.Path.extend({\n\n\t// @section\n\t// @aka CircleMarker options\n\toptions: {\n\t\tfill: true,\n\n\t\t// @option radius: Number = 10\n\t\t// Radius of the circle marker, in pixels\n\t\tradius: 10\n\t},\n\n\tinitialize: function (latlng, options) {\n\t\tL.setOptions(this, options);\n\t\tthis._latlng = L.latLng(latlng);\n\t\tthis._radius = this.options.radius;\n\t},\n\n\t// @method setLatLng(latLng: LatLng): this\n\t// Sets the position of a circle marker to a new location.\n\tsetLatLng: function (latlng) {\n\t\tthis._latlng = L.latLng(latlng);\n\t\tthis.redraw();\n\t\treturn this.fire('move', {latlng: this._latlng});\n\t},\n\n\t// @method getLatLng(): LatLng\n\t// Returns the current geographical position of the circle marker\n\tgetLatLng: function () {\n\t\treturn this._latlng;\n\t},\n\n\t// @method setRadius(radius: Number): this\n\t// Sets the radius of a circle marker. Units are in pixels.\n\tsetRadius: function (radius) {\n\t\tthis.options.radius = this._radius = radius;\n\t\treturn this.redraw();\n\t},\n\n\t// @method getRadius(): Number\n\t// Returns the current radius of the circle\n\tgetRadius: function () {\n\t\treturn this._radius;\n\t},\n\n\tsetStyle : function (options) {\n\t\tvar radius = options && options.radius || this._radius;\n\t\tL.Path.prototype.setStyle.call(this, options);\n\t\tthis.setRadius(radius);\n\t\treturn this;\n\t},\n\n\t_project: function () {\n\t\tthis._point = this._map.latLngToLayerPoint(this._latlng);\n\t\tthis._updateBounds();\n\t},\n\n\t_updateBounds: function () {\n\t\tvar r = this._radius,\n\t\t    r2 = this._radiusY || r,\n\t\t    w = this._clickTolerance(),\n\t\t    p = [r + w, r2 + w];\n\t\tthis._pxBounds = new L.Bounds(this._point.subtract(p), this._point.add(p));\n\t},\n\n\t_update: function () {\n\t\tif (this._map) {\n\t\t\tthis._updatePath();\n\t\t}\n\t},\n\n\t_updatePath: function () {\n\t\tthis._renderer._updateCircle(this);\n\t},\n\n\t_empty: function () {\n\t\treturn this._radius && !this._renderer._bounds.intersects(this._pxBounds);\n\t}\n});\n\n\n// @factory L.circleMarker(latlng: LatLng, options?: CircleMarker options)\n// Instantiates a circle marker object given a geographical point, and an optional options object.\nL.circleMarker = function (latlng, options) {\n\treturn new L.CircleMarker(latlng, options);\n};\n\n\n\n/*\n * @class Circle\n * @aka L.Circle\n * @inherits CircleMarker\n *\n * A class for drawing circle overlays on a map. Extends `CircleMarker`.\n *\n * It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion).\n *\n * @example\n *\n * ```js\n * L.circle([50.5, 30.5], {radius: 200}).addTo(map);\n * ```\n */\n\nL.Circle = L.CircleMarker.extend({\n\n\tinitialize: function (latlng, options, legacyOptions) {\n\t\tif (typeof options === 'number') {\n\t\t\t// Backwards compatibility with 0.7.x factory (latlng, radius, options?)\n\t\t\toptions = L.extend({}, legacyOptions, {radius: options});\n\t\t}\n\t\tL.setOptions(this, options);\n\t\tthis._latlng = L.latLng(latlng);\n\n\t\tif (isNaN(this.options.radius)) { throw new Error('Circle radius cannot be NaN'); }\n\n\t\t// @section\n\t\t// @aka Circle options\n\t\t// @option radius: Number; Radius of the circle, in meters.\n\t\tthis._mRadius = this.options.radius;\n\t},\n\n\t// @method setRadius(radius: Number): this\n\t// Sets the radius of a circle. Units are in meters.\n\tsetRadius: function (radius) {\n\t\tthis._mRadius = radius;\n\t\treturn this.redraw();\n\t},\n\n\t// @method getRadius(): Number\n\t// Returns the current radius of a circle. Units are in meters.\n\tgetRadius: function () {\n\t\treturn this._mRadius;\n\t},\n\n\t// @method getBounds(): LatLngBounds\n\t// Returns the `LatLngBounds` of the path.\n\tgetBounds: function () {\n\t\tvar half = [this._radius, this._radiusY || this._radius];\n\n\t\treturn new L.LatLngBounds(\n\t\t\tthis._map.layerPointToLatLng(this._point.subtract(half)),\n\t\t\tthis._map.layerPointToLatLng(this._point.add(half)));\n\t},\n\n\tsetStyle: L.Path.prototype.setStyle,\n\n\t_project: function () {\n\n\t\tvar lng = this._latlng.lng,\n\t\t    lat = this._latlng.lat,\n\t\t    map = this._map,\n\t\t    crs = map.options.crs;\n\n\t\tif (crs.distance === L.CRS.Earth.distance) {\n\t\t\tvar d = Math.PI / 180,\n\t\t\t    latR = (this._mRadius / L.CRS.Earth.R) / d,\n\t\t\t    top = map.project([lat + latR, lng]),\n\t\t\t    bottom = map.project([lat - latR, lng]),\n\t\t\t    p = top.add(bottom).divideBy(2),\n\t\t\t    lat2 = map.unproject(p).lat,\n\t\t\t    lngR = Math.acos((Math.cos(latR * d) - Math.sin(lat * d) * Math.sin(lat2 * d)) /\n\t\t\t            (Math.cos(lat * d) * Math.cos(lat2 * d))) / d;\n\n\t\t\tif (isNaN(lngR) || lngR === 0) {\n\t\t\t\tlngR = latR / Math.cos(Math.PI / 180 * lat); // Fallback for edge case, #2425\n\t\t\t}\n\n\t\t\tthis._point = p.subtract(map.getPixelOrigin());\n\t\t\tthis._radius = isNaN(lngR) ? 0 : Math.max(Math.round(p.x - map.project([lat2, lng - lngR]).x), 1);\n\t\t\tthis._radiusY = Math.max(Math.round(p.y - top.y), 1);\n\n\t\t} else {\n\t\t\tvar latlng2 = crs.unproject(crs.project(this._latlng).subtract([this._mRadius, 0]));\n\n\t\t\tthis._point = map.latLngToLayerPoint(this._latlng);\n\t\t\tthis._radius = this._point.x - map.latLngToLayerPoint(latlng2).x;\n\t\t}\n\n\t\tthis._updateBounds();\n\t}\n});\n\n// @factory L.circle(latlng: LatLng, options?: Circle options)\n// Instantiates a circle object given a geographical point, and an options object\n// which contains the circle radius.\n// @alternative\n// @factory L.circle(latlng: LatLng, radius: Number, options?: Circle options)\n// Obsolete way of instantiating a circle, for compatibility with 0.7.x code.\n// Do not use in new applications or plugins.\nL.circle = function (latlng, options, legacyOptions) {\n\treturn new L.Circle(latlng, options, legacyOptions);\n};\n\n\n\n/*\n * @class SVG\n * @inherits Renderer\n * @aka L.SVG\n *\n * Allows vector layers to be displayed with [SVG](https://developer.mozilla.org/docs/Web/SVG).\n * Inherits `Renderer`.\n *\n * Due to [technical limitations](http://caniuse.com/#search=svg), SVG is not\n * available in all web browsers, notably Android 2.x and 3.x.\n *\n * Although SVG is not available on IE7 and IE8, these browsers support\n * [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language)\n * (a now deprecated technology), and the SVG renderer will fall back to VML in\n * this case.\n *\n * @example\n *\n * Use SVG by default for all paths in the map:\n *\n * ```js\n * var map = L.map('map', {\n * \trenderer: L.svg()\n * });\n * ```\n *\n * Use a SVG renderer with extra padding for specific vector geometries:\n *\n * ```js\n * var map = L.map('map');\n * var myRenderer = L.svg({ padding: 0.5 });\n * var line = L.polyline( coordinates, { renderer: myRenderer } );\n * var circle = L.circle( center, { renderer: myRenderer } );\n * ```\n */\n\nL.SVG = L.Renderer.extend({\n\n\tgetEvents: function () {\n\t\tvar events = L.Renderer.prototype.getEvents.call(this);\n\t\tevents.zoomstart = this._onZoomStart;\n\t\treturn events;\n\t},\n\n\t_initContainer: function () {\n\t\tthis._container = L.SVG.create('svg');\n\n\t\t// makes it possible to click through svg root; we'll reset it back in individual paths\n\t\tthis._container.setAttribute('pointer-events', 'none');\n\n\t\tthis._rootGroup = L.SVG.create('g');\n\t\tthis._container.appendChild(this._rootGroup);\n\t},\n\n\t_onZoomStart: function () {\n\t\t// Drag-then-pinch interactions might mess up the center and zoom.\n\t\t// In this case, the easiest way to prevent this is re-do the renderer\n\t\t//   bounds and padding when the zooming starts.\n\t\tthis._update();\n\t},\n\n\t_update: function () {\n\t\tif (this._map._animatingZoom && this._bounds) { return; }\n\n\t\tL.Renderer.prototype._update.call(this);\n\n\t\tvar b = this._bounds,\n\t\t    size = b.getSize(),\n\t\t    container = this._container;\n\n\t\t// set size of svg-container if changed\n\t\tif (!this._svgSize || !this._svgSize.equals(size)) {\n\t\t\tthis._svgSize = size;\n\t\t\tcontainer.setAttribute('width', size.x);\n\t\t\tcontainer.setAttribute('height', size.y);\n\t\t}\n\n\t\t// movement: update container viewBox so that we don't have to change coordinates of individual layers\n\t\tL.DomUtil.setPosition(container, b.min);\n\t\tcontainer.setAttribute('viewBox', [b.min.x, b.min.y, size.x, size.y].join(' '));\n\n\t\tthis.fire('update');\n\t},\n\n\t// methods below are called by vector layers implementations\n\n\t_initPath: function (layer) {\n\t\tvar path = layer._path = L.SVG.create('path');\n\n\t\t// @namespace Path\n\t\t// @option className: String = null\n\t\t// Custom class name set on an element. Only for SVG renderer.\n\t\tif (layer.options.className) {\n\t\t\tL.DomUtil.addClass(path, layer.options.className);\n\t\t}\n\n\t\tif (layer.options.interactive) {\n\t\t\tL.DomUtil.addClass(path, 'leaflet-interactive');\n\t\t}\n\n\t\tthis._updateStyle(layer);\n\t\tthis._layers[L.stamp(layer)] = layer;\n\t},\n\n\t_addPath: function (layer) {\n\t\tthis._rootGroup.appendChild(layer._path);\n\t\tlayer.addInteractiveTarget(layer._path);\n\t},\n\n\t_removePath: function (layer) {\n\t\tL.DomUtil.remove(layer._path);\n\t\tlayer.removeInteractiveTarget(layer._path);\n\t\tdelete this._layers[L.stamp(layer)];\n\t},\n\n\t_updatePath: function (layer) {\n\t\tlayer._project();\n\t\tlayer._update();\n\t},\n\n\t_updateStyle: function (layer) {\n\t\tvar path = layer._path,\n\t\t    options = layer.options;\n\n\t\tif (!path) { return; }\n\n\t\tif (options.stroke) {\n\t\t\tpath.setAttribute('stroke', options.color);\n\t\t\tpath.setAttribute('stroke-opacity', options.opacity);\n\t\t\tpath.setAttribute('stroke-width', options.weight);\n\t\t\tpath.setAttribute('stroke-linecap', options.lineCap);\n\t\t\tpath.setAttribute('stroke-linejoin', options.lineJoin);\n\n\t\t\tif (options.dashArray) {\n\t\t\t\tpath.setAttribute('stroke-dasharray', options.dashArray);\n\t\t\t} else {\n\t\t\t\tpath.removeAttribute('stroke-dasharray');\n\t\t\t}\n\n\t\t\tif (options.dashOffset) {\n\t\t\t\tpath.setAttribute('stroke-dashoffset', options.dashOffset);\n\t\t\t} else {\n\t\t\t\tpath.removeAttribute('stroke-dashoffset');\n\t\t\t}\n\t\t} else {\n\t\t\tpath.setAttribute('stroke', 'none');\n\t\t}\n\n\t\tif (options.fill) {\n\t\t\tpath.setAttribute('fill', options.fillColor || options.color);\n\t\t\tpath.setAttribute('fill-opacity', options.fillOpacity);\n\t\t\tpath.setAttribute('fill-rule', options.fillRule || 'evenodd');\n\t\t} else {\n\t\t\tpath.setAttribute('fill', 'none');\n\t\t}\n\t},\n\n\t_updatePoly: function (layer, closed) {\n\t\tthis._setPath(layer, L.SVG.pointsToPath(layer._parts, closed));\n\t},\n\n\t_updateCircle: function (layer) {\n\t\tvar p = layer._point,\n\t\t    r = layer._radius,\n\t\t    r2 = layer._radiusY || r,\n\t\t    arc = 'a' + r + ',' + r2 + ' 0 1,0 ';\n\n\t\t// drawing a circle with two half-arcs\n\t\tvar d = layer._empty() ? 'M0 0' :\n\t\t\t\t'M' + (p.x - r) + ',' + p.y +\n\t\t\t\tarc + (r * 2) + ',0 ' +\n\t\t\t\tarc + (-r * 2) + ',0 ';\n\n\t\tthis._setPath(layer, d);\n\t},\n\n\t_setPath: function (layer, path) {\n\t\tlayer._path.setAttribute('d', path);\n\t},\n\n\t// SVG does not have the concept of zIndex so we resort to changing the DOM order of elements\n\t_bringToFront: function (layer) {\n\t\tL.DomUtil.toFront(layer._path);\n\t},\n\n\t_bringToBack: function (layer) {\n\t\tL.DomUtil.toBack(layer._path);\n\t}\n});\n\n\n// @namespace SVG; @section\n// There are several static functions which can be called without instantiating L.SVG:\nL.extend(L.SVG, {\n\t// @function create(name: String): SVGElement\n\t// Returns a instance of [SVGElement](https://developer.mozilla.org/docs/Web/API/SVGElement),\n\t// corresponding to the class name passed. For example, using 'line' will return\n\t// an instance of [SVGLineElement](https://developer.mozilla.org/docs/Web/API/SVGLineElement).\n\tcreate: function (name) {\n\t\treturn document.createElementNS('http://www.w3.org/2000/svg', name);\n\t},\n\n\t// @function pointsToPath(rings: Point[], closed: Boolean): String\n\t// Generates a SVG path string for multiple rings, with each ring turning\n\t// into \"M..L..L..\" instructions\n\tpointsToPath: function (rings, closed) {\n\t\tvar str = '',\n\t\t    i, j, len, len2, points, p;\n\n\t\tfor (i = 0, len = rings.length; i < len; i++) {\n\t\t\tpoints = rings[i];\n\n\t\t\tfor (j = 0, len2 = points.length; j < len2; j++) {\n\t\t\t\tp = points[j];\n\t\t\t\tstr += (j ? 'L' : 'M') + p.x + ' ' + p.y;\n\t\t\t}\n\n\t\t\t// closes the ring for polygons; \"x\" is VML syntax\n\t\t\tstr += closed ? (L.Browser.svg ? 'z' : 'x') : '';\n\t\t}\n\n\t\t// SVG complains about empty path strings\n\t\treturn str || 'M0 0';\n\t}\n});\n\n// @namespace Browser; @property svg: Boolean\n// `true` when the browser supports [SVG](https://developer.mozilla.org/docs/Web/SVG).\nL.Browser.svg = !!(document.createElementNS && L.SVG.create('svg').createSVGRect);\n\n\n// @namespace SVG\n// @factory L.svg(options?: Renderer options)\n// Creates a SVG renderer with the given options.\nL.svg = function (options) {\n\treturn L.Browser.svg || L.Browser.vml ? new L.SVG(options) : null;\n};\n\n\n\n/*\n * Thanks to Dmitry Baranovsky and his Raphael library for inspiration!\n */\n\n/*\n * @class SVG\n *\n * Although SVG is not available on IE7 and IE8, these browsers support [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language), and the SVG renderer will fall back to VML in this case.\n *\n * VML was deprecated in 2012, which means VML functionality exists only for backwards compatibility\n * with old versions of Internet Explorer.\n */\n\n// @namespace Browser; @property vml: Boolean\n// `true` if the browser supports [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language).\nL.Browser.vml = !L.Browser.svg && (function () {\n\ttry {\n\t\tvar div = document.createElement('div');\n\t\tdiv.innerHTML = '<v:shape adj=\"1\"/>';\n\n\t\tvar shape = div.firstChild;\n\t\tshape.style.behavior = 'url(#default#VML)';\n\n\t\treturn shape && (typeof shape.adj === 'object');\n\n\t} catch (e) {\n\t\treturn false;\n\t}\n}());\n\n// redefine some SVG methods to handle VML syntax which is similar but with some differences\nL.SVG.include(!L.Browser.vml ? {} : {\n\n\t_initContainer: function () {\n\t\tthis._container = L.DomUtil.create('div', 'leaflet-vml-container');\n\t},\n\n\t_update: function () {\n\t\tif (this._map._animatingZoom) { return; }\n\t\tL.Renderer.prototype._update.call(this);\n\t\tthis.fire('update');\n\t},\n\n\t_initPath: function (layer) {\n\t\tvar container = layer._container = L.SVG.create('shape');\n\n\t\tL.DomUtil.addClass(container, 'leaflet-vml-shape ' + (this.options.className || ''));\n\n\t\tcontainer.coordsize = '1 1';\n\n\t\tlayer._path = L.SVG.create('path');\n\t\tcontainer.appendChild(layer._path);\n\n\t\tthis._updateStyle(layer);\n\t\tthis._layers[L.stamp(layer)] = layer;\n\t},\n\n\t_addPath: function (layer) {\n\t\tvar container = layer._container;\n\t\tthis._container.appendChild(container);\n\n\t\tif (layer.options.interactive) {\n\t\t\tlayer.addInteractiveTarget(container);\n\t\t}\n\t},\n\n\t_removePath: function (layer) {\n\t\tvar container = layer._container;\n\t\tL.DomUtil.remove(container);\n\t\tlayer.removeInteractiveTarget(container);\n\t\tdelete this._layers[L.stamp(layer)];\n\t},\n\n\t_updateStyle: function (layer) {\n\t\tvar stroke = layer._stroke,\n\t\t    fill = layer._fill,\n\t\t    options = layer.options,\n\t\t    container = layer._container;\n\n\t\tcontainer.stroked = !!options.stroke;\n\t\tcontainer.filled = !!options.fill;\n\n\t\tif (options.stroke) {\n\t\t\tif (!stroke) {\n\t\t\t\tstroke = layer._stroke = L.SVG.create('stroke');\n\t\t\t}\n\t\t\tcontainer.appendChild(stroke);\n\t\t\tstroke.weight = options.weight + 'px';\n\t\t\tstroke.color = options.color;\n\t\t\tstroke.opacity = options.opacity;\n\n\t\t\tif (options.dashArray) {\n\t\t\t\tstroke.dashStyle = L.Util.isArray(options.dashArray) ?\n\t\t\t\t    options.dashArray.join(' ') :\n\t\t\t\t    options.dashArray.replace(/( *, *)/g, ' ');\n\t\t\t} else {\n\t\t\t\tstroke.dashStyle = '';\n\t\t\t}\n\t\t\tstroke.endcap = options.lineCap.replace('butt', 'flat');\n\t\t\tstroke.joinstyle = options.lineJoin;\n\n\t\t} else if (stroke) {\n\t\t\tcontainer.removeChild(stroke);\n\t\t\tlayer._stroke = null;\n\t\t}\n\n\t\tif (options.fill) {\n\t\t\tif (!fill) {\n\t\t\t\tfill = layer._fill = L.SVG.create('fill');\n\t\t\t}\n\t\t\tcontainer.appendChild(fill);\n\t\t\tfill.color = options.fillColor || options.color;\n\t\t\tfill.opacity = options.fillOpacity;\n\n\t\t} else if (fill) {\n\t\t\tcontainer.removeChild(fill);\n\t\t\tlayer._fill = null;\n\t\t}\n\t},\n\n\t_updateCircle: function (layer) {\n\t\tvar p = layer._point.round(),\n\t\t    r = Math.round(layer._radius),\n\t\t    r2 = Math.round(layer._radiusY || r);\n\n\t\tthis._setPath(layer, layer._empty() ? 'M0 0' :\n\t\t\t\t'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r2 + ' 0,' + (65535 * 360));\n\t},\n\n\t_setPath: function (layer, path) {\n\t\tlayer._path.v = path;\n\t},\n\n\t_bringToFront: function (layer) {\n\t\tL.DomUtil.toFront(layer._container);\n\t},\n\n\t_bringToBack: function (layer) {\n\t\tL.DomUtil.toBack(layer._container);\n\t}\n});\n\nif (L.Browser.vml) {\n\tL.SVG.create = (function () {\n\t\ttry {\n\t\t\tdocument.namespaces.add('lvml', 'urn:schemas-microsoft-com:vml');\n\t\t\treturn function (name) {\n\t\t\t\treturn document.createElement('<lvml:' + name + ' class=\"lvml\">');\n\t\t\t};\n\t\t} catch (e) {\n\t\t\treturn function (name) {\n\t\t\t\treturn document.createElement('<' + name + ' xmlns=\"urn:schemas-microsoft.com:vml\" class=\"lvml\">');\n\t\t\t};\n\t\t}\n\t})();\n}\n\n\n\n/*\n * @class Canvas\n * @inherits Renderer\n * @aka L.Canvas\n *\n * Allows vector layers to be displayed with [`<canvas>`](https://developer.mozilla.org/docs/Web/API/Canvas_API).\n * Inherits `Renderer`.\n *\n * Due to [technical limitations](http://caniuse.com/#search=canvas), Canvas is not\n * available in all web browsers, notably IE8, and overlapping geometries might\n * not display properly in some edge cases.\n *\n * @example\n *\n * Use Canvas by default for all paths in the map:\n *\n * ```js\n * var map = L.map('map', {\n * \trenderer: L.canvas()\n * });\n * ```\n *\n * Use a Canvas renderer with extra padding for specific vector geometries:\n *\n * ```js\n * var map = L.map('map');\n * var myRenderer = L.canvas({ padding: 0.5 });\n * var line = L.polyline( coordinates, { renderer: myRenderer } );\n * var circle = L.circle( center, { renderer: myRenderer } );\n * ```\n */\n\nL.Canvas = L.Renderer.extend({\n\tgetEvents: function () {\n\t\tvar events = L.Renderer.prototype.getEvents.call(this);\n\t\tevents.viewprereset = this._onViewPreReset;\n\t\treturn events;\n\t},\n\n\t_onViewPreReset: function () {\n\t\t// Set a flag so that a viewprereset+moveend+viewreset only updates&redraws once\n\t\tthis._postponeUpdatePaths = true;\n\t},\n\n\tonAdd: function () {\n\t\tL.Renderer.prototype.onAdd.call(this);\n\n\t\t// Redraw vectors since canvas is cleared upon removal,\n\t\t// in case of removing the renderer itself from the map.\n\t\tthis._draw();\n\t},\n\n\t_initContainer: function () {\n\t\tvar container = this._container = document.createElement('canvas');\n\n\t\tL.DomEvent\n\t\t\t.on(container, 'mousemove', L.Util.throttle(this._onMouseMove, 32, this), this)\n\t\t\t.on(container, 'click dblclick mousedown mouseup contextmenu', this._onClick, this)\n\t\t\t.on(container, 'mouseout', this._handleMouseOut, this);\n\n\t\tthis._ctx = container.getContext('2d');\n\t},\n\n\t_updatePaths: function () {\n\t\tif (this._postponeUpdatePaths) { return; }\n\n\t\tvar layer;\n\t\tthis._redrawBounds = null;\n\t\tfor (var id in this._layers) {\n\t\t\tlayer = this._layers[id];\n\t\t\tlayer._update();\n\t\t}\n\t\tthis._redraw();\n\t},\n\n\t_update: function () {\n\t\tif (this._map._animatingZoom && this._bounds) { return; }\n\n\t\tthis._drawnLayers = {};\n\n\t\tL.Renderer.prototype._update.call(this);\n\n\t\tvar b = this._bounds,\n\t\t    container = this._container,\n\t\t    size = b.getSize(),\n\t\t    m = L.Browser.retina ? 2 : 1;\n\n\t\tL.DomUtil.setPosition(container, b.min);\n\n\t\t// set canvas size (also clearing it); use double size on retina\n\t\tcontainer.width = m * size.x;\n\t\tcontainer.height = m * size.y;\n\t\tcontainer.style.width = size.x + 'px';\n\t\tcontainer.style.height = size.y + 'px';\n\n\t\tif (L.Browser.retina) {\n\t\t\tthis._ctx.scale(2, 2);\n\t\t}\n\n\t\t// translate so we use the same path coordinates after canvas element moves\n\t\tthis._ctx.translate(-b.min.x, -b.min.y);\n\n\t\t// Tell paths to redraw themselves\n\t\tthis.fire('update');\n\t},\n\n\t_reset: function () {\n\t\tL.Renderer.prototype._reset.call(this);\n\n\t\tif (this._postponeUpdatePaths) {\n\t\t\tthis._postponeUpdatePaths = false;\n\t\t\tthis._updatePaths();\n\t\t}\n\t},\n\n\t_initPath: function (layer) {\n\t\tthis._updateDashArray(layer);\n\t\tthis._layers[L.stamp(layer)] = layer;\n\n\t\tvar order = layer._order = {\n\t\t\tlayer: layer,\n\t\t\tprev: this._drawLast,\n\t\t\tnext: null\n\t\t};\n\t\tif (this._drawLast) { this._drawLast.next = order; }\n\t\tthis._drawLast = order;\n\t\tthis._drawFirst = this._drawFirst || this._drawLast;\n\t},\n\n\t_addPath: function (layer) {\n\t\tthis._requestRedraw(layer);\n\t},\n\n\t_removePath: function (layer) {\n\t\tvar order = layer._order;\n\t\tvar next = order.next;\n\t\tvar prev = order.prev;\n\n\t\tif (next) {\n\t\t\tnext.prev = prev;\n\t\t} else {\n\t\t\tthis._drawLast = prev;\n\t\t}\n\t\tif (prev) {\n\t\t\tprev.next = next;\n\t\t} else {\n\t\t\tthis._drawFirst = next;\n\t\t}\n\n\t\tdelete layer._order;\n\n\t\tdelete this._layers[L.stamp(layer)];\n\n\t\tthis._requestRedraw(layer);\n\t},\n\n\t_updatePath: function (layer) {\n\t\t// Redraw the union of the layer's old pixel\n\t\t// bounds and the new pixel bounds.\n\t\tthis._extendRedrawBounds(layer);\n\t\tlayer._project();\n\t\tlayer._update();\n\t\t// The redraw will extend the redraw bounds\n\t\t// with the new pixel bounds.\n\t\tthis._requestRedraw(layer);\n\t},\n\n\t_updateStyle: function (layer) {\n\t\tthis._updateDashArray(layer);\n\t\tthis._requestRedraw(layer);\n\t},\n\n\t_updateDashArray: function (layer) {\n\t\tif (layer.options.dashArray) {\n\t\t\tvar parts = layer.options.dashArray.split(','),\n\t\t\t    dashArray = [],\n\t\t\t    i;\n\t\t\tfor (i = 0; i < parts.length; i++) {\n\t\t\t\tdashArray.push(Number(parts[i]));\n\t\t\t}\n\t\t\tlayer.options._dashArray = dashArray;\n\t\t}\n\t},\n\n\t_requestRedraw: function (layer) {\n\t\tif (!this._map) { return; }\n\n\t\tthis._extendRedrawBounds(layer);\n\t\tthis._redrawRequest = this._redrawRequest || L.Util.requestAnimFrame(this._redraw, this);\n\t},\n\n\t_extendRedrawBounds: function (layer) {\n\t\tvar padding = (layer.options.weight || 0) + 1;\n\t\tthis._redrawBounds = this._redrawBounds || new L.Bounds();\n\t\tthis._redrawBounds.extend(layer._pxBounds.min.subtract([padding, padding]));\n\t\tthis._redrawBounds.extend(layer._pxBounds.max.add([padding, padding]));\n\t},\n\n\t_redraw: function () {\n\t\tthis._redrawRequest = null;\n\n\t\tif (this._redrawBounds) {\n\t\t\tthis._redrawBounds.min._floor();\n\t\t\tthis._redrawBounds.max._ceil();\n\t\t}\n\n\t\tthis._clear(); // clear layers in redraw bounds\n\t\tthis._draw(); // draw layers\n\n\t\tthis._redrawBounds = null;\n\t},\n\n\t_clear: function () {\n\t\tvar bounds = this._redrawBounds;\n\t\tif (bounds) {\n\t\t\tvar size = bounds.getSize();\n\t\t\tthis._ctx.clearRect(bounds.min.x, bounds.min.y, size.x, size.y);\n\t\t} else {\n\t\t\tthis._ctx.clearRect(0, 0, this._container.width, this._container.height);\n\t\t}\n\t},\n\n\t_draw: function () {\n\t\tvar layer, bounds = this._redrawBounds;\n\t\tthis._ctx.save();\n\t\tif (bounds) {\n\t\t\tvar size = bounds.getSize();\n\t\t\tthis._ctx.beginPath();\n\t\t\tthis._ctx.rect(bounds.min.x, bounds.min.y, size.x, size.y);\n\t\t\tthis._ctx.clip();\n\t\t}\n\n\t\tthis._drawing = true;\n\n\t\tfor (var order = this._drawFirst; order; order = order.next) {\n\t\t\tlayer = order.layer;\n\t\t\tif (!bounds || (layer._pxBounds && layer._pxBounds.intersects(bounds))) {\n\t\t\t\tlayer._updatePath();\n\t\t\t}\n\t\t}\n\n\t\tthis._drawing = false;\n\n\t\tthis._ctx.restore();  // Restore state before clipping.\n\t},\n\n\t_updatePoly: function (layer, closed) {\n\t\tif (!this._drawing) { return; }\n\n\t\tvar i, j, len2, p,\n\t\t    parts = layer._parts,\n\t\t    len = parts.length,\n\t\t    ctx = this._ctx;\n\n\t\tif (!len) { return; }\n\n\t\tthis._drawnLayers[layer._leaflet_id] = layer;\n\n\t\tctx.beginPath();\n\n\t\tif (ctx.setLineDash) {\n\t\t\tctx.setLineDash(layer.options && layer.options._dashArray || []);\n\t\t}\n\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tfor (j = 0, len2 = parts[i].length; j < len2; j++) {\n\t\t\t\tp = parts[i][j];\n\t\t\t\tctx[j ? 'lineTo' : 'moveTo'](p.x, p.y);\n\t\t\t}\n\t\t\tif (closed) {\n\t\t\t\tctx.closePath();\n\t\t\t}\n\t\t}\n\n\t\tthis._fillStroke(ctx, layer);\n\n\t\t// TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature\n\t},\n\n\t_updateCircle: function (layer) {\n\n\t\tif (!this._drawing || layer._empty()) { return; }\n\n\t\tvar p = layer._point,\n\t\t    ctx = this._ctx,\n\t\t    r = layer._radius,\n\t\t    s = (layer._radiusY || r) / r;\n\n\t\tthis._drawnLayers[layer._leaflet_id] = layer;\n\n\t\tif (s !== 1) {\n\t\t\tctx.save();\n\t\t\tctx.scale(1, s);\n\t\t}\n\n\t\tctx.beginPath();\n\t\tctx.arc(p.x, p.y / s, r, 0, Math.PI * 2, false);\n\n\t\tif (s !== 1) {\n\t\t\tctx.restore();\n\t\t}\n\n\t\tthis._fillStroke(ctx, layer);\n\t},\n\n\t_fillStroke: function (ctx, layer) {\n\t\tvar options = layer.options;\n\n\t\tif (options.fill) {\n\t\t\tctx.globalAlpha = options.fillOpacity;\n\t\t\tctx.fillStyle = options.fillColor || options.color;\n\t\t\tctx.fill(options.fillRule || 'evenodd');\n\t\t}\n\n\t\tif (options.stroke && options.weight !== 0) {\n\t\t\tctx.globalAlpha = options.opacity;\n\t\t\tctx.lineWidth = options.weight;\n\t\t\tctx.strokeStyle = options.color;\n\t\t\tctx.lineCap = options.lineCap;\n\t\t\tctx.lineJoin = options.lineJoin;\n\t\t\tctx.stroke();\n\t\t}\n\t},\n\n\t// Canvas obviously doesn't have mouse events for individual drawn objects,\n\t// so we emulate that by calculating what's under the mouse on mousemove/click manually\n\n\t_onClick: function (e) {\n\t\tvar point = this._map.mouseEventToLayerPoint(e), layer, clickedLayer;\n\n\t\tfor (var order = this._drawFirst; order; order = order.next) {\n\t\t\tlayer = order.layer;\n\t\t\tif (layer.options.interactive && layer._containsPoint(point) && !this._map._draggableMoved(layer)) {\n\t\t\t\tclickedLayer = layer;\n\t\t\t}\n\t\t}\n\t\tif (clickedLayer)  {\n\t\t\tL.DomEvent._fakeStop(e);\n\t\t\tthis._fireEvent([clickedLayer], e);\n\t\t}\n\t},\n\n\t_onMouseMove: function (e) {\n\t\tif (!this._map || this._map.dragging.moving() || this._map._animatingZoom) { return; }\n\n\t\tvar point = this._map.mouseEventToLayerPoint(e);\n\t\tthis._handleMouseHover(e, point);\n\t},\n\n\n\t_handleMouseOut: function (e) {\n\t\tvar layer = this._hoveredLayer;\n\t\tif (layer) {\n\t\t\t// if we're leaving the layer, fire mouseout\n\t\t\tL.DomUtil.removeClass(this._container, 'leaflet-interactive');\n\t\t\tthis._fireEvent([layer], e, 'mouseout');\n\t\t\tthis._hoveredLayer = null;\n\t\t}\n\t},\n\n\t_handleMouseHover: function (e, point) {\n\t\tvar layer, candidateHoveredLayer;\n\n\t\tfor (var order = this._drawFirst; order; order = order.next) {\n\t\t\tlayer = order.layer;\n\t\t\tif (layer.options.interactive && layer._containsPoint(point)) {\n\t\t\t\tcandidateHoveredLayer = layer;\n\t\t\t}\n\t\t}\n\n\t\tif (candidateHoveredLayer !== this._hoveredLayer) {\n\t\t\tthis._handleMouseOut(e);\n\n\t\t\tif (candidateHoveredLayer) {\n\t\t\t\tL.DomUtil.addClass(this._container, 'leaflet-interactive'); // change cursor\n\t\t\t\tthis._fireEvent([candidateHoveredLayer], e, 'mouseover');\n\t\t\t\tthis._hoveredLayer = candidateHoveredLayer;\n\t\t\t}\n\t\t}\n\n\t\tif (this._hoveredLayer) {\n\t\t\tthis._fireEvent([this._hoveredLayer], e);\n\t\t}\n\t},\n\n\t_fireEvent: function (layers, e, type) {\n\t\tthis._map._fireDOMEvent(e, type || e.type, layers);\n\t},\n\n\t_bringToFront: function (layer) {\n\t\tvar order = layer._order;\n\t\tvar next = order.next;\n\t\tvar prev = order.prev;\n\n\t\tif (next) {\n\t\t\tnext.prev = prev;\n\t\t} else {\n\t\t\t// Already last\n\t\t\treturn;\n\t\t}\n\t\tif (prev) {\n\t\t\tprev.next = next;\n\t\t} else if (next) {\n\t\t\t// Update first entry unless this is the\n\t\t\t// signle entry\n\t\t\tthis._drawFirst = next;\n\t\t}\n\n\t\torder.prev = this._drawLast;\n\t\tthis._drawLast.next = order;\n\n\t\torder.next = null;\n\t\tthis._drawLast = order;\n\n\t\tthis._requestRedraw(layer);\n\t},\n\n\t_bringToBack: function (layer) {\n\t\tvar order = layer._order;\n\t\tvar next = order.next;\n\t\tvar prev = order.prev;\n\n\t\tif (prev) {\n\t\t\tprev.next = next;\n\t\t} else {\n\t\t\t// Already first\n\t\t\treturn;\n\t\t}\n\t\tif (next) {\n\t\t\tnext.prev = prev;\n\t\t} else if (prev) {\n\t\t\t// Update last entry unless this is the\n\t\t\t// signle entry\n\t\t\tthis._drawLast = prev;\n\t\t}\n\n\t\torder.prev = null;\n\n\t\torder.next = this._drawFirst;\n\t\tthis._drawFirst.prev = order;\n\t\tthis._drawFirst = order;\n\n\t\tthis._requestRedraw(layer);\n\t}\n});\n\n// @namespace Browser; @property canvas: Boolean\n// `true` when the browser supports [`<canvas>`](https://developer.mozilla.org/docs/Web/API/Canvas_API).\nL.Browser.canvas = (function () {\n\treturn !!document.createElement('canvas').getContext;\n}());\n\n// @namespace Canvas\n// @factory L.canvas(options?: Renderer options)\n// Creates a Canvas renderer with the given options.\nL.canvas = function (options) {\n\treturn L.Browser.canvas ? new L.Canvas(options) : null;\n};\n\nL.Polyline.prototype._containsPoint = function (p, closed) {\n\tvar i, j, k, len, len2, part,\n\t    w = this._clickTolerance();\n\n\tif (!this._pxBounds.contains(p)) { return false; }\n\n\t// hit detection for polylines\n\tfor (i = 0, len = this._parts.length; i < len; i++) {\n\t\tpart = this._parts[i];\n\n\t\tfor (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {\n\t\t\tif (!closed && (j === 0)) { continue; }\n\n\t\t\tif (L.LineUtil.pointToSegmentDistance(p, part[k], part[j]) <= w) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\nL.Polygon.prototype._containsPoint = function (p) {\n\tvar inside = false,\n\t    part, p1, p2, i, j, k, len, len2;\n\n\tif (!this._pxBounds.contains(p)) { return false; }\n\n\t// ray casting algorithm for detecting if point is in polygon\n\tfor (i = 0, len = this._parts.length; i < len; i++) {\n\t\tpart = this._parts[i];\n\n\t\tfor (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {\n\t\t\tp1 = part[j];\n\t\t\tp2 = part[k];\n\n\t\t\tif (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {\n\t\t\t\tinside = !inside;\n\t\t\t}\n\t\t}\n\t}\n\n\t// also check if it's on polygon stroke\n\treturn inside || L.Polyline.prototype._containsPoint.call(this, p, true);\n};\n\nL.CircleMarker.prototype._containsPoint = function (p) {\n\treturn p.distanceTo(this._point) <= this._radius + this._clickTolerance();\n};\n\n\n\n/*\r\n * @class GeoJSON\r\n * @aka L.GeoJSON\r\n * @inherits FeatureGroup\r\n *\r\n * Represents a GeoJSON object or an array of GeoJSON objects. Allows you to parse\r\n * GeoJSON data and display it on the map. Extends `FeatureGroup`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.geoJSON(data, {\r\n * \tstyle: function (feature) {\r\n * \t\treturn {color: feature.properties.color};\r\n * \t}\r\n * }).bindPopup(function (layer) {\r\n * \treturn layer.feature.properties.description;\r\n * }).addTo(map);\r\n * ```\r\n */\r\n\r\nL.GeoJSON = L.FeatureGroup.extend({\r\n\r\n\t/* @section\r\n\t * @aka GeoJSON options\r\n\t *\r\n\t * @option pointToLayer: Function = *\r\n\t * A `Function` defining how GeoJSON points spawn Leaflet layers. It is internally\r\n\t * called when data is added, passing the GeoJSON point feature and its `LatLng`.\r\n\t * The default is to spawn a default `Marker`:\r\n\t * ```js\r\n\t * function(geoJsonPoint, latlng) {\r\n\t * \treturn L.marker(latlng);\r\n\t * }\r\n\t * ```\r\n\t *\r\n\t * @option style: Function = *\r\n\t * A `Function` defining the `Path options` for styling GeoJSON lines and polygons,\r\n\t * called internally when data is added.\r\n\t * The default value is to not override any defaults:\r\n\t * ```js\r\n\t * function (geoJsonFeature) {\r\n\t * \treturn {}\r\n\t * }\r\n\t * ```\r\n\t *\r\n\t * @option onEachFeature: Function = *\r\n\t * A `Function` that will be called once for each created `Feature`, after it has\r\n\t * been created and styled. Useful for attaching events and popups to features.\r\n\t * The default is to do nothing with the newly created layers:\r\n\t * ```js\r\n\t * function (feature, layer) {}\r\n\t * ```\r\n\t *\r\n\t * @option filter: Function = *\r\n\t * A `Function` that will be used to decide whether to include a feature or not.\r\n\t * The default is to include all features:\r\n\t * ```js\r\n\t * function (geoJsonFeature) {\r\n\t * \treturn true;\r\n\t * }\r\n\t * ```\r\n\t * Note: dynamically changing the `filter` option will have effect only on newly\r\n\t * added data. It will _not_ re-evaluate already included features.\r\n\t *\r\n\t * @option coordsToLatLng: Function = *\r\n\t * A `Function` that will be used for converting GeoJSON coordinates to `LatLng`s.\r\n\t * The default is the `coordsToLatLng` static method.\r\n\t */\r\n\r\n\tinitialize: function (geojson, options) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._layers = {};\r\n\r\n\t\tif (geojson) {\r\n\t\t\tthis.addData(geojson);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method addData( <GeoJSON> data ): this\r\n\t// Adds a GeoJSON object to the layer.\r\n\taddData: function (geojson) {\r\n\t\tvar features = L.Util.isArray(geojson) ? geojson : geojson.features,\r\n\t\t    i, len, feature;\r\n\r\n\t\tif (features) {\r\n\t\t\tfor (i = 0, len = features.length; i < len; i++) {\r\n\t\t\t\t// only add this if geometry or geometries are set and not null\r\n\t\t\t\tfeature = features[i];\r\n\t\t\t\tif (feature.geometries || feature.geometry || feature.features || feature.coordinates) {\r\n\t\t\t\t\tthis.addData(feature);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar options = this.options;\r\n\r\n\t\tif (options.filter && !options.filter(geojson)) { return this; }\r\n\r\n\t\tvar layer = L.GeoJSON.geometryToLayer(geojson, options);\r\n\t\tif (!layer) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\tlayer.feature = L.GeoJSON.asFeature(geojson);\r\n\r\n\t\tlayer.defaultOptions = layer.options;\r\n\t\tthis.resetStyle(layer);\r\n\r\n\t\tif (options.onEachFeature) {\r\n\t\t\toptions.onEachFeature(geojson, layer);\r\n\t\t}\r\n\r\n\t\treturn this.addLayer(layer);\r\n\t},\r\n\r\n\t// @method resetStyle( <Path> layer ): this\r\n\t// Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events.\r\n\tresetStyle: function (layer) {\r\n\t\t// reset any custom styles\r\n\t\tlayer.options = L.Util.extend({}, layer.defaultOptions);\r\n\t\tthis._setLayerStyle(layer, this.options.style);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method setStyle( <Function> style ): this\r\n\t// Changes styles of GeoJSON vector layers with the given style function.\r\n\tsetStyle: function (style) {\r\n\t\treturn this.eachLayer(function (layer) {\r\n\t\t\tthis._setLayerStyle(layer, style);\r\n\t\t}, this);\r\n\t},\r\n\r\n\t_setLayerStyle: function (layer, style) {\r\n\t\tif (typeof style === 'function') {\r\n\t\t\tstyle = style(layer.feature);\r\n\t\t}\r\n\t\tif (layer.setStyle) {\r\n\t\t\tlayer.setStyle(style);\r\n\t\t}\r\n\t}\r\n});\r\n\r\n// @section\r\n// There are several static functions which can be called without instantiating L.GeoJSON:\r\nL.extend(L.GeoJSON, {\r\n\t// @function geometryToLayer(featureData: Object, options?: GeoJSON options): Layer\r\n\t// Creates a `Layer` from a given GeoJSON feature. Can use a custom\r\n\t// [`pointToLayer`](#geojson-pointtolayer) and/or [`coordsToLatLng`](#geojson-coordstolatlng)\r\n\t// functions if provided as options.\r\n\tgeometryToLayer: function (geojson, options) {\r\n\r\n\t\tvar geometry = geojson.type === 'Feature' ? geojson.geometry : geojson,\r\n\t\t    coords = geometry ? geometry.coordinates : null,\r\n\t\t    layers = [],\r\n\t\t    pointToLayer = options && options.pointToLayer,\r\n\t\t    coordsToLatLng = options && options.coordsToLatLng || this.coordsToLatLng,\r\n\t\t    latlng, latlngs, i, len;\r\n\r\n\t\tif (!coords && !geometry) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tswitch (geometry.type) {\r\n\t\tcase 'Point':\r\n\t\t\tlatlng = coordsToLatLng(coords);\r\n\t\t\treturn pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng);\r\n\r\n\t\tcase 'MultiPoint':\r\n\t\t\tfor (i = 0, len = coords.length; i < len; i++) {\r\n\t\t\t\tlatlng = coordsToLatLng(coords[i]);\r\n\t\t\t\tlayers.push(pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng));\r\n\t\t\t}\r\n\t\t\treturn new L.FeatureGroup(layers);\r\n\r\n\t\tcase 'LineString':\r\n\t\tcase 'MultiLineString':\r\n\t\t\tlatlngs = this.coordsToLatLngs(coords, geometry.type === 'LineString' ? 0 : 1, coordsToLatLng);\r\n\t\t\treturn new L.Polyline(latlngs, options);\r\n\r\n\t\tcase 'Polygon':\r\n\t\tcase 'MultiPolygon':\r\n\t\t\tlatlngs = this.coordsToLatLngs(coords, geometry.type === 'Polygon' ? 1 : 2, coordsToLatLng);\r\n\t\t\treturn new L.Polygon(latlngs, options);\r\n\r\n\t\tcase 'GeometryCollection':\r\n\t\t\tfor (i = 0, len = geometry.geometries.length; i < len; i++) {\r\n\t\t\t\tvar layer = this.geometryToLayer({\r\n\t\t\t\t\tgeometry: geometry.geometries[i],\r\n\t\t\t\t\ttype: 'Feature',\r\n\t\t\t\t\tproperties: geojson.properties\r\n\t\t\t\t}, options);\r\n\r\n\t\t\t\tif (layer) {\r\n\t\t\t\t\tlayers.push(layer);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn new L.FeatureGroup(layers);\r\n\r\n\t\tdefault:\r\n\t\t\tthrow new Error('Invalid GeoJSON object.');\r\n\t\t}\r\n\t},\r\n\r\n\t// @function coordsToLatLng(coords: Array): LatLng\r\n\t// Creates a `LatLng` object from an array of 2 numbers (longitude, latitude)\r\n\t// or 3 numbers (longitude, latitude, altitude) used in GeoJSON for points.\r\n\tcoordsToLatLng: function (coords) {\r\n\t\treturn new L.LatLng(coords[1], coords[0], coords[2]);\r\n\t},\r\n\r\n\t// @function coordsToLatLngs(coords: Array, levelsDeep?: Number, coordsToLatLng?: Function): Array\r\n\t// Creates a multidimensional array of `LatLng`s from a GeoJSON coordinates array.\r\n\t// `levelsDeep` specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default).\r\n\t// Can use a custom [`coordsToLatLng`](#geojson-coordstolatlng) function.\r\n\tcoordsToLatLngs: function (coords, levelsDeep, coordsToLatLng) {\r\n\t\tvar latlngs = [];\r\n\r\n\t\tfor (var i = 0, len = coords.length, latlng; i < len; i++) {\r\n\t\t\tlatlng = levelsDeep ?\r\n\t\t\t        this.coordsToLatLngs(coords[i], levelsDeep - 1, coordsToLatLng) :\r\n\t\t\t        (coordsToLatLng || this.coordsToLatLng)(coords[i]);\r\n\r\n\t\t\tlatlngs.push(latlng);\r\n\t\t}\r\n\r\n\t\treturn latlngs;\r\n\t},\r\n\r\n\t// @function latLngToCoords(latlng: LatLng): Array\r\n\t// Reverse of [`coordsToLatLng`](#geojson-coordstolatlng)\r\n\tlatLngToCoords: function (latlng) {\r\n\t\treturn latlng.alt !== undefined ?\r\n\t\t\t\t[latlng.lng, latlng.lat, latlng.alt] :\r\n\t\t\t\t[latlng.lng, latlng.lat];\r\n\t},\r\n\r\n\t// @function latLngsToCoords(latlngs: Array, levelsDeep?: Number, closed?: Boolean): Array\r\n\t// Reverse of [`coordsToLatLngs`](#geojson-coordstolatlngs)\r\n\t// `closed` determines whether the first point should be appended to the end of the array to close the feature, only used when `levelsDeep` is 0. False by default.\r\n\tlatLngsToCoords: function (latlngs, levelsDeep, closed) {\r\n\t\tvar coords = [];\r\n\r\n\t\tfor (var i = 0, len = latlngs.length; i < len; i++) {\r\n\t\t\tcoords.push(levelsDeep ?\r\n\t\t\t\tL.GeoJSON.latLngsToCoords(latlngs[i], levelsDeep - 1, closed) :\r\n\t\t\t\tL.GeoJSON.latLngToCoords(latlngs[i]));\r\n\t\t}\r\n\r\n\t\tif (!levelsDeep && closed) {\r\n\t\t\tcoords.push(coords[0]);\r\n\t\t}\r\n\r\n\t\treturn coords;\r\n\t},\r\n\r\n\tgetFeature: function (layer, newGeometry) {\r\n\t\treturn layer.feature ?\r\n\t\t\t\tL.extend({}, layer.feature, {geometry: newGeometry}) :\r\n\t\t\t\tL.GeoJSON.asFeature(newGeometry);\r\n\t},\r\n\r\n\t// @function asFeature(geojson: Object): Object\r\n\t// Normalize GeoJSON geometries/features into GeoJSON features.\r\n\tasFeature: function (geojson) {\r\n\t\tif (geojson.type === 'Feature' || geojson.type === 'FeatureCollection') {\r\n\t\t\treturn geojson;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\ttype: 'Feature',\r\n\t\t\tproperties: {},\r\n\t\t\tgeometry: geojson\r\n\t\t};\r\n\t}\r\n});\r\n\r\nvar PointToGeoJSON = {\r\n\ttoGeoJSON: function () {\r\n\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\ttype: 'Point',\r\n\t\t\tcoordinates: L.GeoJSON.latLngToCoords(this.getLatLng())\r\n\t\t});\r\n\t}\r\n};\r\n\r\n// @namespace Marker\r\n// @method toGeoJSON(): Object\r\n// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the marker (as a GeoJSON `Point` Feature).\r\nL.Marker.include(PointToGeoJSON);\r\n\r\n// @namespace CircleMarker\r\n// @method toGeoJSON(): Object\r\n// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the circle marker (as a GeoJSON `Point` Feature).\r\nL.Circle.include(PointToGeoJSON);\r\nL.CircleMarker.include(PointToGeoJSON);\r\n\r\n\r\n// @namespace Polyline\r\n// @method toGeoJSON(): Object\r\n// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the polyline (as a GeoJSON `LineString` or `MultiLineString` Feature).\r\nL.Polyline.prototype.toGeoJSON = function () {\r\n\tvar multi = !L.Polyline._flat(this._latlngs);\r\n\r\n\tvar coords = L.GeoJSON.latLngsToCoords(this._latlngs, multi ? 1 : 0);\r\n\r\n\treturn L.GeoJSON.getFeature(this, {\r\n\t\ttype: (multi ? 'Multi' : '') + 'LineString',\r\n\t\tcoordinates: coords\r\n\t});\r\n};\r\n\r\n// @namespace Polygon\r\n// @method toGeoJSON(): Object\r\n// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the polygon (as a GeoJSON `Polygon` or `MultiPolygon` Feature).\r\nL.Polygon.prototype.toGeoJSON = function () {\r\n\tvar holes = !L.Polyline._flat(this._latlngs),\r\n\t    multi = holes && !L.Polyline._flat(this._latlngs[0]);\r\n\r\n\tvar coords = L.GeoJSON.latLngsToCoords(this._latlngs, multi ? 2 : holes ? 1 : 0, true);\r\n\r\n\tif (!holes) {\r\n\t\tcoords = [coords];\r\n\t}\r\n\r\n\treturn L.GeoJSON.getFeature(this, {\r\n\t\ttype: (multi ? 'Multi' : '') + 'Polygon',\r\n\t\tcoordinates: coords\r\n\t});\r\n};\r\n\r\n\r\n// @namespace LayerGroup\r\nL.LayerGroup.include({\r\n\ttoMultiPoint: function () {\r\n\t\tvar coords = [];\r\n\r\n\t\tthis.eachLayer(function (layer) {\r\n\t\t\tcoords.push(layer.toGeoJSON().geometry.coordinates);\r\n\t\t});\r\n\r\n\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\ttype: 'MultiPoint',\r\n\t\t\tcoordinates: coords\r\n\t\t});\r\n\t},\r\n\r\n\t// @method toGeoJSON(): Object\r\n\t// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the layer group (as a GeoJSON `GeometryCollection`).\r\n\ttoGeoJSON: function () {\r\n\r\n\t\tvar type = this.feature && this.feature.geometry && this.feature.geometry.type;\r\n\r\n\t\tif (type === 'MultiPoint') {\r\n\t\t\treturn this.toMultiPoint();\r\n\t\t}\r\n\r\n\t\tvar isGeometryCollection = type === 'GeometryCollection',\r\n\t\t    jsons = [];\r\n\r\n\t\tthis.eachLayer(function (layer) {\r\n\t\t\tif (layer.toGeoJSON) {\r\n\t\t\t\tvar json = layer.toGeoJSON();\r\n\t\t\t\tjsons.push(isGeometryCollection ? json.geometry : L.GeoJSON.asFeature(json));\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif (isGeometryCollection) {\r\n\t\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\t\tgeometries: jsons,\r\n\t\t\t\ttype: 'GeometryCollection'\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\ttype: 'FeatureCollection',\r\n\t\t\tfeatures: jsons\r\n\t\t};\r\n\t}\r\n});\r\n\r\n// @namespace GeoJSON\r\n// @factory L.geoJSON(geojson?: Object, options?: GeoJSON options)\r\n// Creates a GeoJSON layer. Optionally accepts an object in\r\n// [GeoJSON format](http://geojson.org/geojson-spec.html) to display on the map\r\n// (you can alternatively add it later with `addData` method) and an `options` object.\r\nL.geoJSON = function (geojson, options) {\r\n\treturn new L.GeoJSON(geojson, options);\r\n};\r\n// Backward compatibility.\r\nL.geoJson = L.geoJSON;\r\n\n\n\n/*\r\n * @class Draggable\r\n * @aka L.Draggable\r\n * @inherits Evented\r\n *\r\n * A class for making DOM elements draggable (including touch support).\r\n * Used internally for map and marker dragging. Only works for elements\r\n * that were positioned with [`L.DomUtil.setPosition`](#domutil-setposition).\r\n *\r\n * @example\r\n * ```js\r\n * var draggable = new L.Draggable(elementToDrag);\r\n * draggable.enable();\r\n * ```\r\n */\r\n\r\nL.Draggable = L.Evented.extend({\r\n\r\n\toptions: {\r\n\t\t// @option clickTolerance: Number = 3\r\n\t\t// The max number of pixels a user can shift the mouse pointer during a click\r\n\t\t// for it to be considered a valid click (as opposed to a mouse drag).\r\n\t\tclickTolerance: 3\r\n\t},\r\n\r\n\tstatics: {\r\n\t\tSTART: L.Browser.touch ? ['touchstart', 'mousedown'] : ['mousedown'],\r\n\t\tEND: {\r\n\t\t\tmousedown: 'mouseup',\r\n\t\t\ttouchstart: 'touchend',\r\n\t\t\tpointerdown: 'touchend',\r\n\t\t\tMSPointerDown: 'touchend'\r\n\t\t},\r\n\t\tMOVE: {\r\n\t\t\tmousedown: 'mousemove',\r\n\t\t\ttouchstart: 'touchmove',\r\n\t\t\tpointerdown: 'touchmove',\r\n\t\t\tMSPointerDown: 'touchmove'\r\n\t\t}\r\n\t},\r\n\r\n\t// @constructor L.Draggable(el: HTMLElement, dragHandle?: HTMLElement, preventOutline: Boolean)\r\n\t// Creates a `Draggable` object for moving `el` when you start dragging the `dragHandle` element (equals `el` itself by default).\r\n\tinitialize: function (element, dragStartTarget, preventOutline) {\r\n\t\tthis._element = element;\r\n\t\tthis._dragStartTarget = dragStartTarget || element;\r\n\t\tthis._preventOutline = preventOutline;\r\n\t},\r\n\r\n\t// @method enable()\r\n\t// Enables the dragging ability\r\n\tenable: function () {\r\n\t\tif (this._enabled) { return; }\r\n\r\n\t\tL.DomEvent.on(this._dragStartTarget, L.Draggable.START.join(' '), this._onDown, this);\r\n\r\n\t\tthis._enabled = true;\r\n\t},\r\n\r\n\t// @method disable()\r\n\t// Disables the dragging ability\r\n\tdisable: function () {\r\n\t\tif (!this._enabled) { return; }\r\n\r\n\t\t// If we're currently dragging this draggable,\r\n\t\t// disabling it counts as first ending the drag.\r\n\t\tif (L.Draggable._dragging === this) {\r\n\t\t\tthis.finishDrag();\r\n\t\t}\r\n\r\n\t\tL.DomEvent.off(this._dragStartTarget, L.Draggable.START.join(' '), this._onDown, this);\r\n\r\n\t\tthis._enabled = false;\r\n\t\tthis._moved = false;\r\n\t},\r\n\r\n\t_onDown: function (e) {\r\n\t\t// Ignore simulated events, since we handle both touch and\r\n\t\t// mouse explicitly; otherwise we risk getting duplicates of\r\n\t\t// touch events, see #4315.\r\n\t\t// Also ignore the event if disabled; this happens in IE11\r\n\t\t// under some circumstances, see #3666.\r\n\t\tif (e._simulated || !this._enabled) { return; }\r\n\r\n\t\tthis._moved = false;\r\n\r\n\t\tif (L.DomUtil.hasClass(this._element, 'leaflet-zoom-anim')) { return; }\r\n\r\n\t\tif (L.Draggable._dragging || e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; }\r\n\t\tL.Draggable._dragging = this;  // Prevent dragging multiple objects at once.\r\n\r\n\t\tif (this._preventOutline) {\r\n\t\t\tL.DomUtil.preventOutline(this._element);\r\n\t\t}\r\n\r\n\t\tL.DomUtil.disableImageDrag();\r\n\t\tL.DomUtil.disableTextSelection();\r\n\r\n\t\tif (this._moving) { return; }\r\n\r\n\t\t// @event down: Event\r\n\t\t// Fired when a drag is about to start.\r\n\t\tthis.fire('down');\r\n\r\n\t\tvar first = e.touches ? e.touches[0] : e;\r\n\r\n\t\tthis._startPoint = new L.Point(first.clientX, first.clientY);\r\n\r\n\t\tL.DomEvent\r\n\t\t\t.on(document, L.Draggable.MOVE[e.type], this._onMove, this)\r\n\t\t\t.on(document, L.Draggable.END[e.type], this._onUp, this);\r\n\t},\r\n\r\n\t_onMove: function (e) {\r\n\t\t// Ignore simulated events, since we handle both touch and\r\n\t\t// mouse explicitly; otherwise we risk getting duplicates of\r\n\t\t// touch events, see #4315.\r\n\t\t// Also ignore the event if disabled; this happens in IE11\r\n\t\t// under some circumstances, see #3666.\r\n\t\tif (e._simulated || !this._enabled) { return; }\r\n\r\n\t\tif (e.touches && e.touches.length > 1) {\r\n\t\t\tthis._moved = true;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar first = (e.touches && e.touches.length === 1 ? e.touches[0] : e),\r\n\t\t    newPoint = new L.Point(first.clientX, first.clientY),\r\n\t\t    offset = newPoint.subtract(this._startPoint);\r\n\r\n\t\tif (!offset.x && !offset.y) { return; }\r\n\t\tif (Math.abs(offset.x) + Math.abs(offset.y) < this.options.clickTolerance) { return; }\r\n\r\n\t\tL.DomEvent.preventDefault(e);\r\n\r\n\t\tif (!this._moved) {\r\n\t\t\t// @event dragstart: Event\r\n\t\t\t// Fired when a drag starts\r\n\t\t\tthis.fire('dragstart');\r\n\r\n\t\t\tthis._moved = true;\r\n\t\t\tthis._startPos = L.DomUtil.getPosition(this._element).subtract(offset);\r\n\r\n\t\t\tL.DomUtil.addClass(document.body, 'leaflet-dragging');\r\n\r\n\t\t\tthis._lastTarget = e.target || e.srcElement;\r\n\t\t\t// IE and Edge do not give the <use> element, so fetch it\r\n\t\t\t// if necessary\r\n\t\t\tif ((window.SVGElementInstance) && (this._lastTarget instanceof SVGElementInstance)) {\r\n\t\t\t\tthis._lastTarget = this._lastTarget.correspondingUseElement;\r\n\t\t\t}\r\n\t\t\tL.DomUtil.addClass(this._lastTarget, 'leaflet-drag-target');\r\n\t\t}\r\n\r\n\t\tthis._newPos = this._startPos.add(offset);\r\n\t\tthis._moving = true;\r\n\r\n\t\tL.Util.cancelAnimFrame(this._animRequest);\r\n\t\tthis._lastEvent = e;\r\n\t\tthis._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true);\r\n\t},\r\n\r\n\t_updatePosition: function () {\r\n\t\tvar e = {originalEvent: this._lastEvent};\r\n\r\n\t\t// @event predrag: Event\r\n\t\t// Fired continuously during dragging *before* each corresponding\r\n\t\t// update of the element's position.\r\n\t\tthis.fire('predrag', e);\r\n\t\tL.DomUtil.setPosition(this._element, this._newPos);\r\n\r\n\t\t// @event drag: Event\r\n\t\t// Fired continuously during dragging.\r\n\t\tthis.fire('drag', e);\r\n\t},\r\n\r\n\t_onUp: function (e) {\r\n\t\t// Ignore simulated events, since we handle both touch and\r\n\t\t// mouse explicitly; otherwise we risk getting duplicates of\r\n\t\t// touch events, see #4315.\r\n\t\t// Also ignore the event if disabled; this happens in IE11\r\n\t\t// under some circumstances, see #3666.\r\n\t\tif (e._simulated || !this._enabled) { return; }\r\n\t\tthis.finishDrag();\r\n\t},\r\n\r\n\tfinishDrag: function () {\r\n\t\tL.DomUtil.removeClass(document.body, 'leaflet-dragging');\r\n\r\n\t\tif (this._lastTarget) {\r\n\t\t\tL.DomUtil.removeClass(this._lastTarget, 'leaflet-drag-target');\r\n\t\t\tthis._lastTarget = null;\r\n\t\t}\r\n\r\n\t\tfor (var i in L.Draggable.MOVE) {\r\n\t\t\tL.DomEvent\r\n\t\t\t\t.off(document, L.Draggable.MOVE[i], this._onMove, this)\r\n\t\t\t\t.off(document, L.Draggable.END[i], this._onUp, this);\r\n\t\t}\r\n\r\n\t\tL.DomUtil.enableImageDrag();\r\n\t\tL.DomUtil.enableTextSelection();\r\n\r\n\t\tif (this._moved && this._moving) {\r\n\t\t\t// ensure drag is not fired after dragend\r\n\t\t\tL.Util.cancelAnimFrame(this._animRequest);\r\n\r\n\t\t\t// @event dragend: DragEndEvent\r\n\t\t\t// Fired when the drag ends.\r\n\t\t\tthis.fire('dragend', {\r\n\t\t\t\tdistance: this._newPos.distanceTo(this._startPos)\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis._moving = false;\r\n\t\tL.Draggable._dragging = false;\r\n\t}\r\n\r\n});\r\n\n\n\n/*\n\tL.Handler is a base class for handler classes that are used internally to inject\n\tinteraction features like dragging to classes like Map and Marker.\n*/\n\n// @class Handler\n// @aka L.Handler\n// Abstract class for map interaction handlers\n\nL.Handler = L.Class.extend({\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\t},\n\n\t// @method enable(): this\n\t// Enables the handler\n\tenable: function () {\n\t\tif (this._enabled) { return this; }\n\n\t\tthis._enabled = true;\n\t\tthis.addHooks();\n\t\treturn this;\n\t},\n\n\t// @method disable(): this\n\t// Disables the handler\n\tdisable: function () {\n\t\tif (!this._enabled) { return this; }\n\n\t\tthis._enabled = false;\n\t\tthis.removeHooks();\n\t\treturn this;\n\t},\n\n\t// @method enabled(): Boolean\n\t// Returns `true` if the handler is enabled\n\tenabled: function () {\n\t\treturn !!this._enabled;\n\t}\n\n\t// @section Extension methods\n\t// Classes inheriting from `Handler` must implement the two following methods:\n\t// @method addHooks()\n\t// Called when the handler is enabled, should add event hooks.\n\t// @method removeHooks()\n\t// Called when the handler is disabled, should remove the event hooks added previously.\n});\n\n\n\n/*\n * L.Handler.MapDrag is used to make the map draggable (with panning inertia), enabled by default.\n */\n\n// @namespace Map\n// @section Interaction Options\nL.Map.mergeOptions({\n\t// @option dragging: Boolean = true\n\t// Whether the map be draggable with mouse/touch or not.\n\tdragging: true,\n\n\t// @section Panning Inertia Options\n\t// @option inertia: Boolean = *\n\t// If enabled, panning of the map will have an inertia effect where\n\t// the map builds momentum while dragging and continues moving in\n\t// the same direction for some time. Feels especially nice on touch\n\t// devices. Enabled by default unless running on old Android devices.\n\tinertia: !L.Browser.android23,\n\n\t// @option inertiaDeceleration: Number = 3000\n\t// The rate with which the inertial movement slows down, in pixels/second².\n\tinertiaDeceleration: 3400, // px/s^2\n\n\t// @option inertiaMaxSpeed: Number = Infinity\n\t// Max speed of the inertial movement, in pixels/second.\n\tinertiaMaxSpeed: Infinity, // px/s\n\n\t// @option easeLinearity: Number = 0.2\n\teaseLinearity: 0.2,\n\n\t// TODO refactor, move to CRS\n\t// @option worldCopyJump: Boolean = false\n\t// With this option enabled, the map tracks when you pan to another \"copy\"\n\t// of the world and seamlessly jumps to the original one so that all overlays\n\t// like markers and vector layers are still visible.\n\tworldCopyJump: false,\n\n\t// @option maxBoundsViscosity: Number = 0.0\n\t// If `maxBounds` is set, this option will control how solid the bounds\n\t// are when dragging the map around. The default value of `0.0` allows the\n\t// user to drag outside the bounds at normal speed, higher values will\n\t// slow down map dragging outside bounds, and `1.0` makes the bounds fully\n\t// solid, preventing the user from dragging outside the bounds.\n\tmaxBoundsViscosity: 0.0\n});\n\nL.Map.Drag = L.Handler.extend({\n\taddHooks: function () {\n\t\tif (!this._draggable) {\n\t\t\tvar map = this._map;\n\n\t\t\tthis._draggable = new L.Draggable(map._mapPane, map._container);\n\n\t\t\tthis._draggable.on({\n\t\t\t\tdown: this._onDown,\n\t\t\t\tdragstart: this._onDragStart,\n\t\t\t\tdrag: this._onDrag,\n\t\t\t\tdragend: this._onDragEnd\n\t\t\t}, this);\n\n\t\t\tthis._draggable.on('predrag', this._onPreDragLimit, this);\n\t\t\tif (map.options.worldCopyJump) {\n\t\t\t\tthis._draggable.on('predrag', this._onPreDragWrap, this);\n\t\t\t\tmap.on('zoomend', this._onZoomEnd, this);\n\n\t\t\t\tmap.whenReady(this._onZoomEnd, this);\n\t\t\t}\n\t\t}\n\t\tL.DomUtil.addClass(this._map._container, 'leaflet-grab leaflet-touch-drag');\n\t\tthis._draggable.enable();\n\t\tthis._positions = [];\n\t\tthis._times = [];\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomUtil.removeClass(this._map._container, 'leaflet-grab');\n\t\tL.DomUtil.removeClass(this._map._container, 'leaflet-touch-drag');\n\t\tthis._draggable.disable();\n\t},\n\n\tmoved: function () {\n\t\treturn this._draggable && this._draggable._moved;\n\t},\n\n\tmoving: function () {\n\t\treturn this._draggable && this._draggable._moving;\n\t},\n\n\t_onDown: function () {\n\t\tthis._map._stop();\n\t},\n\n\t_onDragStart: function () {\n\t\tvar map = this._map;\n\n\t\tif (this._map.options.maxBounds && this._map.options.maxBoundsViscosity) {\n\t\t\tvar bounds = L.latLngBounds(this._map.options.maxBounds);\n\n\t\t\tthis._offsetLimit = L.bounds(\n\t\t\t\tthis._map.latLngToContainerPoint(bounds.getNorthWest()).multiplyBy(-1),\n\t\t\t\tthis._map.latLngToContainerPoint(bounds.getSouthEast()).multiplyBy(-1)\n\t\t\t\t\t.add(this._map.getSize()));\n\n\t\t\tthis._viscosity = Math.min(1.0, Math.max(0.0, this._map.options.maxBoundsViscosity));\n\t\t} else {\n\t\t\tthis._offsetLimit = null;\n\t\t}\n\n\t\tmap\n\t\t    .fire('movestart')\n\t\t    .fire('dragstart');\n\n\t\tif (map.options.inertia) {\n\t\t\tthis._positions = [];\n\t\t\tthis._times = [];\n\t\t}\n\t},\n\n\t_onDrag: function (e) {\n\t\tif (this._map.options.inertia) {\n\t\t\tvar time = this._lastTime = +new Date(),\n\t\t\t    pos = this._lastPos = this._draggable._absPos || this._draggable._newPos;\n\n\t\t\tthis._positions.push(pos);\n\t\t\tthis._times.push(time);\n\n\t\t\tif (time - this._times[0] > 50) {\n\t\t\t\tthis._positions.shift();\n\t\t\t\tthis._times.shift();\n\t\t\t}\n\t\t}\n\n\t\tthis._map\n\t\t    .fire('move', e)\n\t\t    .fire('drag', e);\n\t},\n\n\t_onZoomEnd: function () {\n\t\tvar pxCenter = this._map.getSize().divideBy(2),\n\t\t    pxWorldCenter = this._map.latLngToLayerPoint([0, 0]);\n\n\t\tthis._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x;\n\t\tthis._worldWidth = this._map.getPixelWorldBounds().getSize().x;\n\t},\n\n\t_viscousLimit: function (value, threshold) {\n\t\treturn value - (value - threshold) * this._viscosity;\n\t},\n\n\t_onPreDragLimit: function () {\n\t\tif (!this._viscosity || !this._offsetLimit) { return; }\n\n\t\tvar offset = this._draggable._newPos.subtract(this._draggable._startPos);\n\n\t\tvar limit = this._offsetLimit;\n\t\tif (offset.x < limit.min.x) { offset.x = this._viscousLimit(offset.x, limit.min.x); }\n\t\tif (offset.y < limit.min.y) { offset.y = this._viscousLimit(offset.y, limit.min.y); }\n\t\tif (offset.x > limit.max.x) { offset.x = this._viscousLimit(offset.x, limit.max.x); }\n\t\tif (offset.y > limit.max.y) { offset.y = this._viscousLimit(offset.y, limit.max.y); }\n\n\t\tthis._draggable._newPos = this._draggable._startPos.add(offset);\n\t},\n\n\t_onPreDragWrap: function () {\n\t\t// TODO refactor to be able to adjust map pane position after zoom\n\t\tvar worldWidth = this._worldWidth,\n\t\t    halfWidth = Math.round(worldWidth / 2),\n\t\t    dx = this._initialWorldOffset,\n\t\t    x = this._draggable._newPos.x,\n\t\t    newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx,\n\t\t    newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx,\n\t\t    newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2;\n\n\t\tthis._draggable._absPos = this._draggable._newPos.clone();\n\t\tthis._draggable._newPos.x = newX;\n\t},\n\n\t_onDragEnd: function (e) {\n\t\tvar map = this._map,\n\t\t    options = map.options,\n\n\t\t    noInertia = !options.inertia || this._times.length < 2;\n\n\t\tmap.fire('dragend', e);\n\n\t\tif (noInertia) {\n\t\t\tmap.fire('moveend');\n\n\t\t} else {\n\n\t\t\tvar direction = this._lastPos.subtract(this._positions[0]),\n\t\t\t    duration = (this._lastTime - this._times[0]) / 1000,\n\t\t\t    ease = options.easeLinearity,\n\n\t\t\t    speedVector = direction.multiplyBy(ease / duration),\n\t\t\t    speed = speedVector.distanceTo([0, 0]),\n\n\t\t\t    limitedSpeed = Math.min(options.inertiaMaxSpeed, speed),\n\t\t\t    limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed),\n\n\t\t\t    decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease),\n\t\t\t    offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round();\n\n\t\t\tif (!offset.x && !offset.y) {\n\t\t\t\tmap.fire('moveend');\n\n\t\t\t} else {\n\t\t\t\toffset = map._limitOffset(offset, map.options.maxBounds);\n\n\t\t\t\tL.Util.requestAnimFrame(function () {\n\t\t\t\t\tmap.panBy(offset, {\n\t\t\t\t\t\tduration: decelerationDuration,\n\t\t\t\t\t\teaseLinearity: ease,\n\t\t\t\t\t\tnoMoveStart: true,\n\t\t\t\t\t\tanimate: true\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n});\n\n// @section Handlers\n// @property dragging: Handler\n// Map dragging handler (by both mouse and touch).\nL.Map.addInitHook('addHandler', 'dragging', L.Map.Drag);\n\n\n\n/*\n * L.Handler.DoubleClickZoom is used to handle double-click zoom on the map, enabled by default.\n */\n\n// @namespace Map\n// @section Interaction Options\n\nL.Map.mergeOptions({\n\t// @option doubleClickZoom: Boolean|String = true\n\t// Whether the map can be zoomed in by double clicking on it and\n\t// zoomed out by double clicking while holding shift. If passed\n\t// `'center'`, double-click zoom will zoom to the center of the\n\t//  view regardless of where the mouse was.\n\tdoubleClickZoom: true\n});\n\nL.Map.DoubleClickZoom = L.Handler.extend({\n\taddHooks: function () {\n\t\tthis._map.on('dblclick', this._onDoubleClick, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._map.off('dblclick', this._onDoubleClick, this);\n\t},\n\n\t_onDoubleClick: function (e) {\n\t\tvar map = this._map,\n\t\t    oldZoom = map.getZoom(),\n\t\t    delta = map.options.zoomDelta,\n\t\t    zoom = e.originalEvent.shiftKey ? oldZoom - delta : oldZoom + delta;\n\n\t\tif (map.options.doubleClickZoom === 'center') {\n\t\t\tmap.setZoom(zoom);\n\t\t} else {\n\t\t\tmap.setZoomAround(e.containerPoint, zoom);\n\t\t}\n\t}\n});\n\n// @section Handlers\n//\n// Map properties include interaction handlers that allow you to control\n// interaction behavior in runtime, enabling or disabling certain features such\n// as dragging or touch zoom (see `Handler` methods). For example:\n//\n// ```js\n// map.doubleClickZoom.disable();\n// ```\n//\n// @property doubleClickZoom: Handler\n// Double click zoom handler.\nL.Map.addInitHook('addHandler', 'doubleClickZoom', L.Map.DoubleClickZoom);\n\n\n\n/*\n * L.Handler.ScrollWheelZoom is used by L.Map to enable mouse scroll wheel zoom on the map.\n */\n\n// @namespace Map\n// @section Interaction Options\nL.Map.mergeOptions({\n\t// @section Mousewheel options\n\t// @option scrollWheelZoom: Boolean|String = true\n\t// Whether the map can be zoomed by using the mouse wheel. If passed `'center'`,\n\t// it will zoom to the center of the view regardless of where the mouse was.\n\tscrollWheelZoom: true,\n\n\t// @option wheelDebounceTime: Number = 40\n\t// Limits the rate at which a wheel can fire (in milliseconds). By default\n\t// user can't zoom via wheel more often than once per 40 ms.\n\twheelDebounceTime: 40,\n\n\t// @option wheelPxPerZoomLevel: Number = 60\n\t// How many scroll pixels (as reported by [L.DomEvent.getWheelDelta](#domevent-getwheeldelta))\n\t// mean a change of one full zoom level. Smaller values will make wheel-zooming\n\t// faster (and vice versa).\n\twheelPxPerZoomLevel: 60\n});\n\nL.Map.ScrollWheelZoom = L.Handler.extend({\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._map._container, 'mousewheel', this._onWheelScroll, this);\n\n\t\tthis._delta = 0;\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._map._container, 'mousewheel', this._onWheelScroll, this);\n\t},\n\n\t_onWheelScroll: function (e) {\n\t\tvar delta = L.DomEvent.getWheelDelta(e);\n\n\t\tvar debounce = this._map.options.wheelDebounceTime;\n\n\t\tthis._delta += delta;\n\t\tthis._lastMousePos = this._map.mouseEventToContainerPoint(e);\n\n\t\tif (!this._startTime) {\n\t\t\tthis._startTime = +new Date();\n\t\t}\n\n\t\tvar left = Math.max(debounce - (+new Date() - this._startTime), 0);\n\n\t\tclearTimeout(this._timer);\n\t\tthis._timer = setTimeout(L.bind(this._performZoom, this), left);\n\n\t\tL.DomEvent.stop(e);\n\t},\n\n\t_performZoom: function () {\n\t\tvar map = this._map,\n\t\t    zoom = map.getZoom(),\n\t\t    snap = this._map.options.zoomSnap || 0;\n\n\t\tmap._stop(); // stop panning and fly animations if any\n\n\t\t// map the delta with a sigmoid function to -4..4 range leaning on -1..1\n\t\tvar d2 = this._delta / (this._map.options.wheelPxPerZoomLevel * 4),\n\t\t    d3 = 4 * Math.log(2 / (1 + Math.exp(-Math.abs(d2)))) / Math.LN2,\n\t\t    d4 = snap ? Math.ceil(d3 / snap) * snap : d3,\n\t\t    delta = map._limitZoom(zoom + (this._delta > 0 ? d4 : -d4)) - zoom;\n\n\t\tthis._delta = 0;\n\t\tthis._startTime = null;\n\n\t\tif (!delta) { return; }\n\n\t\tif (map.options.scrollWheelZoom === 'center') {\n\t\t\tmap.setZoom(zoom + delta);\n\t\t} else {\n\t\t\tmap.setZoomAround(this._lastMousePos, zoom + delta);\n\t\t}\n\t}\n});\n\n// @section Handlers\n// @property scrollWheelZoom: Handler\n// Scroll wheel zoom handler.\nL.Map.addInitHook('addHandler', 'scrollWheelZoom', L.Map.ScrollWheelZoom);\n\n\n\n/*\r\n * Extends the event handling code with double tap support for mobile browsers.\r\n */\r\n\r\nL.extend(L.DomEvent, {\r\n\r\n\t_touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart',\r\n\t_touchend: L.Browser.msPointer ? 'MSPointerUp' : L.Browser.pointer ? 'pointerup' : 'touchend',\r\n\r\n\t// inspired by Zepto touch code by Thomas Fuchs\r\n\taddDoubleTapListener: function (obj, handler, id) {\r\n\t\tvar last, touch,\r\n\t\t    doubleTap = false,\r\n\t\t    delay = 250;\r\n\r\n\t\tfunction onTouchStart(e) {\r\n\t\t\tvar count;\r\n\r\n\t\t\tif (L.Browser.pointer) {\r\n\t\t\t\tif ((!L.Browser.edge) || e.pointerType === 'mouse') { return; }\r\n\t\t\t\tcount = L.DomEvent._pointersCount;\r\n\t\t\t} else {\r\n\t\t\t\tcount = e.touches.length;\r\n\t\t\t}\r\n\r\n\t\t\tif (count > 1) { return; }\r\n\r\n\t\t\tvar now = Date.now(),\r\n\t\t\t    delta = now - (last || now);\r\n\r\n\t\t\ttouch = e.touches ? e.touches[0] : e;\r\n\t\t\tdoubleTap = (delta > 0 && delta <= delay);\r\n\t\t\tlast = now;\r\n\t\t}\r\n\r\n\t\tfunction onTouchEnd(e) {\r\n\t\t\tif (doubleTap && !touch.cancelBubble) {\r\n\t\t\t\tif (L.Browser.pointer) {\r\n\t\t\t\t\tif ((!L.Browser.edge) || e.pointerType === 'mouse') { return; }\r\n\r\n\t\t\t\t\t// work around .type being readonly with MSPointer* events\r\n\t\t\t\t\tvar newTouch = {},\r\n\t\t\t\t\t    prop, i;\r\n\r\n\t\t\t\t\tfor (i in touch) {\r\n\t\t\t\t\t\tprop = touch[i];\r\n\t\t\t\t\t\tnewTouch[i] = prop && prop.bind ? prop.bind(touch) : prop;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttouch = newTouch;\r\n\t\t\t\t}\r\n\t\t\t\ttouch.type = 'dblclick';\r\n\t\t\t\thandler(touch);\r\n\t\t\t\tlast = null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar pre = '_leaflet_',\r\n\t\t    touchstart = this._touchstart,\r\n\t\t    touchend = this._touchend;\r\n\r\n\t\tobj[pre + touchstart + id] = onTouchStart;\r\n\t\tobj[pre + touchend + id] = onTouchEnd;\r\n\t\tobj[pre + 'dblclick' + id] = handler;\r\n\r\n\t\tobj.addEventListener(touchstart, onTouchStart, false);\r\n\t\tobj.addEventListener(touchend, onTouchEnd, false);\r\n\r\n\t\t// On some platforms (notably, chrome<55 on win10 + touchscreen + mouse),\r\n\t\t// the browser doesn't fire touchend/pointerup events but does fire\r\n\t\t// native dblclicks. See #4127.\r\n\t\t// Edge 14 also fires native dblclicks, but only for pointerType mouse, see #5180.\r\n\t\tobj.addEventListener('dblclick', handler, false);\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveDoubleTapListener: function (obj, id) {\r\n\t\tvar pre = '_leaflet_',\r\n\t\t    touchstart = obj[pre + this._touchstart + id],\r\n\t\t    touchend = obj[pre + this._touchend + id],\r\n\t\t    dblclick = obj[pre + 'dblclick' + id];\r\n\r\n\t\tobj.removeEventListener(this._touchstart, touchstart, false);\r\n\t\tobj.removeEventListener(this._touchend, touchend, false);\r\n\t\tif (!L.Browser.edge) {\r\n\t\t\tobj.removeEventListener('dblclick', dblclick, false);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n});\r\n\n\n\n/*\n * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices.\n */\n\nL.extend(L.DomEvent, {\n\n\tPOINTER_DOWN:   L.Browser.msPointer ? 'MSPointerDown'   : 'pointerdown',\n\tPOINTER_MOVE:   L.Browser.msPointer ? 'MSPointerMove'   : 'pointermove',\n\tPOINTER_UP:     L.Browser.msPointer ? 'MSPointerUp'     : 'pointerup',\n\tPOINTER_CANCEL: L.Browser.msPointer ? 'MSPointerCancel' : 'pointercancel',\n\tTAG_WHITE_LIST: ['INPUT', 'SELECT', 'OPTION'],\n\n\t_pointers: {},\n\t_pointersCount: 0,\n\n\t// Provides a touch events wrapper for (ms)pointer events.\n\t// ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890\n\n\taddPointerListener: function (obj, type, handler, id) {\n\n\t\tif (type === 'touchstart') {\n\t\t\tthis._addPointerStart(obj, handler, id);\n\n\t\t} else if (type === 'touchmove') {\n\t\t\tthis._addPointerMove(obj, handler, id);\n\n\t\t} else if (type === 'touchend') {\n\t\t\tthis._addPointerEnd(obj, handler, id);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremovePointerListener: function (obj, type, id) {\n\t\tvar handler = obj['_leaflet_' + type + id];\n\n\t\tif (type === 'touchstart') {\n\t\t\tobj.removeEventListener(this.POINTER_DOWN, handler, false);\n\n\t\t} else if (type === 'touchmove') {\n\t\t\tobj.removeEventListener(this.POINTER_MOVE, handler, false);\n\n\t\t} else if (type === 'touchend') {\n\t\t\tobj.removeEventListener(this.POINTER_UP, handler, false);\n\t\t\tobj.removeEventListener(this.POINTER_CANCEL, handler, false);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_addPointerStart: function (obj, handler, id) {\n\t\tvar onDown = L.bind(function (e) {\n\t\t\tif (e.pointerType !== 'mouse' && e.MSPOINTER_TYPE_MOUSE && e.pointerType !== e.MSPOINTER_TYPE_MOUSE) {\n\t\t\t\t// In IE11, some touch events needs to fire for form controls, or\n\t\t\t\t// the controls will stop working. We keep a whitelist of tag names that\n\t\t\t\t// need these events. For other target tags, we prevent default on the event.\n\t\t\t\tif (this.TAG_WHITE_LIST.indexOf(e.target.tagName) < 0) {\n\t\t\t\t\tL.DomEvent.preventDefault(e);\n\t\t\t\t} else {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._handlePointer(e, handler);\n\t\t}, this);\n\n\t\tobj['_leaflet_touchstart' + id] = onDown;\n\t\tobj.addEventListener(this.POINTER_DOWN, onDown, false);\n\n\t\t// need to keep track of what pointers and how many are active to provide e.touches emulation\n\t\tif (!this._pointerDocListener) {\n\t\t\tvar pointerUp = L.bind(this._globalPointerUp, this);\n\n\t\t\t// we listen documentElement as any drags that end by moving the touch off the screen get fired there\n\t\t\tdocument.documentElement.addEventListener(this.POINTER_DOWN, L.bind(this._globalPointerDown, this), true);\n\t\t\tdocument.documentElement.addEventListener(this.POINTER_MOVE, L.bind(this._globalPointerMove, this), true);\n\t\t\tdocument.documentElement.addEventListener(this.POINTER_UP, pointerUp, true);\n\t\t\tdocument.documentElement.addEventListener(this.POINTER_CANCEL, pointerUp, true);\n\n\t\t\tthis._pointerDocListener = true;\n\t\t}\n\t},\n\n\t_globalPointerDown: function (e) {\n\t\tthis._pointers[e.pointerId] = e;\n\t\tthis._pointersCount++;\n\t},\n\n\t_globalPointerMove: function (e) {\n\t\tif (this._pointers[e.pointerId]) {\n\t\t\tthis._pointers[e.pointerId] = e;\n\t\t}\n\t},\n\n\t_globalPointerUp: function (e) {\n\t\tdelete this._pointers[e.pointerId];\n\t\tthis._pointersCount--;\n\t},\n\n\t_handlePointer: function (e, handler) {\n\t\te.touches = [];\n\t\tfor (var i in this._pointers) {\n\t\t\te.touches.push(this._pointers[i]);\n\t\t}\n\t\te.changedTouches = [e];\n\n\t\thandler(e);\n\t},\n\n\t_addPointerMove: function (obj, handler, id) {\n\t\tvar onMove = L.bind(function (e) {\n\t\t\t// don't fire touch moves when mouse isn't down\n\t\t\tif ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; }\n\n\t\t\tthis._handlePointer(e, handler);\n\t\t}, this);\n\n\t\tobj['_leaflet_touchmove' + id] = onMove;\n\t\tobj.addEventListener(this.POINTER_MOVE, onMove, false);\n\t},\n\n\t_addPointerEnd: function (obj, handler, id) {\n\t\tvar onUp = L.bind(function (e) {\n\t\t\tthis._handlePointer(e, handler);\n\t\t}, this);\n\n\t\tobj['_leaflet_touchend' + id] = onUp;\n\t\tobj.addEventListener(this.POINTER_UP, onUp, false);\n\t\tobj.addEventListener(this.POINTER_CANCEL, onUp, false);\n\t}\n});\n\n\n\n/*\n * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers.\n */\n\n// @namespace Map\n// @section Interaction Options\nL.Map.mergeOptions({\n\t// @section Touch interaction options\n\t// @option touchZoom: Boolean|String = *\n\t// Whether the map can be zoomed by touch-dragging with two fingers. If\n\t// passed `'center'`, it will zoom to the center of the view regardless of\n\t// where the touch events (fingers) were. Enabled for touch-capable web\n\t// browsers except for old Androids.\n\ttouchZoom: L.Browser.touch && !L.Browser.android23,\n\n\t// @option bounceAtZoomLimits: Boolean = true\n\t// Set it to false if you don't want the map to zoom beyond min/max zoom\n\t// and then bounce back when pinch-zooming.\n\tbounceAtZoomLimits: true\n});\n\nL.Map.TouchZoom = L.Handler.extend({\n\taddHooks: function () {\n\t\tL.DomUtil.addClass(this._map._container, 'leaflet-touch-zoom');\n\t\tL.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomUtil.removeClass(this._map._container, 'leaflet-touch-zoom');\n\t\tL.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this);\n\t},\n\n\t_onTouchStart: function (e) {\n\t\tvar map = this._map;\n\t\tif (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; }\n\n\t\tvar p1 = map.mouseEventToContainerPoint(e.touches[0]),\n\t\t    p2 = map.mouseEventToContainerPoint(e.touches[1]);\n\n\t\tthis._centerPoint = map.getSize()._divideBy(2);\n\t\tthis._startLatLng = map.containerPointToLatLng(this._centerPoint);\n\t\tif (map.options.touchZoom !== 'center') {\n\t\t\tthis._pinchStartLatLng = map.containerPointToLatLng(p1.add(p2)._divideBy(2));\n\t\t}\n\n\t\tthis._startDist = p1.distanceTo(p2);\n\t\tthis._startZoom = map.getZoom();\n\n\t\tthis._moved = false;\n\t\tthis._zooming = true;\n\n\t\tmap._stop();\n\n\t\tL.DomEvent\n\t\t    .on(document, 'touchmove', this._onTouchMove, this)\n\t\t    .on(document, 'touchend', this._onTouchEnd, this);\n\n\t\tL.DomEvent.preventDefault(e);\n\t},\n\n\t_onTouchMove: function (e) {\n\t\tif (!e.touches || e.touches.length !== 2 || !this._zooming) { return; }\n\n\t\tvar map = this._map,\n\t\t    p1 = map.mouseEventToContainerPoint(e.touches[0]),\n\t\t    p2 = map.mouseEventToContainerPoint(e.touches[1]),\n\t\t    scale = p1.distanceTo(p2) / this._startDist;\n\n\n\t\tthis._zoom = map.getScaleZoom(scale, this._startZoom);\n\n\t\tif (!map.options.bounceAtZoomLimits && (\n\t\t\t(this._zoom < map.getMinZoom() && scale < 1) ||\n\t\t\t(this._zoom > map.getMaxZoom() && scale > 1))) {\n\t\t\tthis._zoom = map._limitZoom(this._zoom);\n\t\t}\n\n\t\tif (map.options.touchZoom === 'center') {\n\t\t\tthis._center = this._startLatLng;\n\t\t\tif (scale === 1) { return; }\n\t\t} else {\n\t\t\t// Get delta from pinch to center, so centerLatLng is delta applied to initial pinchLatLng\n\t\t\tvar delta = p1._add(p2)._divideBy(2)._subtract(this._centerPoint);\n\t\t\tif (scale === 1 && delta.x === 0 && delta.y === 0) { return; }\n\t\t\tthis._center = map.unproject(map.project(this._pinchStartLatLng, this._zoom).subtract(delta), this._zoom);\n\t\t}\n\n\t\tif (!this._moved) {\n\t\t\tmap._moveStart(true);\n\t\t\tthis._moved = true;\n\t\t}\n\n\t\tL.Util.cancelAnimFrame(this._animRequest);\n\n\t\tvar moveFn = L.bind(map._move, map, this._center, this._zoom, {pinch: true, round: false});\n\t\tthis._animRequest = L.Util.requestAnimFrame(moveFn, this, true);\n\n\t\tL.DomEvent.preventDefault(e);\n\t},\n\n\t_onTouchEnd: function () {\n\t\tif (!this._moved || !this._zooming) {\n\t\t\tthis._zooming = false;\n\t\t\treturn;\n\t\t}\n\n\t\tthis._zooming = false;\n\t\tL.Util.cancelAnimFrame(this._animRequest);\n\n\t\tL.DomEvent\n\t\t    .off(document, 'touchmove', this._onTouchMove)\n\t\t    .off(document, 'touchend', this._onTouchEnd);\n\n\t\t// Pinch updates GridLayers' levels only when zoomSnap is off, so zoomSnap becomes noUpdate.\n\t\tif (this._map.options.zoomAnimation) {\n\t\t\tthis._map._animateZoom(this._center, this._map._limitZoom(this._zoom), true, this._map.options.zoomSnap);\n\t\t} else {\n\t\t\tthis._map._resetView(this._center, this._map._limitZoom(this._zoom));\n\t\t}\n\t}\n});\n\n// @section Handlers\n// @property touchZoom: Handler\n// Touch zoom handler.\nL.Map.addInitHook('addHandler', 'touchZoom', L.Map.TouchZoom);\n\n\n\n/*\n * L.Map.Tap is used to enable mobile hacks like quick taps and long hold.\n */\n\n// @namespace Map\n// @section Interaction Options\nL.Map.mergeOptions({\n\t// @section Touch interaction options\n\t// @option tap: Boolean = true\n\t// Enables mobile hacks for supporting instant taps (fixing 200ms click\n\t// delay on iOS/Android) and touch holds (fired as `contextmenu` events).\n\ttap: true,\n\n\t// @option tapTolerance: Number = 15\n\t// The max number of pixels a user can shift his finger during touch\n\t// for it to be considered a valid tap.\n\ttapTolerance: 15\n});\n\nL.Map.Tap = L.Handler.extend({\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._map._container, 'touchstart', this._onDown, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._map._container, 'touchstart', this._onDown, this);\n\t},\n\n\t_onDown: function (e) {\n\t\tif (!e.touches) { return; }\n\n\t\tL.DomEvent.preventDefault(e);\n\n\t\tthis._fireClick = true;\n\n\t\t// don't simulate click or track longpress if more than 1 touch\n\t\tif (e.touches.length > 1) {\n\t\t\tthis._fireClick = false;\n\t\t\tclearTimeout(this._holdTimeout);\n\t\t\treturn;\n\t\t}\n\n\t\tvar first = e.touches[0],\n\t\t    el = first.target;\n\n\t\tthis._startPos = this._newPos = new L.Point(first.clientX, first.clientY);\n\n\t\t// if touching a link, highlight it\n\t\tif (el.tagName && el.tagName.toLowerCase() === 'a') {\n\t\t\tL.DomUtil.addClass(el, 'leaflet-active');\n\t\t}\n\n\t\t// simulate long hold but setting a timeout\n\t\tthis._holdTimeout = setTimeout(L.bind(function () {\n\t\t\tif (this._isTapValid()) {\n\t\t\t\tthis._fireClick = false;\n\t\t\t\tthis._onUp();\n\t\t\t\tthis._simulateEvent('contextmenu', first);\n\t\t\t}\n\t\t}, this), 1000);\n\n\t\tthis._simulateEvent('mousedown', first);\n\n\t\tL.DomEvent.on(document, {\n\t\t\ttouchmove: this._onMove,\n\t\t\ttouchend: this._onUp\n\t\t}, this);\n\t},\n\n\t_onUp: function (e) {\n\t\tclearTimeout(this._holdTimeout);\n\n\t\tL.DomEvent.off(document, {\n\t\t\ttouchmove: this._onMove,\n\t\t\ttouchend: this._onUp\n\t\t}, this);\n\n\t\tif (this._fireClick && e && e.changedTouches) {\n\n\t\t\tvar first = e.changedTouches[0],\n\t\t\t    el = first.target;\n\n\t\t\tif (el && el.tagName && el.tagName.toLowerCase() === 'a') {\n\t\t\t\tL.DomUtil.removeClass(el, 'leaflet-active');\n\t\t\t}\n\n\t\t\tthis._simulateEvent('mouseup', first);\n\n\t\t\t// simulate click if the touch didn't move too much\n\t\t\tif (this._isTapValid()) {\n\t\t\t\tthis._simulateEvent('click', first);\n\t\t\t}\n\t\t}\n\t},\n\n\t_isTapValid: function () {\n\t\treturn this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance;\n\t},\n\n\t_onMove: function (e) {\n\t\tvar first = e.touches[0];\n\t\tthis._newPos = new L.Point(first.clientX, first.clientY);\n\t\tthis._simulateEvent('mousemove', first);\n\t},\n\n\t_simulateEvent: function (type, e) {\n\t\tvar simulatedEvent = document.createEvent('MouseEvents');\n\n\t\tsimulatedEvent._simulated = true;\n\t\te.target._simulatedClick = true;\n\n\t\tsimulatedEvent.initMouseEvent(\n\t\t        type, true, true, window, 1,\n\t\t        e.screenX, e.screenY,\n\t\t        e.clientX, e.clientY,\n\t\t        false, false, false, false, 0, null);\n\n\t\te.target.dispatchEvent(simulatedEvent);\n\t}\n});\n\n// @section Handlers\n// @property tap: Handler\n// Mobile touch hacks (quick tap and touch hold) handler.\nif (L.Browser.touch && !L.Browser.pointer) {\n\tL.Map.addInitHook('addHandler', 'tap', L.Map.Tap);\n}\n\n\n\n/*\n * L.Handler.BoxZoom is used to add shift-drag zoom interaction to the map\n * (zoom to a selected bounding box), enabled by default.\n */\n\n// @namespace Map\n// @section Interaction Options\nL.Map.mergeOptions({\n\t// @option boxZoom: Boolean = true\n\t// Whether the map can be zoomed to a rectangular area specified by\n\t// dragging the mouse while pressing the shift key.\n\tboxZoom: true\n});\n\nL.Map.BoxZoom = L.Handler.extend({\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\t\tthis._container = map._container;\n\t\tthis._pane = map._panes.overlayPane;\n\t},\n\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this);\n\t},\n\n\tmoved: function () {\n\t\treturn this._moved;\n\t},\n\n\t_resetState: function () {\n\t\tthis._moved = false;\n\t},\n\n\t_onMouseDown: function (e) {\n\t\tif (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }\n\n\t\tthis._resetState();\n\n\t\tL.DomUtil.disableTextSelection();\n\t\tL.DomUtil.disableImageDrag();\n\n\t\tthis._startPoint = this._map.mouseEventToContainerPoint(e);\n\n\t\tL.DomEvent.on(document, {\n\t\t\tcontextmenu: L.DomEvent.stop,\n\t\t\tmousemove: this._onMouseMove,\n\t\t\tmouseup: this._onMouseUp,\n\t\t\tkeydown: this._onKeyDown\n\t\t}, this);\n\t},\n\n\t_onMouseMove: function (e) {\n\t\tif (!this._moved) {\n\t\t\tthis._moved = true;\n\n\t\t\tthis._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._container);\n\t\t\tL.DomUtil.addClass(this._container, 'leaflet-crosshair');\n\n\t\t\tthis._map.fire('boxzoomstart');\n\t\t}\n\n\t\tthis._point = this._map.mouseEventToContainerPoint(e);\n\n\t\tvar bounds = new L.Bounds(this._point, this._startPoint),\n\t\t    size = bounds.getSize();\n\n\t\tL.DomUtil.setPosition(this._box, bounds.min);\n\n\t\tthis._box.style.width  = size.x + 'px';\n\t\tthis._box.style.height = size.y + 'px';\n\t},\n\n\t_finish: function () {\n\t\tif (this._moved) {\n\t\t\tL.DomUtil.remove(this._box);\n\t\t\tL.DomUtil.removeClass(this._container, 'leaflet-crosshair');\n\t\t}\n\n\t\tL.DomUtil.enableTextSelection();\n\t\tL.DomUtil.enableImageDrag();\n\n\t\tL.DomEvent.off(document, {\n\t\t\tcontextmenu: L.DomEvent.stop,\n\t\t\tmousemove: this._onMouseMove,\n\t\t\tmouseup: this._onMouseUp,\n\t\t\tkeydown: this._onKeyDown\n\t\t}, this);\n\t},\n\n\t_onMouseUp: function (e) {\n\t\tif ((e.which !== 1) && (e.button !== 1)) { return; }\n\n\t\tthis._finish();\n\n\t\tif (!this._moved) { return; }\n\t\t// Postpone to next JS tick so internal click event handling\n\t\t// still see it as \"moved\".\n\t\tsetTimeout(L.bind(this._resetState, this), 0);\n\n\t\tvar bounds = new L.LatLngBounds(\n\t\t        this._map.containerPointToLatLng(this._startPoint),\n\t\t        this._map.containerPointToLatLng(this._point));\n\n\t\tthis._map\n\t\t\t.fitBounds(bounds)\n\t\t\t.fire('boxzoomend', {boxZoomBounds: bounds});\n\t},\n\n\t_onKeyDown: function (e) {\n\t\tif (e.keyCode === 27) {\n\t\t\tthis._finish();\n\t\t}\n\t}\n});\n\n// @section Handlers\n// @property boxZoom: Handler\n// Box (shift-drag with mouse) zoom handler.\nL.Map.addInitHook('addHandler', 'boxZoom', L.Map.BoxZoom);\n\n\n\n/*\n * L.Map.Keyboard is handling keyboard interaction with the map, enabled by default.\n */\n\n// @namespace Map\n// @section Keyboard Navigation Options\nL.Map.mergeOptions({\n\t// @option keyboard: Boolean = true\n\t// Makes the map focusable and allows users to navigate the map with keyboard\n\t// arrows and `+`/`-` keys.\n\tkeyboard: true,\n\n\t// @option keyboardPanDelta: Number = 80\n\t// Amount of pixels to pan when pressing an arrow key.\n\tkeyboardPanDelta: 80\n});\n\nL.Map.Keyboard = L.Handler.extend({\n\n\tkeyCodes: {\n\t\tleft:    [37],\n\t\tright:   [39],\n\t\tdown:    [40],\n\t\tup:      [38],\n\t\tzoomIn:  [187, 107, 61, 171],\n\t\tzoomOut: [189, 109, 54, 173]\n\t},\n\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\n\t\tthis._setPanDelta(map.options.keyboardPanDelta);\n\t\tthis._setZoomDelta(map.options.zoomDelta);\n\t},\n\n\taddHooks: function () {\n\t\tvar container = this._map._container;\n\n\t\t// make the container focusable by tabbing\n\t\tif (container.tabIndex <= 0) {\n\t\t\tcontainer.tabIndex = '0';\n\t\t}\n\n\t\tL.DomEvent.on(container, {\n\t\t\tfocus: this._onFocus,\n\t\t\tblur: this._onBlur,\n\t\t\tmousedown: this._onMouseDown\n\t\t}, this);\n\n\t\tthis._map.on({\n\t\t\tfocus: this._addHooks,\n\t\t\tblur: this._removeHooks\n\t\t}, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._removeHooks();\n\n\t\tL.DomEvent.off(this._map._container, {\n\t\t\tfocus: this._onFocus,\n\t\t\tblur: this._onBlur,\n\t\t\tmousedown: this._onMouseDown\n\t\t}, this);\n\n\t\tthis._map.off({\n\t\t\tfocus: this._addHooks,\n\t\t\tblur: this._removeHooks\n\t\t}, this);\n\t},\n\n\t_onMouseDown: function () {\n\t\tif (this._focused) { return; }\n\n\t\tvar body = document.body,\n\t\t    docEl = document.documentElement,\n\t\t    top = body.scrollTop || docEl.scrollTop,\n\t\t    left = body.scrollLeft || docEl.scrollLeft;\n\n\t\tthis._map._container.focus();\n\n\t\twindow.scrollTo(left, top);\n\t},\n\n\t_onFocus: function () {\n\t\tthis._focused = true;\n\t\tthis._map.fire('focus');\n\t},\n\n\t_onBlur: function () {\n\t\tthis._focused = false;\n\t\tthis._map.fire('blur');\n\t},\n\n\t_setPanDelta: function (panDelta) {\n\t\tvar keys = this._panKeys = {},\n\t\t    codes = this.keyCodes,\n\t\t    i, len;\n\n\t\tfor (i = 0, len = codes.left.length; i < len; i++) {\n\t\t\tkeys[codes.left[i]] = [-1 * panDelta, 0];\n\t\t}\n\t\tfor (i = 0, len = codes.right.length; i < len; i++) {\n\t\t\tkeys[codes.right[i]] = [panDelta, 0];\n\t\t}\n\t\tfor (i = 0, len = codes.down.length; i < len; i++) {\n\t\t\tkeys[codes.down[i]] = [0, panDelta];\n\t\t}\n\t\tfor (i = 0, len = codes.up.length; i < len; i++) {\n\t\t\tkeys[codes.up[i]] = [0, -1 * panDelta];\n\t\t}\n\t},\n\n\t_setZoomDelta: function (zoomDelta) {\n\t\tvar keys = this._zoomKeys = {},\n\t\t    codes = this.keyCodes,\n\t\t    i, len;\n\n\t\tfor (i = 0, len = codes.zoomIn.length; i < len; i++) {\n\t\t\tkeys[codes.zoomIn[i]] = zoomDelta;\n\t\t}\n\t\tfor (i = 0, len = codes.zoomOut.length; i < len; i++) {\n\t\t\tkeys[codes.zoomOut[i]] = -zoomDelta;\n\t\t}\n\t},\n\n\t_addHooks: function () {\n\t\tL.DomEvent.on(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_removeHooks: function () {\n\t\tL.DomEvent.off(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_onKeyDown: function (e) {\n\t\tif (e.altKey || e.ctrlKey || e.metaKey) { return; }\n\n\t\tvar key = e.keyCode,\n\t\t    map = this._map,\n\t\t    offset;\n\n\t\tif (key in this._panKeys) {\n\n\t\t\tif (map._panAnim && map._panAnim._inProgress) { return; }\n\n\t\t\toffset = this._panKeys[key];\n\t\t\tif (e.shiftKey) {\n\t\t\t\toffset = L.point(offset).multiplyBy(3);\n\t\t\t}\n\n\t\t\tmap.panBy(offset);\n\n\t\t\tif (map.options.maxBounds) {\n\t\t\t\tmap.panInsideBounds(map.options.maxBounds);\n\t\t\t}\n\n\t\t} else if (key in this._zoomKeys) {\n\t\t\tmap.setZoom(map.getZoom() + (e.shiftKey ? 3 : 1) * this._zoomKeys[key]);\n\n\t\t} else if (key === 27) {\n\t\t\tmap.closePopup();\n\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\tL.DomEvent.stop(e);\n\t}\n});\n\n// @section Handlers\n// @section Handlers\n// @property keyboard: Handler\n// Keyboard navigation handler.\nL.Map.addInitHook('addHandler', 'keyboard', L.Map.Keyboard);\n\n\n\n/*\n * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable.\n */\n\n\n/* @namespace Marker\n * @section Interaction handlers\n *\n * Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see `Handler` methods). Example:\n *\n * ```js\n * marker.dragging.disable();\n * ```\n *\n * @property dragging: Handler\n * Marker dragging handler (by both mouse and touch).\n */\n\nL.Handler.MarkerDrag = L.Handler.extend({\n\tinitialize: function (marker) {\n\t\tthis._marker = marker;\n\t},\n\n\taddHooks: function () {\n\t\tvar icon = this._marker._icon;\n\n\t\tif (!this._draggable) {\n\t\t\tthis._draggable = new L.Draggable(icon, icon, true);\n\t\t}\n\n\t\tthis._draggable.on({\n\t\t\tdragstart: this._onDragStart,\n\t\t\tdrag: this._onDrag,\n\t\t\tdragend: this._onDragEnd\n\t\t}, this).enable();\n\n\t\tL.DomUtil.addClass(icon, 'leaflet-marker-draggable');\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._draggable.off({\n\t\t\tdragstart: this._onDragStart,\n\t\t\tdrag: this._onDrag,\n\t\t\tdragend: this._onDragEnd\n\t\t}, this).disable();\n\n\t\tif (this._marker._icon) {\n\t\t\tL.DomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable');\n\t\t}\n\t},\n\n\tmoved: function () {\n\t\treturn this._draggable && this._draggable._moved;\n\t},\n\n\t_onDragStart: function () {\n\t\t// @section Dragging events\n\t\t// @event dragstart: Event\n\t\t// Fired when the user starts dragging the marker.\n\n\t\t// @event movestart: Event\n\t\t// Fired when the marker starts moving (because of dragging).\n\n\t\tthis._oldLatLng = this._marker.getLatLng();\n\t\tthis._marker\n\t\t    .closePopup()\n\t\t    .fire('movestart')\n\t\t    .fire('dragstart');\n\t},\n\n\t_onDrag: function (e) {\n\t\tvar marker = this._marker,\n\t\t    shadow = marker._shadow,\n\t\t    iconPos = L.DomUtil.getPosition(marker._icon),\n\t\t    latlng = marker._map.layerPointToLatLng(iconPos);\n\n\t\t// update shadow position\n\t\tif (shadow) {\n\t\t\tL.DomUtil.setPosition(shadow, iconPos);\n\t\t}\n\n\t\tmarker._latlng = latlng;\n\t\te.latlng = latlng;\n\t\te.oldLatLng = this._oldLatLng;\n\n\t\t// @event drag: Event\n\t\t// Fired repeatedly while the user drags the marker.\n\t\tmarker\n\t\t    .fire('move', e)\n\t\t    .fire('drag', e);\n\t},\n\n\t_onDragEnd: function (e) {\n\t\t// @event dragend: DragEndEvent\n\t\t// Fired when the user stops dragging the marker.\n\n\t\t// @event moveend: Event\n\t\t// Fired when the marker stops moving (because of dragging).\n\t\tdelete this._oldLatLng;\n\t\tthis._marker\n\t\t    .fire('moveend')\n\t\t    .fire('dragend', e);\n\t}\n});\n\n\n\n/*\r\n * @class Control\r\n * @aka L.Control\r\n * @inherits Class\r\n *\r\n * L.Control is a base class for implementing map controls. Handles positioning.\r\n * All other controls extend from this class.\r\n */\r\n\r\nL.Control = L.Class.extend({\r\n\t// @section\r\n\t// @aka Control options\r\n\toptions: {\r\n\t\t// @option position: String = 'topright'\r\n\t\t// The position of the control (one of the map corners). Possible values are `'topleft'`,\r\n\t\t// `'topright'`, `'bottomleft'` or `'bottomright'`\r\n\t\tposition: 'topright'\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\t/* @section\r\n\t * Classes extending L.Control will inherit the following methods:\r\n\t *\r\n\t * @method getPosition: string\r\n\t * Returns the position of the control.\r\n\t */\r\n\tgetPosition: function () {\r\n\t\treturn this.options.position;\r\n\t},\r\n\r\n\t// @method setPosition(position: string): this\r\n\t// Sets the position of the control.\r\n\tsetPosition: function (position) {\r\n\t\tvar map = this._map;\r\n\r\n\t\tif (map) {\r\n\t\t\tmap.removeControl(this);\r\n\t\t}\r\n\r\n\t\tthis.options.position = position;\r\n\r\n\t\tif (map) {\r\n\t\t\tmap.addControl(this);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getContainer: HTMLElement\r\n\t// Returns the HTMLElement that contains the control.\r\n\tgetContainer: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\t// @method addTo(map: Map): this\r\n\t// Adds the control to the given map.\r\n\taddTo: function (map) {\r\n\t\tthis.remove();\r\n\t\tthis._map = map;\r\n\r\n\t\tvar container = this._container = this.onAdd(map),\r\n\t\t    pos = this.getPosition(),\r\n\t\t    corner = map._controlCorners[pos];\r\n\r\n\t\tL.DomUtil.addClass(container, 'leaflet-control');\r\n\r\n\t\tif (pos.indexOf('bottom') !== -1) {\r\n\t\t\tcorner.insertBefore(container, corner.firstChild);\r\n\t\t} else {\r\n\t\t\tcorner.appendChild(container);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method remove: this\r\n\t// Removes the control from the map it is currently active on.\r\n\tremove: function () {\r\n\t\tif (!this._map) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tL.DomUtil.remove(this._container);\r\n\r\n\t\tif (this.onRemove) {\r\n\t\t\tthis.onRemove(this._map);\r\n\t\t}\r\n\r\n\t\tthis._map = null;\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_refocusOnMap: function (e) {\r\n\t\t// if map exists and event is not a keyboard event\r\n\t\tif (this._map && e && e.screenX > 0 && e.screenY > 0) {\r\n\t\t\tthis._map.getContainer().focus();\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.control = function (options) {\r\n\treturn new L.Control(options);\r\n};\r\n\r\n/* @section Extension methods\r\n * @uninheritable\r\n *\r\n * Every control should extend from `L.Control` and (re-)implement the following methods.\r\n *\r\n * @method onAdd(map: Map): HTMLElement\r\n * Should return the container DOM element for the control and add listeners on relevant map events. Called on [`control.addTo(map)`](#control-addTo).\r\n *\r\n * @method onRemove(map: Map)\r\n * Optional method. Should contain all clean up code that removes the listeners previously added in [`onAdd`](#control-onadd). Called on [`control.remove()`](#control-remove).\r\n */\r\n\r\n/* @namespace Map\r\n * @section Methods for Layers and Controls\r\n */\r\nL.Map.include({\r\n\t// @method addControl(control: Control): this\r\n\t// Adds the given control to the map\r\n\taddControl: function (control) {\r\n\t\tcontrol.addTo(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method removeControl(control: Control): this\r\n\t// Removes the given control from the map\r\n\tremoveControl: function (control) {\r\n\t\tcontrol.remove();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initControlPos: function () {\r\n\t\tvar corners = this._controlCorners = {},\r\n\t\t    l = 'leaflet-',\r\n\t\t    container = this._controlContainer =\r\n\t\t            L.DomUtil.create('div', l + 'control-container', this._container);\r\n\r\n\t\tfunction createCorner(vSide, hSide) {\r\n\t\t\tvar className = l + vSide + ' ' + l + hSide;\r\n\r\n\t\t\tcorners[vSide + hSide] = L.DomUtil.create('div', className, container);\r\n\t\t}\r\n\r\n\t\tcreateCorner('top', 'left');\r\n\t\tcreateCorner('top', 'right');\r\n\t\tcreateCorner('bottom', 'left');\r\n\t\tcreateCorner('bottom', 'right');\r\n\t},\r\n\r\n\t_clearControlPos: function () {\r\n\t\tL.DomUtil.remove(this._controlContainer);\r\n\t}\r\n});\r\n\n\n\n/*\r\n * @class Control.Zoom\r\n * @aka L.Control.Zoom\r\n * @inherits Control\r\n *\r\n * A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its [`zoomControl` option](#map-zoomcontrol) to `false`. Extends `Control`.\r\n */\r\n\r\nL.Control.Zoom = L.Control.extend({\r\n\t// @section\r\n\t// @aka Control.Zoom options\r\n\toptions: {\r\n\t\tposition: 'topleft',\r\n\r\n\t\t// @option zoomInText: String = '+'\r\n\t\t// The text set on the 'zoom in' button.\r\n\t\tzoomInText: '+',\r\n\r\n\t\t// @option zoomInTitle: String = 'Zoom in'\r\n\t\t// The title set on the 'zoom in' button.\r\n\t\tzoomInTitle: 'Zoom in',\r\n\r\n\t\t// @option zoomOutText: String = '-'\r\n\t\t// The text set on the 'zoom out' button.\r\n\t\tzoomOutText: '-',\r\n\r\n\t\t// @option zoomOutTitle: String = 'Zoom out'\r\n\t\t// The title set on the 'zoom out' button.\r\n\t\tzoomOutTitle: 'Zoom out'\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tvar zoomName = 'leaflet-control-zoom',\r\n\t\t    container = L.DomUtil.create('div', zoomName + ' leaflet-bar'),\r\n\t\t    options = this.options;\r\n\r\n\t\tthis._zoomInButton  = this._createButton(options.zoomInText, options.zoomInTitle,\r\n\t\t        zoomName + '-in',  container, this._zoomIn);\r\n\t\tthis._zoomOutButton = this._createButton(options.zoomOutText, options.zoomOutTitle,\r\n\t\t        zoomName + '-out', container, this._zoomOut);\r\n\r\n\t\tthis._updateDisabled();\r\n\t\tmap.on('zoomend zoomlevelschange', this._updateDisabled, this);\r\n\r\n\t\treturn container;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap.off('zoomend zoomlevelschange', this._updateDisabled, this);\r\n\t},\r\n\r\n\tdisable: function () {\r\n\t\tthis._disabled = true;\r\n\t\tthis._updateDisabled();\r\n\t\treturn this;\r\n\t},\r\n\r\n\tenable: function () {\r\n\t\tthis._disabled = false;\r\n\t\tthis._updateDisabled();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_zoomIn: function (e) {\r\n\t\tif (!this._disabled && this._map._zoom < this._map.getMaxZoom()) {\r\n\t\t\tthis._map.zoomIn(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1));\r\n\t\t}\r\n\t},\r\n\r\n\t_zoomOut: function (e) {\r\n\t\tif (!this._disabled && this._map._zoom > this._map.getMinZoom()) {\r\n\t\t\tthis._map.zoomOut(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1));\r\n\t\t}\r\n\t},\r\n\r\n\t_createButton: function (html, title, className, container, fn) {\r\n\t\tvar link = L.DomUtil.create('a', className, container);\r\n\t\tlink.innerHTML = html;\r\n\t\tlink.href = '#';\r\n\t\tlink.title = title;\r\n\r\n\t\t/*\r\n\t\t * Will force screen readers like VoiceOver to read this as \"Zoom in - button\"\r\n\t\t */\r\n\t\tlink.setAttribute('role', 'button');\r\n\t\tlink.setAttribute('aria-label', title);\r\n\r\n\t\tL.DomEvent\r\n\t\t    .on(link, 'mousedown dblclick', L.DomEvent.stopPropagation)\r\n\t\t    .on(link, 'click', L.DomEvent.stop)\r\n\t\t    .on(link, 'click', fn, this)\r\n\t\t    .on(link, 'click', this._refocusOnMap, this);\r\n\r\n\t\treturn link;\r\n\t},\r\n\r\n\t_updateDisabled: function () {\r\n\t\tvar map = this._map,\r\n\t\t    className = 'leaflet-disabled';\r\n\r\n\t\tL.DomUtil.removeClass(this._zoomInButton, className);\r\n\t\tL.DomUtil.removeClass(this._zoomOutButton, className);\r\n\r\n\t\tif (this._disabled || map._zoom === map.getMinZoom()) {\r\n\t\t\tL.DomUtil.addClass(this._zoomOutButton, className);\r\n\t\t}\r\n\t\tif (this._disabled || map._zoom === map.getMaxZoom()) {\r\n\t\t\tL.DomUtil.addClass(this._zoomInButton, className);\r\n\t\t}\r\n\t}\r\n});\r\n\r\n// @namespace Map\r\n// @section Control options\r\n// @option zoomControl: Boolean = true\r\n// Whether a [zoom control](#control-zoom) is added to the map by default.\r\nL.Map.mergeOptions({\r\n\tzoomControl: true\r\n});\r\n\r\nL.Map.addInitHook(function () {\r\n\tif (this.options.zoomControl) {\r\n\t\tthis.zoomControl = new L.Control.Zoom();\r\n\t\tthis.addControl(this.zoomControl);\r\n\t}\r\n});\r\n\r\n// @namespace Control.Zoom\r\n// @factory L.control.zoom(options: Control.Zoom options)\r\n// Creates a zoom control\r\nL.control.zoom = function (options) {\r\n\treturn new L.Control.Zoom(options);\r\n};\r\n\n\n\n/*\r\n * @class Control.Attribution\r\n * @aka L.Control.Attribution\r\n * @inherits Control\r\n *\r\n * The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its [`attributionControl` option](#map-attributioncontrol) to `false`, and it fetches attribution texts from layers with the [`getAttribution` method](#layer-getattribution) automatically. Extends Control.\r\n */\r\n\r\nL.Control.Attribution = L.Control.extend({\r\n\t// @section\r\n\t// @aka Control.Attribution options\r\n\toptions: {\r\n\t\tposition: 'bottomright',\r\n\r\n\t\t// @option prefix: String = 'Leaflet'\r\n\t\t// The HTML text shown before the attributions. Pass `false` to disable.\r\n\t\tprefix: '<a href=\"http://leafletjs.com\" title=\"A JS library for interactive maps\">Leaflet</a>'\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._attributions = {};\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tmap.attributionControl = this;\r\n\t\tthis._container = L.DomUtil.create('div', 'leaflet-control-attribution');\r\n\t\tif (L.DomEvent) {\r\n\t\t\tL.DomEvent.disableClickPropagation(this._container);\r\n\t\t}\r\n\r\n\t\t// TODO ugly, refactor\r\n\t\tfor (var i in map._layers) {\r\n\t\t\tif (map._layers[i].getAttribution) {\r\n\t\t\t\tthis.addAttribution(map._layers[i].getAttribution());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._update();\r\n\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\t// @method setPrefix(prefix: String): this\r\n\t// Sets the text before the attributions.\r\n\tsetPrefix: function (prefix) {\r\n\t\tthis.options.prefix = prefix;\r\n\t\tthis._update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method addAttribution(text: String): this\r\n\t// Adds an attribution text (e.g. `'Vector data &copy; Mapbox'`).\r\n\taddAttribution: function (text) {\r\n\t\tif (!text) { return this; }\r\n\r\n\t\tif (!this._attributions[text]) {\r\n\t\t\tthis._attributions[text] = 0;\r\n\t\t}\r\n\t\tthis._attributions[text]++;\r\n\r\n\t\tthis._update();\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method removeAttribution(text: String): this\r\n\t// Removes an attribution text.\r\n\tremoveAttribution: function (text) {\r\n\t\tif (!text) { return this; }\r\n\r\n\t\tif (this._attributions[text]) {\r\n\t\t\tthis._attributions[text]--;\r\n\t\t\tthis._update();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_update: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tvar attribs = [];\r\n\r\n\t\tfor (var i in this._attributions) {\r\n\t\t\tif (this._attributions[i]) {\r\n\t\t\t\tattribs.push(i);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar prefixAndAttribs = [];\r\n\r\n\t\tif (this.options.prefix) {\r\n\t\t\tprefixAndAttribs.push(this.options.prefix);\r\n\t\t}\r\n\t\tif (attribs.length) {\r\n\t\t\tprefixAndAttribs.push(attribs.join(', '));\r\n\t\t}\r\n\r\n\t\tthis._container.innerHTML = prefixAndAttribs.join(' | ');\r\n\t}\r\n});\r\n\r\n// @namespace Map\r\n// @section Control options\r\n// @option attributionControl: Boolean = true\r\n// Whether a [attribution control](#control-attribution) is added to the map by default.\r\nL.Map.mergeOptions({\r\n\tattributionControl: true\r\n});\r\n\r\nL.Map.addInitHook(function () {\r\n\tif (this.options.attributionControl) {\r\n\t\tnew L.Control.Attribution().addTo(this);\r\n\t}\r\n});\r\n\r\n// @namespace Control.Attribution\r\n// @factory L.control.attribution(options: Control.Attribution options)\r\n// Creates an attribution control.\r\nL.control.attribution = function (options) {\r\n\treturn new L.Control.Attribution(options);\r\n};\r\n\n\n\n/*\n * @class Control.Scale\n * @aka L.Control.Scale\n * @inherits Control\n *\n * A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Extends `Control`.\n *\n * @example\n *\n * ```js\n * L.control.scale().addTo(map);\n * ```\n */\n\nL.Control.Scale = L.Control.extend({\n\t// @section\n\t// @aka Control.Scale options\n\toptions: {\n\t\tposition: 'bottomleft',\n\n\t\t// @option maxWidth: Number = 100\n\t\t// Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500).\n\t\tmaxWidth: 100,\n\n\t\t// @option metric: Boolean = True\n\t\t// Whether to show the metric scale line (m/km).\n\t\tmetric: true,\n\n\t\t// @option imperial: Boolean = True\n\t\t// Whether to show the imperial scale line (mi/ft).\n\t\timperial: true\n\n\t\t// @option updateWhenIdle: Boolean = false\n\t\t// If `true`, the control is updated on [`moveend`](#map-moveend), otherwise it's always up-to-date (updated on [`move`](#map-move)).\n\t},\n\n\tonAdd: function (map) {\n\t\tvar className = 'leaflet-control-scale',\n\t\t    container = L.DomUtil.create('div', className),\n\t\t    options = this.options;\n\n\t\tthis._addScales(options, className + '-line', container);\n\n\t\tmap.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this);\n\t\tmap.whenReady(this._update, this);\n\n\t\treturn container;\n\t},\n\n\tonRemove: function (map) {\n\t\tmap.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this);\n\t},\n\n\t_addScales: function (options, className, container) {\n\t\tif (options.metric) {\n\t\t\tthis._mScale = L.DomUtil.create('div', className, container);\n\t\t}\n\t\tif (options.imperial) {\n\t\t\tthis._iScale = L.DomUtil.create('div', className, container);\n\t\t}\n\t},\n\n\t_update: function () {\n\t\tvar map = this._map,\n\t\t    y = map.getSize().y / 2;\n\n\t\tvar maxMeters = map.distance(\n\t\t\t\tmap.containerPointToLatLng([0, y]),\n\t\t\t\tmap.containerPointToLatLng([this.options.maxWidth, y]));\n\n\t\tthis._updateScales(maxMeters);\n\t},\n\n\t_updateScales: function (maxMeters) {\n\t\tif (this.options.metric && maxMeters) {\n\t\t\tthis._updateMetric(maxMeters);\n\t\t}\n\t\tif (this.options.imperial && maxMeters) {\n\t\t\tthis._updateImperial(maxMeters);\n\t\t}\n\t},\n\n\t_updateMetric: function (maxMeters) {\n\t\tvar meters = this._getRoundNum(maxMeters),\n\t\t    label = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km';\n\n\t\tthis._updateScale(this._mScale, label, meters / maxMeters);\n\t},\n\n\t_updateImperial: function (maxMeters) {\n\t\tvar maxFeet = maxMeters * 3.2808399,\n\t\t    maxMiles, miles, feet;\n\n\t\tif (maxFeet > 5280) {\n\t\t\tmaxMiles = maxFeet / 5280;\n\t\t\tmiles = this._getRoundNum(maxMiles);\n\t\t\tthis._updateScale(this._iScale, miles + ' mi', miles / maxMiles);\n\n\t\t} else {\n\t\t\tfeet = this._getRoundNum(maxFeet);\n\t\t\tthis._updateScale(this._iScale, feet + ' ft', feet / maxFeet);\n\t\t}\n\t},\n\n\t_updateScale: function (scale, text, ratio) {\n\t\tscale.style.width = Math.round(this.options.maxWidth * ratio) + 'px';\n\t\tscale.innerHTML = text;\n\t},\n\n\t_getRoundNum: function (num) {\n\t\tvar pow10 = Math.pow(10, (Math.floor(num) + '').length - 1),\n\t\t    d = num / pow10;\n\n\t\td = d >= 10 ? 10 :\n\t\t    d >= 5 ? 5 :\n\t\t    d >= 3 ? 3 :\n\t\t    d >= 2 ? 2 : 1;\n\n\t\treturn pow10 * d;\n\t}\n});\n\n\n// @factory L.control.scale(options?: Control.Scale options)\n// Creates an scale control with the given options.\nL.control.scale = function (options) {\n\treturn new L.Control.Scale(options);\n};\n\n\n\n/*\r\n * @class Control.Layers\r\n * @aka L.Control.Layers\r\n * @inherits Control\r\n *\r\n * The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the [detailed example](http://leafletjs.com/examples/layers-control.html)). Extends `Control`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var baseLayers = {\r\n * \t\"Mapbox\": mapbox,\r\n * \t\"OpenStreetMap\": osm\r\n * };\r\n *\r\n * var overlays = {\r\n * \t\"Marker\": marker,\r\n * \t\"Roads\": roadsLayer\r\n * };\r\n *\r\n * L.control.layers(baseLayers, overlays).addTo(map);\r\n * ```\r\n *\r\n * The `baseLayers` and `overlays` parameters are object literals with layer names as keys and `Layer` objects as values:\r\n *\r\n * ```js\r\n * {\r\n *     \"<someName1>\": layer1,\r\n *     \"<someName2>\": layer2\r\n * }\r\n * ```\r\n *\r\n * The layer names can contain HTML, which allows you to add additional styling to the items:\r\n *\r\n * ```js\r\n * {\"<img src='my-layer-icon' /> <span class='my-layer-item'>My Layer</span>\": myLayer}\r\n * ```\r\n */\r\n\r\n\r\nL.Control.Layers = L.Control.extend({\r\n\t// @section\r\n\t// @aka Control.Layers options\r\n\toptions: {\r\n\t\t// @option collapsed: Boolean = true\r\n\t\t// If `true`, the control will be collapsed into an icon and expanded on mouse hover or touch.\r\n\t\tcollapsed: true,\r\n\t\tposition: 'topright',\r\n\r\n\t\t// @option autoZIndex: Boolean = true\r\n\t\t// If `true`, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off.\r\n\t\tautoZIndex: true,\r\n\r\n\t\t// @option hideSingleBase: Boolean = false\r\n\t\t// If `true`, the base layers in the control will be hidden when there is only one.\r\n\t\thideSingleBase: false,\r\n\r\n\t\t// @option sortLayers: Boolean = false\r\n\t\t// Whether to sort the layers. When `false`, layers will keep the order\r\n\t\t// in which they were added to the control.\r\n\t\tsortLayers: false,\r\n\r\n\t\t// @option sortFunction: Function = *\r\n\t\t// A [compare function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)\r\n\t\t// that will be used for sorting the layers, when `sortLayers` is `true`.\r\n\t\t// The function receives both the `L.Layer` instances and their names, as in\r\n\t\t// `sortFunction(layerA, layerB, nameA, nameB)`.\r\n\t\t// By default, it sorts layers alphabetically by their name.\r\n\t\tsortFunction: function (layerA, layerB, nameA, nameB) {\r\n\t\t\treturn nameA < nameB ? -1 : (nameB < nameA ? 1 : 0);\r\n\t\t}\r\n\t},\r\n\r\n\tinitialize: function (baseLayers, overlays, options) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._layers = [];\r\n\t\tthis._lastZIndex = 0;\r\n\t\tthis._handlingClick = false;\r\n\r\n\t\tfor (var i in baseLayers) {\r\n\t\t\tthis._addLayer(baseLayers[i], i);\r\n\t\t}\r\n\r\n\t\tfor (i in overlays) {\r\n\t\t\tthis._addLayer(overlays[i], i, true);\r\n\t\t}\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._initLayout();\r\n\t\tthis._update();\r\n\r\n\t\tthis._map = map;\r\n\t\tmap.on('zoomend', this._checkDisabledLayers, this);\r\n\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\tonRemove: function () {\r\n\t\tthis._map.off('zoomend', this._checkDisabledLayers, this);\r\n\r\n\t\tfor (var i = 0; i < this._layers.length; i++) {\r\n\t\t\tthis._layers[i].layer.off('add remove', this._onLayerChange, this);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method addBaseLayer(layer: Layer, name: String): this\r\n\t// Adds a base layer (radio button entry) with the given name to the control.\r\n\taddBaseLayer: function (layer, name) {\r\n\t\tthis._addLayer(layer, name);\r\n\t\treturn (this._map) ? this._update() : this;\r\n\t},\r\n\r\n\t// @method addOverlay(layer: Layer, name: String): this\r\n\t// Adds an overlay (checkbox entry) with the given name to the control.\r\n\taddOverlay: function (layer, name) {\r\n\t\tthis._addLayer(layer, name, true);\r\n\t\treturn (this._map) ? this._update() : this;\r\n\t},\r\n\r\n\t// @method removeLayer(layer: Layer): this\r\n\t// Remove the given layer from the control.\r\n\tremoveLayer: function (layer) {\r\n\t\tlayer.off('add remove', this._onLayerChange, this);\r\n\r\n\t\tvar obj = this._getLayer(L.stamp(layer));\r\n\t\tif (obj) {\r\n\t\t\tthis._layers.splice(this._layers.indexOf(obj), 1);\r\n\t\t}\r\n\t\treturn (this._map) ? this._update() : this;\r\n\t},\r\n\r\n\t// @method expand(): this\r\n\t// Expand the control container if collapsed.\r\n\texpand: function () {\r\n\t\tL.DomUtil.addClass(this._container, 'leaflet-control-layers-expanded');\r\n\t\tthis._form.style.height = null;\r\n\t\tvar acceptableHeight = this._map.getSize().y - (this._container.offsetTop + 50);\r\n\t\tif (acceptableHeight < this._form.clientHeight) {\r\n\t\t\tL.DomUtil.addClass(this._form, 'leaflet-control-layers-scrollbar');\r\n\t\t\tthis._form.style.height = acceptableHeight + 'px';\r\n\t\t} else {\r\n\t\t\tL.DomUtil.removeClass(this._form, 'leaflet-control-layers-scrollbar');\r\n\t\t}\r\n\t\tthis._checkDisabledLayers();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method collapse(): this\r\n\t// Collapse the control container if expanded.\r\n\tcollapse: function () {\r\n\t\tL.DomUtil.removeClass(this._container, 'leaflet-control-layers-expanded');\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar className = 'leaflet-control-layers',\r\n\t\t    container = this._container = L.DomUtil.create('div', className),\r\n\t\t    collapsed = this.options.collapsed;\r\n\r\n\t\t// makes this work on IE touch devices by stopping it from firing a mouseout event when the touch is released\r\n\t\tcontainer.setAttribute('aria-haspopup', true);\r\n\r\n\t\tL.DomEvent.disableClickPropagation(container);\r\n\t\tif (!L.Browser.touch) {\r\n\t\t\tL.DomEvent.disableScrollPropagation(container);\r\n\t\t}\r\n\r\n\t\tvar form = this._form = L.DomUtil.create('form', className + '-list');\r\n\r\n\t\tif (collapsed) {\r\n\t\t\tthis._map.on('click', this.collapse, this);\r\n\r\n\t\t\tif (!L.Browser.android) {\r\n\t\t\t\tL.DomEvent.on(container, {\r\n\t\t\t\t\tmouseenter: this.expand,\r\n\t\t\t\t\tmouseleave: this.collapse\r\n\t\t\t\t}, this);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar link = this._layersLink = L.DomUtil.create('a', className + '-toggle', container);\r\n\t\tlink.href = '#';\r\n\t\tlink.title = 'Layers';\r\n\r\n\t\tif (L.Browser.touch) {\r\n\t\t\tL.DomEvent\r\n\t\t\t    .on(link, 'click', L.DomEvent.stop)\r\n\t\t\t    .on(link, 'click', this.expand, this);\r\n\t\t} else {\r\n\t\t\tL.DomEvent.on(link, 'focus', this.expand, this);\r\n\t\t}\r\n\r\n\t\t// work around for Firefox Android issue https://github.com/Leaflet/Leaflet/issues/2033\r\n\t\tL.DomEvent.on(form, 'click', function () {\r\n\t\t\tsetTimeout(L.bind(this._onInputClick, this), 0);\r\n\t\t}, this);\r\n\r\n\t\t// TODO keyboard accessibility\r\n\r\n\t\tif (!collapsed) {\r\n\t\t\tthis.expand();\r\n\t\t}\r\n\r\n\t\tthis._baseLayersList = L.DomUtil.create('div', className + '-base', form);\r\n\t\tthis._separator = L.DomUtil.create('div', className + '-separator', form);\r\n\t\tthis._overlaysList = L.DomUtil.create('div', className + '-overlays', form);\r\n\r\n\t\tcontainer.appendChild(form);\r\n\t},\r\n\r\n\t_getLayer: function (id) {\r\n\t\tfor (var i = 0; i < this._layers.length; i++) {\r\n\r\n\t\t\tif (this._layers[i] && L.stamp(this._layers[i].layer) === id) {\r\n\t\t\t\treturn this._layers[i];\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_addLayer: function (layer, name, overlay) {\r\n\t\tlayer.on('add remove', this._onLayerChange, this);\r\n\r\n\t\tthis._layers.push({\r\n\t\t\tlayer: layer,\r\n\t\t\tname: name,\r\n\t\t\toverlay: overlay\r\n\t\t});\r\n\r\n\t\tif (this.options.sortLayers) {\r\n\t\t\tthis._layers.sort(L.bind(function (a, b) {\r\n\t\t\t\treturn this.options.sortFunction(a.layer, b.layer, a.name, b.name);\r\n\t\t\t}, this));\r\n\t\t}\r\n\r\n\t\tif (this.options.autoZIndex && layer.setZIndex) {\r\n\t\t\tthis._lastZIndex++;\r\n\t\t\tlayer.setZIndex(this._lastZIndex);\r\n\t\t}\r\n\t},\r\n\r\n\t_update: function () {\r\n\t\tif (!this._container) { return this; }\r\n\r\n\t\tL.DomUtil.empty(this._baseLayersList);\r\n\t\tL.DomUtil.empty(this._overlaysList);\r\n\r\n\t\tvar baseLayersPresent, overlaysPresent, i, obj, baseLayersCount = 0;\r\n\r\n\t\tfor (i = 0; i < this._layers.length; i++) {\r\n\t\t\tobj = this._layers[i];\r\n\t\t\tthis._addItem(obj);\r\n\t\t\toverlaysPresent = overlaysPresent || obj.overlay;\r\n\t\t\tbaseLayersPresent = baseLayersPresent || !obj.overlay;\r\n\t\t\tbaseLayersCount += !obj.overlay ? 1 : 0;\r\n\t\t}\r\n\r\n\t\t// Hide base layers section if there's only one layer.\r\n\t\tif (this.options.hideSingleBase) {\r\n\t\t\tbaseLayersPresent = baseLayersPresent && baseLayersCount > 1;\r\n\t\t\tthis._baseLayersList.style.display = baseLayersPresent ? '' : 'none';\r\n\t\t}\r\n\r\n\t\tthis._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none';\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_onLayerChange: function (e) {\r\n\t\tif (!this._handlingClick) {\r\n\t\t\tthis._update();\r\n\t\t}\r\n\r\n\t\tvar obj = this._getLayer(L.stamp(e.target));\r\n\r\n\t\t// @namespace Map\r\n\t\t// @section Layer events\r\n\t\t// @event baselayerchange: LayersControlEvent\r\n\t\t// Fired when the base layer is changed through the [layer control](#control-layers).\r\n\t\t// @event overlayadd: LayersControlEvent\r\n\t\t// Fired when an overlay is selected through the [layer control](#control-layers).\r\n\t\t// @event overlayremove: LayersControlEvent\r\n\t\t// Fired when an overlay is deselected through the [layer control](#control-layers).\r\n\t\t// @namespace Control.Layers\r\n\t\tvar type = obj.overlay ?\r\n\t\t\t(e.type === 'add' ? 'overlayadd' : 'overlayremove') :\r\n\t\t\t(e.type === 'add' ? 'baselayerchange' : null);\r\n\r\n\t\tif (type) {\r\n\t\t\tthis._map.fire(type, obj);\r\n\t\t}\r\n\t},\r\n\r\n\t// IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe)\r\n\t_createRadioElement: function (name, checked) {\r\n\r\n\t\tvar radioHtml = '<input type=\"radio\" class=\"leaflet-control-layers-selector\" name=\"' +\r\n\t\t\t\tname + '\"' + (checked ? ' checked=\"checked\"' : '') + '/>';\r\n\r\n\t\tvar radioFragment = document.createElement('div');\r\n\t\tradioFragment.innerHTML = radioHtml;\r\n\r\n\t\treturn radioFragment.firstChild;\r\n\t},\r\n\r\n\t_addItem: function (obj) {\r\n\t\tvar label = document.createElement('label'),\r\n\t\t    checked = this._map.hasLayer(obj.layer),\r\n\t\t    input;\r\n\r\n\t\tif (obj.overlay) {\r\n\t\t\tinput = document.createElement('input');\r\n\t\t\tinput.type = 'checkbox';\r\n\t\t\tinput.className = 'leaflet-control-layers-selector';\r\n\t\t\tinput.defaultChecked = checked;\r\n\t\t} else {\r\n\t\t\tinput = this._createRadioElement('leaflet-base-layers', checked);\r\n\t\t}\r\n\r\n\t\tinput.layerId = L.stamp(obj.layer);\r\n\r\n\t\tL.DomEvent.on(input, 'click', this._onInputClick, this);\r\n\r\n\t\tvar name = document.createElement('span');\r\n\t\tname.innerHTML = ' ' + obj.name;\r\n\r\n\t\t// Helps from preventing layer control flicker when checkboxes are disabled\r\n\t\t// https://github.com/Leaflet/Leaflet/issues/2771\r\n\t\tvar holder = document.createElement('div');\r\n\r\n\t\tlabel.appendChild(holder);\r\n\t\tholder.appendChild(input);\r\n\t\tholder.appendChild(name);\r\n\r\n\t\tvar container = obj.overlay ? this._overlaysList : this._baseLayersList;\r\n\t\tcontainer.appendChild(label);\r\n\r\n\t\tthis._checkDisabledLayers();\r\n\t\treturn label;\r\n\t},\r\n\r\n\t_onInputClick: function () {\r\n\t\tvar inputs = this._form.getElementsByTagName('input'),\r\n\t\t    input, layer, hasLayer;\r\n\t\tvar addedLayers = [],\r\n\t\t    removedLayers = [];\r\n\r\n\t\tthis._handlingClick = true;\r\n\r\n\t\tfor (var i = inputs.length - 1; i >= 0; i--) {\r\n\t\t\tinput = inputs[i];\r\n\t\t\tlayer = this._getLayer(input.layerId).layer;\r\n\t\t\thasLayer = this._map.hasLayer(layer);\r\n\r\n\t\t\tif (input.checked && !hasLayer) {\r\n\t\t\t\taddedLayers.push(layer);\r\n\r\n\t\t\t} else if (!input.checked && hasLayer) {\r\n\t\t\t\tremovedLayers.push(layer);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Bugfix issue 2318: Should remove all old layers before readding new ones\r\n\t\tfor (i = 0; i < removedLayers.length; i++) {\r\n\t\t\tthis._map.removeLayer(removedLayers[i]);\r\n\t\t}\r\n\t\tfor (i = 0; i < addedLayers.length; i++) {\r\n\t\t\tthis._map.addLayer(addedLayers[i]);\r\n\t\t}\r\n\r\n\t\tthis._handlingClick = false;\r\n\r\n\t\tthis._refocusOnMap();\r\n\t},\r\n\r\n\t_checkDisabledLayers: function () {\r\n\t\tvar inputs = this._form.getElementsByTagName('input'),\r\n\t\t    input,\r\n\t\t    layer,\r\n\t\t    zoom = this._map.getZoom();\r\n\r\n\t\tfor (var i = inputs.length - 1; i >= 0; i--) {\r\n\t\t\tinput = inputs[i];\r\n\t\t\tlayer = this._getLayer(input.layerId).layer;\r\n\t\t\tinput.disabled = (layer.options.minZoom !== undefined && zoom < layer.options.minZoom) ||\r\n\t\t\t                 (layer.options.maxZoom !== undefined && zoom > layer.options.maxZoom);\r\n\r\n\t\t}\r\n\t},\r\n\r\n\t_expand: function () {\r\n\t\t// Backward compatibility, remove me in 1.1.\r\n\t\treturn this.expand();\r\n\t},\r\n\r\n\t_collapse: function () {\r\n\t\t// Backward compatibility, remove me in 1.1.\r\n\t\treturn this.collapse();\r\n\t}\r\n\r\n});\r\n\r\n\r\n// @factory L.control.layers(baselayers?: Object, overlays?: Object, options?: Control.Layers options)\r\n// Creates an attribution control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. Note that all base layers should be passed in the base layers object, but only one should be added to the map during map instantiation.\r\nL.control.layers = function (baseLayers, overlays, options) {\r\n\treturn new L.Control.Layers(baseLayers, overlays, options);\r\n};\r\n\n\n\n}(window, document));\n//# sourceMappingURL=leaflet-src.map","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var hashClear = require('./_hashClear'),\n    hashDelete = require('./_hashDelete'),\n    hashGet = require('./_hashGet'),\n    hashHas = require('./_hashHas'),\n    hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n  var index = -1,\n      length = entries ? entries.length : 0;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","var listCacheClear = require('./_listCacheClear'),\n    listCacheDelete = require('./_listCacheDelete'),\n    listCacheGet = require('./_listCacheGet'),\n    listCacheHas = require('./_listCacheHas'),\n    listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n  var index = -1,\n      length = entries ? entries.length : 0;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var mapCacheClear = require('./_mapCacheClear'),\n    mapCacheDelete = require('./_mapCacheDelete'),\n    mapCacheGet = require('./_mapCacheGet'),\n    mapCacheHas = require('./_mapCacheHas'),\n    mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n  var index = -1,\n      length = entries ? entries.length : 0;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var MapCache = require('./_MapCache'),\n    setCacheAdd = require('./_setCacheAdd'),\n    setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n  var index = -1,\n      length = values ? values.length : 0;\n\n  this.__data__ = new MapCache;\n  while (++index < length) {\n    this.add(values[index]);\n  }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n","var ListCache = require('./_ListCache'),\n    stackClear = require('./_stackClear'),\n    stackDelete = require('./_stackDelete'),\n    stackGet = require('./_stackGet'),\n    stackHas = require('./_stackHas'),\n    stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n  var data = this.__data__ = new ListCache(entries);\n  this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","var baseTimes = require('./_baseTimes'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isIndex = require('./_isIndex');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n  // Safari 9 makes `arguments.length` enumerable in strict mode.\n  var result = (isArray(value) || isArguments(value))\n    ? baseTimes(value.length, String)\n    : [];\n\n  var length = result.length,\n      skipIndexes = !!length;\n\n  for (var key in value) {\n    if ((inherited || hasOwnProperty.call(value, key)) &&\n        !(skipIndexes && (key == 'length' || isIndex(key, length)))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayLikeKeys;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1,\n      length = array ? array.length : 0,\n      result = Array(length);\n\n  while (++index < length) {\n    result[index] = iteratee(array[index], index, array);\n  }\n  return result;\n}\n\nmodule.exports = arrayMap;\n","/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n *  the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n  var index = -1,\n      length = array ? array.length : 0;\n\n  if (initAccum && length) {\n    accumulator = array[++index];\n  }\n  while (++index < length) {\n    accumulator = iteratee(accumulator, array[index], index, array);\n  }\n  return accumulator;\n}\n\nmodule.exports = arrayReduce;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n *  else `false`.\n */\nfunction arraySome(array, predicate) {\n  var index = -1,\n      length = array ? array.length : 0;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nmodule.exports = arraySome;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n  var length = array.length;\n  while (length--) {\n    if (eq(array[length][0], key)) {\n      return length;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var baseForOwn = require('./_baseForOwn'),\n    createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n","var createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n","var baseFor = require('./_baseFor'),\n    keys = require('./keys');\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n  return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n","var castPath = require('./_castPath'),\n    isKey = require('./_isKey'),\n    toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n  path = isKey(path, object) ? [path] : castPath(path);\n\n  var index = 0,\n      length = path.length;\n\n  while (object != null && index < length) {\n    object = object[toKey(path[index++])];\n  }\n  return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/**\n * The base implementation of `getTag`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  return objectToString.call(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n  return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n    isObject = require('./isObject'),\n    isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {boolean} [bitmask] The bitmask of comparison flags.\n *  The bitmask may be composed of the following flags:\n *     1 - Unordered comparison\n *     2 - Partial comparison\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, customizer, bitmask, stack) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, baseIsEqual, customizer, bitmask, stack);\n}\n\nmodule.exports = baseIsEqual;\n","var Stack = require('./_Stack'),\n    equalArrays = require('./_equalArrays'),\n    equalByTag = require('./_equalByTag'),\n    equalObjects = require('./_equalObjects'),\n    getTag = require('./_getTag'),\n    isArray = require('./isArray'),\n    isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for comparison styles. */\nvar PARTIAL_COMPARE_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {number} [bitmask] The bitmask of comparison flags. See `baseIsEqual`\n *  for more details.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, equalFunc, customizer, bitmask, stack) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = arrayTag,\n      othTag = arrayTag;\n\n  if (!objIsArr) {\n    objTag = getTag(object);\n    objTag = objTag == argsTag ? objectTag : objTag;\n  }\n  if (!othIsArr) {\n    othTag = getTag(other);\n    othTag = othTag == argsTag ? objectTag : othTag;\n  }\n  var objIsObj = objTag == objectTag,\n      othIsObj = othTag == objectTag,\n      isSameTag = objTag == othTag;\n\n  if (isSameTag && !objIsObj) {\n    stack || (stack = new Stack);\n    return (objIsArr || isTypedArray(object))\n      ? equalArrays(object, other, equalFunc, customizer, bitmask, stack)\n      : equalByTag(object, other, objTag, equalFunc, customizer, bitmask, stack);\n  }\n  if (!(bitmask & PARTIAL_COMPARE_FLAG)) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      var objUnwrapped = objIsWrapped ? object.value() : object,\n          othUnwrapped = othIsWrapped ? other.value() : other;\n\n      stack || (stack = new Stack);\n      return equalFunc(objUnwrapped, othUnwrapped, customizer, bitmask, stack);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  stack || (stack = new Stack);\n  return equalObjects(object, other, equalFunc, customizer, bitmask, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n","var Stack = require('./_Stack'),\n    baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for comparison styles. */\nvar UNORDERED_COMPARE_FLAG = 1,\n    PARTIAL_COMPARE_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n  var index = matchData.length,\n      length = index,\n      noCustomizer = !customizer;\n\n  if (object == null) {\n    return !length;\n  }\n  object = Object(object);\n  while (index--) {\n    var data = matchData[index];\n    if ((noCustomizer && data[2])\n          ? data[1] !== object[data[0]]\n          : !(data[0] in object)\n        ) {\n      return false;\n    }\n  }\n  while (++index < length) {\n    data = matchData[index];\n    var key = data[0],\n        objValue = object[key],\n        srcValue = data[1];\n\n    if (noCustomizer && data[2]) {\n      if (objValue === undefined && !(key in object)) {\n        return false;\n      }\n    } else {\n      var stack = new Stack;\n      if (customizer) {\n        var result = customizer(objValue, srcValue, key, object, source, stack);\n      }\n      if (!(result === undefined\n            ? baseIsEqual(srcValue, objValue, customizer, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG, stack)\n            : result\n          )) {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\nmodule.exports = baseIsMatch;\n","var isFunction = require('./isFunction'),\n    isMasked = require('./_isMasked'),\n    isObject = require('./isObject'),\n    toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n */\nfunction baseIsNative(value) {\n  if (!isObject(value) || isMasked(value)) {\n    return false;\n  }\n  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","var isLength = require('./isLength'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n  return isObjectLike(value) &&\n    isLength(value.length) && !!typedArrayTags[objectToString.call(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","var baseMatches = require('./_baseMatches'),\n    baseMatchesProperty = require('./_baseMatchesProperty'),\n    identity = require('./identity'),\n    isArray = require('./isArray'),\n    property = require('./property');\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n  // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n  // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n  if (typeof value == 'function') {\n    return value;\n  }\n  if (value == null) {\n    return identity;\n  }\n  if (typeof value == 'object') {\n    return isArray(value)\n      ? baseMatchesProperty(value[0], value[1])\n      : baseMatches(value);\n  }\n  return property(value);\n}\n\nmodule.exports = baseIteratee;\n","var isPrototype = require('./_isPrototype'),\n    nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n  if (!isPrototype(object)) {\n    return nativeKeys(object);\n  }\n  var result = [];\n  for (var key in Object(object)) {\n    if (hasOwnProperty.call(object, key) && key != 'constructor') {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseKeys;\n","var baseEach = require('./_baseEach'),\n    isArrayLike = require('./isArrayLike');\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n  var index = -1,\n      result = isArrayLike(collection) ? Array(collection.length) : [];\n\n  baseEach(collection, function(value, key, collection) {\n    result[++index] = iteratee(value, key, collection);\n  });\n  return result;\n}\n\nmodule.exports = baseMap;\n","var baseIsMatch = require('./_baseIsMatch'),\n    getMatchData = require('./_getMatchData'),\n    matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n  var matchData = getMatchData(source);\n  if (matchData.length == 1 && matchData[0][2]) {\n    return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n  }\n  return function(object) {\n    return object === source || baseIsMatch(object, source, matchData);\n  };\n}\n\nmodule.exports = baseMatches;\n","var baseIsEqual = require('./_baseIsEqual'),\n    get = require('./get'),\n    hasIn = require('./hasIn'),\n    isKey = require('./_isKey'),\n    isStrictComparable = require('./_isStrictComparable'),\n    matchesStrictComparable = require('./_matchesStrictComparable'),\n    toKey = require('./_toKey');\n\n/** Used to compose bitmasks for comparison styles. */\nvar UNORDERED_COMPARE_FLAG = 1,\n    PARTIAL_COMPARE_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n  if (isKey(path) && isStrictComparable(srcValue)) {\n    return matchesStrictComparable(toKey(path), srcValue);\n  }\n  return function(object) {\n    var objValue = get(object, path);\n    return (objValue === undefined && objValue === srcValue)\n      ? hasIn(object, path)\n      : baseIsEqual(srcValue, objValue, undefined, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG);\n  };\n}\n\nmodule.exports = baseMatchesProperty;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n  return function(object) {\n    return object == null ? undefined : object[key];\n  };\n}\n\nmodule.exports = baseProperty;\n","var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n  return function(object) {\n    return baseGet(object, path);\n  };\n}\n\nmodule.exports = basePropertyDeep;\n","/**\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initAccum Specify using the first or last element of\n *  `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\nfunction baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n  eachFunc(collection, function(value, index, collection) {\n    accumulator = initAccum\n      ? (initAccum = false, value)\n      : iteratee(accumulator, value, index, collection);\n  });\n  return accumulator;\n}\n\nmodule.exports = baseReduce;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n  var index = -1,\n      result = Array(n);\n\n  while (++index < n) {\n    result[index] = iteratee(index);\n  }\n  return result;\n}\n\nmodule.exports = baseTimes;\n","var Symbol = require('./_Symbol'),\n    isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n  // Exit early for strings to avoid a performance hit in some environments.\n  if (typeof value == 'string') {\n    return value;\n  }\n  if (isSymbol(value)) {\n    return symbolToString ? symbolToString.call(value) : '';\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n  return function(value) {\n    return func(value);\n  };\n}\n\nmodule.exports = baseUnary;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n  return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n","var isArray = require('./isArray'),\n    stringToPath = require('./_stringToPath');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value) {\n  return isArray(value) ? value : stringToPath(value);\n}\n\nmodule.exports = castPath;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n  return function(collection, iteratee) {\n    if (collection == null) {\n      return collection;\n    }\n    if (!isArrayLike(collection)) {\n      return eachFunc(collection, iteratee);\n    }\n    var length = collection.length,\n        index = fromRight ? length : -1,\n        iterable = Object(collection);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (iteratee(iterable[index], index, iterable) === false) {\n        break;\n      }\n    }\n    return collection;\n  };\n}\n\nmodule.exports = createBaseEach;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n  return function(object, iteratee, keysFunc) {\n    var index = -1,\n        iterable = Object(object),\n        props = keysFunc(object),\n        length = props.length;\n\n    while (length--) {\n      var key = props[fromRight ? length : ++index];\n      if (iteratee(iterable[key], key, iterable) === false) {\n        break;\n      }\n    }\n    return object;\n  };\n}\n\nmodule.exports = createBaseFor;\n","var SetCache = require('./_SetCache'),\n    arraySome = require('./_arraySome'),\n    cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for comparison styles. */\nvar UNORDERED_COMPARE_FLAG = 1,\n    PARTIAL_COMPARE_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} customizer The function to customize comparisons.\n * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`\n *  for more details.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, equalFunc, customizer, bitmask, stack) {\n  var isPartial = bitmask & PARTIAL_COMPARE_FLAG,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n    return false;\n  }\n  // Assume cyclic values are equal.\n  var stacked = stack.get(array);\n  if (stacked && stack.get(other)) {\n    return stacked == other;\n  }\n  var index = -1,\n      result = true,\n      seen = (bitmask & UNORDERED_COMPARE_FLAG) ? new SetCache : undefined;\n\n  stack.set(array, other);\n  stack.set(other, array);\n\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, arrValue, index, other, array, stack)\n        : customizer(arrValue, othValue, index, array, other, stack);\n    }\n    if (compared !== undefined) {\n      if (compared) {\n        continue;\n      }\n      result = false;\n      break;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (seen) {\n      if (!arraySome(other, function(othValue, othIndex) {\n            if (!cacheHas(seen, othIndex) &&\n                (arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) {\n              return seen.push(othIndex);\n            }\n          })) {\n        result = false;\n        break;\n      }\n    } else if (!(\n          arrValue === othValue ||\n            equalFunc(arrValue, othValue, customizer, bitmask, stack)\n        )) {\n      result = false;\n      break;\n    }\n  }\n  stack['delete'](array);\n  stack['delete'](other);\n  return result;\n}\n\nmodule.exports = equalArrays;\n","var Symbol = require('./_Symbol'),\n    Uint8Array = require('./_Uint8Array'),\n    eq = require('./eq'),\n    equalArrays = require('./_equalArrays'),\n    mapToArray = require('./_mapToArray'),\n    setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for comparison styles. */\nvar UNORDERED_COMPARE_FLAG = 1,\n    PARTIAL_COMPARE_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} customizer The function to customize comparisons.\n * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`\n *  for more details.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) {\n  switch (tag) {\n    case dataViewTag:\n      if ((object.byteLength != other.byteLength) ||\n          (object.byteOffset != other.byteOffset)) {\n        return false;\n      }\n      object = object.buffer;\n      other = other.buffer;\n\n    case arrayBufferTag:\n      if ((object.byteLength != other.byteLength) ||\n          !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n        return false;\n      }\n      return true;\n\n    case boolTag:\n    case dateTag:\n    case numberTag:\n      // Coerce booleans to `1` or `0` and dates to milliseconds.\n      // Invalid dates are coerced to `NaN`.\n      return eq(+object, +other);\n\n    case errorTag:\n      return object.name == other.name && object.message == other.message;\n\n    case regexpTag:\n    case stringTag:\n      // Coerce regexes to strings and treat strings, primitives and objects,\n      // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n      // for more details.\n      return object == (other + '');\n\n    case mapTag:\n      var convert = mapToArray;\n\n    case setTag:\n      var isPartial = bitmask & PARTIAL_COMPARE_FLAG;\n      convert || (convert = setToArray);\n\n      if (object.size != other.size && !isPartial) {\n        return false;\n      }\n      // Assume cyclic values are equal.\n      var stacked = stack.get(object);\n      if (stacked) {\n        return stacked == other;\n      }\n      bitmask |= UNORDERED_COMPARE_FLAG;\n\n      // Recursively compare objects (susceptible to call stack limits).\n      stack.set(object, other);\n      var result = equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack);\n      stack['delete'](object);\n      return result;\n\n    case symbolTag:\n      if (symbolValueOf) {\n        return symbolValueOf.call(object) == symbolValueOf.call(other);\n      }\n  }\n  return false;\n}\n\nmodule.exports = equalByTag;\n","var keys = require('./keys');\n\n/** Used to compose bitmasks for comparison styles. */\nvar PARTIAL_COMPARE_FLAG = 2;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} customizer The function to customize comparisons.\n * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`\n *  for more details.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, equalFunc, customizer, bitmask, stack) {\n  var isPartial = bitmask & PARTIAL_COMPARE_FLAG,\n      objProps = keys(object),\n      objLength = objProps.length,\n      othProps = keys(other),\n      othLength = othProps.length;\n\n  if (objLength != othLength && !isPartial) {\n    return false;\n  }\n  var index = objLength;\n  while (index--) {\n    var key = objProps[index];\n    if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  // Assume cyclic values are equal.\n  var stacked = stack.get(object);\n  if (stacked && stack.get(other)) {\n    return stacked == other;\n  }\n  var result = true;\n  stack.set(object, other);\n  stack.set(other, object);\n\n  var skipCtor = isPartial;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, objValue, key, other, object, stack)\n        : customizer(objValue, othValue, key, object, other, stack);\n    }\n    // Recursively compare objects (susceptible to call stack limits).\n    if (!(compared === undefined\n          ? (objValue === othValue || equalFunc(objValue, othValue, customizer, bitmask, stack))\n          : compared\n        )) {\n      result = false;\n      break;\n    }\n    skipCtor || (skipCtor = key == 'constructor');\n  }\n  if (result && !skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    // Non `Object` object instances with different constructors are not equal.\n    if (objCtor != othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n          typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n      result = false;\n    }\n  }\n  stack['delete'](object);\n  stack['delete'](other);\n  return result;\n}\n\nmodule.exports = equalObjects;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n  var data = map.__data__;\n  return isKeyable(key)\n    ? data[typeof key == 'string' ? 'string' : 'hash']\n    : data.map;\n}\n\nmodule.exports = getMapData;\n","var isStrictComparable = require('./_isStrictComparable'),\n    keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n  var result = keys(object),\n      length = result.length;\n\n  while (length--) {\n    var key = result[length],\n        value = object[key];\n\n    result[length] = [key, value, isStrictComparable(value)];\n  }\n  return result;\n}\n\nmodule.exports = getMatchData;\n","var baseIsNative = require('./_baseIsNative'),\n    getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = getValue(object, key);\n  return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var DataView = require('./_DataView'),\n    Map = require('./_Map'),\n    Promise = require('./_Promise'),\n    Set = require('./_Set'),\n    WeakMap = require('./_WeakMap'),\n    baseGetTag = require('./_baseGetTag'),\n    toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n    objectTag = '[object Object]',\n    promiseTag = '[object Promise]',\n    setTag = '[object Set]',\n    weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n    mapCtorString = toSource(Map),\n    promiseCtorString = toSource(Promise),\n    setCtorString = toSource(Set),\n    weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n    (Map && getTag(new Map) != mapTag) ||\n    (Promise && getTag(Promise.resolve()) != promiseTag) ||\n    (Set && getTag(new Set) != setTag) ||\n    (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n  getTag = function(value) {\n    var result = objectToString.call(value),\n        Ctor = result == objectTag ? value.constructor : undefined,\n        ctorString = Ctor ? toSource(Ctor) : undefined;\n\n    if (ctorString) {\n      switch (ctorString) {\n        case dataViewCtorString: return dataViewTag;\n        case mapCtorString: return mapTag;\n        case promiseCtorString: return promiseTag;\n        case setCtorString: return setTag;\n        case weakMapCtorString: return weakMapTag;\n      }\n    }\n    return result;\n  };\n}\n\nmodule.exports = getTag;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n  return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","var castPath = require('./_castPath'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isIndex = require('./_isIndex'),\n    isKey = require('./_isKey'),\n    isLength = require('./isLength'),\n    toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n  path = isKey(path, object) ? [path] : castPath(path);\n\n  var index = -1,\n      length = path.length,\n      result = false;\n\n  while (++index < length) {\n    var key = toKey(path[index]);\n    if (!(result = object != null && hasFunc(object, key))) {\n      break;\n    }\n    object = object[key];\n  }\n  if (result || ++index != length) {\n    return result;\n  }\n  length = object ? object.length : 0;\n  return !!length && isLength(length) && isIndex(key, length) &&\n    (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n  this.__data__ = nativeCreate ? nativeCreate(null) : {};\n  this.size = 0;\n}\n\nmodule.exports = hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n  var result = this.has(key) && delete this.__data__[key];\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n  var data = this.__data__;\n  if (nativeCreate) {\n    var result = data[key];\n    return result === HASH_UNDEFINED ? undefined : result;\n  }\n  return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n  var data = this.__data__;\n  return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n  var data = this.__data__;\n  this.size += this.has(key) ? 0 : 1;\n  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n  return this;\n}\n\nmodule.exports = hashSet;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  length = length == null ? MAX_SAFE_INTEGER : length;\n  return !!length &&\n    (typeof value == 'number' || reIsUint.test(value)) &&\n    (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","var isArray = require('./isArray'),\n    isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n    reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n  if (isArray(value)) {\n    return false;\n  }\n  var type = typeof value;\n  if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n      value == null || isSymbol(value)) {\n    return true;\n  }\n  return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n    (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n  var type = typeof value;\n  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n    ? (value !== '__proto__')\n    : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n  return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n  return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n  var Ctor = value && value.constructor,\n      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n  return value === proto;\n}\n\nmodule.exports = isPrototype;\n","var isObject = require('./isObject');\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n *  equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n  return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n  this.__data__ = [];\n  this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    return false;\n  }\n  var lastIndex = data.length - 1;\n  if (index == lastIndex) {\n    data.pop();\n  } else {\n    splice.call(data, index, 1);\n  }\n  --this.size;\n  return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n  return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    ++this.size;\n    data.push([key, value]);\n  } else {\n    data[index][1] = value;\n  }\n  return this;\n}\n\nmodule.exports = listCacheSet;\n","var Hash = require('./_Hash'),\n    ListCache = require('./_ListCache'),\n    Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n  this.size = 0;\n  this.__data__ = {\n    'hash': new Hash,\n    'map': new (Map || ListCache),\n    'string': new Hash\n  };\n}\n\nmodule.exports = mapCacheClear;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n  var result = getMapData(this, key)['delete'](key);\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = mapCacheDelete;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n  return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n  return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n  var data = getMapData(this, key),\n      size = data.size;\n\n  data.set(key, value);\n  this.size += data.size == size ? 0 : 1;\n  return this;\n}\n\nmodule.exports = mapCacheSet;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n  var index = -1,\n      result = Array(map.size);\n\n  map.forEach(function(value, key) {\n    result[++index] = [key, value];\n  });\n  return result;\n}\n\nmodule.exports = mapToArray;\n","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n  return function(object) {\n    if (object == null) {\n      return false;\n    }\n    return object[key] === srcValue &&\n      (srcValue !== undefined || (key in Object(object)));\n  };\n}\n\nmodule.exports = matchesStrictComparable;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n  var result = memoize(func, function(key) {\n    if (cache.size === MAX_MEMOIZE_SIZE) {\n      cache.clear();\n    }\n    return key;\n  });\n\n  var cache = result.cache;\n  return result;\n}\n\nmodule.exports = memoizeCapped;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n  try {\n    return freeProcess && freeProcess.binding('util');\n  } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n  return function(arg) {\n    return func(transform(arg));\n  };\n}\n\nmodule.exports = overArg;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n  this.__data__.set(value, HASH_UNDEFINED);\n  return this;\n}\n\nmodule.exports = setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n  return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n  var index = -1,\n      result = Array(set.size);\n\n  set.forEach(function(value) {\n    result[++index] = value;\n  });\n  return result;\n}\n\nmodule.exports = setToArray;\n","var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n  this.__data__ = new ListCache;\n  this.size = 0;\n}\n\nmodule.exports = stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n  var data = this.__data__,\n      result = data['delete'](key);\n\n  this.size = data.size;\n  return result;\n}\n\nmodule.exports = stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n  return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n  return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n","var ListCache = require('./_ListCache'),\n    Map = require('./_Map'),\n    MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n  var data = this.__data__;\n  if (data instanceof ListCache) {\n    var pairs = data.__data__;\n    if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n      pairs.push([key, value]);\n      this.size = ++data.size;\n      return this;\n    }\n    data = this.__data__ = new MapCache(pairs);\n  }\n  data.set(key, value);\n  this.size = data.size;\n  return this;\n}\n\nmodule.exports = stackSet;\n","var memoizeCapped = require('./_memoizeCapped'),\n    toString = require('./toString');\n\n/** Used to match property names within property paths. */\nvar reLeadingDot = /^\\./,\n    rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n  string = toString(string);\n\n  var result = [];\n  if (reLeadingDot.test(string)) {\n    result.push('');\n  }\n  string.replace(rePropName, function(match, number, quote, string) {\n    result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\n  });\n  return result;\n});\n\nmodule.exports = stringToPath;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n  if (typeof value == 'string' || isSymbol(value)) {\n    return value;\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to process.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\nmodule.exports = toSource;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n  return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n  var result = object == null ? undefined : baseGet(object, path);\n  return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","var baseHasIn = require('./_baseHasIn'),\n    hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n  return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n  return value;\n}\n\nmodule.exports = identity;\n","var isArrayLikeObject = require('./isArrayLikeObject');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n  return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n    (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\nmodule.exports = isArguments;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","var isFunction = require('./isFunction'),\n    isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var isArrayLike = require('./isArrayLike'),\n    isObjectLike = require('./isObjectLike');\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n *  else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n  return isObjectLike(value) && isArrayLike(value);\n}\n\nmodule.exports = isArrayLikeObject;\n","var isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 8-9 which returns 'object' for typed array and other constructors.\n  var tag = isObject(value) ? objectToString.call(value) : '';\n  return tag == funcTag || tag == genTag;\n}\n\nmodule.exports = isFunction;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n    baseUnary = require('./_baseUnary'),\n    nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n    baseKeys = require('./_baseKeys'),\n    isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n","var arrayMap = require('./_arrayMap'),\n    baseIteratee = require('./_baseIteratee'),\n    baseMap = require('./_baseMap'),\n    isArray = require('./isArray');\n\n/**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n *   return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n *   { 'user': 'barney' },\n *   { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee) {\n  var func = isArray(collection) ? arrayMap : baseMap;\n  return func(collection, baseIteratee(iteratee, 3));\n}\n\nmodule.exports = map;\n","var MapCache = require('./_MapCache');\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n  if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  var memoized = function() {\n    var args = arguments,\n        key = resolver ? resolver.apply(this, args) : args[0],\n        cache = memoized.cache;\n\n    if (cache.has(key)) {\n      return cache.get(key);\n    }\n    var result = func.apply(this, args);\n    memoized.cache = cache.set(key, result) || cache;\n    return result;\n  };\n  memoized.cache = new (memoize.Cache || MapCache);\n  return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var baseProperty = require('./_baseProperty'),\n    basePropertyDeep = require('./_basePropertyDeep'),\n    isKey = require('./_isKey'),\n    toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n *   { 'a': { 'b': 2 } },\n *   { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n  return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n","var arrayReduce = require('./_arrayReduce'),\n    baseEach = require('./_baseEach'),\n    baseIteratee = require('./_baseIteratee'),\n    baseReduce = require('./_baseReduce'),\n    isArray = require('./isArray');\n\n/**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` thru `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not given, the first element of `collection` is used as the initial\n * value. The iteratee is invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n * and `sortBy`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduceRight\n * @example\n *\n * _.reduce([1, 2], function(sum, n) {\n *   return sum + n;\n * }, 0);\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n *   (result[value] || (result[value] = [])).push(key);\n *   return result;\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n */\nfunction reduce(collection, iteratee, accumulator) {\n  var func = isArray(collection) ? arrayReduce : baseReduce,\n      initAccum = arguments.length < 3;\n\n  return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n}\n\nmodule.exports = reduce;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n  return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","(function() {\n  var callWithJQuery;\n\n  callWithJQuery = function(pivotModule) {\n    if (typeof exports === \"object\" && typeof module === \"object\") {\n      return pivotModule((function(){try{return require('jquery')}catch(e){return window.jQuery}})(), (function(){try{return require('d3')}catch(e){return window.d3}})());\n    } else if (typeof define === \"function\" && define.amd) {\n      return define([\"jquery\", \"d3\"], pivotModule);\n    } else {\n      return pivotModule(jQuery, d3);\n    }\n  };\n\n  callWithJQuery(function($, d3) {\n    return $.pivotUtilities.d3_renderers = {\n      Treemap: function(pivotData, opts) {\n        var addToTree, color, defaults, height, i, len, ref, result, rowKey, tree, treemap, value, width;\n        defaults = {\n          localeStrings: {},\n          d3: {\n            width: function() {\n              return $(window).width() / 1.4;\n            },\n            height: function() {\n              return $(window).height() / 1.4;\n            }\n          }\n        };\n        opts = $.extend(defaults, opts);\n        result = $(\"<div>\").css({\n          width: \"100%\",\n          height: \"100%\"\n        });\n        tree = {\n          name: \"All\",\n          children: []\n        };\n        addToTree = function(tree, path, value) {\n          var child, i, len, newChild, ref, x;\n          if (path.length === 0) {\n            tree.value = value;\n            return;\n          }\n          if (tree.children == null) {\n            tree.children = [];\n          }\n          x = path.shift();\n          ref = tree.children;\n          for (i = 0, len = ref.length; i < len; i++) {\n            child = ref[i];\n            if (!(child.name === x)) {\n              continue;\n            }\n            addToTree(child, path, value);\n            return;\n          }\n          newChild = {\n            name: x\n          };\n          addToTree(newChild, path, value);\n          return tree.children.push(newChild);\n        };\n        ref = pivotData.getRowKeys();\n        for (i = 0, len = ref.length; i < len; i++) {\n          rowKey = ref[i];\n          value = pivotData.getAggregator(rowKey, []).value();\n          if (value != null) {\n            addToTree(tree, rowKey, value);\n          }\n        }\n        color = d3.scale.category10();\n        width = opts.d3.width();\n        height = opts.d3.height();\n        treemap = d3.layout.treemap().size([width, height]).sticky(true).value(function(d) {\n          return d.size;\n        });\n        d3.select(result[0]).append(\"div\").style(\"position\", \"relative\").style(\"width\", width + \"px\").style(\"height\", height + \"px\").datum(tree).selectAll(\".node\").data(treemap.padding([15, 0, 0, 0]).value(function(d) {\n          return d.value;\n        }).nodes).enter().append(\"div\").attr(\"class\", \"node\").style(\"background\", function(d) {\n          if (d.children != null) {\n            return \"lightgrey\";\n          } else {\n            return color(d.name);\n          }\n        }).text(function(d) {\n          return d.name;\n        }).call(function() {\n          this.style(\"left\", function(d) {\n            return d.x + \"px\";\n          }).style(\"top\", function(d) {\n            return d.y + \"px\";\n          }).style(\"width\", function(d) {\n            return Math.max(0, d.dx - 1) + \"px\";\n          }).style(\"height\", function(d) {\n            return Math.max(0, d.dy - 1) + \"px\";\n          });\n        });\n        return result;\n      }\n    };\n  });\n\n}).call(this);\n\n//# sourceMappingURL=d3_renderers.js.map\n","(function() {\n  var callWithJQuery;\n\n  callWithJQuery = function(pivotModule) {\n    if (typeof exports === \"object\" && typeof module === \"object\") {\n      return pivotModule((function(){try{return require('jquery')}catch(e){return window.jQuery}})());\n    } else if (typeof define === \"function\" && define.amd) {\n      return define([\"jquery\"], pivotModule);\n    } else {\n      return pivotModule(jQuery);\n    }\n  };\n\n  callWithJQuery(function($) {\n    var makeGoogleChart;\n    makeGoogleChart = function(chartType, extraOptions) {\n      return function(pivotData, opts) {\n        var agg, base, base1, colKey, colKeys, dataArray, dataTable, defaults, fullAggName, groupByTitle, h, hAxisTitle, headers, i, j, len, len1, numCharsInHAxis, options, ref, result, row, rowKey, rowKeys, title, tree2, vAxisTitle, val, wrapper, x, y;\n        defaults = {\n          localeStrings: {\n            vs: \"vs\",\n            by: \"by\"\n          },\n          gchart: {}\n        };\n        opts = $.extend(true, defaults, opts);\n        if ((base = opts.gchart).width == null) {\n          base.width = window.innerWidth / 1.4;\n        }\n        if ((base1 = opts.gchart).height == null) {\n          base1.height = window.innerHeight / 1.4;\n        }\n        rowKeys = pivotData.getRowKeys();\n        if (rowKeys.length === 0) {\n          rowKeys.push([]);\n        }\n        colKeys = pivotData.getColKeys();\n        if (colKeys.length === 0) {\n          colKeys.push([]);\n        }\n        fullAggName = pivotData.aggregatorName;\n        if (pivotData.valAttrs.length) {\n          fullAggName += \"(\" + (pivotData.valAttrs.join(\", \")) + \")\";\n        }\n        headers = (function() {\n          var i, len, results;\n          results = [];\n          for (i = 0, len = rowKeys.length; i < len; i++) {\n            h = rowKeys[i];\n            results.push(h.join(\"-\"));\n          }\n          return results;\n        })();\n        headers.unshift(\"\");\n        numCharsInHAxis = 0;\n        if (chartType === \"ScatterChart\") {\n          dataArray = [];\n          ref = pivotData.tree;\n          for (y in ref) {\n            tree2 = ref[y];\n            for (x in tree2) {\n              agg = tree2[x];\n              dataArray.push([parseFloat(x), parseFloat(y), fullAggName + \": \\n\" + agg.format(agg.value())]);\n            }\n          }\n          dataTable = new google.visualization.DataTable();\n          dataTable.addColumn('number', pivotData.colAttrs.join(\"-\"));\n          dataTable.addColumn('number', pivotData.rowAttrs.join(\"-\"));\n          dataTable.addColumn({\n            type: \"string\",\n            role: \"tooltip\"\n          });\n          dataTable.addRows(dataArray);\n          hAxisTitle = pivotData.colAttrs.join(\"-\");\n          vAxisTitle = pivotData.rowAttrs.join(\"-\");\n          title = \"\";\n        } else {\n          dataArray = [headers];\n          for (i = 0, len = colKeys.length; i < len; i++) {\n            colKey = colKeys[i];\n            row = [colKey.join(\"-\")];\n            numCharsInHAxis += row[0].length;\n            for (j = 0, len1 = rowKeys.length; j < len1; j++) {\n              rowKey = rowKeys[j];\n              agg = pivotData.getAggregator(rowKey, colKey);\n              if (agg.value() != null) {\n                val = agg.value();\n                if ($.isNumeric(val)) {\n                  if (val < 1) {\n                    row.push(parseFloat(val.toPrecision(3)));\n                  } else {\n                    row.push(parseFloat(val.toFixed(3)));\n                  }\n                } else {\n                  row.push(val);\n                }\n              } else {\n                row.push(null);\n              }\n            }\n            dataArray.push(row);\n          }\n          dataTable = google.visualization.arrayToDataTable(dataArray);\n          title = vAxisTitle = fullAggName;\n          hAxisTitle = pivotData.colAttrs.join(\"-\");\n          if (hAxisTitle !== \"\") {\n            title += \" \" + opts.localeStrings.vs + \" \" + hAxisTitle;\n          }\n          groupByTitle = pivotData.rowAttrs.join(\"-\");\n          if (groupByTitle !== \"\") {\n            title += \" \" + opts.localeStrings.by + \" \" + groupByTitle;\n          }\n        }\n        options = {\n          title: title,\n          hAxis: {\n            title: hAxisTitle,\n            slantedText: numCharsInHAxis > 50\n          },\n          vAxis: {\n            title: vAxisTitle\n          },\n          tooltip: {\n            textStyle: {\n              fontName: 'Arial',\n              fontSize: 12\n            }\n          }\n        };\n        if (chartType === \"ColumnChart\") {\n          options.vAxis.minValue = 0;\n        }\n        if (chartType === \"ScatterChart\") {\n          options.legend = {\n            position: \"none\"\n          };\n          options.chartArea = {\n            'width': '80%',\n            'height': '80%'\n          };\n        } else if (dataArray[0].length === 2 && dataArray[0][1] === \"\") {\n          options.legend = {\n            position: \"none\"\n          };\n        }\n        $.extend(options, opts.gchart, extraOptions);\n        result = $(\"<div>\").css({\n          width: \"100%\",\n          height: \"100%\"\n        });\n        wrapper = new google.visualization.ChartWrapper({\n          dataTable: dataTable,\n          chartType: chartType,\n          options: options\n        });\n        wrapper.draw(result[0]);\n        result.bind(\"dblclick\", function() {\n          var editor;\n          editor = new google.visualization.ChartEditor();\n          google.visualization.events.addListener(editor, 'ok', function() {\n            return editor.getChartWrapper().draw(result[0]);\n          });\n          return editor.openDialog(wrapper);\n        });\n        return result;\n      };\n    };\n    return $.pivotUtilities.gchart_renderers = {\n      \"Line Chart\": makeGoogleChart(\"LineChart\"),\n      \"Bar Chart\": makeGoogleChart(\"ColumnChart\"),\n      \"Stacked Bar Chart\": makeGoogleChart(\"ColumnChart\", {\n        isStacked: true\n      }),\n      \"Area Chart\": makeGoogleChart(\"AreaChart\", {\n        isStacked: true\n      }),\n      \"Scatter Chart\": makeGoogleChart(\"ScatterChart\")\n    };\n  });\n\n}).call(this);\n\n//# sourceMappingURL=gchart_renderers.js.map\n","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.proj4 = factory());\n}(this, (function () { 'use strict';\n\n\tvar globals = function(defs) {\n\t  defs('EPSG:4326', \"+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees\");\n\t  defs('EPSG:4269', \"+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees\");\n\t  defs('EPSG:3857', \"+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs\");\n\n\t  defs.WGS84 = defs['EPSG:4326'];\n\t  defs['EPSG:3785'] = defs['EPSG:3857']; // maintain backward compat, official code is 3857\n\t  defs.GOOGLE = defs['EPSG:3857'];\n\t  defs['EPSG:900913'] = defs['EPSG:3857'];\n\t  defs['EPSG:102113'] = defs['EPSG:3857'];\n\t};\n\n\tvar PJD_3PARAM = 1;\n\tvar PJD_7PARAM = 2;\n\tvar PJD_WGS84 = 4; // WGS84 or equivalent\n\tvar PJD_NODATUM = 5; // WGS84 or equivalent\n\tvar SEC_TO_RAD = 4.84813681109535993589914102357e-6;\n\tvar HALF_PI = Math.PI/2;\n\t// ellipoid pj_set_ell.c\n\tvar SIXTH = 0.1666666666666666667;\n\t/* 1/6 */\n\tvar RA4 = 0.04722222222222222222;\n\t/* 17/360 */\n\tvar RA6 = 0.02215608465608465608;\n\tvar EPSLN = (typeof Number.EPSILON === 'undefined') ? 1.0e-10 : Number.EPSILON;\n\tvar D2R = 0.01745329251994329577;\n\tvar R2D = 57.29577951308232088;\n\tvar FORTPI = Math.PI/4;\n\tvar TWO_PI = Math.PI * 2;\n\t// SPI is slightly greater than Math.PI, so values that exceed the -180..180\n\t// degree range by a tiny amount don't get wrapped. This prevents points that\n\t// have drifted from their original location along the 180th meridian (due to\n\t// floating point error) from changing their sign.\n\tvar SPI = 3.14159265359;\n\n\tvar exports$1 = {};\n\texports$1.greenwich = 0.0; //\"0dE\",\n\texports$1.lisbon = -9.131906111111; //\"9d07'54.862\\\"W\",\n\texports$1.paris = 2.337229166667; //\"2d20'14.025\\\"E\",\n\texports$1.bogota = -74.080916666667; //\"74d04'51.3\\\"W\",\n\texports$1.madrid = -3.687938888889; //\"3d41'16.58\\\"W\",\n\texports$1.rome = 12.452333333333; //\"12d27'8.4\\\"E\",\n\texports$1.bern = 7.439583333333; //\"7d26'22.5\\\"E\",\n\texports$1.jakarta = 106.807719444444; //\"106d48'27.79\\\"E\",\n\texports$1.ferro = -17.666666666667; //\"17d40'W\",\n\texports$1.brussels = 4.367975; //\"4d22'4.71\\\"E\",\n\texports$1.stockholm = 18.058277777778; //\"18d3'29.8\\\"E\",\n\texports$1.athens = 23.7163375; //\"23d42'58.815\\\"E\",\n\texports$1.oslo = 10.722916666667; //\"10d43'22.5\\\"E\"\n\n\tvar units = {\n\t  ft: {to_meter: 0.3048},\n\t  'us-ft': {to_meter: 1200 / 3937}\n\t};\n\n\tvar ignoredChar = /[\\s_\\-\\/\\(\\)]/g;\n\tfunction match(obj, key) {\n\t  if (obj[key]) {\n\t    return obj[key];\n\t  }\n\t  var keys = Object.keys(obj);\n\t  var lkey = key.toLowerCase().replace(ignoredChar, '');\n\t  var i = -1;\n\t  var testkey, processedKey;\n\t  while (++i < keys.length) {\n\t    testkey = keys[i];\n\t    processedKey = testkey.toLowerCase().replace(ignoredChar, '');\n\t    if (processedKey === lkey) {\n\t      return obj[testkey];\n\t    }\n\t  }\n\t}\n\n\tvar parseProj = function(defData) {\n\t  var self = {};\n\t  var paramObj = defData.split('+').map(function(v) {\n\t    return v.trim();\n\t  }).filter(function(a) {\n\t    return a;\n\t  }).reduce(function(p, a) {\n\t    var split = a.split('=');\n\t    split.push(true);\n\t    p[split[0].toLowerCase()] = split[1];\n\t    return p;\n\t  }, {});\n\t  var paramName, paramVal, paramOutname;\n\t  var params = {\n\t    proj: 'projName',\n\t    datum: 'datumCode',\n\t    rf: function(v) {\n\t      self.rf = parseFloat(v);\n\t    },\n\t    lat_0: function(v) {\n\t      self.lat0 = v * D2R;\n\t    },\n\t    lat_1: function(v) {\n\t      self.lat1 = v * D2R;\n\t    },\n\t    lat_2: function(v) {\n\t      self.lat2 = v * D2R;\n\t    },\n\t    lat_ts: function(v) {\n\t      self.lat_ts = v * D2R;\n\t    },\n\t    lon_0: function(v) {\n\t      self.long0 = v * D2R;\n\t    },\n\t    lon_1: function(v) {\n\t      self.long1 = v * D2R;\n\t    },\n\t    lon_2: function(v) {\n\t      self.long2 = v * D2R;\n\t    },\n\t    alpha: function(v) {\n\t      self.alpha = parseFloat(v) * D2R;\n\t    },\n\t    lonc: function(v) {\n\t      self.longc = v * D2R;\n\t    },\n\t    x_0: function(v) {\n\t      self.x0 = parseFloat(v);\n\t    },\n\t    y_0: function(v) {\n\t      self.y0 = parseFloat(v);\n\t    },\n\t    k_0: function(v) {\n\t      self.k0 = parseFloat(v);\n\t    },\n\t    k: function(v) {\n\t      self.k0 = parseFloat(v);\n\t    },\n\t    a: function(v) {\n\t      self.a = parseFloat(v);\n\t    },\n\t    b: function(v) {\n\t      self.b = parseFloat(v);\n\t    },\n\t    r_a: function() {\n\t      self.R_A = true;\n\t    },\n\t    zone: function(v) {\n\t      self.zone = parseInt(v, 10);\n\t    },\n\t    south: function() {\n\t      self.utmSouth = true;\n\t    },\n\t    towgs84: function(v) {\n\t      self.datum_params = v.split(\",\").map(function(a) {\n\t        return parseFloat(a);\n\t      });\n\t    },\n\t    to_meter: function(v) {\n\t      self.to_meter = parseFloat(v);\n\t    },\n\t    units: function(v) {\n\t      self.units = v;\n\t      var unit = match(units, v);\n\t      if (unit) {\n\t        self.to_meter = unit.to_meter;\n\t      }\n\t    },\n\t    from_greenwich: function(v) {\n\t      self.from_greenwich = v * D2R;\n\t    },\n\t    pm: function(v) {\n\t      var pm = match(exports$1, v);\n\t      self.from_greenwich = (pm ? pm : parseFloat(v)) * D2R;\n\t    },\n\t    nadgrids: function(v) {\n\t      if (v === '@null') {\n\t        self.datumCode = 'none';\n\t      }\n\t      else {\n\t        self.nadgrids = v;\n\t      }\n\t    },\n\t    axis: function(v) {\n\t      var legalAxis = \"ewnsud\";\n\t      if (v.length === 3 && legalAxis.indexOf(v.substr(0, 1)) !== -1 && legalAxis.indexOf(v.substr(1, 1)) !== -1 && legalAxis.indexOf(v.substr(2, 1)) !== -1) {\n\t        self.axis = v;\n\t      }\n\t    }\n\t  };\n\t  for (paramName in paramObj) {\n\t    paramVal = paramObj[paramName];\n\t    if (paramName in params) {\n\t      paramOutname = params[paramName];\n\t      if (typeof paramOutname === 'function') {\n\t        paramOutname(paramVal);\n\t      }\n\t      else {\n\t        self[paramOutname] = paramVal;\n\t      }\n\t    }\n\t    else {\n\t      self[paramName] = paramVal;\n\t    }\n\t  }\n\t  if(typeof self.datumCode === 'string' && self.datumCode !== \"WGS84\"){\n\t    self.datumCode = self.datumCode.toLowerCase();\n\t  }\n\t  return self;\n\t};\n\n\tvar NEUTRAL = 1;\n\tvar KEYWORD = 2;\n\tvar NUMBER = 3;\n\tvar QUOTED = 4;\n\tvar AFTERQUOTE = 5;\n\tvar ENDED = -1;\n\tvar whitespace = /\\s/;\n\tvar latin = /[A-Za-z]/;\n\tvar keyword = /[A-Za-z84]/;\n\tvar endThings = /[,\\]]/;\n\tvar digets = /[\\d\\.E\\-\\+]/;\n\t// const ignoredChar = /[\\s_\\-\\/\\(\\)]/g;\n\tfunction Parser(text) {\n\t  if (typeof text !== 'string') {\n\t    throw new Error('not a string');\n\t  }\n\t  this.text = text.trim();\n\t  this.level = 0;\n\t  this.place = 0;\n\t  this.root = null;\n\t  this.stack = [];\n\t  this.currentObject = null;\n\t  this.state = NEUTRAL;\n\t}\n\tParser.prototype.readCharicter = function() {\n\t  var char = this.text[this.place++];\n\t  if (this.state !== QUOTED) {\n\t    while (whitespace.test(char)) {\n\t      if (this.place >= this.text.length) {\n\t        return;\n\t      }\n\t      char = this.text[this.place++];\n\t    }\n\t  }\n\t  switch (this.state) {\n\t    case NEUTRAL:\n\t      return this.neutral(char);\n\t    case KEYWORD:\n\t      return this.keyword(char)\n\t    case QUOTED:\n\t      return this.quoted(char);\n\t    case AFTERQUOTE:\n\t      return this.afterquote(char);\n\t    case NUMBER:\n\t      return this.number(char);\n\t    case ENDED:\n\t      return;\n\t  }\n\t};\n\tParser.prototype.afterquote = function(char) {\n\t  if (char === '\"') {\n\t    this.word += '\"';\n\t    this.state = QUOTED;\n\t    return;\n\t  }\n\t  if (endThings.test(char)) {\n\t    this.word = this.word.trim();\n\t    this.afterItem(char);\n\t    return;\n\t  }\n\t  throw new Error('havn\\'t handled \"' +char + '\" in afterquote yet, index ' + this.place);\n\t};\n\tParser.prototype.afterItem = function(char) {\n\t  if (char === ',') {\n\t    if (this.word !== null) {\n\t      this.currentObject.push(this.word);\n\t    }\n\t    this.word = null;\n\t    this.state = NEUTRAL;\n\t    return;\n\t  }\n\t  if (char === ']') {\n\t    this.level--;\n\t    if (this.word !== null) {\n\t      this.currentObject.push(this.word);\n\t      this.word = null;\n\t    }\n\t    this.state = NEUTRAL;\n\t    this.currentObject = this.stack.pop();\n\t    if (!this.currentObject) {\n\t      this.state = ENDED;\n\t    }\n\n\t    return;\n\t  }\n\t};\n\tParser.prototype.number = function(char) {\n\t  if (digets.test(char)) {\n\t    this.word += char;\n\t    return;\n\t  }\n\t  if (endThings.test(char)) {\n\t    this.word = parseFloat(this.word);\n\t    this.afterItem(char);\n\t    return;\n\t  }\n\t  throw new Error('havn\\'t handled \"' +char + '\" in number yet, index ' + this.place);\n\t};\n\tParser.prototype.quoted = function(char) {\n\t  if (char === '\"') {\n\t    this.state = AFTERQUOTE;\n\t    return;\n\t  }\n\t  this.word += char;\n\t  return;\n\t};\n\tParser.prototype.keyword = function(char) {\n\t  if (keyword.test(char)) {\n\t    this.word += char;\n\t    return;\n\t  }\n\t  if (char === '[') {\n\t    var newObjects = [];\n\t    newObjects.push(this.word);\n\t    this.level++;\n\t    if (this.root === null) {\n\t      this.root = newObjects;\n\t    } else {\n\t      this.currentObject.push(newObjects);\n\t    }\n\t    this.stack.push(this.currentObject);\n\t    this.currentObject = newObjects;\n\t    this.state = NEUTRAL;\n\t    return;\n\t  }\n\t  if (endThings.test(char)) {\n\t    this.afterItem(char);\n\t    return;\n\t  }\n\t  throw new Error('havn\\'t handled \"' +char + '\" in keyword yet, index ' + this.place);\n\t};\n\tParser.prototype.neutral = function(char) {\n\t  if (latin.test(char)) {\n\t    this.word = char;\n\t    this.state = KEYWORD;\n\t    return;\n\t  }\n\t  if (char === '\"') {\n\t    this.word = '';\n\t    this.state = QUOTED;\n\t    return;\n\t  }\n\t  if (digets.test(char)) {\n\t    this.word = char;\n\t    this.state = NUMBER;\n\t    return;\n\t  }\n\t  if (endThings.test(char)) {\n\t    this.afterItem(char);\n\t    return;\n\t  }\n\t  throw new Error('havn\\'t handled \"' +char + '\" in neutral yet, index ' + this.place);\n\t};\n\tParser.prototype.output = function() {\n\t  while (this.place < this.text.length) {\n\t    this.readCharicter();\n\t  }\n\t  if (this.state === ENDED) {\n\t    return this.root;\n\t  }\n\t  throw new Error('unable to parse string \"' +this.text + '\". State is ' + this.state);\n\t};\n\n\tfunction parseString(txt) {\n\t  var parser = new Parser(txt);\n\t  return parser.output();\n\t}\n\n\tfunction mapit(obj, key, value) {\n\t  if (Array.isArray(key)) {\n\t    value.unshift(key);\n\t    key = null;\n\t  }\n\t  var thing = key ? {} : obj;\n\n\t  var out = value.reduce(function(newObj, item) {\n\t    sExpr(item, newObj);\n\t    return newObj\n\t  }, thing);\n\t  if (key) {\n\t    obj[key] = out;\n\t  }\n\t}\n\n\tfunction sExpr(v, obj) {\n\t  if (!Array.isArray(v)) {\n\t    obj[v] = true;\n\t    return;\n\t  }\n\t  var key = v.shift();\n\t  if (key === 'PARAMETER') {\n\t    key = v.shift();\n\t  }\n\t  if (v.length === 1) {\n\t    if (Array.isArray(v[0])) {\n\t      obj[key] = {};\n\t      sExpr(v[0], obj[key]);\n\t      return;\n\t    }\n\t    obj[key] = v[0];\n\t    return;\n\t  }\n\t  if (!v.length) {\n\t    obj[key] = true;\n\t    return;\n\t  }\n\t  if (key === 'TOWGS84') {\n\t    obj[key] = v;\n\t    return;\n\t  }\n\t  if (!Array.isArray(key)) {\n\t    obj[key] = {};\n\t  }\n\n\t  var i;\n\t  switch (key) {\n\t    case 'UNIT':\n\t    case 'PRIMEM':\n\t    case 'VERT_DATUM':\n\t      obj[key] = {\n\t        name: v[0].toLowerCase(),\n\t        convert: v[1]\n\t      };\n\t      if (v.length === 3) {\n\t        sExpr(v[2], obj[key]);\n\t      }\n\t      return;\n\t    case 'SPHEROID':\n\t    case 'ELLIPSOID':\n\t      obj[key] = {\n\t        name: v[0],\n\t        a: v[1],\n\t        rf: v[2]\n\t      };\n\t      if (v.length === 4) {\n\t        sExpr(v[3], obj[key]);\n\t      }\n\t      return;\n\t    case 'PROJECTEDCRS':\n\t    case 'PROJCRS':\n\t    case 'GEOGCS':\n\t    case 'GEOCCS':\n\t    case 'PROJCS':\n\t    case 'LOCAL_CS':\n\t    case 'GEODCRS':\n\t    case 'GEODETICCRS':\n\t    case 'GEODETICDATUM':\n\t    case 'EDATUM':\n\t    case 'ENGINEERINGDATUM':\n\t    case 'VERT_CS':\n\t    case 'VERTCRS':\n\t    case 'VERTICALCRS':\n\t    case 'COMPD_CS':\n\t    case 'COMPOUNDCRS':\n\t    case 'ENGINEERINGCRS':\n\t    case 'ENGCRS':\n\t    case 'FITTED_CS':\n\t    case 'LOCAL_DATUM':\n\t    case 'DATUM':\n\t      v[0] = ['name', v[0]];\n\t      mapit(obj, key, v);\n\t      return;\n\t    default:\n\t      i = -1;\n\t      while (++i < v.length) {\n\t        if (!Array.isArray(v[i])) {\n\t          return sExpr(v, obj[key]);\n\t        }\n\t      }\n\t      return mapit(obj, key, v);\n\t  }\n\t}\n\n\tvar D2R$1 = 0.01745329251994329577;\n\tfunction rename(obj, params) {\n\t  var outName = params[0];\n\t  var inName = params[1];\n\t  if (!(outName in obj) && (inName in obj)) {\n\t    obj[outName] = obj[inName];\n\t    if (params.length === 3) {\n\t      obj[outName] = params[2](obj[outName]);\n\t    }\n\t  }\n\t}\n\n\tfunction d2r(input) {\n\t  return input * D2R$1;\n\t}\n\n\tfunction cleanWKT(wkt) {\n\t  if (wkt.type === 'GEOGCS') {\n\t    wkt.projName = 'longlat';\n\t  } else if (wkt.type === 'LOCAL_CS') {\n\t    wkt.projName = 'identity';\n\t    wkt.local = true;\n\t  } else {\n\t    if (typeof wkt.PROJECTION === 'object') {\n\t      wkt.projName = Object.keys(wkt.PROJECTION)[0];\n\t    } else {\n\t      wkt.projName = wkt.PROJECTION;\n\t    }\n\t  }\n\t  if (wkt.UNIT) {\n\t    wkt.units = wkt.UNIT.name.toLowerCase();\n\t    if (wkt.units === 'metre') {\n\t      wkt.units = 'meter';\n\t    }\n\t    if (wkt.UNIT.convert) {\n\t      if (wkt.type === 'GEOGCS') {\n\t        if (wkt.DATUM && wkt.DATUM.SPHEROID) {\n\t          wkt.to_meter = wkt.UNIT.convert*wkt.DATUM.SPHEROID.a;\n\t        }\n\t      } else {\n\t        wkt.to_meter = wkt.UNIT.convert, 10;\n\t      }\n\t    }\n\t  }\n\t  var geogcs = wkt.GEOGCS;\n\t  if (wkt.type === 'GEOGCS') {\n\t    geogcs = wkt;\n\t  }\n\t  if (geogcs) {\n\t    //if(wkt.GEOGCS.PRIMEM&&wkt.GEOGCS.PRIMEM.convert){\n\t    //  wkt.from_greenwich=wkt.GEOGCS.PRIMEM.convert*D2R;\n\t    //}\n\t    if (geogcs.DATUM) {\n\t      wkt.datumCode = geogcs.DATUM.name.toLowerCase();\n\t    } else {\n\t      wkt.datumCode = geogcs.name.toLowerCase();\n\t    }\n\t    if (wkt.datumCode.slice(0, 2) === 'd_') {\n\t      wkt.datumCode = wkt.datumCode.slice(2);\n\t    }\n\t    if (wkt.datumCode === 'new_zealand_geodetic_datum_1949' || wkt.datumCode === 'new_zealand_1949') {\n\t      wkt.datumCode = 'nzgd49';\n\t    }\n\t    if (wkt.datumCode === 'wgs_1984') {\n\t      if (wkt.PROJECTION === 'Mercator_Auxiliary_Sphere') {\n\t        wkt.sphere = true;\n\t      }\n\t      wkt.datumCode = 'wgs84';\n\t    }\n\t    if (wkt.datumCode.slice(-6) === '_ferro') {\n\t      wkt.datumCode = wkt.datumCode.slice(0, - 6);\n\t    }\n\t    if (wkt.datumCode.slice(-8) === '_jakarta') {\n\t      wkt.datumCode = wkt.datumCode.slice(0, - 8);\n\t    }\n\t    if (~wkt.datumCode.indexOf('belge')) {\n\t      wkt.datumCode = 'rnb72';\n\t    }\n\t    if (geogcs.DATUM && geogcs.DATUM.SPHEROID) {\n\t      wkt.ellps = geogcs.DATUM.SPHEROID.name.replace('_19', '').replace(/[Cc]larke\\_18/, 'clrk');\n\t      if (wkt.ellps.toLowerCase().slice(0, 13) === 'international') {\n\t        wkt.ellps = 'intl';\n\t      }\n\n\t      wkt.a = geogcs.DATUM.SPHEROID.a;\n\t      wkt.rf = parseFloat(geogcs.DATUM.SPHEROID.rf, 10);\n\t    }\n\t    if (~wkt.datumCode.indexOf('osgb_1936')) {\n\t      wkt.datumCode = 'osgb36';\n\t    }\n\t  }\n\t  if (wkt.b && !isFinite(wkt.b)) {\n\t    wkt.b = wkt.a;\n\t  }\n\n\t  function toMeter(input) {\n\t    var ratio = wkt.to_meter || 1;\n\t    return input * ratio;\n\t  }\n\t  var renamer = function(a) {\n\t    return rename(wkt, a);\n\t  };\n\t  var list = [\n\t    ['standard_parallel_1', 'Standard_Parallel_1'],\n\t    ['standard_parallel_2', 'Standard_Parallel_2'],\n\t    ['false_easting', 'False_Easting'],\n\t    ['false_northing', 'False_Northing'],\n\t    ['central_meridian', 'Central_Meridian'],\n\t    ['latitude_of_origin', 'Latitude_Of_Origin'],\n\t    ['latitude_of_origin', 'Central_Parallel'],\n\t    ['scale_factor', 'Scale_Factor'],\n\t    ['k0', 'scale_factor'],\n\t    ['latitude_of_center', 'Latitude_of_center'],\n\t    ['lat0', 'latitude_of_center', d2r],\n\t    ['longitude_of_center', 'Longitude_Of_Center'],\n\t    ['longc', 'longitude_of_center', d2r],\n\t    ['x0', 'false_easting', toMeter],\n\t    ['y0', 'false_northing', toMeter],\n\t    ['long0', 'central_meridian', d2r],\n\t    ['lat0', 'latitude_of_origin', d2r],\n\t    ['lat0', 'standard_parallel_1', d2r],\n\t    ['lat1', 'standard_parallel_1', d2r],\n\t    ['lat2', 'standard_parallel_2', d2r],\n\t    ['alpha', 'azimuth', d2r],\n\t    ['srsCode', 'name']\n\t  ];\n\t  list.forEach(renamer);\n\t  if (!wkt.long0 && wkt.longc && (wkt.projName === 'Albers_Conic_Equal_Area' || wkt.projName === 'Lambert_Azimuthal_Equal_Area')) {\n\t    wkt.long0 = wkt.longc;\n\t  }\n\t  if (!wkt.lat_ts && wkt.lat1 && (wkt.projName === 'Stereographic_South_Pole' || wkt.projName === 'Polar Stereographic (variant B)')) {\n\t    wkt.lat0 = d2r(wkt.lat1 > 0 ? 90 : -90);\n\t    wkt.lat_ts = wkt.lat1;\n\t  }\n\t}\n\tvar wkt = function(wkt) {\n\t  var lisp = parseString(wkt);\n\t  var type = lisp.shift();\n\t  var name = lisp.shift();\n\t  lisp.unshift(['name', name]);\n\t  lisp.unshift(['type', type]);\n\t  var obj = {};\n\t  sExpr(lisp, obj);\n\t  cleanWKT(obj);\n\t  return obj;\n\t};\n\n\tfunction defs(name) {\n\t  /*global console*/\n\t  var that = this;\n\t  if (arguments.length === 2) {\n\t    var def = arguments[1];\n\t    if (typeof def === 'string') {\n\t      if (def.charAt(0) === '+') {\n\t        defs[name] = parseProj(arguments[1]);\n\t      }\n\t      else {\n\t        defs[name] = wkt(arguments[1]);\n\t      }\n\t    } else {\n\t      defs[name] = def;\n\t    }\n\t  }\n\t  else if (arguments.length === 1) {\n\t    if (Array.isArray(name)) {\n\t      return name.map(function(v) {\n\t        if (Array.isArray(v)) {\n\t          defs.apply(that, v);\n\t        }\n\t        else {\n\t          defs(v);\n\t        }\n\t      });\n\t    }\n\t    else if (typeof name === 'string') {\n\t      if (name in defs) {\n\t        return defs[name];\n\t      }\n\t    }\n\t    else if ('EPSG' in name) {\n\t      defs['EPSG:' + name.EPSG] = name;\n\t    }\n\t    else if ('ESRI' in name) {\n\t      defs['ESRI:' + name.ESRI] = name;\n\t    }\n\t    else if ('IAU2000' in name) {\n\t      defs['IAU2000:' + name.IAU2000] = name;\n\t    }\n\t    else {\n\t      console.log(name);\n\t    }\n\t    return;\n\t  }\n\n\n\t}\n\tglobals(defs);\n\n\tfunction testObj(code){\n\t  return typeof code === 'string';\n\t}\n\tfunction testDef(code){\n\t  return code in defs;\n\t}\n\t var codeWords = ['PROJECTEDCRS', 'PROJCRS', 'GEOGCS','GEOCCS','PROJCS','LOCAL_CS', 'GEODCRS', 'GEODETICCRS', 'GEODETICDATUM', 'ENGCRS', 'ENGINEERINGCRS']; \n\tfunction testWKT(code){\n\t  return codeWords.some(function (word) {\n\t    return code.indexOf(word) > -1;\n\t  });\n\t}\n\tfunction testProj(code){\n\t  return code[0] === '+';\n\t}\n\tfunction parse(code){\n\t  if (testObj(code)) {\n\t    //check to see if this is a WKT string\n\t    if (testDef(code)) {\n\t      return defs[code];\n\t    }\n\t    if (testWKT(code)) {\n\t      return wkt(code);\n\t    }\n\t    if (testProj(code)) {\n\t      return parseProj(code);\n\t    }\n\t  }else{\n\t    return code;\n\t  }\n\t}\n\n\tvar extend = function(destination, source) {\n\t  destination = destination || {};\n\t  var value, property;\n\t  if (!source) {\n\t    return destination;\n\t  }\n\t  for (property in source) {\n\t    value = source[property];\n\t    if (value !== undefined) {\n\t      destination[property] = value;\n\t    }\n\t  }\n\t  return destination;\n\t};\n\n\tvar msfnz = function(eccent, sinphi, cosphi) {\n\t  var con = eccent * sinphi;\n\t  return cosphi / (Math.sqrt(1 - con * con));\n\t};\n\n\tvar sign = function(x) {\n\t  return x<0 ? -1 : 1;\n\t};\n\n\tvar adjust_lon = function(x) {\n\t  return (Math.abs(x) <= SPI) ? x : (x - (sign(x) * TWO_PI));\n\t};\n\n\tvar tsfnz = function(eccent, phi, sinphi) {\n\t  var con = eccent * sinphi;\n\t  var com = 0.5 * eccent;\n\t  con = Math.pow(((1 - con) / (1 + con)), com);\n\t  return (Math.tan(0.5 * (HALF_PI - phi)) / con);\n\t};\n\n\tvar phi2z = function(eccent, ts) {\n\t  var eccnth = 0.5 * eccent;\n\t  var con, dphi;\n\t  var phi = HALF_PI - 2 * Math.atan(ts);\n\t  for (var i = 0; i <= 15; i++) {\n\t    con = eccent * Math.sin(phi);\n\t    dphi = HALF_PI - 2 * Math.atan(ts * (Math.pow(((1 - con) / (1 + con)), eccnth))) - phi;\n\t    phi += dphi;\n\t    if (Math.abs(dphi) <= 0.0000000001) {\n\t      return phi;\n\t    }\n\t  }\n\t  //console.log(\"phi2z has NoConvergence\");\n\t  return -9999;\n\t};\n\n\tfunction init() {\n\t  var con = this.b / this.a;\n\t  this.es = 1 - con * con;\n\t  if(!('x0' in this)){\n\t    this.x0 = 0;\n\t  }\n\t  if(!('y0' in this)){\n\t    this.y0 = 0;\n\t  }\n\t  this.e = Math.sqrt(this.es);\n\t  if (this.lat_ts) {\n\t    if (this.sphere) {\n\t      this.k0 = Math.cos(this.lat_ts);\n\t    }\n\t    else {\n\t      this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts));\n\t    }\n\t  }\n\t  else {\n\t    if (!this.k0) {\n\t      if (this.k) {\n\t        this.k0 = this.k;\n\t      }\n\t      else {\n\t        this.k0 = 1;\n\t      }\n\t    }\n\t  }\n\t}\n\n\t/* Mercator forward equations--mapping lat,long to x,y\n\t  --------------------------------------------------*/\n\n\tfunction forward(p) {\n\t  var lon = p.x;\n\t  var lat = p.y;\n\t  // convert to radians\n\t  if (lat * R2D > 90 && lat * R2D < -90 && lon * R2D > 180 && lon * R2D < -180) {\n\t    return null;\n\t  }\n\n\t  var x, y;\n\t  if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) {\n\t    return null;\n\t  }\n\t  else {\n\t    if (this.sphere) {\n\t      x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0);\n\t      y = this.y0 + this.a * this.k0 * Math.log(Math.tan(FORTPI + 0.5 * lat));\n\t    }\n\t    else {\n\t      var sinphi = Math.sin(lat);\n\t      var ts = tsfnz(this.e, lat, sinphi);\n\t      x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0);\n\t      y = this.y0 - this.a * this.k0 * Math.log(ts);\n\t    }\n\t    p.x = x;\n\t    p.y = y;\n\t    return p;\n\t  }\n\t}\n\n\t/* Mercator inverse equations--mapping x,y to lat/long\n\t  --------------------------------------------------*/\n\tfunction inverse(p) {\n\n\t  var x = p.x - this.x0;\n\t  var y = p.y - this.y0;\n\t  var lon, lat;\n\n\t  if (this.sphere) {\n\t    lat = HALF_PI - 2 * Math.atan(Math.exp(-y / (this.a * this.k0)));\n\t  }\n\t  else {\n\t    var ts = Math.exp(-y / (this.a * this.k0));\n\t    lat = phi2z(this.e, ts);\n\t    if (lat === -9999) {\n\t      return null;\n\t    }\n\t  }\n\t  lon = adjust_lon(this.long0 + x / (this.a * this.k0));\n\n\t  p.x = lon;\n\t  p.y = lat;\n\t  return p;\n\t}\n\n\tvar names$1 = [\"Mercator\", \"Popular Visualisation Pseudo Mercator\", \"Mercator_1SP\", \"Mercator_Auxiliary_Sphere\", \"merc\"];\n\tvar merc = {\n\t  init: init,\n\t  forward: forward,\n\t  inverse: inverse,\n\t  names: names$1\n\t};\n\n\tfunction init$1() {\n\t  //no-op for longlat\n\t}\n\n\tfunction identity(pt) {\n\t  return pt;\n\t}\n\tvar names$2 = [\"longlat\", \"identity\"];\n\tvar longlat = {\n\t  init: init$1,\n\t  forward: identity,\n\t  inverse: identity,\n\t  names: names$2\n\t};\n\n\tvar projs = [merc, longlat];\n\tvar names$$1 = {};\n\tvar projStore = [];\n\n\tfunction add(proj, i) {\n\t  var len = projStore.length;\n\t  if (!proj.names) {\n\t    console.log(i);\n\t    return true;\n\t  }\n\t  projStore[len] = proj;\n\t  proj.names.forEach(function(n) {\n\t    names$$1[n.toLowerCase()] = len;\n\t  });\n\t  return this;\n\t}\n\n\tfunction get(name) {\n\t  if (!name) {\n\t    return false;\n\t  }\n\t  var n = name.toLowerCase();\n\t  if (typeof names$$1[n] !== 'undefined' && projStore[names$$1[n]]) {\n\t    return projStore[names$$1[n]];\n\t  }\n\t}\n\n\tfunction start() {\n\t  projs.forEach(add);\n\t}\n\tvar projections = {\n\t  start: start,\n\t  add: add,\n\t  get: get\n\t};\n\n\tvar exports$2 = {};\n\texports$2.MERIT = {\n\t  a: 6378137.0,\n\t  rf: 298.257,\n\t  ellipseName: \"MERIT 1983\"\n\t};\n\n\texports$2.SGS85 = {\n\t  a: 6378136.0,\n\t  rf: 298.257,\n\t  ellipseName: \"Soviet Geodetic System 85\"\n\t};\n\n\texports$2.GRS80 = {\n\t  a: 6378137.0,\n\t  rf: 298.257222101,\n\t  ellipseName: \"GRS 1980(IUGG, 1980)\"\n\t};\n\n\texports$2.IAU76 = {\n\t  a: 6378140.0,\n\t  rf: 298.257,\n\t  ellipseName: \"IAU 1976\"\n\t};\n\n\texports$2.airy = {\n\t  a: 6377563.396,\n\t  b: 6356256.910,\n\t  ellipseName: \"Airy 1830\"\n\t};\n\n\texports$2.APL4 = {\n\t  a: 6378137,\n\t  rf: 298.25,\n\t  ellipseName: \"Appl. Physics. 1965\"\n\t};\n\n\texports$2.NWL9D = {\n\t  a: 6378145.0,\n\t  rf: 298.25,\n\t  ellipseName: \"Naval Weapons Lab., 1965\"\n\t};\n\n\texports$2.mod_airy = {\n\t  a: 6377340.189,\n\t  b: 6356034.446,\n\t  ellipseName: \"Modified Airy\"\n\t};\n\n\texports$2.andrae = {\n\t  a: 6377104.43,\n\t  rf: 300.0,\n\t  ellipseName: \"Andrae 1876 (Den., Iclnd.)\"\n\t};\n\n\texports$2.aust_SA = {\n\t  a: 6378160.0,\n\t  rf: 298.25,\n\t  ellipseName: \"Australian Natl & S. Amer. 1969\"\n\t};\n\n\texports$2.GRS67 = {\n\t  a: 6378160.0,\n\t  rf: 298.2471674270,\n\t  ellipseName: \"GRS 67(IUGG 1967)\"\n\t};\n\n\texports$2.bessel = {\n\t  a: 6377397.155,\n\t  rf: 299.1528128,\n\t  ellipseName: \"Bessel 1841\"\n\t};\n\n\texports$2.bess_nam = {\n\t  a: 6377483.865,\n\t  rf: 299.1528128,\n\t  ellipseName: \"Bessel 1841 (Namibia)\"\n\t};\n\n\texports$2.clrk66 = {\n\t  a: 6378206.4,\n\t  b: 6356583.8,\n\t  ellipseName: \"Clarke 1866\"\n\t};\n\n\texports$2.clrk80 = {\n\t  a: 6378249.145,\n\t  rf: 293.4663,\n\t  ellipseName: \"Clarke 1880 mod.\"\n\t};\n\n\texports$2.clrk58 = {\n\t  a: 6378293.645208759,\n\t  rf: 294.2606763692654,\n\t  ellipseName: \"Clarke 1858\"\n\t};\n\n\texports$2.CPM = {\n\t  a: 6375738.7,\n\t  rf: 334.29,\n\t  ellipseName: \"Comm. des Poids et Mesures 1799\"\n\t};\n\n\texports$2.delmbr = {\n\t  a: 6376428.0,\n\t  rf: 311.5,\n\t  ellipseName: \"Delambre 1810 (Belgium)\"\n\t};\n\n\texports$2.engelis = {\n\t  a: 6378136.05,\n\t  rf: 298.2566,\n\t  ellipseName: \"Engelis 1985\"\n\t};\n\n\texports$2.evrst30 = {\n\t  a: 6377276.345,\n\t  rf: 300.8017,\n\t  ellipseName: \"Everest 1830\"\n\t};\n\n\texports$2.evrst48 = {\n\t  a: 6377304.063,\n\t  rf: 300.8017,\n\t  ellipseName: \"Everest 1948\"\n\t};\n\n\texports$2.evrst56 = {\n\t  a: 6377301.243,\n\t  rf: 300.8017,\n\t  ellipseName: \"Everest 1956\"\n\t};\n\n\texports$2.evrst69 = {\n\t  a: 6377295.664,\n\t  rf: 300.8017,\n\t  ellipseName: \"Everest 1969\"\n\t};\n\n\texports$2.evrstSS = {\n\t  a: 6377298.556,\n\t  rf: 300.8017,\n\t  ellipseName: \"Everest (Sabah & Sarawak)\"\n\t};\n\n\texports$2.fschr60 = {\n\t  a: 6378166.0,\n\t  rf: 298.3,\n\t  ellipseName: \"Fischer (Mercury Datum) 1960\"\n\t};\n\n\texports$2.fschr60m = {\n\t  a: 6378155.0,\n\t  rf: 298.3,\n\t  ellipseName: \"Fischer 1960\"\n\t};\n\n\texports$2.fschr68 = {\n\t  a: 6378150.0,\n\t  rf: 298.3,\n\t  ellipseName: \"Fischer 1968\"\n\t};\n\n\texports$2.helmert = {\n\t  a: 6378200.0,\n\t  rf: 298.3,\n\t  ellipseName: \"Helmert 1906\"\n\t};\n\n\texports$2.hough = {\n\t  a: 6378270.0,\n\t  rf: 297.0,\n\t  ellipseName: \"Hough\"\n\t};\n\n\texports$2.intl = {\n\t  a: 6378388.0,\n\t  rf: 297.0,\n\t  ellipseName: \"International 1909 (Hayford)\"\n\t};\n\n\texports$2.kaula = {\n\t  a: 6378163.0,\n\t  rf: 298.24,\n\t  ellipseName: \"Kaula 1961\"\n\t};\n\n\texports$2.lerch = {\n\t  a: 6378139.0,\n\t  rf: 298.257,\n\t  ellipseName: \"Lerch 1979\"\n\t};\n\n\texports$2.mprts = {\n\t  a: 6397300.0,\n\t  rf: 191.0,\n\t  ellipseName: \"Maupertius 1738\"\n\t};\n\n\texports$2.new_intl = {\n\t  a: 6378157.5,\n\t  b: 6356772.2,\n\t  ellipseName: \"New International 1967\"\n\t};\n\n\texports$2.plessis = {\n\t  a: 6376523.0,\n\t  rf: 6355863.0,\n\t  ellipseName: \"Plessis 1817 (France)\"\n\t};\n\n\texports$2.krass = {\n\t  a: 6378245.0,\n\t  rf: 298.3,\n\t  ellipseName: \"Krassovsky, 1942\"\n\t};\n\n\texports$2.SEasia = {\n\t  a: 6378155.0,\n\t  b: 6356773.3205,\n\t  ellipseName: \"Southeast Asia\"\n\t};\n\n\texports$2.walbeck = {\n\t  a: 6376896.0,\n\t  b: 6355834.8467,\n\t  ellipseName: \"Walbeck\"\n\t};\n\n\texports$2.WGS60 = {\n\t  a: 6378165.0,\n\t  rf: 298.3,\n\t  ellipseName: \"WGS 60\"\n\t};\n\n\texports$2.WGS66 = {\n\t  a: 6378145.0,\n\t  rf: 298.25,\n\t  ellipseName: \"WGS 66\"\n\t};\n\n\texports$2.WGS7 = {\n\t  a: 6378135.0,\n\t  rf: 298.26,\n\t  ellipseName: \"WGS 72\"\n\t};\n\n\tvar WGS84 = exports$2.WGS84 = {\n\t  a: 6378137.0,\n\t  rf: 298.257223563,\n\t  ellipseName: \"WGS 84\"\n\t};\n\n\texports$2.sphere = {\n\t  a: 6370997.0,\n\t  b: 6370997.0,\n\t  ellipseName: \"Normal Sphere (r=6370997)\"\n\t};\n\n\tfunction eccentricity(a, b, rf, R_A) {\n\t  var a2 = a * a; // used in geocentric\n\t  var b2 = b * b; // used in geocentric\n\t  var es = (a2 - b2) / a2; // e ^ 2\n\t  var e = 0;\n\t  if (R_A) {\n\t    a *= 1 - es * (SIXTH + es * (RA4 + es * RA6));\n\t    a2 = a * a;\n\t    es = 0;\n\t  } else {\n\t    e = Math.sqrt(es); // eccentricity\n\t  }\n\t  var ep2 = (a2 - b2) / b2; // used in geocentric\n\t  return {\n\t    es: es,\n\t    e: e,\n\t    ep2: ep2\n\t  };\n\t}\n\tfunction sphere(a, b, rf, ellps, sphere) {\n\t  if (!a) { // do we have an ellipsoid?\n\t    var ellipse = match(exports$2, ellps);\n\t    if (!ellipse) {\n\t      ellipse = WGS84;\n\t    }\n\t    a = ellipse.a;\n\t    b = ellipse.b;\n\t    rf = ellipse.rf;\n\t  }\n\n\t  if (rf && !b) {\n\t    b = (1.0 - 1.0 / rf) * a;\n\t  }\n\t  if (rf === 0 || Math.abs(a - b) < EPSLN) {\n\t    sphere = true;\n\t    b = a;\n\t  }\n\t  return {\n\t    a: a,\n\t    b: b,\n\t    rf: rf,\n\t    sphere: sphere\n\t  };\n\t}\n\n\tvar exports$3 = {};\n\texports$3.wgs84 = {\n\t  towgs84: \"0,0,0\",\n\t  ellipse: \"WGS84\",\n\t  datumName: \"WGS84\"\n\t};\n\n\texports$3.ch1903 = {\n\t  towgs84: \"674.374,15.056,405.346\",\n\t  ellipse: \"bessel\",\n\t  datumName: \"swiss\"\n\t};\n\n\texports$3.ggrs87 = {\n\t  towgs84: \"-199.87,74.79,246.62\",\n\t  ellipse: \"GRS80\",\n\t  datumName: \"Greek_Geodetic_Reference_System_1987\"\n\t};\n\n\texports$3.nad83 = {\n\t  towgs84: \"0,0,0\",\n\t  ellipse: \"GRS80\",\n\t  datumName: \"North_American_Datum_1983\"\n\t};\n\n\texports$3.nad27 = {\n\t  nadgrids: \"@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat\",\n\t  ellipse: \"clrk66\",\n\t  datumName: \"North_American_Datum_1927\"\n\t};\n\n\texports$3.potsdam = {\n\t  towgs84: \"606.0,23.0,413.0\",\n\t  ellipse: \"bessel\",\n\t  datumName: \"Potsdam Rauenberg 1950 DHDN\"\n\t};\n\n\texports$3.carthage = {\n\t  towgs84: \"-263.0,6.0,431.0\",\n\t  ellipse: \"clark80\",\n\t  datumName: \"Carthage 1934 Tunisia\"\n\t};\n\n\texports$3.hermannskogel = {\n\t  towgs84: \"653.0,-212.0,449.0\",\n\t  ellipse: \"bessel\",\n\t  datumName: \"Hermannskogel\"\n\t};\n\n\texports$3.ire65 = {\n\t  towgs84: \"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15\",\n\t  ellipse: \"mod_airy\",\n\t  datumName: \"Ireland 1965\"\n\t};\n\n\texports$3.rassadiran = {\n\t  towgs84: \"-133.63,-157.5,-158.62\",\n\t  ellipse: \"intl\",\n\t  datumName: \"Rassadiran\"\n\t};\n\n\texports$3.nzgd49 = {\n\t  towgs84: \"59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993\",\n\t  ellipse: \"intl\",\n\t  datumName: \"New Zealand Geodetic Datum 1949\"\n\t};\n\n\texports$3.osgb36 = {\n\t  towgs84: \"446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894\",\n\t  ellipse: \"airy\",\n\t  datumName: \"Airy 1830\"\n\t};\n\n\texports$3.s_jtsk = {\n\t  towgs84: \"589,76,480\",\n\t  ellipse: 'bessel',\n\t  datumName: 'S-JTSK (Ferro)'\n\t};\n\n\texports$3.beduaram = {\n\t  towgs84: '-106,-87,188',\n\t  ellipse: 'clrk80',\n\t  datumName: 'Beduaram'\n\t};\n\n\texports$3.gunung_segara = {\n\t  towgs84: '-403,684,41',\n\t  ellipse: 'bessel',\n\t  datumName: 'Gunung Segara Jakarta'\n\t};\n\n\texports$3.rnb72 = {\n\t  towgs84: \"106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1\",\n\t  ellipse: \"intl\",\n\t  datumName: \"Reseau National Belge 1972\"\n\t};\n\n\tfunction datum(datumCode, datum_params, a, b, es, ep2) {\n\t  var out = {};\n\n\t  if (datumCode === undefined || datumCode === 'none') {\n\t    out.datum_type = PJD_NODATUM;\n\t  } else {\n\t    out.datum_type = PJD_WGS84;\n\t  }\n\n\t  if (datum_params) {\n\t    out.datum_params = datum_params.map(parseFloat);\n\t    if (out.datum_params[0] !== 0 || out.datum_params[1] !== 0 || out.datum_params[2] !== 0) {\n\t      out.datum_type = PJD_3PARAM;\n\t    }\n\t    if (out.datum_params.length > 3) {\n\t      if (out.datum_params[3] !== 0 || out.datum_params[4] !== 0 || out.datum_params[5] !== 0 || out.datum_params[6] !== 0) {\n\t        out.datum_type = PJD_7PARAM;\n\t        out.datum_params[3] *= SEC_TO_RAD;\n\t        out.datum_params[4] *= SEC_TO_RAD;\n\t        out.datum_params[5] *= SEC_TO_RAD;\n\t        out.datum_params[6] = (out.datum_params[6] / 1000000.0) + 1.0;\n\t      }\n\t    }\n\t  }\n\n\t  out.a = a; //datum object also uses these values\n\t  out.b = b;\n\t  out.es = es;\n\t  out.ep2 = ep2;\n\t  return out;\n\t}\n\n\tfunction Projection$1(srsCode,callback) {\n\t  if (!(this instanceof Projection$1)) {\n\t    return new Projection$1(srsCode);\n\t  }\n\t  callback = callback || function(error){\n\t    if(error){\n\t      throw error;\n\t    }\n\t  };\n\t  var json = parse(srsCode);\n\t  if(typeof json !== 'object'){\n\t    callback(srsCode);\n\t    return;\n\t  }\n\t  var ourProj = Projection$1.projections.get(json.projName);\n\t  if(!ourProj){\n\t    callback(srsCode);\n\t    return;\n\t  }\n\t  if (json.datumCode && json.datumCode !== 'none') {\n\t    var datumDef = match(exports$3, json.datumCode);\n\t    if (datumDef) {\n\t      json.datum_params = datumDef.towgs84 ? datumDef.towgs84.split(',') : null;\n\t      json.ellps = datumDef.ellipse;\n\t      json.datumName = datumDef.datumName ? datumDef.datumName : json.datumCode;\n\t    }\n\t  }\n\t  json.k0 = json.k0 || 1.0;\n\t  json.axis = json.axis || 'enu';\n\t  json.ellps = json.ellps || 'wgs84';\n\t  var sphere_ = sphere(json.a, json.b, json.rf, json.ellps, json.sphere);\n\t  var ecc = eccentricity(sphere_.a, sphere_.b, sphere_.rf, json.R_A);\n\t  var datumObj = json.datum || datum(json.datumCode, json.datum_params, sphere_.a, sphere_.b, ecc.es, ecc.ep2);\n\n\t  extend(this, json); // transfer everything over from the projection because we don't know what we'll need\n\t  extend(this, ourProj); // transfer all the methods from the projection\n\n\t  // copy the 4 things over we calulated in deriveConstants.sphere\n\t  this.a = sphere_.a;\n\t  this.b = sphere_.b;\n\t  this.rf = sphere_.rf;\n\t  this.sphere = sphere_.sphere;\n\n\t  // copy the 3 things we calculated in deriveConstants.eccentricity\n\t  this.es = ecc.es;\n\t  this.e = ecc.e;\n\t  this.ep2 = ecc.ep2;\n\n\t  // add in the datum object\n\t  this.datum = datumObj;\n\n\t  // init the projection\n\t  this.init();\n\n\t  // legecy callback from back in the day when it went to spatialreference.org\n\t  callback(null, this);\n\n\t}\n\tProjection$1.projections = projections;\n\tProjection$1.projections.start();\n\n\tfunction compareDatums(source, dest) {\n\t  if (source.datum_type !== dest.datum_type) {\n\t    return false; // false, datums are not equal\n\t  } else if (source.a !== dest.a || Math.abs(source.es - dest.es) > 0.000000000050) {\n\t    // the tolerance for es is to ensure that GRS80 and WGS84\n\t    // are considered identical\n\t    return false;\n\t  } else if (source.datum_type === PJD_3PARAM) {\n\t    return (source.datum_params[0] === dest.datum_params[0] && source.datum_params[1] === dest.datum_params[1] && source.datum_params[2] === dest.datum_params[2]);\n\t  } else if (source.datum_type === PJD_7PARAM) {\n\t    return (source.datum_params[0] === dest.datum_params[0] && source.datum_params[1] === dest.datum_params[1] && source.datum_params[2] === dest.datum_params[2] && source.datum_params[3] === dest.datum_params[3] && source.datum_params[4] === dest.datum_params[4] && source.datum_params[5] === dest.datum_params[5] && source.datum_params[6] === dest.datum_params[6]);\n\t  } else {\n\t    return true; // datums are equal\n\t  }\n\t} // cs_compare_datums()\n\n\t/*\n\t * The function Convert_Geodetic_To_Geocentric converts geodetic coordinates\n\t * (latitude, longitude, and height) to geocentric coordinates (X, Y, Z),\n\t * according to the current ellipsoid parameters.\n\t *\n\t *    Latitude  : Geodetic latitude in radians                     (input)\n\t *    Longitude : Geodetic longitude in radians                    (input)\n\t *    Height    : Geodetic height, in meters                       (input)\n\t *    X         : Calculated Geocentric X coordinate, in meters    (output)\n\t *    Y         : Calculated Geocentric Y coordinate, in meters    (output)\n\t *    Z         : Calculated Geocentric Z coordinate, in meters    (output)\n\t *\n\t */\n\tfunction geodeticToGeocentric(p, es, a) {\n\t  var Longitude = p.x;\n\t  var Latitude = p.y;\n\t  var Height = p.z ? p.z : 0; //Z value not always supplied\n\n\t  var Rn; /*  Earth radius at location  */\n\t  var Sin_Lat; /*  Math.sin(Latitude)  */\n\t  var Sin2_Lat; /*  Square of Math.sin(Latitude)  */\n\t  var Cos_Lat; /*  Math.cos(Latitude)  */\n\n\t  /*\n\t   ** Don't blow up if Latitude is just a little out of the value\n\t   ** range as it may just be a rounding issue.  Also removed longitude\n\t   ** test, it should be wrapped by Math.cos() and Math.sin().  NFW for PROJ.4, Sep/2001.\n\t   */\n\t  if (Latitude < -HALF_PI && Latitude > -1.001 * HALF_PI) {\n\t    Latitude = -HALF_PI;\n\t  } else if (Latitude > HALF_PI && Latitude < 1.001 * HALF_PI) {\n\t    Latitude = HALF_PI;\n\t  } else if ((Latitude < -HALF_PI) || (Latitude > HALF_PI)) {\n\t    /* Latitude out of range */\n\t    //..reportError('geocent:lat out of range:' + Latitude);\n\t    return null;\n\t  }\n\n\t  if (Longitude > Math.PI) {\n\t    Longitude -= (2 * Math.PI);\n\t  }\n\t  Sin_Lat = Math.sin(Latitude);\n\t  Cos_Lat = Math.cos(Latitude);\n\t  Sin2_Lat = Sin_Lat * Sin_Lat;\n\t  Rn = a / (Math.sqrt(1.0e0 - es * Sin2_Lat));\n\t  return {\n\t    x: (Rn + Height) * Cos_Lat * Math.cos(Longitude),\n\t    y: (Rn + Height) * Cos_Lat * Math.sin(Longitude),\n\t    z: ((Rn * (1 - es)) + Height) * Sin_Lat\n\t  };\n\t} // cs_geodetic_to_geocentric()\n\n\tfunction geocentricToGeodetic(p, es, a, b) {\n\t  /* local defintions and variables */\n\t  /* end-criterium of loop, accuracy of sin(Latitude) */\n\t  var genau = 1e-12;\n\t  var genau2 = (genau * genau);\n\t  var maxiter = 30;\n\n\t  var P; /* distance between semi-minor axis and location */\n\t  var RR; /* distance between center and location */\n\t  var CT; /* sin of geocentric latitude */\n\t  var ST; /* cos of geocentric latitude */\n\t  var RX;\n\t  var RK;\n\t  var RN; /* Earth radius at location */\n\t  var CPHI0; /* cos of start or old geodetic latitude in iterations */\n\t  var SPHI0; /* sin of start or old geodetic latitude in iterations */\n\t  var CPHI; /* cos of searched geodetic latitude */\n\t  var SPHI; /* sin of searched geodetic latitude */\n\t  var SDPHI; /* end-criterium: addition-theorem of sin(Latitude(iter)-Latitude(iter-1)) */\n\t  var iter; /* # of continous iteration, max. 30 is always enough (s.a.) */\n\n\t  var X = p.x;\n\t  var Y = p.y;\n\t  var Z = p.z ? p.z : 0.0; //Z value not always supplied\n\t  var Longitude;\n\t  var Latitude;\n\t  var Height;\n\n\t  P = Math.sqrt(X * X + Y * Y);\n\t  RR = Math.sqrt(X * X + Y * Y + Z * Z);\n\n\t  /*      special cases for latitude and longitude */\n\t  if (P / a < genau) {\n\n\t    /*  special case, if P=0. (X=0., Y=0.) */\n\t    Longitude = 0.0;\n\n\t    /*  if (X,Y,Z)=(0.,0.,0.) then Height becomes semi-minor axis\n\t     *  of ellipsoid (=center of mass), Latitude becomes PI/2 */\n\t    if (RR / a < genau) {\n\t      Latitude = HALF_PI;\n\t      Height = -b;\n\t      return {\n\t        x: p.x,\n\t        y: p.y,\n\t        z: p.z\n\t      };\n\t    }\n\t  } else {\n\t    /*  ellipsoidal (geodetic) longitude\n\t     *  interval: -PI < Longitude <= +PI */\n\t    Longitude = Math.atan2(Y, X);\n\t  }\n\n\t  /* --------------------------------------------------------------\n\t   * Following iterative algorithm was developped by\n\t   * \"Institut for Erdmessung\", University of Hannover, July 1988.\n\t   * Internet: www.ife.uni-hannover.de\n\t   * Iterative computation of CPHI,SPHI and Height.\n\t   * Iteration of CPHI and SPHI to 10**-12 radian resp.\n\t   * 2*10**-7 arcsec.\n\t   * --------------------------------------------------------------\n\t   */\n\t  CT = Z / RR;\n\t  ST = P / RR;\n\t  RX = 1.0 / Math.sqrt(1.0 - es * (2.0 - es) * ST * ST);\n\t  CPHI0 = ST * (1.0 - es) * RX;\n\t  SPHI0 = CT * RX;\n\t  iter = 0;\n\n\t  /* loop to find sin(Latitude) resp. Latitude\n\t   * until |sin(Latitude(iter)-Latitude(iter-1))| < genau */\n\t  do {\n\t    iter++;\n\t    RN = a / Math.sqrt(1.0 - es * SPHI0 * SPHI0);\n\n\t    /*  ellipsoidal (geodetic) height */\n\t    Height = P * CPHI0 + Z * SPHI0 - RN * (1.0 - es * SPHI0 * SPHI0);\n\n\t    RK = es * RN / (RN + Height);\n\t    RX = 1.0 / Math.sqrt(1.0 - RK * (2.0 - RK) * ST * ST);\n\t    CPHI = ST * (1.0 - RK) * RX;\n\t    SPHI = CT * RX;\n\t    SDPHI = SPHI * CPHI0 - CPHI * SPHI0;\n\t    CPHI0 = CPHI;\n\t    SPHI0 = SPHI;\n\t  }\n\t  while (SDPHI * SDPHI > genau2 && iter < maxiter);\n\n\t  /*      ellipsoidal (geodetic) latitude */\n\t  Latitude = Math.atan(SPHI / Math.abs(CPHI));\n\t  return {\n\t    x: Longitude,\n\t    y: Latitude,\n\t    z: Height\n\t  };\n\t} // cs_geocentric_to_geodetic()\n\n\t/****************************************************************/\n\t// pj_geocentic_to_wgs84( p )\n\t//  p = point to transform in geocentric coordinates (x,y,z)\n\n\n\t/** point object, nothing fancy, just allows values to be\n\t    passed back and forth by reference rather than by value.\n\t    Other point classes may be used as long as they have\n\t    x and y properties, which will get modified in the transform method.\n\t*/\n\tfunction geocentricToWgs84(p, datum_type, datum_params) {\n\n\t  if (datum_type === PJD_3PARAM) {\n\t    // if( x[io] === HUGE_VAL )\n\t    //    continue;\n\t    return {\n\t      x: p.x + datum_params[0],\n\t      y: p.y + datum_params[1],\n\t      z: p.z + datum_params[2],\n\t    };\n\t  } else if (datum_type === PJD_7PARAM) {\n\t    var Dx_BF = datum_params[0];\n\t    var Dy_BF = datum_params[1];\n\t    var Dz_BF = datum_params[2];\n\t    var Rx_BF = datum_params[3];\n\t    var Ry_BF = datum_params[4];\n\t    var Rz_BF = datum_params[5];\n\t    var M_BF = datum_params[6];\n\t    // if( x[io] === HUGE_VAL )\n\t    //    continue;\n\t    return {\n\t      x: M_BF * (p.x - Rz_BF * p.y + Ry_BF * p.z) + Dx_BF,\n\t      y: M_BF * (Rz_BF * p.x + p.y - Rx_BF * p.z) + Dy_BF,\n\t      z: M_BF * (-Ry_BF * p.x + Rx_BF * p.y + p.z) + Dz_BF\n\t    };\n\t  }\n\t} // cs_geocentric_to_wgs84\n\n\t/****************************************************************/\n\t// pj_geocentic_from_wgs84()\n\t//  coordinate system definition,\n\t//  point to transform in geocentric coordinates (x,y,z)\n\tfunction geocentricFromWgs84(p, datum_type, datum_params) {\n\n\t  if (datum_type === PJD_3PARAM) {\n\t    //if( x[io] === HUGE_VAL )\n\t    //    continue;\n\t    return {\n\t      x: p.x - datum_params[0],\n\t      y: p.y - datum_params[1],\n\t      z: p.z - datum_params[2],\n\t    };\n\n\t  } else if (datum_type === PJD_7PARAM) {\n\t    var Dx_BF = datum_params[0];\n\t    var Dy_BF = datum_params[1];\n\t    var Dz_BF = datum_params[2];\n\t    var Rx_BF = datum_params[3];\n\t    var Ry_BF = datum_params[4];\n\t    var Rz_BF = datum_params[5];\n\t    var M_BF = datum_params[6];\n\t    var x_tmp = (p.x - Dx_BF) / M_BF;\n\t    var y_tmp = (p.y - Dy_BF) / M_BF;\n\t    var z_tmp = (p.z - Dz_BF) / M_BF;\n\t    //if( x[io] === HUGE_VAL )\n\t    //    continue;\n\n\t    return {\n\t      x: x_tmp + Rz_BF * y_tmp - Ry_BF * z_tmp,\n\t      y: -Rz_BF * x_tmp + y_tmp + Rx_BF * z_tmp,\n\t      z: Ry_BF * x_tmp - Rx_BF * y_tmp + z_tmp\n\t    };\n\t  } //cs_geocentric_from_wgs84()\n\t}\n\n\tfunction checkParams(type) {\n\t  return (type === PJD_3PARAM || type === PJD_7PARAM);\n\t}\n\n\tvar datum_transform = function(source, dest, point) {\n\t  // Short cut if the datums are identical.\n\t  if (compareDatums(source, dest)) {\n\t    return point; // in this case, zero is sucess,\n\t    // whereas cs_compare_datums returns 1 to indicate TRUE\n\t    // confusing, should fix this\n\t  }\n\n\t  // Explicitly skip datum transform by setting 'datum=none' as parameter for either source or dest\n\t  if (source.datum_type === PJD_NODATUM || dest.datum_type === PJD_NODATUM) {\n\t    return point;\n\t  }\n\n\t  // If this datum requires grid shifts, then apply it to geodetic coordinates.\n\n\t  // Do we need to go through geocentric coordinates?\n\t  if (source.es === dest.es && source.a === dest.a && !checkParams(source.datum_type) &&  !checkParams(dest.datum_type)) {\n\t    return point;\n\t  }\n\n\t  // Convert to geocentric coordinates.\n\t  point = geodeticToGeocentric(point, source.es, source.a);\n\t  // Convert between datums\n\t  if (checkParams(source.datum_type)) {\n\t    point = geocentricToWgs84(point, source.datum_type, source.datum_params);\n\t  }\n\t  if (checkParams(dest.datum_type)) {\n\t    point = geocentricFromWgs84(point, dest.datum_type, dest.datum_params);\n\t  }\n\t  return geocentricToGeodetic(point, dest.es, dest.a, dest.b);\n\n\t};\n\n\tvar adjust_axis = function(crs, denorm, point) {\n\t  var xin = point.x,\n\t    yin = point.y,\n\t    zin = point.z || 0.0;\n\t  var v, t, i;\n\t  var out = {};\n\t  for (i = 0; i < 3; i++) {\n\t    if (denorm && i === 2 && point.z === undefined) {\n\t      continue;\n\t    }\n\t    if (i === 0) {\n\t      v = xin;\n\t      t = 'x';\n\t    }\n\t    else if (i === 1) {\n\t      v = yin;\n\t      t = 'y';\n\t    }\n\t    else {\n\t      v = zin;\n\t      t = 'z';\n\t    }\n\t    switch (crs.axis[i]) {\n\t    case 'e':\n\t      out[t] = v;\n\t      break;\n\t    case 'w':\n\t      out[t] = -v;\n\t      break;\n\t    case 'n':\n\t      out[t] = v;\n\t      break;\n\t    case 's':\n\t      out[t] = -v;\n\t      break;\n\t    case 'u':\n\t      if (point[t] !== undefined) {\n\t        out.z = v;\n\t      }\n\t      break;\n\t    case 'd':\n\t      if (point[t] !== undefined) {\n\t        out.z = -v;\n\t      }\n\t      break;\n\t    default:\n\t      //console.log(\"ERROR: unknow axis (\"+crs.axis[i]+\") - check definition of \"+crs.projName);\n\t      return null;\n\t    }\n\t  }\n\t  return out;\n\t};\n\n\tvar toPoint = function (array){\n\t  var out = {\n\t    x: array[0],\n\t    y: array[1]\n\t  };\n\t  if (array.length>2) {\n\t    out.z = array[2];\n\t  }\n\t  if (array.length>3) {\n\t    out.m = array[3];\n\t  }\n\t  return out;\n\t};\n\n\tfunction checkNotWGS(source, dest) {\n\t  return ((source.datum.datum_type === PJD_3PARAM || source.datum.datum_type === PJD_7PARAM) && dest.datumCode !== 'WGS84') || ((dest.datum.datum_type === PJD_3PARAM || dest.datum.datum_type === PJD_7PARAM) && source.datumCode !== 'WGS84');\n\t}\n\n\tfunction transform(source, dest, point) {\n\t  var wgs84;\n\t  if (Array.isArray(point)) {\n\t    point = toPoint(point);\n\t  }\n\n\t  // Workaround for datum shifts towgs84, if either source or destination projection is not wgs84\n\t  if (source.datum && dest.datum && checkNotWGS(source, dest)) {\n\t    wgs84 = new Projection$1('WGS84');\n\t    point = transform(source, wgs84, point);\n\t    source = wgs84;\n\t  }\n\t  // DGR, 2010/11/12\n\t  if (source.axis !== 'enu') {\n\t    point = adjust_axis(source, false, point);\n\t  }\n\t  // Transform source points to long/lat, if they aren't already.\n\t  if (source.projName === 'longlat') {\n\t    point = {\n\t      x: point.x * D2R,\n\t      y: point.y * D2R\n\t    };\n\t  }\n\t  else {\n\t    if (source.to_meter) {\n\t      point = {\n\t        x: point.x * source.to_meter,\n\t        y: point.y * source.to_meter\n\t      };\n\t    }\n\t    point = source.inverse(point); // Convert Cartesian to longlat\n\t  }\n\t  // Adjust for the prime meridian if necessary\n\t  if (source.from_greenwich) {\n\t    point.x += source.from_greenwich;\n\t  }\n\n\t  // Convert datums if needed, and if possible.\n\t  point = datum_transform(source.datum, dest.datum, point);\n\n\t  // Adjust for the prime meridian if necessary\n\t  if (dest.from_greenwich) {\n\t    point = {\n\t      x: point.x - dest.from_greenwich,\n\t      y: point.y\n\t    };\n\t  }\n\n\t  if (dest.projName === 'longlat') {\n\t    // convert radians to decimal degrees\n\t    point = {\n\t      x: point.x * R2D,\n\t      y: point.y * R2D\n\t    };\n\t  } else { // else project\n\t    point = dest.forward(point);\n\t    if (dest.to_meter) {\n\t      point = {\n\t        x: point.x / dest.to_meter,\n\t        y: point.y / dest.to_meter\n\t      };\n\t    }\n\t  }\n\n\t  // DGR, 2010/11/12\n\t  if (dest.axis !== 'enu') {\n\t    return adjust_axis(dest, true, point);\n\t  }\n\n\t  return point;\n\t}\n\n\tvar wgs84 = Projection$1('WGS84');\n\n\tfunction transformer(from, to, coords) {\n\t  var transformedArray;\n\t  if (Array.isArray(coords)) {\n\t    transformedArray = transform(from, to, coords);\n\t    if (coords.length === 3) {\n\t      return [transformedArray.x, transformedArray.y, transformedArray.z];\n\t    }\n\t    else {\n\t      return [transformedArray.x, transformedArray.y];\n\t    }\n\t  }\n\t  else {\n\t    return transform(from, to, coords);\n\t  }\n\t}\n\n\tfunction checkProj(item) {\n\t  if (item instanceof Projection$1) {\n\t    return item;\n\t  }\n\t  if (item.oProj) {\n\t    return item.oProj;\n\t  }\n\t  return Projection$1(item);\n\t}\n\tfunction proj4$1(fromProj, toProj, coord) {\n\t  fromProj = checkProj(fromProj);\n\t  var single = false;\n\t  var obj;\n\t  if (typeof toProj === 'undefined') {\n\t    toProj = fromProj;\n\t    fromProj = wgs84;\n\t    single = true;\n\t  }\n\t  else if (typeof toProj.x !== 'undefined' || Array.isArray(toProj)) {\n\t    coord = toProj;\n\t    toProj = fromProj;\n\t    fromProj = wgs84;\n\t    single = true;\n\t  }\n\t  toProj = checkProj(toProj);\n\t  if (coord) {\n\t    return transformer(fromProj, toProj, coord);\n\t  }\n\t  else {\n\t    obj = {\n\t      forward: function(coords) {\n\t        return transformer(fromProj, toProj, coords);\n\t      },\n\t      inverse: function(coords) {\n\t        return transformer(toProj, fromProj, coords);\n\t      }\n\t    };\n\t    if (single) {\n\t      obj.oProj = toProj;\n\t    }\n\t    return obj;\n\t  }\n\t}\n\n\t/**\n\t * UTM zones are grouped, and assigned to one of a group of 6\n\t * sets.\n\t *\n\t * {int} @private\n\t */\n\tvar NUM_100K_SETS = 6;\n\n\t/**\n\t * The column letters (for easting) of the lower left value, per\n\t * set.\n\t *\n\t * {string} @private\n\t */\n\tvar SET_ORIGIN_COLUMN_LETTERS = 'AJSAJS';\n\n\t/**\n\t * The row letters (for northing) of the lower left value, per\n\t * set.\n\t *\n\t * {string} @private\n\t */\n\tvar SET_ORIGIN_ROW_LETTERS = 'AFAFAF';\n\n\tvar A = 65; // A\n\tvar I = 73; // I\n\tvar O = 79; // O\n\tvar V = 86; // V\n\tvar Z = 90; // Z\n\tvar mgrs = {\n\t  forward: forward$1,\n\t  inverse: inverse$1,\n\t  toPoint: toPoint$1\n\t};\n\t/**\n\t * Conversion of lat/lon to MGRS.\n\t *\n\t * @param {object} ll Object literal with lat and lon properties on a\n\t *     WGS84 ellipsoid.\n\t * @param {int} accuracy Accuracy in digits (5 for 1 m, 4 for 10 m, 3 for\n\t *      100 m, 2 for 1000 m or 1 for 10000 m). Optional, default is 5.\n\t * @return {string} the MGRS string for the given location and accuracy.\n\t */\n\tfunction forward$1(ll, accuracy) {\n\t  accuracy = accuracy || 5; // default accuracy 1m\n\t  return encode(LLtoUTM({\n\t    lat: ll[1],\n\t    lon: ll[0]\n\t  }), accuracy);\n\t}\n\n\t/**\n\t * Conversion of MGRS to lat/lon.\n\t *\n\t * @param {string} mgrs MGRS string.\n\t * @return {array} An array with left (longitude), bottom (latitude), right\n\t *     (longitude) and top (latitude) values in WGS84, representing the\n\t *     bounding box for the provided MGRS reference.\n\t */\n\tfunction inverse$1(mgrs) {\n\t  var bbox = UTMtoLL(decode(mgrs.toUpperCase()));\n\t  if (bbox.lat && bbox.lon) {\n\t    return [bbox.lon, bbox.lat, bbox.lon, bbox.lat];\n\t  }\n\t  return [bbox.left, bbox.bottom, bbox.right, bbox.top];\n\t}\n\n\tfunction toPoint$1(mgrs) {\n\t  var bbox = UTMtoLL(decode(mgrs.toUpperCase()));\n\t  if (bbox.lat && bbox.lon) {\n\t    return [bbox.lon, bbox.lat];\n\t  }\n\t  return [(bbox.left + bbox.right) / 2, (bbox.top + bbox.bottom) / 2];\n\t}\n\t/**\n\t * Conversion from degrees to radians.\n\t *\n\t * @private\n\t * @param {number} deg the angle in degrees.\n\t * @return {number} the angle in radians.\n\t */\n\tfunction degToRad(deg) {\n\t  return (deg * (Math.PI / 180.0));\n\t}\n\n\t/**\n\t * Conversion from radians to degrees.\n\t *\n\t * @private\n\t * @param {number} rad the angle in radians.\n\t * @return {number} the angle in degrees.\n\t */\n\tfunction radToDeg(rad) {\n\t  return (180.0 * (rad / Math.PI));\n\t}\n\n\t/**\n\t * Converts a set of Longitude and Latitude co-ordinates to UTM\n\t * using the WGS84 ellipsoid.\n\t *\n\t * @private\n\t * @param {object} ll Object literal with lat and lon properties\n\t *     representing the WGS84 coordinate to be converted.\n\t * @return {object} Object literal containing the UTM value with easting,\n\t *     northing, zoneNumber and zoneLetter properties, and an optional\n\t *     accuracy property in digits. Returns null if the conversion failed.\n\t */\n\tfunction LLtoUTM(ll) {\n\t  var Lat = ll.lat;\n\t  var Long = ll.lon;\n\t  var a = 6378137.0; //ellip.radius;\n\t  var eccSquared = 0.00669438; //ellip.eccsq;\n\t  var k0 = 0.9996;\n\t  var LongOrigin;\n\t  var eccPrimeSquared;\n\t  var N, T, C, A, M;\n\t  var LatRad = degToRad(Lat);\n\t  var LongRad = degToRad(Long);\n\t  var LongOriginRad;\n\t  var ZoneNumber;\n\t  // (int)\n\t  ZoneNumber = Math.floor((Long + 180) / 6) + 1;\n\n\t  //Make sure the longitude 180.00 is in Zone 60\n\t  if (Long === 180) {\n\t    ZoneNumber = 60;\n\t  }\n\n\t  // Special zone for Norway\n\t  if (Lat >= 56.0 && Lat < 64.0 && Long >= 3.0 && Long < 12.0) {\n\t    ZoneNumber = 32;\n\t  }\n\n\t  // Special zones for Svalbard\n\t  if (Lat >= 72.0 && Lat < 84.0) {\n\t    if (Long >= 0.0 && Long < 9.0) {\n\t      ZoneNumber = 31;\n\t    }\n\t    else if (Long >= 9.0 && Long < 21.0) {\n\t      ZoneNumber = 33;\n\t    }\n\t    else if (Long >= 21.0 && Long < 33.0) {\n\t      ZoneNumber = 35;\n\t    }\n\t    else if (Long >= 33.0 && Long < 42.0) {\n\t      ZoneNumber = 37;\n\t    }\n\t  }\n\n\t  LongOrigin = (ZoneNumber - 1) * 6 - 180 + 3; //+3 puts origin\n\t  // in middle of\n\t  // zone\n\t  LongOriginRad = degToRad(LongOrigin);\n\n\t  eccPrimeSquared = (eccSquared) / (1 - eccSquared);\n\n\t  N = a / Math.sqrt(1 - eccSquared * Math.sin(LatRad) * Math.sin(LatRad));\n\t  T = Math.tan(LatRad) * Math.tan(LatRad);\n\t  C = eccPrimeSquared * Math.cos(LatRad) * Math.cos(LatRad);\n\t  A = Math.cos(LatRad) * (LongRad - LongOriginRad);\n\n\t  M = a * ((1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256) * LatRad - (3 * eccSquared / 8 + 3 * eccSquared * eccSquared / 32 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(2 * LatRad) + (15 * eccSquared * eccSquared / 256 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(4 * LatRad) - (35 * eccSquared * eccSquared * eccSquared / 3072) * Math.sin(6 * LatRad));\n\n\t  var UTMEasting = (k0 * N * (A + (1 - T + C) * A * A * A / 6.0 + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * A * A * A * A * A / 120.0) + 500000.0);\n\n\t  var UTMNorthing = (k0 * (M + N * Math.tan(LatRad) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24.0 + (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared) * A * A * A * A * A * A / 720.0)));\n\t  if (Lat < 0.0) {\n\t    UTMNorthing += 10000000.0; //10000000 meter offset for\n\t    // southern hemisphere\n\t  }\n\n\t  return {\n\t    northing: Math.round(UTMNorthing),\n\t    easting: Math.round(UTMEasting),\n\t    zoneNumber: ZoneNumber,\n\t    zoneLetter: getLetterDesignator(Lat)\n\t  };\n\t}\n\n\t/**\n\t * Converts UTM coords to lat/long, using the WGS84 ellipsoid. This is a convenience\n\t * class where the Zone can be specified as a single string eg.\"60N\" which\n\t * is then broken down into the ZoneNumber and ZoneLetter.\n\t *\n\t * @private\n\t * @param {object} utm An object literal with northing, easting, zoneNumber\n\t *     and zoneLetter properties. If an optional accuracy property is\n\t *     provided (in meters), a bounding box will be returned instead of\n\t *     latitude and longitude.\n\t * @return {object} An object literal containing either lat and lon values\n\t *     (if no accuracy was provided), or top, right, bottom and left values\n\t *     for the bounding box calculated according to the provided accuracy.\n\t *     Returns null if the conversion failed.\n\t */\n\tfunction UTMtoLL(utm) {\n\n\t  var UTMNorthing = utm.northing;\n\t  var UTMEasting = utm.easting;\n\t  var zoneLetter = utm.zoneLetter;\n\t  var zoneNumber = utm.zoneNumber;\n\t  // check the ZoneNummber is valid\n\t  if (zoneNumber < 0 || zoneNumber > 60) {\n\t    return null;\n\t  }\n\n\t  var k0 = 0.9996;\n\t  var a = 6378137.0; //ellip.radius;\n\t  var eccSquared = 0.00669438; //ellip.eccsq;\n\t  var eccPrimeSquared;\n\t  var e1 = (1 - Math.sqrt(1 - eccSquared)) / (1 + Math.sqrt(1 - eccSquared));\n\t  var N1, T1, C1, R1, D, M;\n\t  var LongOrigin;\n\t  var mu, phi1Rad;\n\n\t  // remove 500,000 meter offset for longitude\n\t  var x = UTMEasting - 500000.0;\n\t  var y = UTMNorthing;\n\n\t  // We must know somehow if we are in the Northern or Southern\n\t  // hemisphere, this is the only time we use the letter So even\n\t  // if the Zone letter isn't exactly correct it should indicate\n\t  // the hemisphere correctly\n\t  if (zoneLetter < 'N') {\n\t    y -= 10000000.0; // remove 10,000,000 meter offset used\n\t    // for southern hemisphere\n\t  }\n\n\t  // There are 60 zones with zone 1 being at West -180 to -174\n\t  LongOrigin = (zoneNumber - 1) * 6 - 180 + 3; // +3 puts origin\n\t  // in middle of\n\t  // zone\n\n\t  eccPrimeSquared = (eccSquared) / (1 - eccSquared);\n\n\t  M = y / k0;\n\t  mu = M / (a * (1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256));\n\n\t  phi1Rad = mu + (3 * e1 / 2 - 27 * e1 * e1 * e1 / 32) * Math.sin(2 * mu) + (21 * e1 * e1 / 16 - 55 * e1 * e1 * e1 * e1 / 32) * Math.sin(4 * mu) + (151 * e1 * e1 * e1 / 96) * Math.sin(6 * mu);\n\t  // double phi1 = ProjMath.radToDeg(phi1Rad);\n\n\t  N1 = a / Math.sqrt(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad));\n\t  T1 = Math.tan(phi1Rad) * Math.tan(phi1Rad);\n\t  C1 = eccPrimeSquared * Math.cos(phi1Rad) * Math.cos(phi1Rad);\n\t  R1 = a * (1 - eccSquared) / Math.pow(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad), 1.5);\n\t  D = x / (N1 * k0);\n\n\t  var lat = phi1Rad - (N1 * Math.tan(phi1Rad) / R1) * (D * D / 2 - (5 + 3 * T1 + 10 * C1 - 4 * C1 * C1 - 9 * eccPrimeSquared) * D * D * D * D / 24 + (61 + 90 * T1 + 298 * C1 + 45 * T1 * T1 - 252 * eccPrimeSquared - 3 * C1 * C1) * D * D * D * D * D * D / 720);\n\t  lat = radToDeg(lat);\n\n\t  var lon = (D - (1 + 2 * T1 + C1) * D * D * D / 6 + (5 - 2 * C1 + 28 * T1 - 3 * C1 * C1 + 8 * eccPrimeSquared + 24 * T1 * T1) * D * D * D * D * D / 120) / Math.cos(phi1Rad);\n\t  lon = LongOrigin + radToDeg(lon);\n\n\t  var result;\n\t  if (utm.accuracy) {\n\t    var topRight = UTMtoLL({\n\t      northing: utm.northing + utm.accuracy,\n\t      easting: utm.easting + utm.accuracy,\n\t      zoneLetter: utm.zoneLetter,\n\t      zoneNumber: utm.zoneNumber\n\t    });\n\t    result = {\n\t      top: topRight.lat,\n\t      right: topRight.lon,\n\t      bottom: lat,\n\t      left: lon\n\t    };\n\t  }\n\t  else {\n\t    result = {\n\t      lat: lat,\n\t      lon: lon\n\t    };\n\t  }\n\t  return result;\n\t}\n\n\t/**\n\t * Calculates the MGRS letter designator for the given latitude.\n\t *\n\t * @private\n\t * @param {number} lat The latitude in WGS84 to get the letter designator\n\t *     for.\n\t * @return {char} The letter designator.\n\t */\n\tfunction getLetterDesignator(lat) {\n\t  //This is here as an error flag to show that the Latitude is\n\t  //outside MGRS limits\n\t  var LetterDesignator = 'Z';\n\n\t  if ((84 >= lat) && (lat >= 72)) {\n\t    LetterDesignator = 'X';\n\t  }\n\t  else if ((72 > lat) && (lat >= 64)) {\n\t    LetterDesignator = 'W';\n\t  }\n\t  else if ((64 > lat) && (lat >= 56)) {\n\t    LetterDesignator = 'V';\n\t  }\n\t  else if ((56 > lat) && (lat >= 48)) {\n\t    LetterDesignator = 'U';\n\t  }\n\t  else if ((48 > lat) && (lat >= 40)) {\n\t    LetterDesignator = 'T';\n\t  }\n\t  else if ((40 > lat) && (lat >= 32)) {\n\t    LetterDesignator = 'S';\n\t  }\n\t  else if ((32 > lat) && (lat >= 24)) {\n\t    LetterDesignator = 'R';\n\t  }\n\t  else if ((24 > lat) && (lat >= 16)) {\n\t    LetterDesignator = 'Q';\n\t  }\n\t  else if ((16 > lat) && (lat >= 8)) {\n\t    LetterDesignator = 'P';\n\t  }\n\t  else if ((8 > lat) && (lat >= 0)) {\n\t    LetterDesignator = 'N';\n\t  }\n\t  else if ((0 > lat) && (lat >= -8)) {\n\t    LetterDesignator = 'M';\n\t  }\n\t  else if ((-8 > lat) && (lat >= -16)) {\n\t    LetterDesignator = 'L';\n\t  }\n\t  else if ((-16 > lat) && (lat >= -24)) {\n\t    LetterDesignator = 'K';\n\t  }\n\t  else if ((-24 > lat) && (lat >= -32)) {\n\t    LetterDesignator = 'J';\n\t  }\n\t  else if ((-32 > lat) && (lat >= -40)) {\n\t    LetterDesignator = 'H';\n\t  }\n\t  else if ((-40 > lat) && (lat >= -48)) {\n\t    LetterDesignator = 'G';\n\t  }\n\t  else if ((-48 > lat) && (lat >= -56)) {\n\t    LetterDesignator = 'F';\n\t  }\n\t  else if ((-56 > lat) && (lat >= -64)) {\n\t    LetterDesignator = 'E';\n\t  }\n\t  else if ((-64 > lat) && (lat >= -72)) {\n\t    LetterDesignator = 'D';\n\t  }\n\t  else if ((-72 > lat) && (lat >= -80)) {\n\t    LetterDesignator = 'C';\n\t  }\n\t  return LetterDesignator;\n\t}\n\n\t/**\n\t * Encodes a UTM location as MGRS string.\n\t *\n\t * @private\n\t * @param {object} utm An object literal with easting, northing,\n\t *     zoneLetter, zoneNumber\n\t * @param {number} accuracy Accuracy in digits (1-5).\n\t * @return {string} MGRS string for the given UTM location.\n\t */\n\tfunction encode(utm, accuracy) {\n\t  // prepend with leading zeroes\n\t  var seasting = \"00000\" + utm.easting,\n\t    snorthing = \"00000\" + utm.northing;\n\n\t  return utm.zoneNumber + utm.zoneLetter + get100kID(utm.easting, utm.northing, utm.zoneNumber) + seasting.substr(seasting.length - 5, accuracy) + snorthing.substr(snorthing.length - 5, accuracy);\n\t}\n\n\t/**\n\t * Get the two letter 100k designator for a given UTM easting,\n\t * northing and zone number value.\n\t *\n\t * @private\n\t * @param {number} easting\n\t * @param {number} northing\n\t * @param {number} zoneNumber\n\t * @return the two letter 100k designator for the given UTM location.\n\t */\n\tfunction get100kID(easting, northing, zoneNumber) {\n\t  var setParm = get100kSetForZone(zoneNumber);\n\t  var setColumn = Math.floor(easting / 100000);\n\t  var setRow = Math.floor(northing / 100000) % 20;\n\t  return getLetter100kID(setColumn, setRow, setParm);\n\t}\n\n\t/**\n\t * Given a UTM zone number, figure out the MGRS 100K set it is in.\n\t *\n\t * @private\n\t * @param {number} i An UTM zone number.\n\t * @return {number} the 100k set the UTM zone is in.\n\t */\n\tfunction get100kSetForZone(i) {\n\t  var setParm = i % NUM_100K_SETS;\n\t  if (setParm === 0) {\n\t    setParm = NUM_100K_SETS;\n\t  }\n\n\t  return setParm;\n\t}\n\n\t/**\n\t * Get the two-letter MGRS 100k designator given information\n\t * translated from the UTM northing, easting and zone number.\n\t *\n\t * @private\n\t * @param {number} column the column index as it relates to the MGRS\n\t *        100k set spreadsheet, created from the UTM easting.\n\t *        Values are 1-8.\n\t * @param {number} row the row index as it relates to the MGRS 100k set\n\t *        spreadsheet, created from the UTM northing value. Values\n\t *        are from 0-19.\n\t * @param {number} parm the set block, as it relates to the MGRS 100k set\n\t *        spreadsheet, created from the UTM zone. Values are from\n\t *        1-60.\n\t * @return two letter MGRS 100k code.\n\t */\n\tfunction getLetter100kID(column, row, parm) {\n\t  // colOrigin and rowOrigin are the letters at the origin of the set\n\t  var index = parm - 1;\n\t  var colOrigin = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(index);\n\t  var rowOrigin = SET_ORIGIN_ROW_LETTERS.charCodeAt(index);\n\n\t  // colInt and rowInt are the letters to build to return\n\t  var colInt = colOrigin + column - 1;\n\t  var rowInt = rowOrigin + row;\n\t  var rollover = false;\n\n\t  if (colInt > Z) {\n\t    colInt = colInt - Z + A - 1;\n\t    rollover = true;\n\t  }\n\n\t  if (colInt === I || (colOrigin < I && colInt > I) || ((colInt > I || colOrigin < I) && rollover)) {\n\t    colInt++;\n\t  }\n\n\t  if (colInt === O || (colOrigin < O && colInt > O) || ((colInt > O || colOrigin < O) && rollover)) {\n\t    colInt++;\n\n\t    if (colInt === I) {\n\t      colInt++;\n\t    }\n\t  }\n\n\t  if (colInt > Z) {\n\t    colInt = colInt - Z + A - 1;\n\t  }\n\n\t  if (rowInt > V) {\n\t    rowInt = rowInt - V + A - 1;\n\t    rollover = true;\n\t  }\n\t  else {\n\t    rollover = false;\n\t  }\n\n\t  if (((rowInt === I) || ((rowOrigin < I) && (rowInt > I))) || (((rowInt > I) || (rowOrigin < I)) && rollover)) {\n\t    rowInt++;\n\t  }\n\n\t  if (((rowInt === O) || ((rowOrigin < O) && (rowInt > O))) || (((rowInt > O) || (rowOrigin < O)) && rollover)) {\n\t    rowInt++;\n\n\t    if (rowInt === I) {\n\t      rowInt++;\n\t    }\n\t  }\n\n\t  if (rowInt > V) {\n\t    rowInt = rowInt - V + A - 1;\n\t  }\n\n\t  var twoLetter = String.fromCharCode(colInt) + String.fromCharCode(rowInt);\n\t  return twoLetter;\n\t}\n\n\t/**\n\t * Decode the UTM parameters from a MGRS string.\n\t *\n\t * @private\n\t * @param {string} mgrsString an UPPERCASE coordinate string is expected.\n\t * @return {object} An object literal with easting, northing, zoneLetter,\n\t *     zoneNumber and accuracy (in meters) properties.\n\t */\n\tfunction decode(mgrsString) {\n\n\t  if (mgrsString && mgrsString.length === 0) {\n\t    throw (\"MGRSPoint coverting from nothing\");\n\t  }\n\n\t  var length = mgrsString.length;\n\n\t  var hunK = null;\n\t  var sb = \"\";\n\t  var testChar;\n\t  var i = 0;\n\n\t  // get Zone number\n\t  while (!(/[A-Z]/).test(testChar = mgrsString.charAt(i))) {\n\t    if (i >= 2) {\n\t      throw (\"MGRSPoint bad conversion from: \" + mgrsString);\n\t    }\n\t    sb += testChar;\n\t    i++;\n\t  }\n\n\t  var zoneNumber = parseInt(sb, 10);\n\n\t  if (i === 0 || i + 3 > length) {\n\t    // A good MGRS string has to be 4-5 digits long,\n\t    // ##AAA/#AAA at least.\n\t    throw (\"MGRSPoint bad conversion from: \" + mgrsString);\n\t  }\n\n\t  var zoneLetter = mgrsString.charAt(i++);\n\n\t  // Should we check the zone letter here? Why not.\n\t  if (zoneLetter <= 'A' || zoneLetter === 'B' || zoneLetter === 'Y' || zoneLetter >= 'Z' || zoneLetter === 'I' || zoneLetter === 'O') {\n\t    throw (\"MGRSPoint zone letter \" + zoneLetter + \" not handled: \" + mgrsString);\n\t  }\n\n\t  hunK = mgrsString.substring(i, i += 2);\n\n\t  var set = get100kSetForZone(zoneNumber);\n\n\t  var east100k = getEastingFromChar(hunK.charAt(0), set);\n\t  var north100k = getNorthingFromChar(hunK.charAt(1), set);\n\n\t  // We have a bug where the northing may be 2000000 too low.\n\t  // How\n\t  // do we know when to roll over?\n\n\t  while (north100k < getMinNorthing(zoneLetter)) {\n\t    north100k += 2000000;\n\t  }\n\n\t  // calculate the char index for easting/northing separator\n\t  var remainder = length - i;\n\n\t  if (remainder % 2 !== 0) {\n\t    throw (\"MGRSPoint has to have an even number \\nof digits after the zone letter and two 100km letters - front \\nhalf for easting meters, second half for \\nnorthing meters\" + mgrsString);\n\t  }\n\n\t  var sep = remainder / 2;\n\n\t  var sepEasting = 0.0;\n\t  var sepNorthing = 0.0;\n\t  var accuracyBonus, sepEastingString, sepNorthingString, easting, northing;\n\t  if (sep > 0) {\n\t    accuracyBonus = 100000.0 / Math.pow(10, sep);\n\t    sepEastingString = mgrsString.substring(i, i + sep);\n\t    sepEasting = parseFloat(sepEastingString) * accuracyBonus;\n\t    sepNorthingString = mgrsString.substring(i + sep);\n\t    sepNorthing = parseFloat(sepNorthingString) * accuracyBonus;\n\t  }\n\n\t  easting = sepEasting + east100k;\n\t  northing = sepNorthing + north100k;\n\n\t  return {\n\t    easting: easting,\n\t    northing: northing,\n\t    zoneLetter: zoneLetter,\n\t    zoneNumber: zoneNumber,\n\t    accuracy: accuracyBonus\n\t  };\n\t}\n\n\t/**\n\t * Given the first letter from a two-letter MGRS 100k zone, and given the\n\t * MGRS table set for the zone number, figure out the easting value that\n\t * should be added to the other, secondary easting value.\n\t *\n\t * @private\n\t * @param {char} e The first letter from a two-letter MGRS 100´k zone.\n\t * @param {number} set The MGRS table set for the zone number.\n\t * @return {number} The easting value for the given letter and set.\n\t */\n\tfunction getEastingFromChar(e, set) {\n\t  // colOrigin is the letter at the origin of the set for the\n\t  // column\n\t  var curCol = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(set - 1);\n\t  var eastingValue = 100000.0;\n\t  var rewindMarker = false;\n\n\t  while (curCol !== e.charCodeAt(0)) {\n\t    curCol++;\n\t    if (curCol === I) {\n\t      curCol++;\n\t    }\n\t    if (curCol === O) {\n\t      curCol++;\n\t    }\n\t    if (curCol > Z) {\n\t      if (rewindMarker) {\n\t        throw (\"Bad character: \" + e);\n\t      }\n\t      curCol = A;\n\t      rewindMarker = true;\n\t    }\n\t    eastingValue += 100000.0;\n\t  }\n\n\t  return eastingValue;\n\t}\n\n\t/**\n\t * Given the second letter from a two-letter MGRS 100k zone, and given the\n\t * MGRS table set for the zone number, figure out the northing value that\n\t * should be added to the other, secondary northing value. You have to\n\t * remember that Northings are determined from the equator, and the vertical\n\t * cycle of letters mean a 2000000 additional northing meters. This happens\n\t * approx. every 18 degrees of latitude. This method does *NOT* count any\n\t * additional northings. You have to figure out how many 2000000 meters need\n\t * to be added for the zone letter of the MGRS coordinate.\n\t *\n\t * @private\n\t * @param {char} n Second letter of the MGRS 100k zone\n\t * @param {number} set The MGRS table set number, which is dependent on the\n\t *     UTM zone number.\n\t * @return {number} The northing value for the given letter and set.\n\t */\n\tfunction getNorthingFromChar(n, set) {\n\n\t  if (n > 'V') {\n\t    throw (\"MGRSPoint given invalid Northing \" + n);\n\t  }\n\n\t  // rowOrigin is the letter at the origin of the set for the\n\t  // column\n\t  var curRow = SET_ORIGIN_ROW_LETTERS.charCodeAt(set - 1);\n\t  var northingValue = 0.0;\n\t  var rewindMarker = false;\n\n\t  while (curRow !== n.charCodeAt(0)) {\n\t    curRow++;\n\t    if (curRow === I) {\n\t      curRow++;\n\t    }\n\t    if (curRow === O) {\n\t      curRow++;\n\t    }\n\t    // fixing a bug making whole application hang in this loop\n\t    // when 'n' is a wrong character\n\t    if (curRow > V) {\n\t      if (rewindMarker) { // making sure that this loop ends\n\t        throw (\"Bad character: \" + n);\n\t      }\n\t      curRow = A;\n\t      rewindMarker = true;\n\t    }\n\t    northingValue += 100000.0;\n\t  }\n\n\t  return northingValue;\n\t}\n\n\t/**\n\t * The function getMinNorthing returns the minimum northing value of a MGRS\n\t * zone.\n\t *\n\t * Ported from Geotrans' c Lattitude_Band_Value structure table.\n\t *\n\t * @private\n\t * @param {char} zoneLetter The MGRS zone to get the min northing for.\n\t * @return {number}\n\t */\n\tfunction getMinNorthing(zoneLetter) {\n\t  var northing;\n\t  switch (zoneLetter) {\n\t  case 'C':\n\t    northing = 1100000.0;\n\t    break;\n\t  case 'D':\n\t    northing = 2000000.0;\n\t    break;\n\t  case 'E':\n\t    northing = 2800000.0;\n\t    break;\n\t  case 'F':\n\t    northing = 3700000.0;\n\t    break;\n\t  case 'G':\n\t    northing = 4600000.0;\n\t    break;\n\t  case 'H':\n\t    northing = 5500000.0;\n\t    break;\n\t  case 'J':\n\t    northing = 6400000.0;\n\t    break;\n\t  case 'K':\n\t    northing = 7300000.0;\n\t    break;\n\t  case 'L':\n\t    northing = 8200000.0;\n\t    break;\n\t  case 'M':\n\t    northing = 9100000.0;\n\t    break;\n\t  case 'N':\n\t    northing = 0.0;\n\t    break;\n\t  case 'P':\n\t    northing = 800000.0;\n\t    break;\n\t  case 'Q':\n\t    northing = 1700000.0;\n\t    break;\n\t  case 'R':\n\t    northing = 2600000.0;\n\t    break;\n\t  case 'S':\n\t    northing = 3500000.0;\n\t    break;\n\t  case 'T':\n\t    northing = 4400000.0;\n\t    break;\n\t  case 'U':\n\t    northing = 5300000.0;\n\t    break;\n\t  case 'V':\n\t    northing = 6200000.0;\n\t    break;\n\t  case 'W':\n\t    northing = 7000000.0;\n\t    break;\n\t  case 'X':\n\t    northing = 7900000.0;\n\t    break;\n\t  default:\n\t    northing = -1.0;\n\t  }\n\t  if (northing >= 0.0) {\n\t    return northing;\n\t  }\n\t  else {\n\t    throw (\"Invalid zone letter: \" + zoneLetter);\n\t  }\n\n\t}\n\n\tfunction Point(x, y, z) {\n\t  if (!(this instanceof Point)) {\n\t    return new Point(x, y, z);\n\t  }\n\t  if (Array.isArray(x)) {\n\t    this.x = x[0];\n\t    this.y = x[1];\n\t    this.z = x[2] || 0.0;\n\t  } else if(typeof x === 'object') {\n\t    this.x = x.x;\n\t    this.y = x.y;\n\t    this.z = x.z || 0.0;\n\t  } else if (typeof x === 'string' && typeof y === 'undefined') {\n\t    var coords = x.split(',');\n\t    this.x = parseFloat(coords[0], 10);\n\t    this.y = parseFloat(coords[1], 10);\n\t    this.z = parseFloat(coords[2], 10) || 0.0;\n\t  } else {\n\t    this.x = x;\n\t    this.y = y;\n\t    this.z = z || 0.0;\n\t  }\n\t  console.warn('proj4.Point will be removed in version 3, use proj4.toPoint');\n\t}\n\n\tPoint.fromMGRS = function(mgrsStr) {\n\t  return new Point(toPoint$1(mgrsStr));\n\t};\n\tPoint.prototype.toMGRS = function(accuracy) {\n\t  return forward$1([this.x, this.y], accuracy);\n\t};\n\n\tvar version = \"2.4.3\";\n\n\tvar C00 = 1;\n\tvar C02 = 0.25;\n\tvar C04 = 0.046875;\n\tvar C06 = 0.01953125;\n\tvar C08 = 0.01068115234375;\n\tvar C22 = 0.75;\n\tvar C44 = 0.46875;\n\tvar C46 = 0.01302083333333333333;\n\tvar C48 = 0.00712076822916666666;\n\tvar C66 = 0.36458333333333333333;\n\tvar C68 = 0.00569661458333333333;\n\tvar C88 = 0.3076171875;\n\n\tvar pj_enfn = function(es) {\n\t  var en = [];\n\t  en[0] = C00 - es * (C02 + es * (C04 + es * (C06 + es * C08)));\n\t  en[1] = es * (C22 - es * (C04 + es * (C06 + es * C08)));\n\t  var t = es * es;\n\t  en[2] = t * (C44 - es * (C46 + es * C48));\n\t  t *= es;\n\t  en[3] = t * (C66 - es * C68);\n\t  en[4] = t * es * C88;\n\t  return en;\n\t};\n\n\tvar pj_mlfn = function(phi, sphi, cphi, en) {\n\t  cphi *= sphi;\n\t  sphi *= sphi;\n\t  return (en[0] * phi - cphi * (en[1] + sphi * (en[2] + sphi * (en[3] + sphi * en[4]))));\n\t};\n\n\tvar MAX_ITER = 20;\n\n\tvar pj_inv_mlfn = function(arg, es, en) {\n\t  var k = 1 / (1 - es);\n\t  var phi = arg;\n\t  for (var i = MAX_ITER; i; --i) { /* rarely goes over 2 iterations */\n\t    var s = Math.sin(phi);\n\t    var t = 1 - es * s * s;\n\t    //t = this.pj_mlfn(phi, s, Math.cos(phi), en) - arg;\n\t    //phi -= t * (t * Math.sqrt(t)) * k;\n\t    t = (pj_mlfn(phi, s, Math.cos(phi), en) - arg) * (t * Math.sqrt(t)) * k;\n\t    phi -= t;\n\t    if (Math.abs(t) < EPSLN) {\n\t      return phi;\n\t    }\n\t  }\n\t  //..reportError(\"cass:pj_inv_mlfn: Convergence error\");\n\t  return phi;\n\t};\n\n\t// Heavily based on this tmerc projection implementation\n\t// https://github.com/mbloch/mapshaper-proj/blob/master/src/projections/tmerc.js\n\n\tfunction init$2() {\n\t  this.x0 = this.x0 !== undefined ? this.x0 : 0;\n\t  this.y0 = this.y0 !== undefined ? this.y0 : 0;\n\t  this.long0 = this.long0 !== undefined ? this.long0 : 0;\n\t  this.lat0 = this.lat0 !== undefined ? this.lat0 : 0;\n\n\t  if (this.es) {\n\t    this.en = pj_enfn(this.es);\n\t    this.ml0 = pj_mlfn(this.lat0, Math.sin(this.lat0), Math.cos(this.lat0), this.en);\n\t  }\n\t}\n\n\t/**\n\t    Transverse Mercator Forward  - long/lat to x/y\n\t    long/lat in radians\n\t  */\n\tfunction forward$2(p) {\n\t  var lon = p.x;\n\t  var lat = p.y;\n\n\t  var delta_lon = adjust_lon(lon - this.long0);\n\t  var con;\n\t  var x, y;\n\t  var sin_phi = Math.sin(lat);\n\t  var cos_phi = Math.cos(lat);\n\n\t  if (!this.es) {\n\t    var b = cos_phi * Math.sin(delta_lon);\n\n\t    if ((Math.abs(Math.abs(b) - 1)) < EPSLN) {\n\t      return (93);\n\t    }\n\t    else {\n\t      x = 0.5 * this.a * this.k0 * Math.log((1 + b) / (1 - b)) + this.x0;\n\t      y = cos_phi * Math.cos(delta_lon) / Math.sqrt(1 - Math.pow(b, 2));\n\t      b = Math.abs(y);\n\n\t      if (b >= 1) {\n\t        if ((b - 1) > EPSLN) {\n\t          return (93);\n\t        }\n\t        else {\n\t          y = 0;\n\t        }\n\t      }\n\t      else {\n\t        y = Math.acos(y);\n\t      }\n\n\t      if (lat < 0) {\n\t        y = -y;\n\t      }\n\n\t      y = this.a * this.k0 * (y - this.lat0) + this.y0;\n\t    }\n\t  }\n\t  else {\n\t    var al = cos_phi * delta_lon;\n\t    var als = Math.pow(al, 2);\n\t    var c = this.ep2 * Math.pow(cos_phi, 2);\n\t    var cs = Math.pow(c, 2);\n\t    var tq = Math.abs(cos_phi) > EPSLN ? Math.tan(lat) : 0;\n\t    var t = Math.pow(tq, 2);\n\t    var ts = Math.pow(t, 2);\n\t    con = 1 - this.es * Math.pow(sin_phi, 2);\n\t    al = al / Math.sqrt(con);\n\t    var ml = pj_mlfn(lat, sin_phi, cos_phi, this.en);\n\n\t    x = this.a * (this.k0 * al * (1 +\n\t      als / 6 * (1 - t + c +\n\t      als / 20 * (5 - 18 * t + ts + 14 * c - 58 * t * c +\n\t      als / 42 * (61 + 179 * ts - ts * t - 479 * t))))) +\n\t      this.x0;\n\n\t    y = this.a * (this.k0 * (ml - this.ml0 +\n\t      sin_phi * delta_lon * al / 2 * (1 +\n\t      als / 12 * (5 - t + 9 * c + 4 * cs +\n\t      als / 30 * (61 + ts - 58 * t + 270 * c - 330 * t * c +\n\t      als / 56 * (1385 + 543 * ts - ts * t - 3111 * t)))))) +\n\t      this.y0;\n\t  }\n\n\t  p.x = x;\n\t  p.y = y;\n\n\t  return p;\n\t}\n\n\t/**\n\t    Transverse Mercator Inverse  -  x/y to long/lat\n\t  */\n\tfunction inverse$2(p) {\n\t  var con, phi;\n\t  var lat, lon;\n\t  var x = (p.x - this.x0) * (1 / this.a);\n\t  var y = (p.y - this.y0) * (1 / this.a);\n\n\t  if (!this.es) {\n\t    var f = Math.exp(x / this.k0);\n\t    var g = 0.5 * (f - 1 / f);\n\t    var temp = this.lat0 + y / this.k0;\n\t    var h = Math.cos(temp);\n\t    con = Math.sqrt((1 - Math.pow(h, 2)) / (1 + Math.pow(g, 2)));\n\t    lat = Math.asin(con);\n\n\t    if (y < 0) {\n\t      lat = -lat;\n\t    }\n\n\t    if ((g === 0) && (h === 0)) {\n\t      lon = 0;\n\t    }\n\t    else {\n\t      lon = adjust_lon(Math.atan2(g, h) + this.long0);\n\t    }\n\t  }\n\t  else { // ellipsoidal form\n\t    con = this.ml0 + y / this.k0;\n\t    phi = pj_inv_mlfn(con, this.es, this.en);\n\n\t    if (Math.abs(phi) < HALF_PI) {\n\t      var sin_phi = Math.sin(phi);\n\t      var cos_phi = Math.cos(phi);\n\t      var tan_phi = Math.abs(cos_phi) > EPSLN ? Math.tan(phi) : 0;\n\t      var c = this.ep2 * Math.pow(cos_phi, 2);\n\t      var cs = Math.pow(c, 2);\n\t      var t = Math.pow(tan_phi, 2);\n\t      var ts = Math.pow(t, 2);\n\t      con = 1 - this.es * Math.pow(sin_phi, 2);\n\t      var d = x * Math.sqrt(con) / this.k0;\n\t      var ds = Math.pow(d, 2);\n\t      con = con * tan_phi;\n\n\t      lat = phi - (con * ds / (1 - this.es)) * 0.5 * (1 -\n\t        ds / 12 * (5 + 3 * t - 9 * c * t + c - 4 * cs -\n\t        ds / 30 * (61 + 90 * t - 252 * c * t + 45 * ts + 46 * c -\n\t        ds / 56 * (1385 + 3633 * t + 4095 * ts + 1574 * ts * t))));\n\n\t      lon = adjust_lon(this.long0 + (d * (1 -\n\t        ds / 6 * (1 + 2 * t + c -\n\t        ds / 20 * (5 + 28 * t + 24 * ts + 8 * c * t + 6 * c -\n\t        ds / 42 * (61 + 662 * t + 1320 * ts + 720 * ts * t)))) / cos_phi));\n\t    }\n\t    else {\n\t      lat = HALF_PI * sign(y);\n\t      lon = 0;\n\t    }\n\t  }\n\n\t  p.x = lon;\n\t  p.y = lat;\n\n\t  return p;\n\t}\n\n\tvar names$3 = [\"Transverse_Mercator\", \"Transverse Mercator\", \"tmerc\"];\n\tvar tmerc = {\n\t  init: init$2,\n\t  forward: forward$2,\n\t  inverse: inverse$2,\n\t  names: names$3\n\t};\n\n\tvar sinh = function(x) {\n\t  var r = Math.exp(x);\n\t  r = (r - 1 / r) / 2;\n\t  return r;\n\t};\n\n\tvar hypot = function(x, y) {\n\t  x = Math.abs(x);\n\t  y = Math.abs(y);\n\t  var a = Math.max(x, y);\n\t  var b = Math.min(x, y) / (a ? a : 1);\n\n\t  return a * Math.sqrt(1 + Math.pow(b, 2));\n\t};\n\n\tvar log1py = function(x) {\n\t  var y = 1 + x;\n\t  var z = y - 1;\n\n\t  return z === 0 ? x : x * Math.log(y) / z;\n\t};\n\n\tvar asinhy = function(x) {\n\t  var y = Math.abs(x);\n\t  y = log1py(y * (1 + y / (hypot(1, y) + 1)));\n\n\t  return x < 0 ? -y : y;\n\t};\n\n\tvar gatg = function(pp, B) {\n\t  var cos_2B = 2 * Math.cos(2 * B);\n\t  var i = pp.length - 1;\n\t  var h1 = pp[i];\n\t  var h2 = 0;\n\t  var h;\n\n\t  while (--i >= 0) {\n\t    h = -h2 + cos_2B * h1 + pp[i];\n\t    h2 = h1;\n\t    h1 = h;\n\t  }\n\n\t  return (B + h * Math.sin(2 * B));\n\t};\n\n\tvar clens = function(pp, arg_r) {\n\t  var r = 2 * Math.cos(arg_r);\n\t  var i = pp.length - 1;\n\t  var hr1 = pp[i];\n\t  var hr2 = 0;\n\t  var hr;\n\n\t  while (--i >= 0) {\n\t    hr = -hr2 + r * hr1 + pp[i];\n\t    hr2 = hr1;\n\t    hr1 = hr;\n\t  }\n\n\t  return Math.sin(arg_r) * hr;\n\t};\n\n\tvar cosh = function(x) {\n\t  var r = Math.exp(x);\n\t  r = (r + 1 / r) / 2;\n\t  return r;\n\t};\n\n\tvar clens_cmplx = function(pp, arg_r, arg_i) {\n\t  var sin_arg_r = Math.sin(arg_r);\n\t  var cos_arg_r = Math.cos(arg_r);\n\t  var sinh_arg_i = sinh(arg_i);\n\t  var cosh_arg_i = cosh(arg_i);\n\t  var r = 2 * cos_arg_r * cosh_arg_i;\n\t  var i = -2 * sin_arg_r * sinh_arg_i;\n\t  var j = pp.length - 1;\n\t  var hr = pp[j];\n\t  var hi1 = 0;\n\t  var hr1 = 0;\n\t  var hi = 0;\n\t  var hr2;\n\t  var hi2;\n\n\t  while (--j >= 0) {\n\t    hr2 = hr1;\n\t    hi2 = hi1;\n\t    hr1 = hr;\n\t    hi1 = hi;\n\t    hr = -hr2 + r * hr1 - i * hi1 + pp[j];\n\t    hi = -hi2 + i * hr1 + r * hi1;\n\t  }\n\n\t  r = sin_arg_r * cosh_arg_i;\n\t  i = cos_arg_r * sinh_arg_i;\n\n\t  return [r * hr - i * hi, r * hi + i * hr];\n\t};\n\n\t// Heavily based on this etmerc projection implementation\n\t// https://github.com/mbloch/mapshaper-proj/blob/master/src/projections/etmerc.js\n\n\tfunction init$3() {\n\t  if (this.es === undefined || this.es <= 0) {\n\t    throw new Error('incorrect elliptical usage');\n\t  }\n\n\t  this.x0 = this.x0 !== undefined ? this.x0 : 0;\n\t  this.y0 = this.y0 !== undefined ? this.y0 : 0;\n\t  this.long0 = this.long0 !== undefined ? this.long0 : 0;\n\t  this.lat0 = this.lat0 !== undefined ? this.lat0 : 0;\n\n\t  this.cgb = [];\n\t  this.cbg = [];\n\t  this.utg = [];\n\t  this.gtu = [];\n\n\t  var f = this.es / (1 + Math.sqrt(1 - this.es));\n\t  var n = f / (2 - f);\n\t  var np = n;\n\n\t  this.cgb[0] = n * (2 + n * (-2 / 3 + n * (-2 + n * (116 / 45 + n * (26 / 45 + n * (-2854 / 675 ))))));\n\t  this.cbg[0] = n * (-2 + n * ( 2 / 3 + n * ( 4 / 3 + n * (-82 / 45 + n * (32 / 45 + n * (4642 / 4725))))));\n\n\t  np = np * n;\n\t  this.cgb[1] = np * (7 / 3 + n * (-8 / 5 + n * (-227 / 45 + n * (2704 / 315 + n * (2323 / 945)))));\n\t  this.cbg[1] = np * (5 / 3 + n * (-16 / 15 + n * ( -13 / 9 + n * (904 / 315 + n * (-1522 / 945)))));\n\n\t  np = np * n;\n\t  this.cgb[2] = np * (56 / 15 + n * (-136 / 35 + n * (-1262 / 105 + n * (73814 / 2835))));\n\t  this.cbg[2] = np * (-26 / 15 + n * (34 / 21 + n * (8 / 5 + n * (-12686 / 2835))));\n\n\t  np = np * n;\n\t  this.cgb[3] = np * (4279 / 630 + n * (-332 / 35 + n * (-399572 / 14175)));\n\t  this.cbg[3] = np * (1237 / 630 + n * (-12 / 5 + n * ( -24832 / 14175)));\n\n\t  np = np * n;\n\t  this.cgb[4] = np * (4174 / 315 + n * (-144838 / 6237));\n\t  this.cbg[4] = np * (-734 / 315 + n * (109598 / 31185));\n\n\t  np = np * n;\n\t  this.cgb[5] = np * (601676 / 22275);\n\t  this.cbg[5] = np * (444337 / 155925);\n\n\t  np = Math.pow(n, 2);\n\t  this.Qn = this.k0 / (1 + n) * (1 + np * (1 / 4 + np * (1 / 64 + np / 256)));\n\n\t  this.utg[0] = n * (-0.5 + n * ( 2 / 3 + n * (-37 / 96 + n * ( 1 / 360 + n * (81 / 512 + n * (-96199 / 604800))))));\n\t  this.gtu[0] = n * (0.5 + n * (-2 / 3 + n * (5 / 16 + n * (41 / 180 + n * (-127 / 288 + n * (7891 / 37800))))));\n\n\t  this.utg[1] = np * (-1 / 48 + n * (-1 / 15 + n * (437 / 1440 + n * (-46 / 105 + n * (1118711 / 3870720)))));\n\t  this.gtu[1] = np * (13 / 48 + n * (-3 / 5 + n * (557 / 1440 + n * (281 / 630 + n * (-1983433 / 1935360)))));\n\n\t  np = np * n;\n\t  this.utg[2] = np * (-17 / 480 + n * (37 / 840 + n * (209 / 4480 + n * (-5569 / 90720 ))));\n\t  this.gtu[2] = np * (61 / 240 + n * (-103 / 140 + n * (15061 / 26880 + n * (167603 / 181440))));\n\n\t  np = np * n;\n\t  this.utg[3] = np * (-4397 / 161280 + n * (11 / 504 + n * (830251 / 7257600)));\n\t  this.gtu[3] = np * (49561 / 161280 + n * (-179 / 168 + n * (6601661 / 7257600)));\n\n\t  np = np * n;\n\t  this.utg[4] = np * (-4583 / 161280 + n * (108847 / 3991680));\n\t  this.gtu[4] = np * (34729 / 80640 + n * (-3418889 / 1995840));\n\n\t  np = np * n;\n\t  this.utg[5] = np * (-20648693 / 638668800);\n\t  this.gtu[5] = np * (212378941 / 319334400);\n\n\t  var Z = gatg(this.cbg, this.lat0);\n\t  this.Zb = -this.Qn * (Z + clens(this.gtu, 2 * Z));\n\t}\n\n\tfunction forward$3(p) {\n\t  var Ce = adjust_lon(p.x - this.long0);\n\t  var Cn = p.y;\n\n\t  Cn = gatg(this.cbg, Cn);\n\t  var sin_Cn = Math.sin(Cn);\n\t  var cos_Cn = Math.cos(Cn);\n\t  var sin_Ce = Math.sin(Ce);\n\t  var cos_Ce = Math.cos(Ce);\n\n\t  Cn = Math.atan2(sin_Cn, cos_Ce * cos_Cn);\n\t  Ce = Math.atan2(sin_Ce * cos_Cn, hypot(sin_Cn, cos_Cn * cos_Ce));\n\t  Ce = asinhy(Math.tan(Ce));\n\n\t  var tmp = clens_cmplx(this.gtu, 2 * Cn, 2 * Ce);\n\n\t  Cn = Cn + tmp[0];\n\t  Ce = Ce + tmp[1];\n\n\t  var x;\n\t  var y;\n\n\t  if (Math.abs(Ce) <= 2.623395162778) {\n\t    x = this.a * (this.Qn * Ce) + this.x0;\n\t    y = this.a * (this.Qn * Cn + this.Zb) + this.y0;\n\t  }\n\t  else {\n\t    x = Infinity;\n\t    y = Infinity;\n\t  }\n\n\t  p.x = x;\n\t  p.y = y;\n\n\t  return p;\n\t}\n\n\tfunction inverse$3(p) {\n\t  var Ce = (p.x - this.x0) * (1 / this.a);\n\t  var Cn = (p.y - this.y0) * (1 / this.a);\n\n\t  Cn = (Cn - this.Zb) / this.Qn;\n\t  Ce = Ce / this.Qn;\n\n\t  var lon;\n\t  var lat;\n\n\t  if (Math.abs(Ce) <= 2.623395162778) {\n\t    var tmp = clens_cmplx(this.utg, 2 * Cn, 2 * Ce);\n\n\t    Cn = Cn + tmp[0];\n\t    Ce = Ce + tmp[1];\n\t    Ce = Math.atan(sinh(Ce));\n\n\t    var sin_Cn = Math.sin(Cn);\n\t    var cos_Cn = Math.cos(Cn);\n\t    var sin_Ce = Math.sin(Ce);\n\t    var cos_Ce = Math.cos(Ce);\n\n\t    Cn = Math.atan2(sin_Cn * cos_Ce, hypot(sin_Ce, cos_Ce * cos_Cn));\n\t    Ce = Math.atan2(sin_Ce, cos_Ce * cos_Cn);\n\n\t    lon = adjust_lon(Ce + this.long0);\n\t    lat = gatg(this.cgb, Cn);\n\t  }\n\t  else {\n\t    lon = Infinity;\n\t    lat = Infinity;\n\t  }\n\n\t  p.x = lon;\n\t  p.y = lat;\n\n\t  return p;\n\t}\n\n\tvar names$4 = [\"Extended_Transverse_Mercator\", \"Extended Transverse Mercator\", \"etmerc\"];\n\tvar etmerc = {\n\t  init: init$3,\n\t  forward: forward$3,\n\t  inverse: inverse$3,\n\t  names: names$4\n\t};\n\n\tvar adjust_zone = function(zone, lon) {\n\t  if (zone === undefined) {\n\t    zone = Math.floor((adjust_lon(lon) + Math.PI) * 30 / Math.PI) + 1;\n\n\t    if (zone < 0) {\n\t      return 0;\n\t    } else if (zone > 60) {\n\t      return 60;\n\t    }\n\t  }\n\t  return zone;\n\t};\n\n\tvar dependsOn = 'etmerc';\n\tfunction init$4() {\n\t  var zone = adjust_zone(this.zone, this.long0);\n\t  if (zone === undefined) {\n\t    throw new Error('unknown utm zone');\n\t  }\n\t  this.lat0 = 0;\n\t  this.long0 =  ((6 * Math.abs(zone)) - 183) * D2R;\n\t  this.x0 = 500000;\n\t  this.y0 = this.utmSouth ? 10000000 : 0;\n\t  this.k0 = 0.9996;\n\n\t  etmerc.init.apply(this);\n\t  this.forward = etmerc.forward;\n\t  this.inverse = etmerc.inverse;\n\t}\n\n\tvar names$5 = [\"Universal Transverse Mercator System\", \"utm\"];\n\tvar utm = {\n\t  init: init$4,\n\t  names: names$5,\n\t  dependsOn: dependsOn\n\t};\n\n\tvar srat = function(esinp, exp) {\n\t  return (Math.pow((1 - esinp) / (1 + esinp), exp));\n\t};\n\n\tvar MAX_ITER$1 = 20;\n\tfunction init$6() {\n\t  var sphi = Math.sin(this.lat0);\n\t  var cphi = Math.cos(this.lat0);\n\t  cphi *= cphi;\n\t  this.rc = Math.sqrt(1 - this.es) / (1 - this.es * sphi * sphi);\n\t  this.C = Math.sqrt(1 + this.es * cphi * cphi / (1 - this.es));\n\t  this.phic0 = Math.asin(sphi / this.C);\n\t  this.ratexp = 0.5 * this.C * this.e;\n\t  this.K = Math.tan(0.5 * this.phic0 + FORTPI) / (Math.pow(Math.tan(0.5 * this.lat0 + FORTPI), this.C) * srat(this.e * sphi, this.ratexp));\n\t}\n\n\tfunction forward$5(p) {\n\t  var lon = p.x;\n\t  var lat = p.y;\n\n\t  p.y = 2 * Math.atan(this.K * Math.pow(Math.tan(0.5 * lat + FORTPI), this.C) * srat(this.e * Math.sin(lat), this.ratexp)) - HALF_PI;\n\t  p.x = this.C * lon;\n\t  return p;\n\t}\n\n\tfunction inverse$5(p) {\n\t  var DEL_TOL = 1e-14;\n\t  var lon = p.x / this.C;\n\t  var lat = p.y;\n\t  var num = Math.pow(Math.tan(0.5 * lat + FORTPI) / this.K, 1 / this.C);\n\t  for (var i = MAX_ITER$1; i > 0; --i) {\n\t    lat = 2 * Math.atan(num * srat(this.e * Math.sin(p.y), - 0.5 * this.e)) - HALF_PI;\n\t    if (Math.abs(lat - p.y) < DEL_TOL) {\n\t      break;\n\t    }\n\t    p.y = lat;\n\t  }\n\t  /* convergence failed */\n\t  if (!i) {\n\t    return null;\n\t  }\n\t  p.x = lon;\n\t  p.y = lat;\n\t  return p;\n\t}\n\n\tvar names$7 = [\"gauss\"];\n\tvar gauss = {\n\t  init: init$6,\n\t  forward: forward$5,\n\t  inverse: inverse$5,\n\t  names: names$7\n\t};\n\n\tfunction init$5() {\n\t  gauss.init.apply(this);\n\t  if (!this.rc) {\n\t    return;\n\t  }\n\t  this.sinc0 = Math.sin(this.phic0);\n\t  this.cosc0 = Math.cos(this.phic0);\n\t  this.R2 = 2 * this.rc;\n\t  if (!this.title) {\n\t    this.title = \"Oblique Stereographic Alternative\";\n\t  }\n\t}\n\n\tfunction forward$4(p) {\n\t  var sinc, cosc, cosl, k;\n\t  p.x = adjust_lon(p.x - this.long0);\n\t  gauss.forward.apply(this, [p]);\n\t  sinc = Math.sin(p.y);\n\t  cosc = Math.cos(p.y);\n\t  cosl = Math.cos(p.x);\n\t  k = this.k0 * this.R2 / (1 + this.sinc0 * sinc + this.cosc0 * cosc * cosl);\n\t  p.x = k * cosc * Math.sin(p.x);\n\t  p.y = k * (this.cosc0 * sinc - this.sinc0 * cosc * cosl);\n\t  p.x = this.a * p.x + this.x0;\n\t  p.y = this.a * p.y + this.y0;\n\t  return p;\n\t}\n\n\tfunction inverse$4(p) {\n\t  var sinc, cosc, lon, lat, rho;\n\t  p.x = (p.x - this.x0) / this.a;\n\t  p.y = (p.y - this.y0) / this.a;\n\n\t  p.x /= this.k0;\n\t  p.y /= this.k0;\n\t  if ((rho = Math.sqrt(p.x * p.x + p.y * p.y))) {\n\t    var c = 2 * Math.atan2(rho, this.R2);\n\t    sinc = Math.sin(c);\n\t    cosc = Math.cos(c);\n\t    lat = Math.asin(cosc * this.sinc0 + p.y * sinc * this.cosc0 / rho);\n\t    lon = Math.atan2(p.x * sinc, rho * this.cosc0 * cosc - p.y * this.sinc0 * sinc);\n\t  }\n\t  else {\n\t    lat = this.phic0;\n\t    lon = 0;\n\t  }\n\n\t  p.x = lon;\n\t  p.y = lat;\n\t  gauss.inverse.apply(this, [p]);\n\t  p.x = adjust_lon(p.x + this.long0);\n\t  return p;\n\t}\n\n\tvar names$6 = [\"Stereographic_North_Pole\", \"Oblique_Stereographic\", \"Polar_Stereographic\", \"sterea\",\"Oblique Stereographic Alternative\"];\n\tvar sterea = {\n\t  init: init$5,\n\t  forward: forward$4,\n\t  inverse: inverse$4,\n\t  names: names$6\n\t};\n\n\tfunction ssfn_(phit, sinphi, eccen) {\n\t  sinphi *= eccen;\n\t  return (Math.tan(0.5 * (HALF_PI + phit)) * Math.pow((1 - sinphi) / (1 + sinphi), 0.5 * eccen));\n\t}\n\n\tfunction init$7() {\n\t  this.coslat0 = Math.cos(this.lat0);\n\t  this.sinlat0 = Math.sin(this.lat0);\n\t  if (this.sphere) {\n\t    if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) {\n\t      this.k0 = 0.5 * (1 + sign(this.lat0) * Math.sin(this.lat_ts));\n\t    }\n\t  }\n\t  else {\n\t    if (Math.abs(this.coslat0) <= EPSLN) {\n\t      if (this.lat0 > 0) {\n\t        //North pole\n\t        //trace('stere:north pole');\n\t        this.con = 1;\n\t      }\n\t      else {\n\t        //South pole\n\t        //trace('stere:south pole');\n\t        this.con = -1;\n\t      }\n\t    }\n\t    this.cons = Math.sqrt(Math.pow(1 + this.e, 1 + this.e) * Math.pow(1 - this.e, 1 - this.e));\n\t    if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) {\n\t      this.k0 = 0.5 * this.cons * msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)) / tsfnz(this.e, this.con * this.lat_ts, this.con * Math.sin(this.lat_ts));\n\t    }\n\t    this.ms1 = msfnz(this.e, this.sinlat0, this.coslat0);\n\t    this.X0 = 2 * Math.atan(this.ssfn_(this.lat0, this.sinlat0, this.e)) - HALF_PI;\n\t    this.cosX0 = Math.cos(this.X0);\n\t    this.sinX0 = Math.sin(this.X0);\n\t  }\n\t}\n\n\t// Stereographic forward equations--mapping lat,long to x,y\n\tfunction forward$6(p) {\n\t  var lon = p.x;\n\t  var lat = p.y;\n\t  var sinlat = Math.sin(lat);\n\t  var coslat = Math.cos(lat);\n\t  var A, X, sinX, cosX, ts, rh;\n\t  var dlon = adjust_lon(lon - this.long0);\n\n\t  if (Math.abs(Math.abs(lon - this.long0) - Math.PI) <= EPSLN && Math.abs(lat + this.lat0) <= EPSLN) {\n\t    //case of the origine point\n\t    //trace('stere:this is the origin point');\n\t    p.x = NaN;\n\t    p.y = NaN;\n\t    return p;\n\t  }\n\t  if (this.sphere) {\n\t    //trace('stere:sphere case');\n\t    A = 2 * this.k0 / (1 + this.sinlat0 * sinlat + this.coslat0 * coslat * Math.cos(dlon));\n\t    p.x = this.a * A * coslat * Math.sin(dlon) + this.x0;\n\t    p.y = this.a * A * (this.coslat0 * sinlat - this.sinlat0 * coslat * Math.cos(dlon)) + this.y0;\n\t    return p;\n\t  }\n\t  else {\n\t    X = 2 * Math.atan(this.ssfn_(lat, sinlat, this.e)) - HALF_PI;\n\t    cosX = Math.cos(X);\n\t    sinX = Math.sin(X);\n\t    if (Math.abs(this.coslat0) <= EPSLN) {\n\t      ts = tsfnz(this.e, lat * this.con, this.con * sinlat);\n\t      rh = 2 * this.a * this.k0 * ts / this.cons;\n\t      p.x = this.x0 + rh * Math.sin(lon - this.long0);\n\t      p.y = this.y0 - this.con * rh * Math.cos(lon - this.long0);\n\t      //trace(p.toString());\n\t      return p;\n\t    }\n\t    else if (Math.abs(this.sinlat0) < EPSLN) {\n\t      //Eq\n\t      //trace('stere:equateur');\n\t      A = 2 * this.a * this.k0 / (1 + cosX * Math.cos(dlon));\n\t      p.y = A * sinX;\n\t    }\n\t    else {\n\t      //other case\n\t      //trace('stere:normal case');\n\t      A = 2 * this.a * this.k0 * this.ms1 / (this.cosX0 * (1 + this.sinX0 * sinX + this.cosX0 * cosX * Math.cos(dlon)));\n\t      p.y = A * (this.cosX0 * sinX - this.sinX0 * cosX * Math.cos(dlon)) + this.y0;\n\t    }\n\t    p.x = A * cosX * Math.sin(dlon) + this.x0;\n\t  }\n\t  //trace(p.toString());\n\t  return p;\n\t}\n\n\t//* Stereographic inverse equations--mapping x,y to lat/long\n\tfunction inverse$6(p) {\n\t  p.x -= this.x0;\n\t  p.y -= this.y0;\n\t  var lon, lat, ts, ce, Chi;\n\t  var rh = Math.sqrt(p.x * p.x + p.y * p.y);\n\t  if (this.sphere) {\n\t    var c = 2 * Math.atan(rh / (0.5 * this.a * this.k0));\n\t    lon = this.long0;\n\t    lat = this.lat0;\n\t    if (rh <= EPSLN) {\n\t      p.x = lon;\n\t      p.y = lat;\n\t      return p;\n\t    }\n\t    lat = Math.asin(Math.cos(c) * this.sinlat0 + p.y * Math.sin(c) * this.coslat0 / rh);\n\t    if (Math.abs(this.coslat0) < EPSLN) {\n\t      if (this.lat0 > 0) {\n\t        lon = adjust_lon(this.long0 + Math.atan2(p.x, - 1 * p.y));\n\t      }\n\t      else {\n\t        lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y));\n\t      }\n\t    }\n\t    else {\n\t      lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(c), rh * this.coslat0 * Math.cos(c) - p.y * this.sinlat0 * Math.sin(c)));\n\t    }\n\t    p.x = lon;\n\t    p.y = lat;\n\t    return p;\n\t  }\n\t  else {\n\t    if (Math.abs(this.coslat0) <= EPSLN) {\n\t      if (rh <= EPSLN) {\n\t        lat = this.lat0;\n\t        lon = this.long0;\n\t        p.x = lon;\n\t        p.y = lat;\n\t        //trace(p.toString());\n\t        return p;\n\t      }\n\t      p.x *= this.con;\n\t      p.y *= this.con;\n\t      ts = rh * this.cons / (2 * this.a * this.k0);\n\t      lat = this.con * phi2z(this.e, ts);\n\t      lon = this.con * adjust_lon(this.con * this.long0 + Math.atan2(p.x, - 1 * p.y));\n\t    }\n\t    else {\n\t      ce = 2 * Math.atan(rh * this.cosX0 / (2 * this.a * this.k0 * this.ms1));\n\t      lon = this.long0;\n\t      if (rh <= EPSLN) {\n\t        Chi = this.X0;\n\t      }\n\t      else {\n\t        Chi = Math.asin(Math.cos(ce) * this.sinX0 + p.y * Math.sin(ce) * this.cosX0 / rh);\n\t        lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(ce), rh * this.cosX0 * Math.cos(ce) - p.y * this.sinX0 * Math.sin(ce)));\n\t      }\n\t      lat = -1 * phi2z(this.e, Math.tan(0.5 * (HALF_PI + Chi)));\n\t    }\n\t  }\n\t  p.x = lon;\n\t  p.y = lat;\n\n\t  //trace(p.toString());\n\t  return p;\n\n\t}\n\n\tvar names$8 = [\"stere\", \"Stereographic_South_Pole\", \"Polar Stereographic (variant B)\"];\n\tvar stere = {\n\t  init: init$7,\n\t  forward: forward$6,\n\t  inverse: inverse$6,\n\t  names: names$8,\n\t  ssfn_: ssfn_\n\t};\n\n\t/*\n\t  references:\n\t    Formules et constantes pour le Calcul pour la\n\t    projection cylindrique conforme à axe oblique et pour la transformation entre\n\t    des systèmes de référence.\n\t    http://www.swisstopo.admin.ch/internet/swisstopo/fr/home/topics/survey/sys/refsys/switzerland.parsysrelated1.31216.downloadList.77004.DownloadFile.tmp/swissprojectionfr.pdf\n\t  */\n\n\tfunction init$8() {\n\t  var phy0 = this.lat0;\n\t  this.lambda0 = this.long0;\n\t  var sinPhy0 = Math.sin(phy0);\n\t  var semiMajorAxis = this.a;\n\t  var invF = this.rf;\n\t  var flattening = 1 / invF;\n\t  var e2 = 2 * flattening - Math.pow(flattening, 2);\n\t  var e = this.e = Math.sqrt(e2);\n\t  this.R = this.k0 * semiMajorAxis * Math.sqrt(1 - e2) / (1 - e2 * Math.pow(sinPhy0, 2));\n\t  this.alpha = Math.sqrt(1 + e2 / (1 - e2) * Math.pow(Math.cos(phy0), 4));\n\t  this.b0 = Math.asin(sinPhy0 / this.alpha);\n\t  var k1 = Math.log(Math.tan(Math.PI / 4 + this.b0 / 2));\n\t  var k2 = Math.log(Math.tan(Math.PI / 4 + phy0 / 2));\n\t  var k3 = Math.log((1 + e * sinPhy0) / (1 - e * sinPhy0));\n\t  this.K = k1 - this.alpha * k2 + this.alpha * e / 2 * k3;\n\t}\n\n\tfunction forward$7(p) {\n\t  var Sa1 = Math.log(Math.tan(Math.PI / 4 - p.y / 2));\n\t  var Sa2 = this.e / 2 * Math.log((1 + this.e * Math.sin(p.y)) / (1 - this.e * Math.sin(p.y)));\n\t  var S = -this.alpha * (Sa1 + Sa2) + this.K;\n\n\t  // spheric latitude\n\t  var b = 2 * (Math.atan(Math.exp(S)) - Math.PI / 4);\n\n\t  // spheric longitude\n\t  var I = this.alpha * (p.x - this.lambda0);\n\n\t  // psoeudo equatorial rotation\n\t  var rotI = Math.atan(Math.sin(I) / (Math.sin(this.b0) * Math.tan(b) + Math.cos(this.b0) * Math.cos(I)));\n\n\t  var rotB = Math.asin(Math.cos(this.b0) * Math.sin(b) - Math.sin(this.b0) * Math.cos(b) * Math.cos(I));\n\n\t  p.y = this.R / 2 * Math.log((1 + Math.sin(rotB)) / (1 - Math.sin(rotB))) + this.y0;\n\t  p.x = this.R * rotI + this.x0;\n\t  return p;\n\t}\n\n\tfunction inverse$7(p) {\n\t  var Y = p.x - this.x0;\n\t  var X = p.y - this.y0;\n\n\t  var rotI = Y / this.R;\n\t  var rotB = 2 * (Math.atan(Math.exp(X / this.R)) - Math.PI / 4);\n\n\t  var b = Math.asin(Math.cos(this.b0) * Math.sin(rotB) + Math.sin(this.b0) * Math.cos(rotB) * Math.cos(rotI));\n\t  var I = Math.atan(Math.sin(rotI) / (Math.cos(this.b0) * Math.cos(rotI) - Math.sin(this.b0) * Math.tan(rotB)));\n\n\t  var lambda = this.lambda0 + I / this.alpha;\n\n\t  var S = 0;\n\t  var phy = b;\n\t  var prevPhy = -1000;\n\t  var iteration = 0;\n\t  while (Math.abs(phy - prevPhy) > 0.0000001) {\n\t    if (++iteration > 20) {\n\t      //...reportError(\"omercFwdInfinity\");\n\t      return;\n\t    }\n\t    //S = Math.log(Math.tan(Math.PI / 4 + phy / 2));\n\t    S = 1 / this.alpha * (Math.log(Math.tan(Math.PI / 4 + b / 2)) - this.K) + this.e * Math.log(Math.tan(Math.PI / 4 + Math.asin(this.e * Math.sin(phy)) / 2));\n\t    prevPhy = phy;\n\t    phy = 2 * Math.atan(Math.exp(S)) - Math.PI / 2;\n\t  }\n\n\t  p.x = lambda;\n\t  p.y = phy;\n\t  return p;\n\t}\n\n\tvar names$9 = [\"somerc\"];\n\tvar somerc = {\n\t  init: init$8,\n\t  forward: forward$7,\n\t  inverse: inverse$7,\n\t  names: names$9\n\t};\n\n\t/* Initialize the Oblique Mercator  projection\n\t    ------------------------------------------*/\n\tfunction init$9() {\n\t  this.no_off = this.no_off || false;\n\t  this.no_rot = this.no_rot || false;\n\n\t  if (isNaN(this.k0)) {\n\t    this.k0 = 1;\n\t  }\n\t  var sinlat = Math.sin(this.lat0);\n\t  var coslat = Math.cos(this.lat0);\n\t  var con = this.e * sinlat;\n\n\t  this.bl = Math.sqrt(1 + this.es / (1 - this.es) * Math.pow(coslat, 4));\n\t  this.al = this.a * this.bl * this.k0 * Math.sqrt(1 - this.es) / (1 - con * con);\n\t  var t0 = tsfnz(this.e, this.lat0, sinlat);\n\t  var dl = this.bl / coslat * Math.sqrt((1 - this.es) / (1 - con * con));\n\t  if (dl * dl < 1) {\n\t    dl = 1;\n\t  }\n\t  var fl;\n\t  var gl;\n\t  if (!isNaN(this.longc)) {\n\t    //Central point and azimuth method\n\n\t    if (this.lat0 >= 0) {\n\t      fl = dl + Math.sqrt(dl * dl - 1);\n\t    }\n\t    else {\n\t      fl = dl - Math.sqrt(dl * dl - 1);\n\t    }\n\t    this.el = fl * Math.pow(t0, this.bl);\n\t    gl = 0.5 * (fl - 1 / fl);\n\t    this.gamma0 = Math.asin(Math.sin(this.alpha) / dl);\n\t    this.long0 = this.longc - Math.asin(gl * Math.tan(this.gamma0)) / this.bl;\n\n\t  }\n\t  else {\n\t    //2 points method\n\t    var t1 = tsfnz(this.e, this.lat1, Math.sin(this.lat1));\n\t    var t2 = tsfnz(this.e, this.lat2, Math.sin(this.lat2));\n\t    if (this.lat0 >= 0) {\n\t      this.el = (dl + Math.sqrt(dl * dl - 1)) * Math.pow(t0, this.bl);\n\t    }\n\t    else {\n\t      this.el = (dl - Math.sqrt(dl * dl - 1)) * Math.pow(t0, this.bl);\n\t    }\n\t    var hl = Math.pow(t1, this.bl);\n\t    var ll = Math.pow(t2, this.bl);\n\t    fl = this.el / hl;\n\t    gl = 0.5 * (fl - 1 / fl);\n\t    var jl = (this.el * this.el - ll * hl) / (this.el * this.el + ll * hl);\n\t    var pl = (ll - hl) / (ll + hl);\n\t    var dlon12 = adjust_lon(this.long1 - this.long2);\n\t    this.long0 = 0.5 * (this.long1 + this.long2) - Math.atan(jl * Math.tan(0.5 * this.bl * (dlon12)) / pl) / this.bl;\n\t    this.long0 = adjust_lon(this.long0);\n\t    var dlon10 = adjust_lon(this.long1 - this.long0);\n\t    this.gamma0 = Math.atan(Math.sin(this.bl * (dlon10)) / gl);\n\t    this.alpha = Math.asin(dl * Math.sin(this.gamma0));\n\t  }\n\n\t  if (this.no_off) {\n\t    this.uc = 0;\n\t  }\n\t  else {\n\t    if (this.lat0 >= 0) {\n\t      this.uc = this.al / this.bl * Math.atan2(Math.sqrt(dl * dl - 1), Math.cos(this.alpha));\n\t    }\n\t    else {\n\t      this.uc = -1 * this.al / this.bl * Math.atan2(Math.sqrt(dl * dl - 1), Math.cos(this.alpha));\n\t    }\n\t  }\n\n\t}\n\n\t/* Oblique Mercator forward equations--mapping lat,long to x,y\n\t    ----------------------------------------------------------*/\n\tfunction forward$8(p) {\n\t  var lon = p.x;\n\t  var lat = p.y;\n\t  var dlon = adjust_lon(lon - this.long0);\n\t  var us, vs;\n\t  var con;\n\t  if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) {\n\t    if (lat > 0) {\n\t      con = -1;\n\t    }\n\t    else {\n\t      con = 1;\n\t    }\n\t    vs = this.al / this.bl * Math.log(Math.tan(FORTPI + con * this.gamma0 * 0.5));\n\t    us = -1 * con * HALF_PI * this.al / this.bl;\n\t  }\n\t  else {\n\t    var t = tsfnz(this.e, lat, Math.sin(lat));\n\t    var ql = this.el / Math.pow(t, this.bl);\n\t    var sl = 0.5 * (ql - 1 / ql);\n\t    var tl = 0.5 * (ql + 1 / ql);\n\t    var vl = Math.sin(this.bl * (dlon));\n\t    var ul = (sl * Math.sin(this.gamma0) - vl * Math.cos(this.gamma0)) / tl;\n\t    if (Math.abs(Math.abs(ul) - 1) <= EPSLN) {\n\t      vs = Number.POSITIVE_INFINITY;\n\t    }\n\t    else {\n\t      vs = 0.5 * this.al * Math.log((1 - ul) / (1 + ul)) / this.bl;\n\t    }\n\t    if (Math.abs(Math.cos(this.bl * (dlon))) <= EPSLN) {\n\t      us = this.al * this.bl * (dlon);\n\t    }\n\t    else {\n\t      us = this.al * Math.atan2(sl * Math.cos(this.gamma0) + vl * Math.sin(this.gamma0), Math.cos(this.bl * dlon)) / this.bl;\n\t    }\n\t  }\n\n\t  if (this.no_rot) {\n\t    p.x = this.x0 + us;\n\t    p.y = this.y0 + vs;\n\t  }\n\t  else {\n\n\t    us -= this.uc;\n\t    p.x = this.x0 + vs * Math.cos(this.alpha) + us * Math.sin(this.alpha);\n\t    p.y = this.y0 + us * Math.cos(this.alpha) - vs * Math.sin(this.alpha);\n\t  }\n\t  return p;\n\t}\n\n\tfunction inverse$8(p) {\n\t  var us, vs;\n\t  if (this.no_rot) {\n\t    vs = p.y - this.y0;\n\t    us = p.x - this.x0;\n\t  }\n\t  else {\n\t    vs = (p.x - this.x0) * Math.cos(this.alpha) - (p.y - this.y0) * Math.sin(this.alpha);\n\t    us = (p.y - this.y0) * Math.cos(this.alpha) + (p.x - this.x0) * Math.sin(this.alpha);\n\t    us += this.uc;\n\t  }\n\t  var qp = Math.exp(-1 * this.bl * vs / this.al);\n\t  var sp = 0.5 * (qp - 1 / qp);\n\t  var tp = 0.5 * (qp + 1 / qp);\n\t  var vp = Math.sin(this.bl * us / this.al);\n\t  var up = (vp * Math.cos(this.gamma0) + sp * Math.sin(this.gamma0)) / tp;\n\t  var ts = Math.pow(this.el / Math.sqrt((1 + up) / (1 - up)), 1 / this.bl);\n\t  if (Math.abs(up - 1) < EPSLN) {\n\t    p.x = this.long0;\n\t    p.y = HALF_PI;\n\t  }\n\t  else if (Math.abs(up + 1) < EPSLN) {\n\t    p.x = this.long0;\n\t    p.y = -1 * HALF_PI;\n\t  }\n\t  else {\n\t    p.y = phi2z(this.e, ts);\n\t    p.x = adjust_lon(this.long0 - Math.atan2(sp * Math.cos(this.gamma0) - vp * Math.sin(this.gamma0), Math.cos(this.bl * us / this.al)) / this.bl);\n\t  }\n\t  return p;\n\t}\n\n\tvar names$10 = [\"Hotine_Oblique_Mercator\", \"Hotine Oblique Mercator\", \"Hotine_Oblique_Mercator_Azimuth_Natural_Origin\", \"Hotine_Oblique_Mercator_Azimuth_Center\", \"omerc\"];\n\tvar omerc = {\n\t  init: init$9,\n\t  forward: forward$8,\n\t  inverse: inverse$8,\n\t  names: names$10\n\t};\n\n\tfunction init$10() {\n\n\t  // array of:  r_maj,r_min,lat1,lat2,c_lon,c_lat,false_east,false_north\n\t  //double c_lat;                   /* center latitude                      */\n\t  //double c_lon;                   /* center longitude                     */\n\t  //double lat1;                    /* first standard parallel              */\n\t  //double lat2;                    /* second standard parallel             */\n\t  //double r_maj;                   /* major axis                           */\n\t  //double r_min;                   /* minor axis                           */\n\t  //double false_east;              /* x offset in meters                   */\n\t  //double false_north;             /* y offset in meters                   */\n\n\t  if (!this.lat2) {\n\t    this.lat2 = this.lat1;\n\t  } //if lat2 is not defined\n\t  if (!this.k0) {\n\t    this.k0 = 1;\n\t  }\n\t  this.x0 = this.x0 || 0;\n\t  this.y0 = this.y0 || 0;\n\t  // Standard Parallels cannot be equal and on opposite sides of the equator\n\t  if (Math.abs(this.lat1 + this.lat2) < EPSLN) {\n\t    return;\n\t  }\n\n\t  var temp = this.b / this.a;\n\t  this.e = Math.sqrt(1 - temp * temp);\n\n\t  var sin1 = Math.sin(this.lat1);\n\t  var cos1 = Math.cos(this.lat1);\n\t  var ms1 = msfnz(this.e, sin1, cos1);\n\t  var ts1 = tsfnz(this.e, this.lat1, sin1);\n\n\t  var sin2 = Math.sin(this.lat2);\n\t  var cos2 = Math.cos(this.lat2);\n\t  var ms2 = msfnz(this.e, sin2, cos2);\n\t  var ts2 = tsfnz(this.e, this.lat2, sin2);\n\n\t  var ts0 = tsfnz(this.e, this.lat0, Math.sin(this.lat0));\n\n\t  if (Math.abs(this.lat1 - this.lat2) > EPSLN) {\n\t    this.ns = Math.log(ms1 / ms2) / Math.log(ts1 / ts2);\n\t  }\n\t  else {\n\t    this.ns = sin1;\n\t  }\n\t  if (isNaN(this.ns)) {\n\t    this.ns = sin1;\n\t  }\n\t  this.f0 = ms1 / (this.ns * Math.pow(ts1, this.ns));\n\t  this.rh = this.a * this.f0 * Math.pow(ts0, this.ns);\n\t  if (!this.title) {\n\t    this.title = \"Lambert Conformal Conic\";\n\t  }\n\t}\n\n\t// Lambert Conformal conic forward equations--mapping lat,long to x,y\n\t// -----------------------------------------------------------------\n\tfunction forward$9(p) {\n\n\t  var lon = p.x;\n\t  var lat = p.y;\n\n\t  // singular cases :\n\t  if (Math.abs(2 * Math.abs(lat) - Math.PI) <= EPSLN) {\n\t    lat = sign(lat) * (HALF_PI - 2 * EPSLN);\n\t  }\n\n\t  var con = Math.abs(Math.abs(lat) - HALF_PI);\n\t  var ts, rh1;\n\t  if (con > EPSLN) {\n\t    ts = tsfnz(this.e, lat, Math.sin(lat));\n\t    rh1 = this.a * this.f0 * Math.pow(ts, this.ns);\n\t  }\n\t  else {\n\t    con = lat * this.ns;\n\t    if (con <= 0) {\n\t      return null;\n\t    }\n\t    rh1 = 0;\n\t  }\n\t  var theta = this.ns * adjust_lon(lon - this.long0);\n\t  p.x = this.k0 * (rh1 * Math.sin(theta)) + this.x0;\n\t  p.y = this.k0 * (this.rh - rh1 * Math.cos(theta)) + this.y0;\n\n\t  return p;\n\t}\n\n\t// Lambert Conformal Conic inverse equations--mapping x,y to lat/long\n\t// -----------------------------------------------------------------\n\tfunction inverse$9(p) {\n\n\t  var rh1, con, ts;\n\t  var lat, lon;\n\t  var x = (p.x - this.x0) / this.k0;\n\t  var y = (this.rh - (p.y - this.y0) / this.k0);\n\t  if (this.ns > 0) {\n\t    rh1 = Math.sqrt(x * x + y * y);\n\t    con = 1;\n\t  }\n\t  else {\n\t    rh1 = -Math.sqrt(x * x + y * y);\n\t    con = -1;\n\t  }\n\t  var theta = 0;\n\t  if (rh1 !== 0) {\n\t    theta = Math.atan2((con * x), (con * y));\n\t  }\n\t  if ((rh1 !== 0) || (this.ns > 0)) {\n\t    con = 1 / this.ns;\n\t    ts = Math.pow((rh1 / (this.a * this.f0)), con);\n\t    lat = phi2z(this.e, ts);\n\t    if (lat === -9999) {\n\t      return null;\n\t    }\n\t  }\n\t  else {\n\t    lat = -HALF_PI;\n\t  }\n\t  lon = adjust_lon(theta / this.ns + this.long0);\n\n\t  p.x = lon;\n\t  p.y = lat;\n\t  return p;\n\t}\n\n\tvar names$11 = [\"Lambert Tangential Conformal Conic Projection\", \"Lambert_Conformal_Conic\", \"Lambert_Conformal_Conic_2SP\", \"lcc\"];\n\tvar lcc = {\n\t  init: init$10,\n\t  forward: forward$9,\n\t  inverse: inverse$9,\n\t  names: names$11\n\t};\n\n\tfunction init$11() {\n\t  this.a = 6377397.155;\n\t  this.es = 0.006674372230614;\n\t  this.e = Math.sqrt(this.es);\n\t  if (!this.lat0) {\n\t    this.lat0 = 0.863937979737193;\n\t  }\n\t  if (!this.long0) {\n\t    this.long0 = 0.7417649320975901 - 0.308341501185665;\n\t  }\n\t  /* if scale not set default to 0.9999 */\n\t  if (!this.k0) {\n\t    this.k0 = 0.9999;\n\t  }\n\t  this.s45 = 0.785398163397448; /* 45 */\n\t  this.s90 = 2 * this.s45;\n\t  this.fi0 = this.lat0;\n\t  this.e2 = this.es;\n\t  this.e = Math.sqrt(this.e2);\n\t  this.alfa = Math.sqrt(1 + (this.e2 * Math.pow(Math.cos(this.fi0), 4)) / (1 - this.e2));\n\t  this.uq = 1.04216856380474;\n\t  this.u0 = Math.asin(Math.sin(this.fi0) / this.alfa);\n\t  this.g = Math.pow((1 + this.e * Math.sin(this.fi0)) / (1 - this.e * Math.sin(this.fi0)), this.alfa * this.e / 2);\n\t  this.k = Math.tan(this.u0 / 2 + this.s45) / Math.pow(Math.tan(this.fi0 / 2 + this.s45), this.alfa) * this.g;\n\t  this.k1 = this.k0;\n\t  this.n0 = this.a * Math.sqrt(1 - this.e2) / (1 - this.e2 * Math.pow(Math.sin(this.fi0), 2));\n\t  this.s0 = 1.37008346281555;\n\t  this.n = Math.sin(this.s0);\n\t  this.ro0 = this.k1 * this.n0 / Math.tan(this.s0);\n\t  this.ad = this.s90 - this.uq;\n\t}\n\n\t/* ellipsoid */\n\t/* calculate xy from lat/lon */\n\t/* Constants, identical to inverse transform function */\n\tfunction forward$10(p) {\n\t  var gfi, u, deltav, s, d, eps, ro;\n\t  var lon = p.x;\n\t  var lat = p.y;\n\t  var delta_lon = adjust_lon(lon - this.long0);\n\t  /* Transformation */\n\t  gfi = Math.pow(((1 + this.e * Math.sin(lat)) / (1 - this.e * Math.sin(lat))), (this.alfa * this.e / 2));\n\t  u = 2 * (Math.atan(this.k * Math.pow(Math.tan(lat / 2 + this.s45), this.alfa) / gfi) - this.s45);\n\t  deltav = -delta_lon * this.alfa;\n\t  s = Math.asin(Math.cos(this.ad) * Math.sin(u) + Math.sin(this.ad) * Math.cos(u) * Math.cos(deltav));\n\t  d = Math.asin(Math.cos(u) * Math.sin(deltav) / Math.cos(s));\n\t  eps = this.n * d;\n\t  ro = this.ro0 * Math.pow(Math.tan(this.s0 / 2 + this.s45), this.n) / Math.pow(Math.tan(s / 2 + this.s45), this.n);\n\t  p.y = ro * Math.cos(eps) / 1;\n\t  p.x = ro * Math.sin(eps) / 1;\n\n\t  if (!this.czech) {\n\t    p.y *= -1;\n\t    p.x *= -1;\n\t  }\n\t  return (p);\n\t}\n\n\t/* calculate lat/lon from xy */\n\tfunction inverse$10(p) {\n\t  var u, deltav, s, d, eps, ro, fi1;\n\t  var ok;\n\n\t  /* Transformation */\n\t  /* revert y, x*/\n\t  var tmp = p.x;\n\t  p.x = p.y;\n\t  p.y = tmp;\n\t  if (!this.czech) {\n\t    p.y *= -1;\n\t    p.x *= -1;\n\t  }\n\t  ro = Math.sqrt(p.x * p.x + p.y * p.y);\n\t  eps = Math.atan2(p.y, p.x);\n\t  d = eps / Math.sin(this.s0);\n\t  s = 2 * (Math.atan(Math.pow(this.ro0 / ro, 1 / this.n) * Math.tan(this.s0 / 2 + this.s45)) - this.s45);\n\t  u = Math.asin(Math.cos(this.ad) * Math.sin(s) - Math.sin(this.ad) * Math.cos(s) * Math.cos(d));\n\t  deltav = Math.asin(Math.cos(s) * Math.sin(d) / Math.cos(u));\n\t  p.x = this.long0 - deltav / this.alfa;\n\t  fi1 = u;\n\t  ok = 0;\n\t  var iter = 0;\n\t  do {\n\t    p.y = 2 * (Math.atan(Math.pow(this.k, - 1 / this.alfa) * Math.pow(Math.tan(u / 2 + this.s45), 1 / this.alfa) * Math.pow((1 + this.e * Math.sin(fi1)) / (1 - this.e * Math.sin(fi1)), this.e / 2)) - this.s45);\n\t    if (Math.abs(fi1 - p.y) < 0.0000000001) {\n\t      ok = 1;\n\t    }\n\t    fi1 = p.y;\n\t    iter += 1;\n\t  } while (ok === 0 && iter < 15);\n\t  if (iter >= 15) {\n\t    return null;\n\t  }\n\n\t  return (p);\n\t}\n\n\tvar names$12 = [\"Krovak\", \"krovak\"];\n\tvar krovak = {\n\t  init: init$11,\n\t  forward: forward$10,\n\t  inverse: inverse$10,\n\t  names: names$12\n\t};\n\n\tvar mlfn = function(e0, e1, e2, e3, phi) {\n\t  return (e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi));\n\t};\n\n\tvar e0fn = function(x) {\n\t  return (1 - 0.25 * x * (1 + x / 16 * (3 + 1.25 * x)));\n\t};\n\n\tvar e1fn = function(x) {\n\t  return (0.375 * x * (1 + 0.25 * x * (1 + 0.46875 * x)));\n\t};\n\n\tvar e2fn = function(x) {\n\t  return (0.05859375 * x * x * (1 + 0.75 * x));\n\t};\n\n\tvar e3fn = function(x) {\n\t  return (x * x * x * (35 / 3072));\n\t};\n\n\tvar gN = function(a, e, sinphi) {\n\t  var temp = e * sinphi;\n\t  return a / Math.sqrt(1 - temp * temp);\n\t};\n\n\tvar adjust_lat = function(x) {\n\t  return (Math.abs(x) < HALF_PI) ? x : (x - (sign(x) * Math.PI));\n\t};\n\n\tvar imlfn = function(ml, e0, e1, e2, e3) {\n\t  var phi;\n\t  var dphi;\n\n\t  phi = ml / e0;\n\t  for (var i = 0; i < 15; i++) {\n\t    dphi = (ml - (e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi))) / (e0 - 2 * e1 * Math.cos(2 * phi) + 4 * e2 * Math.cos(4 * phi) - 6 * e3 * Math.cos(6 * phi));\n\t    phi += dphi;\n\t    if (Math.abs(dphi) <= 0.0000000001) {\n\t      return phi;\n\t    }\n\t  }\n\n\t  //..reportError(\"IMLFN-CONV:Latitude failed to converge after 15 iterations\");\n\t  return NaN;\n\t};\n\n\tfunction init$12() {\n\t  if (!this.sphere) {\n\t    this.e0 = e0fn(this.es);\n\t    this.e1 = e1fn(this.es);\n\t    this.e2 = e2fn(this.es);\n\t    this.e3 = e3fn(this.es);\n\t    this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0);\n\t  }\n\t}\n\n\t/* Cassini forward equations--mapping lat,long to x,y\n\t  -----------------------------------------------------------------------*/\n\tfunction forward$11(p) {\n\n\t  /* Forward equations\n\t      -----------------*/\n\t  var x, y;\n\t  var lam = p.x;\n\t  var phi = p.y;\n\t  lam = adjust_lon(lam - this.long0);\n\n\t  if (this.sphere) {\n\t    x = this.a * Math.asin(Math.cos(phi) * Math.sin(lam));\n\t    y = this.a * (Math.atan2(Math.tan(phi), Math.cos(lam)) - this.lat0);\n\t  }\n\t  else {\n\t    //ellipsoid\n\t    var sinphi = Math.sin(phi);\n\t    var cosphi = Math.cos(phi);\n\t    var nl = gN(this.a, this.e, sinphi);\n\t    var tl = Math.tan(phi) * Math.tan(phi);\n\t    var al = lam * Math.cos(phi);\n\t    var asq = al * al;\n\t    var cl = this.es * cosphi * cosphi / (1 - this.es);\n\t    var ml = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi);\n\n\t    x = nl * al * (1 - asq * tl * (1 / 6 - (8 - tl + 8 * cl) * asq / 120));\n\t    y = ml - this.ml0 + nl * sinphi / cosphi * asq * (0.5 + (5 - tl + 6 * cl) * asq / 24);\n\n\n\t  }\n\n\t  p.x = x + this.x0;\n\t  p.y = y + this.y0;\n\t  return p;\n\t}\n\n\t/* Inverse equations\n\t  -----------------*/\n\tfunction inverse$11(p) {\n\t  p.x -= this.x0;\n\t  p.y -= this.y0;\n\t  var x = p.x / this.a;\n\t  var y = p.y / this.a;\n\t  var phi, lam;\n\n\t  if (this.sphere) {\n\t    var dd = y + this.lat0;\n\t    phi = Math.asin(Math.sin(dd) * Math.cos(x));\n\t    lam = Math.atan2(Math.tan(x), Math.cos(dd));\n\t  }\n\t  else {\n\t    /* ellipsoid */\n\t    var ml1 = this.ml0 / this.a + y;\n\t    var phi1 = imlfn(ml1, this.e0, this.e1, this.e2, this.e3);\n\t    if (Math.abs(Math.abs(phi1) - HALF_PI) <= EPSLN) {\n\t      p.x = this.long0;\n\t      p.y = HALF_PI;\n\t      if (y < 0) {\n\t        p.y *= -1;\n\t      }\n\t      return p;\n\t    }\n\t    var nl1 = gN(this.a, this.e, Math.sin(phi1));\n\n\t    var rl1 = nl1 * nl1 * nl1 / this.a / this.a * (1 - this.es);\n\t    var tl1 = Math.pow(Math.tan(phi1), 2);\n\t    var dl = x * this.a / nl1;\n\t    var dsq = dl * dl;\n\t    phi = phi1 - nl1 * Math.tan(phi1) / rl1 * dl * dl * (0.5 - (1 + 3 * tl1) * dl * dl / 24);\n\t    lam = dl * (1 - dsq * (tl1 / 3 + (1 + 3 * tl1) * tl1 * dsq / 15)) / Math.cos(phi1);\n\n\t  }\n\n\t  p.x = adjust_lon(lam + this.long0);\n\t  p.y = adjust_lat(phi);\n\t  return p;\n\n\t}\n\n\tvar names$13 = [\"Cassini\", \"Cassini_Soldner\", \"cass\"];\n\tvar cass = {\n\t  init: init$12,\n\t  forward: forward$11,\n\t  inverse: inverse$11,\n\t  names: names$13\n\t};\n\n\tvar qsfnz = function(eccent, sinphi) {\n\t  var con;\n\t  if (eccent > 1.0e-7) {\n\t    con = eccent * sinphi;\n\t    return ((1 - eccent * eccent) * (sinphi / (1 - con * con) - (0.5 / eccent) * Math.log((1 - con) / (1 + con))));\n\t  }\n\t  else {\n\t    return (2 * sinphi);\n\t  }\n\t};\n\n\t/*\n\t  reference\n\t    \"New Equal-Area Map Projections for Noncircular Regions\", John P. Snyder,\n\t    The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355.\n\t  */\n\n\tvar S_POLE = 1;\n\n\tvar N_POLE = 2;\n\tvar EQUIT = 3;\n\tvar OBLIQ = 4;\n\n\t/* Initialize the Lambert Azimuthal Equal Area projection\n\t  ------------------------------------------------------*/\n\tfunction init$13() {\n\t  var t = Math.abs(this.lat0);\n\t  if (Math.abs(t - HALF_PI) < EPSLN) {\n\t    this.mode = this.lat0 < 0 ? this.S_POLE : this.N_POLE;\n\t  }\n\t  else if (Math.abs(t) < EPSLN) {\n\t    this.mode = this.EQUIT;\n\t  }\n\t  else {\n\t    this.mode = this.OBLIQ;\n\t  }\n\t  if (this.es > 0) {\n\t    var sinphi;\n\n\t    this.qp = qsfnz(this.e, 1);\n\t    this.mmf = 0.5 / (1 - this.es);\n\t    this.apa = authset(this.es);\n\t    switch (this.mode) {\n\t    case this.N_POLE:\n\t      this.dd = 1;\n\t      break;\n\t    case this.S_POLE:\n\t      this.dd = 1;\n\t      break;\n\t    case this.EQUIT:\n\t      this.rq = Math.sqrt(0.5 * this.qp);\n\t      this.dd = 1 / this.rq;\n\t      this.xmf = 1;\n\t      this.ymf = 0.5 * this.qp;\n\t      break;\n\t    case this.OBLIQ:\n\t      this.rq = Math.sqrt(0.5 * this.qp);\n\t      sinphi = Math.sin(this.lat0);\n\t      this.sinb1 = qsfnz(this.e, sinphi) / this.qp;\n\t      this.cosb1 = Math.sqrt(1 - this.sinb1 * this.sinb1);\n\t      this.dd = Math.cos(this.lat0) / (Math.sqrt(1 - this.es * sinphi * sinphi) * this.rq * this.cosb1);\n\t      this.ymf = (this.xmf = this.rq) / this.dd;\n\t      this.xmf *= this.dd;\n\t      break;\n\t    }\n\t  }\n\t  else {\n\t    if (this.mode === this.OBLIQ) {\n\t      this.sinph0 = Math.sin(this.lat0);\n\t      this.cosph0 = Math.cos(this.lat0);\n\t    }\n\t  }\n\t}\n\n\t/* Lambert Azimuthal Equal Area forward equations--mapping lat,long to x,y\n\t  -----------------------------------------------------------------------*/\n\tfunction forward$12(p) {\n\n\t  /* Forward equations\n\t      -----------------*/\n\t  var x, y, coslam, sinlam, sinphi, q, sinb, cosb, b, cosphi;\n\t  var lam = p.x;\n\t  var phi = p.y;\n\n\t  lam = adjust_lon(lam - this.long0);\n\t  if (this.sphere) {\n\t    sinphi = Math.sin(phi);\n\t    cosphi = Math.cos(phi);\n\t    coslam = Math.cos(lam);\n\t    if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {\n\t      y = (this.mode === this.EQUIT) ? 1 + cosphi * coslam : 1 + this.sinph0 * sinphi + this.cosph0 * cosphi * coslam;\n\t      if (y <= EPSLN) {\n\t        return null;\n\t      }\n\t      y = Math.sqrt(2 / y);\n\t      x = y * cosphi * Math.sin(lam);\n\t      y *= (this.mode === this.EQUIT) ? sinphi : this.cosph0 * sinphi - this.sinph0 * cosphi * coslam;\n\t    }\n\t    else if (this.mode === this.N_POLE || this.mode === this.S_POLE) {\n\t      if (this.mode === this.N_POLE) {\n\t        coslam = -coslam;\n\t      }\n\t      if (Math.abs(phi + this.phi0) < EPSLN) {\n\t        return null;\n\t      }\n\t      y = FORTPI - phi * 0.5;\n\t      y = 2 * ((this.mode === this.S_POLE) ? Math.cos(y) : Math.sin(y));\n\t      x = y * Math.sin(lam);\n\t      y *= coslam;\n\t    }\n\t  }\n\t  else {\n\t    sinb = 0;\n\t    cosb = 0;\n\t    b = 0;\n\t    coslam = Math.cos(lam);\n\t    sinlam = Math.sin(lam);\n\t    sinphi = Math.sin(phi);\n\t    q = qsfnz(this.e, sinphi);\n\t    if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {\n\t      sinb = q / this.qp;\n\t      cosb = Math.sqrt(1 - sinb * sinb);\n\t    }\n\t    switch (this.mode) {\n\t    case this.OBLIQ:\n\t      b = 1 + this.sinb1 * sinb + this.cosb1 * cosb * coslam;\n\t      break;\n\t    case this.EQUIT:\n\t      b = 1 + cosb * coslam;\n\t      break;\n\t    case this.N_POLE:\n\t      b = HALF_PI + phi;\n\t      q = this.qp - q;\n\t      break;\n\t    case this.S_POLE:\n\t      b = phi - HALF_PI;\n\t      q = this.qp + q;\n\t      break;\n\t    }\n\t    if (Math.abs(b) < EPSLN) {\n\t      return null;\n\t    }\n\t    switch (this.mode) {\n\t    case this.OBLIQ:\n\t    case this.EQUIT:\n\t      b = Math.sqrt(2 / b);\n\t      if (this.mode === this.OBLIQ) {\n\t        y = this.ymf * b * (this.cosb1 * sinb - this.sinb1 * cosb * coslam);\n\t      }\n\t      else {\n\t        y = (b = Math.sqrt(2 / (1 + cosb * coslam))) * sinb * this.ymf;\n\t      }\n\t      x = this.xmf * b * cosb * sinlam;\n\t      break;\n\t    case this.N_POLE:\n\t    case this.S_POLE:\n\t      if (q >= 0) {\n\t        x = (b = Math.sqrt(q)) * sinlam;\n\t        y = coslam * ((this.mode === this.S_POLE) ? b : -b);\n\t      }\n\t      else {\n\t        x = y = 0;\n\t      }\n\t      break;\n\t    }\n\t  }\n\n\t  p.x = this.a * x + this.x0;\n\t  p.y = this.a * y + this.y0;\n\t  return p;\n\t}\n\n\t/* Inverse equations\n\t  -----------------*/\n\tfunction inverse$12(p) {\n\t  p.x -= this.x0;\n\t  p.y -= this.y0;\n\t  var x = p.x / this.a;\n\t  var y = p.y / this.a;\n\t  var lam, phi, cCe, sCe, q, rho, ab;\n\t  if (this.sphere) {\n\t    var cosz = 0,\n\t      rh, sinz = 0;\n\n\t    rh = Math.sqrt(x * x + y * y);\n\t    phi = rh * 0.5;\n\t    if (phi > 1) {\n\t      return null;\n\t    }\n\t    phi = 2 * Math.asin(phi);\n\t    if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {\n\t      sinz = Math.sin(phi);\n\t      cosz = Math.cos(phi);\n\t    }\n\t    switch (this.mode) {\n\t    case this.EQUIT:\n\t      phi = (Math.abs(rh) <= EPSLN) ? 0 : Math.asin(y * sinz / rh);\n\t      x *= sinz;\n\t      y = cosz * rh;\n\t      break;\n\t    case this.OBLIQ:\n\t      phi = (Math.abs(rh) <= EPSLN) ? this.phi0 : Math.asin(cosz * this.sinph0 + y * sinz * this.cosph0 / rh);\n\t      x *= sinz * this.cosph0;\n\t      y = (cosz - Math.sin(phi) * this.sinph0) * rh;\n\t      break;\n\t    case this.N_POLE:\n\t      y = -y;\n\t      phi = HALF_PI - phi;\n\t      break;\n\t    case this.S_POLE:\n\t      phi -= HALF_PI;\n\t      break;\n\t    }\n\t    lam = (y === 0 && (this.mode === this.EQUIT || this.mode === this.OBLIQ)) ? 0 : Math.atan2(x, y);\n\t  }\n\t  else {\n\t    ab = 0;\n\t    if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {\n\t      x /= this.dd;\n\t      y *= this.dd;\n\t      rho = Math.sqrt(x * x + y * y);\n\t      if (rho < EPSLN) {\n\t        p.x = 0;\n\t        p.y = this.phi0;\n\t        return p;\n\t      }\n\t      sCe = 2 * Math.asin(0.5 * rho / this.rq);\n\t      cCe = Math.cos(sCe);\n\t      x *= (sCe = Math.sin(sCe));\n\t      if (this.mode === this.OBLIQ) {\n\t        ab = cCe * this.sinb1 + y * sCe * this.cosb1 / rho;\n\t        q = this.qp * ab;\n\t        y = rho * this.cosb1 * cCe - y * this.sinb1 * sCe;\n\t      }\n\t      else {\n\t        ab = y * sCe / rho;\n\t        q = this.qp * ab;\n\t        y = rho * cCe;\n\t      }\n\t    }\n\t    else if (this.mode === this.N_POLE || this.mode === this.S_POLE) {\n\t      if (this.mode === this.N_POLE) {\n\t        y = -y;\n\t      }\n\t      q = (x * x + y * y);\n\t      if (!q) {\n\t        p.x = 0;\n\t        p.y = this.phi0;\n\t        return p;\n\t      }\n\t      ab = 1 - q / this.qp;\n\t      if (this.mode === this.S_POLE) {\n\t        ab = -ab;\n\t      }\n\t    }\n\t    lam = Math.atan2(x, y);\n\t    phi = authlat(Math.asin(ab), this.apa);\n\t  }\n\n\t  p.x = adjust_lon(this.long0 + lam);\n\t  p.y = phi;\n\t  return p;\n\t}\n\n\t/* determine latitude from authalic latitude */\n\tvar P00 = 0.33333333333333333333;\n\n\tvar P01 = 0.17222222222222222222;\n\tvar P02 = 0.10257936507936507936;\n\tvar P10 = 0.06388888888888888888;\n\tvar P11 = 0.06640211640211640211;\n\tvar P20 = 0.01641501294219154443;\n\n\tfunction authset(es) {\n\t  var t;\n\t  var APA = [];\n\t  APA[0] = es * P00;\n\t  t = es * es;\n\t  APA[0] += t * P01;\n\t  APA[1] = t * P10;\n\t  t *= es;\n\t  APA[0] += t * P02;\n\t  APA[1] += t * P11;\n\t  APA[2] = t * P20;\n\t  return APA;\n\t}\n\n\tfunction authlat(beta, APA) {\n\t  var t = beta + beta;\n\t  return (beta + APA[0] * Math.sin(t) + APA[1] * Math.sin(t + t) + APA[2] * Math.sin(t + t + t));\n\t}\n\n\tvar names$14 = [\"Lambert Azimuthal Equal Area\", \"Lambert_Azimuthal_Equal_Area\", \"laea\"];\n\tvar laea = {\n\t  init: init$13,\n\t  forward: forward$12,\n\t  inverse: inverse$12,\n\t  names: names$14,\n\t  S_POLE: S_POLE,\n\t  N_POLE: N_POLE,\n\t  EQUIT: EQUIT,\n\t  OBLIQ: OBLIQ\n\t};\n\n\tvar asinz = function(x) {\n\t  if (Math.abs(x) > 1) {\n\t    x = (x > 1) ? 1 : -1;\n\t  }\n\t  return Math.asin(x);\n\t};\n\n\tfunction init$14() {\n\n\t  if (Math.abs(this.lat1 + this.lat2) < EPSLN) {\n\t    return;\n\t  }\n\t  this.temp = this.b / this.a;\n\t  this.es = 1 - Math.pow(this.temp, 2);\n\t  this.e3 = Math.sqrt(this.es);\n\n\t  this.sin_po = Math.sin(this.lat1);\n\t  this.cos_po = Math.cos(this.lat1);\n\t  this.t1 = this.sin_po;\n\t  this.con = this.sin_po;\n\t  this.ms1 = msfnz(this.e3, this.sin_po, this.cos_po);\n\t  this.qs1 = qsfnz(this.e3, this.sin_po, this.cos_po);\n\n\t  this.sin_po = Math.sin(this.lat2);\n\t  this.cos_po = Math.cos(this.lat2);\n\t  this.t2 = this.sin_po;\n\t  this.ms2 = msfnz(this.e3, this.sin_po, this.cos_po);\n\t  this.qs2 = qsfnz(this.e3, this.sin_po, this.cos_po);\n\n\t  this.sin_po = Math.sin(this.lat0);\n\t  this.cos_po = Math.cos(this.lat0);\n\t  this.t3 = this.sin_po;\n\t  this.qs0 = qsfnz(this.e3, this.sin_po, this.cos_po);\n\n\t  if (Math.abs(this.lat1 - this.lat2) > EPSLN) {\n\t    this.ns0 = (this.ms1 * this.ms1 - this.ms2 * this.ms2) / (this.qs2 - this.qs1);\n\t  }\n\t  else {\n\t    this.ns0 = this.con;\n\t  }\n\t  this.c = this.ms1 * this.ms1 + this.ns0 * this.qs1;\n\t  this.rh = this.a * Math.sqrt(this.c - this.ns0 * this.qs0) / this.ns0;\n\t}\n\n\t/* Albers Conical Equal Area forward equations--mapping lat,long to x,y\n\t  -------------------------------------------------------------------*/\n\tfunction forward$13(p) {\n\n\t  var lon = p.x;\n\t  var lat = p.y;\n\n\t  this.sin_phi = Math.sin(lat);\n\t  this.cos_phi = Math.cos(lat);\n\n\t  var qs = qsfnz(this.e3, this.sin_phi, this.cos_phi);\n\t  var rh1 = this.a * Math.sqrt(this.c - this.ns0 * qs) / this.ns0;\n\t  var theta = this.ns0 * adjust_lon(lon - this.long0);\n\t  var x = rh1 * Math.sin(theta) + this.x0;\n\t  var y = this.rh - rh1 * Math.cos(theta) + this.y0;\n\n\t  p.x = x;\n\t  p.y = y;\n\t  return p;\n\t}\n\n\tfunction inverse$13(p) {\n\t  var rh1, qs, con, theta, lon, lat;\n\n\t  p.x -= this.x0;\n\t  p.y = this.rh - p.y + this.y0;\n\t  if (this.ns0 >= 0) {\n\t    rh1 = Math.sqrt(p.x * p.x + p.y * p.y);\n\t    con = 1;\n\t  }\n\t  else {\n\t    rh1 = -Math.sqrt(p.x * p.x + p.y * p.y);\n\t    con = -1;\n\t  }\n\t  theta = 0;\n\t  if (rh1 !== 0) {\n\t    theta = Math.atan2(con * p.x, con * p.y);\n\t  }\n\t  con = rh1 * this.ns0 / this.a;\n\t  if (this.sphere) {\n\t    lat = Math.asin((this.c - con * con) / (2 * this.ns0));\n\t  }\n\t  else {\n\t    qs = (this.c - con * con) / this.ns0;\n\t    lat = this.phi1z(this.e3, qs);\n\t  }\n\n\t  lon = adjust_lon(theta / this.ns0 + this.long0);\n\t  p.x = lon;\n\t  p.y = lat;\n\t  return p;\n\t}\n\n\t/* Function to compute phi1, the latitude for the inverse of the\n\t   Albers Conical Equal-Area projection.\n\t-------------------------------------------*/\n\tfunction phi1z(eccent, qs) {\n\t  var sinphi, cosphi, con, com, dphi;\n\t  var phi = asinz(0.5 * qs);\n\t  if (eccent < EPSLN) {\n\t    return phi;\n\t  }\n\n\t  var eccnts = eccent * eccent;\n\t  for (var i = 1; i <= 25; i++) {\n\t    sinphi = Math.sin(phi);\n\t    cosphi = Math.cos(phi);\n\t    con = eccent * sinphi;\n\t    com = 1 - con * con;\n\t    dphi = 0.5 * com * com / cosphi * (qs / (1 - eccnts) - sinphi / com + 0.5 / eccent * Math.log((1 - con) / (1 + con)));\n\t    phi = phi + dphi;\n\t    if (Math.abs(dphi) <= 1e-7) {\n\t      return phi;\n\t    }\n\t  }\n\t  return null;\n\t}\n\n\tvar names$15 = [\"Albers_Conic_Equal_Area\", \"Albers\", \"aea\"];\n\tvar aea = {\n\t  init: init$14,\n\t  forward: forward$13,\n\t  inverse: inverse$13,\n\t  names: names$15,\n\t  phi1z: phi1z\n\t};\n\n\t/*\n\t  reference:\n\t    Wolfram Mathworld \"Gnomonic Projection\"\n\t    http://mathworld.wolfram.com/GnomonicProjection.html\n\t    Accessed: 12th November 2009\n\t  */\n\tfunction init$15() {\n\n\t  /* Place parameters in static storage for common use\n\t      -------------------------------------------------*/\n\t  this.sin_p14 = Math.sin(this.lat0);\n\t  this.cos_p14 = Math.cos(this.lat0);\n\t  // Approximation for projecting points to the horizon (infinity)\n\t  this.infinity_dist = 1000 * this.a;\n\t  this.rc = 1;\n\t}\n\n\t/* Gnomonic forward equations--mapping lat,long to x,y\n\t    ---------------------------------------------------*/\n\tfunction forward$14(p) {\n\t  var sinphi, cosphi; /* sin and cos value        */\n\t  var dlon; /* delta longitude value      */\n\t  var coslon; /* cos of longitude        */\n\t  var ksp; /* scale factor          */\n\t  var g;\n\t  var x, y;\n\t  var lon = p.x;\n\t  var lat = p.y;\n\t  /* Forward equations\n\t      -----------------*/\n\t  dlon = adjust_lon(lon - this.long0);\n\n\t  sinphi = Math.sin(lat);\n\t  cosphi = Math.cos(lat);\n\n\t  coslon = Math.cos(dlon);\n\t  g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon;\n\t  ksp = 1;\n\t  if ((g > 0) || (Math.abs(g) <= EPSLN)) {\n\t    x = this.x0 + this.a * ksp * cosphi * Math.sin(dlon) / g;\n\t    y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon) / g;\n\t  }\n\t  else {\n\n\t    // Point is in the opposing hemisphere and is unprojectable\n\t    // We still need to return a reasonable point, so we project\n\t    // to infinity, on a bearing\n\t    // equivalent to the northern hemisphere equivalent\n\t    // This is a reasonable approximation for short shapes and lines that\n\t    // straddle the horizon.\n\n\t    x = this.x0 + this.infinity_dist * cosphi * Math.sin(dlon);\n\t    y = this.y0 + this.infinity_dist * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon);\n\n\t  }\n\t  p.x = x;\n\t  p.y = y;\n\t  return p;\n\t}\n\n\tfunction inverse$14(p) {\n\t  var rh; /* Rho */\n\t  var sinc, cosc;\n\t  var c;\n\t  var lon, lat;\n\n\t  /* Inverse equations\n\t      -----------------*/\n\t  p.x = (p.x - this.x0) / this.a;\n\t  p.y = (p.y - this.y0) / this.a;\n\n\t  p.x /= this.k0;\n\t  p.y /= this.k0;\n\n\t  if ((rh = Math.sqrt(p.x * p.x + p.y * p.y))) {\n\t    c = Math.atan2(rh, this.rc);\n\t    sinc = Math.sin(c);\n\t    cosc = Math.cos(c);\n\n\t    lat = asinz(cosc * this.sin_p14 + (p.y * sinc * this.cos_p14) / rh);\n\t    lon = Math.atan2(p.x * sinc, rh * this.cos_p14 * cosc - p.y * this.sin_p14 * sinc);\n\t    lon = adjust_lon(this.long0 + lon);\n\t  }\n\t  else {\n\t    lat = this.phic0;\n\t    lon = 0;\n\t  }\n\n\t  p.x = lon;\n\t  p.y = lat;\n\t  return p;\n\t}\n\n\tvar names$16 = [\"gnom\"];\n\tvar gnom = {\n\t  init: init$15,\n\t  forward: forward$14,\n\t  inverse: inverse$14,\n\t  names: names$16\n\t};\n\n\tvar iqsfnz = function(eccent, q) {\n\t  var temp = 1 - (1 - eccent * eccent) / (2 * eccent) * Math.log((1 - eccent) / (1 + eccent));\n\t  if (Math.abs(Math.abs(q) - temp) < 1.0E-6) {\n\t    if (q < 0) {\n\t      return (-1 * HALF_PI);\n\t    }\n\t    else {\n\t      return HALF_PI;\n\t    }\n\t  }\n\t  //var phi = 0.5* q/(1-eccent*eccent);\n\t  var phi = Math.asin(0.5 * q);\n\t  var dphi;\n\t  var sin_phi;\n\t  var cos_phi;\n\t  var con;\n\t  for (var i = 0; i < 30; i++) {\n\t    sin_phi = Math.sin(phi);\n\t    cos_phi = Math.cos(phi);\n\t    con = eccent * sin_phi;\n\t    dphi = Math.pow(1 - con * con, 2) / (2 * cos_phi) * (q / (1 - eccent * eccent) - sin_phi / (1 - con * con) + 0.5 / eccent * Math.log((1 - con) / (1 + con)));\n\t    phi += dphi;\n\t    if (Math.abs(dphi) <= 0.0000000001) {\n\t      return phi;\n\t    }\n\t  }\n\n\t  //console.log(\"IQSFN-CONV:Latitude failed to converge after 30 iterations\");\n\t  return NaN;\n\t};\n\n\t/*\n\t  reference:\n\t    \"Cartographic Projection Procedures for the UNIX Environment-\n\t    A User's Manual\" by Gerald I. Evenden,\n\t    USGS Open File Report 90-284and Release 4 Interim Reports (2003)\n\t*/\n\tfunction init$16() {\n\t  //no-op\n\t  if (!this.sphere) {\n\t    this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts));\n\t  }\n\t}\n\n\t/* Cylindrical Equal Area forward equations--mapping lat,long to x,y\n\t    ------------------------------------------------------------*/\n\tfunction forward$15(p) {\n\t  var lon = p.x;\n\t  var lat = p.y;\n\t  var x, y;\n\t  /* Forward equations\n\t      -----------------*/\n\t  var dlon = adjust_lon(lon - this.long0);\n\t  if (this.sphere) {\n\t    x = this.x0 + this.a * dlon * Math.cos(this.lat_ts);\n\t    y = this.y0 + this.a * Math.sin(lat) / Math.cos(this.lat_ts);\n\t  }\n\t  else {\n\t    var qs = qsfnz(this.e, Math.sin(lat));\n\t    x = this.x0 + this.a * this.k0 * dlon;\n\t    y = this.y0 + this.a * qs * 0.5 / this.k0;\n\t  }\n\n\t  p.x = x;\n\t  p.y = y;\n\t  return p;\n\t}\n\n\t/* Cylindrical Equal Area inverse equations--mapping x,y to lat/long\n\t    ------------------------------------------------------------*/\n\tfunction inverse$15(p) {\n\t  p.x -= this.x0;\n\t  p.y -= this.y0;\n\t  var lon, lat;\n\n\t  if (this.sphere) {\n\t    lon = adjust_lon(this.long0 + (p.x / this.a) / Math.cos(this.lat_ts));\n\t    lat = Math.asin((p.y / this.a) * Math.cos(this.lat_ts));\n\t  }\n\t  else {\n\t    lat = iqsfnz(this.e, 2 * p.y * this.k0 / this.a);\n\t    lon = adjust_lon(this.long0 + p.x / (this.a * this.k0));\n\t  }\n\n\t  p.x = lon;\n\t  p.y = lat;\n\t  return p;\n\t}\n\n\tvar names$17 = [\"cea\"];\n\tvar cea = {\n\t  init: init$16,\n\t  forward: forward$15,\n\t  inverse: inverse$15,\n\t  names: names$17\n\t};\n\n\tfunction init$17() {\n\n\t  this.x0 = this.x0 || 0;\n\t  this.y0 = this.y0 || 0;\n\t  this.lat0 = this.lat0 || 0;\n\t  this.long0 = this.long0 || 0;\n\t  this.lat_ts = this.lat_ts || 0;\n\t  this.title = this.title || \"Equidistant Cylindrical (Plate Carre)\";\n\n\t  this.rc = Math.cos(this.lat_ts);\n\t}\n\n\t// forward equations--mapping lat,long to x,y\n\t// -----------------------------------------------------------------\n\tfunction forward$16(p) {\n\n\t  var lon = p.x;\n\t  var lat = p.y;\n\n\t  var dlon = adjust_lon(lon - this.long0);\n\t  var dlat = adjust_lat(lat - this.lat0);\n\t  p.x = this.x0 + (this.a * dlon * this.rc);\n\t  p.y = this.y0 + (this.a * dlat);\n\t  return p;\n\t}\n\n\t// inverse equations--mapping x,y to lat/long\n\t// -----------------------------------------------------------------\n\tfunction inverse$16(p) {\n\n\t  var x = p.x;\n\t  var y = p.y;\n\n\t  p.x = adjust_lon(this.long0 + ((x - this.x0) / (this.a * this.rc)));\n\t  p.y = adjust_lat(this.lat0 + ((y - this.y0) / (this.a)));\n\t  return p;\n\t}\n\n\tvar names$18 = [\"Equirectangular\", \"Equidistant_Cylindrical\", \"eqc\"];\n\tvar eqc = {\n\t  init: init$17,\n\t  forward: forward$16,\n\t  inverse: inverse$16,\n\t  names: names$18\n\t};\n\n\tvar MAX_ITER$2 = 20;\n\n\tfunction init$18() {\n\t  /* Place parameters in static storage for common use\n\t      -------------------------------------------------*/\n\t  this.temp = this.b / this.a;\n\t  this.es = 1 - Math.pow(this.temp, 2); // devait etre dans tmerc.js mais n y est pas donc je commente sinon retour de valeurs nulles\n\t  this.e = Math.sqrt(this.es);\n\t  this.e0 = e0fn(this.es);\n\t  this.e1 = e1fn(this.es);\n\t  this.e2 = e2fn(this.es);\n\t  this.e3 = e3fn(this.es);\n\t  this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); //si que des zeros le calcul ne se fait pas\n\t}\n\n\t/* Polyconic forward equations--mapping lat,long to x,y\n\t    ---------------------------------------------------*/\n\tfunction forward$17(p) {\n\t  var lon = p.x;\n\t  var lat = p.y;\n\t  var x, y, el;\n\t  var dlon = adjust_lon(lon - this.long0);\n\t  el = dlon * Math.sin(lat);\n\t  if (this.sphere) {\n\t    if (Math.abs(lat) <= EPSLN) {\n\t      x = this.a * dlon;\n\t      y = -1 * this.a * this.lat0;\n\t    }\n\t    else {\n\t      x = this.a * Math.sin(el) / Math.tan(lat);\n\t      y = this.a * (adjust_lat(lat - this.lat0) + (1 - Math.cos(el)) / Math.tan(lat));\n\t    }\n\t  }\n\t  else {\n\t    if (Math.abs(lat) <= EPSLN) {\n\t      x = this.a * dlon;\n\t      y = -1 * this.ml0;\n\t    }\n\t    else {\n\t      var nl = gN(this.a, this.e, Math.sin(lat)) / Math.tan(lat);\n\t      x = nl * Math.sin(el);\n\t      y = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, lat) - this.ml0 + nl * (1 - Math.cos(el));\n\t    }\n\n\t  }\n\t  p.x = x + this.x0;\n\t  p.y = y + this.y0;\n\t  return p;\n\t}\n\n\t/* Inverse equations\n\t  -----------------*/\n\tfunction inverse$17(p) {\n\t  var lon, lat, x, y, i;\n\t  var al, bl;\n\t  var phi, dphi;\n\t  x = p.x - this.x0;\n\t  y = p.y - this.y0;\n\n\t  if (this.sphere) {\n\t    if (Math.abs(y + this.a * this.lat0) <= EPSLN) {\n\t      lon = adjust_lon(x / this.a + this.long0);\n\t      lat = 0;\n\t    }\n\t    else {\n\t      al = this.lat0 + y / this.a;\n\t      bl = x * x / this.a / this.a + al * al;\n\t      phi = al;\n\t      var tanphi;\n\t      for (i = MAX_ITER$2; i; --i) {\n\t        tanphi = Math.tan(phi);\n\t        dphi = -1 * (al * (phi * tanphi + 1) - phi - 0.5 * (phi * phi + bl) * tanphi) / ((phi - al) / tanphi - 1);\n\t        phi += dphi;\n\t        if (Math.abs(dphi) <= EPSLN) {\n\t          lat = phi;\n\t          break;\n\t        }\n\t      }\n\t      lon = adjust_lon(this.long0 + (Math.asin(x * Math.tan(phi) / this.a)) / Math.sin(lat));\n\t    }\n\t  }\n\t  else {\n\t    if (Math.abs(y + this.ml0) <= EPSLN) {\n\t      lat = 0;\n\t      lon = adjust_lon(this.long0 + x / this.a);\n\t    }\n\t    else {\n\n\t      al = (this.ml0 + y) / this.a;\n\t      bl = x * x / this.a / this.a + al * al;\n\t      phi = al;\n\t      var cl, mln, mlnp, ma;\n\t      var con;\n\t      for (i = MAX_ITER$2; i; --i) {\n\t        con = this.e * Math.sin(phi);\n\t        cl = Math.sqrt(1 - con * con) * Math.tan(phi);\n\t        mln = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi);\n\t        mlnp = this.e0 - 2 * this.e1 * Math.cos(2 * phi) + 4 * this.e2 * Math.cos(4 * phi) - 6 * this.e3 * Math.cos(6 * phi);\n\t        ma = mln / this.a;\n\t        dphi = (al * (cl * ma + 1) - ma - 0.5 * cl * (ma * ma + bl)) / (this.es * Math.sin(2 * phi) * (ma * ma + bl - 2 * al * ma) / (4 * cl) + (al - ma) * (cl * mlnp - 2 / Math.sin(2 * phi)) - mlnp);\n\t        phi -= dphi;\n\t        if (Math.abs(dphi) <= EPSLN) {\n\t          lat = phi;\n\t          break;\n\t        }\n\t      }\n\n\t      //lat=phi4z(this.e,this.e0,this.e1,this.e2,this.e3,al,bl,0,0);\n\t      cl = Math.sqrt(1 - this.es * Math.pow(Math.sin(lat), 2)) * Math.tan(lat);\n\t      lon = adjust_lon(this.long0 + Math.asin(x * cl / this.a) / Math.sin(lat));\n\t    }\n\t  }\n\n\t  p.x = lon;\n\t  p.y = lat;\n\t  return p;\n\t}\n\n\tvar names$19 = [\"Polyconic\", \"poly\"];\n\tvar poly = {\n\t  init: init$18,\n\t  forward: forward$17,\n\t  inverse: inverse$17,\n\t  names: names$19\n\t};\n\n\t/*\n\t  reference\n\t    Department of Land and Survey Technical Circular 1973/32\n\t      http://www.linz.govt.nz/docs/miscellaneous/nz-map-definition.pdf\n\t    OSG Technical Report 4.1\n\t      http://www.linz.govt.nz/docs/miscellaneous/nzmg.pdf\n\t  */\n\n\t/**\n\t * iterations: Number of iterations to refine inverse transform.\n\t *     0 -> km accuracy\n\t *     1 -> m accuracy -- suitable for most mapping applications\n\t *     2 -> mm accuracy\n\t */\n\n\n\tfunction init$19() {\n\t  this.A = [];\n\t  this.A[1] = 0.6399175073;\n\t  this.A[2] = -0.1358797613;\n\t  this.A[3] = 0.063294409;\n\t  this.A[4] = -0.02526853;\n\t  this.A[5] = 0.0117879;\n\t  this.A[6] = -0.0055161;\n\t  this.A[7] = 0.0026906;\n\t  this.A[8] = -0.001333;\n\t  this.A[9] = 0.00067;\n\t  this.A[10] = -0.00034;\n\n\t  this.B_re = [];\n\t  this.B_im = [];\n\t  this.B_re[1] = 0.7557853228;\n\t  this.B_im[1] = 0;\n\t  this.B_re[2] = 0.249204646;\n\t  this.B_im[2] = 0.003371507;\n\t  this.B_re[3] = -0.001541739;\n\t  this.B_im[3] = 0.041058560;\n\t  this.B_re[4] = -0.10162907;\n\t  this.B_im[4] = 0.01727609;\n\t  this.B_re[5] = -0.26623489;\n\t  this.B_im[5] = -0.36249218;\n\t  this.B_re[6] = -0.6870983;\n\t  this.B_im[6] = -1.1651967;\n\n\t  this.C_re = [];\n\t  this.C_im = [];\n\t  this.C_re[1] = 1.3231270439;\n\t  this.C_im[1] = 0;\n\t  this.C_re[2] = -0.577245789;\n\t  this.C_im[2] = -0.007809598;\n\t  this.C_re[3] = 0.508307513;\n\t  this.C_im[3] = -0.112208952;\n\t  this.C_re[4] = -0.15094762;\n\t  this.C_im[4] = 0.18200602;\n\t  this.C_re[5] = 1.01418179;\n\t  this.C_im[5] = 1.64497696;\n\t  this.C_re[6] = 1.9660549;\n\t  this.C_im[6] = 2.5127645;\n\n\t  this.D = [];\n\t  this.D[1] = 1.5627014243;\n\t  this.D[2] = 0.5185406398;\n\t  this.D[3] = -0.03333098;\n\t  this.D[4] = -0.1052906;\n\t  this.D[5] = -0.0368594;\n\t  this.D[6] = 0.007317;\n\t  this.D[7] = 0.01220;\n\t  this.D[8] = 0.00394;\n\t  this.D[9] = -0.0013;\n\t}\n\n\t/**\n\t    New Zealand Map Grid Forward  - long/lat to x/y\n\t    long/lat in radians\n\t  */\n\tfunction forward$18(p) {\n\t  var n;\n\t  var lon = p.x;\n\t  var lat = p.y;\n\n\t  var delta_lat = lat - this.lat0;\n\t  var delta_lon = lon - this.long0;\n\n\t  // 1. Calculate d_phi and d_psi    ...                          // and d_lambda\n\t  // For this algorithm, delta_latitude is in seconds of arc x 10-5, so we need to scale to those units. Longitude is radians.\n\t  var d_phi = delta_lat / SEC_TO_RAD * 1E-5;\n\t  var d_lambda = delta_lon;\n\t  var d_phi_n = 1; // d_phi^0\n\n\t  var d_psi = 0;\n\t  for (n = 1; n <= 10; n++) {\n\t    d_phi_n = d_phi_n * d_phi;\n\t    d_psi = d_psi + this.A[n] * d_phi_n;\n\t  }\n\n\t  // 2. Calculate theta\n\t  var th_re = d_psi;\n\t  var th_im = d_lambda;\n\n\t  // 3. Calculate z\n\t  var th_n_re = 1;\n\t  var th_n_im = 0; // theta^0\n\t  var th_n_re1;\n\t  var th_n_im1;\n\n\t  var z_re = 0;\n\t  var z_im = 0;\n\t  for (n = 1; n <= 6; n++) {\n\t    th_n_re1 = th_n_re * th_re - th_n_im * th_im;\n\t    th_n_im1 = th_n_im * th_re + th_n_re * th_im;\n\t    th_n_re = th_n_re1;\n\t    th_n_im = th_n_im1;\n\t    z_re = z_re + this.B_re[n] * th_n_re - this.B_im[n] * th_n_im;\n\t    z_im = z_im + this.B_im[n] * th_n_re + this.B_re[n] * th_n_im;\n\t  }\n\n\t  // 4. Calculate easting and northing\n\t  p.x = (z_im * this.a) + this.x0;\n\t  p.y = (z_re * this.a) + this.y0;\n\n\t  return p;\n\t}\n\n\t/**\n\t    New Zealand Map Grid Inverse  -  x/y to long/lat\n\t  */\n\tfunction inverse$18(p) {\n\t  var n;\n\t  var x = p.x;\n\t  var y = p.y;\n\n\t  var delta_x = x - this.x0;\n\t  var delta_y = y - this.y0;\n\n\t  // 1. Calculate z\n\t  var z_re = delta_y / this.a;\n\t  var z_im = delta_x / this.a;\n\n\t  // 2a. Calculate theta - first approximation gives km accuracy\n\t  var z_n_re = 1;\n\t  var z_n_im = 0; // z^0\n\t  var z_n_re1;\n\t  var z_n_im1;\n\n\t  var th_re = 0;\n\t  var th_im = 0;\n\t  for (n = 1; n <= 6; n++) {\n\t    z_n_re1 = z_n_re * z_re - z_n_im * z_im;\n\t    z_n_im1 = z_n_im * z_re + z_n_re * z_im;\n\t    z_n_re = z_n_re1;\n\t    z_n_im = z_n_im1;\n\t    th_re = th_re + this.C_re[n] * z_n_re - this.C_im[n] * z_n_im;\n\t    th_im = th_im + this.C_im[n] * z_n_re + this.C_re[n] * z_n_im;\n\t  }\n\n\t  // 2b. Iterate to refine the accuracy of the calculation\n\t  //        0 iterations gives km accuracy\n\t  //        1 iteration gives m accuracy -- good enough for most mapping applications\n\t  //        2 iterations bives mm accuracy\n\t  for (var i = 0; i < this.iterations; i++) {\n\t    var th_n_re = th_re;\n\t    var th_n_im = th_im;\n\t    var th_n_re1;\n\t    var th_n_im1;\n\n\t    var num_re = z_re;\n\t    var num_im = z_im;\n\t    for (n = 2; n <= 6; n++) {\n\t      th_n_re1 = th_n_re * th_re - th_n_im * th_im;\n\t      th_n_im1 = th_n_im * th_re + th_n_re * th_im;\n\t      th_n_re = th_n_re1;\n\t      th_n_im = th_n_im1;\n\t      num_re = num_re + (n - 1) * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im);\n\t      num_im = num_im + (n - 1) * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im);\n\t    }\n\n\t    th_n_re = 1;\n\t    th_n_im = 0;\n\t    var den_re = this.B_re[1];\n\t    var den_im = this.B_im[1];\n\t    for (n = 2; n <= 6; n++) {\n\t      th_n_re1 = th_n_re * th_re - th_n_im * th_im;\n\t      th_n_im1 = th_n_im * th_re + th_n_re * th_im;\n\t      th_n_re = th_n_re1;\n\t      th_n_im = th_n_im1;\n\t      den_re = den_re + n * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im);\n\t      den_im = den_im + n * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im);\n\t    }\n\n\t    // Complex division\n\t    var den2 = den_re * den_re + den_im * den_im;\n\t    th_re = (num_re * den_re + num_im * den_im) / den2;\n\t    th_im = (num_im * den_re - num_re * den_im) / den2;\n\t  }\n\n\t  // 3. Calculate d_phi              ...                                    // and d_lambda\n\t  var d_psi = th_re;\n\t  var d_lambda = th_im;\n\t  var d_psi_n = 1; // d_psi^0\n\n\t  var d_phi = 0;\n\t  for (n = 1; n <= 9; n++) {\n\t    d_psi_n = d_psi_n * d_psi;\n\t    d_phi = d_phi + this.D[n] * d_psi_n;\n\t  }\n\n\t  // 4. Calculate latitude and longitude\n\t  // d_phi is calcuated in second of arc * 10^-5, so we need to scale back to radians. d_lambda is in radians.\n\t  var lat = this.lat0 + (d_phi * SEC_TO_RAD * 1E5);\n\t  var lon = this.long0 + d_lambda;\n\n\t  p.x = lon;\n\t  p.y = lat;\n\n\t  return p;\n\t}\n\n\tvar names$20 = [\"New_Zealand_Map_Grid\", \"nzmg\"];\n\tvar nzmg = {\n\t  init: init$19,\n\t  forward: forward$18,\n\t  inverse: inverse$18,\n\t  names: names$20\n\t};\n\n\t/*\n\t  reference\n\t    \"New Equal-Area Map Projections for Noncircular Regions\", John P. Snyder,\n\t    The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355.\n\t  */\n\n\n\t/* Initialize the Miller Cylindrical projection\n\t  -------------------------------------------*/\n\tfunction init$20() {\n\t  //no-op\n\t}\n\n\t/* Miller Cylindrical forward equations--mapping lat,long to x,y\n\t    ------------------------------------------------------------*/\n\tfunction forward$19(p) {\n\t  var lon = p.x;\n\t  var lat = p.y;\n\t  /* Forward equations\n\t      -----------------*/\n\t  var dlon = adjust_lon(lon - this.long0);\n\t  var x = this.x0 + this.a * dlon;\n\t  var y = this.y0 + this.a * Math.log(Math.tan((Math.PI / 4) + (lat / 2.5))) * 1.25;\n\n\t  p.x = x;\n\t  p.y = y;\n\t  return p;\n\t}\n\n\t/* Miller Cylindrical inverse equations--mapping x,y to lat/long\n\t    ------------------------------------------------------------*/\n\tfunction inverse$19(p) {\n\t  p.x -= this.x0;\n\t  p.y -= this.y0;\n\n\t  var lon = adjust_lon(this.long0 + p.x / this.a);\n\t  var lat = 2.5 * (Math.atan(Math.exp(0.8 * p.y / this.a)) - Math.PI / 4);\n\n\t  p.x = lon;\n\t  p.y = lat;\n\t  return p;\n\t}\n\n\tvar names$21 = [\"Miller_Cylindrical\", \"mill\"];\n\tvar mill = {\n\t  init: init$20,\n\t  forward: forward$19,\n\t  inverse: inverse$19,\n\t  names: names$21\n\t};\n\n\tvar MAX_ITER$3 = 20;\n\tfunction init$21() {\n\t  /* Place parameters in static storage for common use\n\t    -------------------------------------------------*/\n\n\n\t  if (!this.sphere) {\n\t    this.en = pj_enfn(this.es);\n\t  }\n\t  else {\n\t    this.n = 1;\n\t    this.m = 0;\n\t    this.es = 0;\n\t    this.C_y = Math.sqrt((this.m + 1) / this.n);\n\t    this.C_x = this.C_y / (this.m + 1);\n\t  }\n\n\t}\n\n\t/* Sinusoidal forward equations--mapping lat,long to x,y\n\t  -----------------------------------------------------*/\n\tfunction forward$20(p) {\n\t  var x, y;\n\t  var lon = p.x;\n\t  var lat = p.y;\n\t  /* Forward equations\n\t    -----------------*/\n\t  lon = adjust_lon(lon - this.long0);\n\n\t  if (this.sphere) {\n\t    if (!this.m) {\n\t      lat = this.n !== 1 ? Math.asin(this.n * Math.sin(lat)) : lat;\n\t    }\n\t    else {\n\t      var k = this.n * Math.sin(lat);\n\t      for (var i = MAX_ITER$3; i; --i) {\n\t        var V = (this.m * lat + Math.sin(lat) - k) / (this.m + Math.cos(lat));\n\t        lat -= V;\n\t        if (Math.abs(V) < EPSLN) {\n\t          break;\n\t        }\n\t      }\n\t    }\n\t    x = this.a * this.C_x * lon * (this.m + Math.cos(lat));\n\t    y = this.a * this.C_y * lat;\n\n\t  }\n\t  else {\n\n\t    var s = Math.sin(lat);\n\t    var c = Math.cos(lat);\n\t    y = this.a * pj_mlfn(lat, s, c, this.en);\n\t    x = this.a * lon * c / Math.sqrt(1 - this.es * s * s);\n\t  }\n\n\t  p.x = x;\n\t  p.y = y;\n\t  return p;\n\t}\n\n\tfunction inverse$20(p) {\n\t  var lat, temp, lon, s;\n\n\t  p.x -= this.x0;\n\t  lon = p.x / this.a;\n\t  p.y -= this.y0;\n\t  lat = p.y / this.a;\n\n\t  if (this.sphere) {\n\t    lat /= this.C_y;\n\t    lon = lon / (this.C_x * (this.m + Math.cos(lat)));\n\t    if (this.m) {\n\t      lat = asinz((this.m * lat + Math.sin(lat)) / this.n);\n\t    }\n\t    else if (this.n !== 1) {\n\t      lat = asinz(Math.sin(lat) / this.n);\n\t    }\n\t    lon = adjust_lon(lon + this.long0);\n\t    lat = adjust_lat(lat);\n\t  }\n\t  else {\n\t    lat = pj_inv_mlfn(p.y / this.a, this.es, this.en);\n\t    s = Math.abs(lat);\n\t    if (s < HALF_PI) {\n\t      s = Math.sin(lat);\n\t      temp = this.long0 + p.x * Math.sqrt(1 - this.es * s * s) / (this.a * Math.cos(lat));\n\t      //temp = this.long0 + p.x / (this.a * Math.cos(lat));\n\t      lon = adjust_lon(temp);\n\t    }\n\t    else if ((s - EPSLN) < HALF_PI) {\n\t      lon = this.long0;\n\t    }\n\t  }\n\t  p.x = lon;\n\t  p.y = lat;\n\t  return p;\n\t}\n\n\tvar names$22 = [\"Sinusoidal\", \"sinu\"];\n\tvar sinu = {\n\t  init: init$21,\n\t  forward: forward$20,\n\t  inverse: inverse$20,\n\t  names: names$22\n\t};\n\n\tfunction init$22() {}\n\t/* Mollweide forward equations--mapping lat,long to x,y\n\t    ----------------------------------------------------*/\n\tfunction forward$21(p) {\n\n\t  /* Forward equations\n\t      -----------------*/\n\t  var lon = p.x;\n\t  var lat = p.y;\n\n\t  var delta_lon = adjust_lon(lon - this.long0);\n\t  var theta = lat;\n\t  var con = Math.PI * Math.sin(lat);\n\n\t  /* Iterate using the Newton-Raphson method to find theta\n\t      -----------------------------------------------------*/\n\t  for (var i = 0; true; i++) {\n\t    var delta_theta = -(theta + Math.sin(theta) - con) / (1 + Math.cos(theta));\n\t    theta += delta_theta;\n\t    if (Math.abs(delta_theta) < EPSLN) {\n\t      break;\n\t    }\n\t  }\n\t  theta /= 2;\n\n\t  /* If the latitude is 90 deg, force the x coordinate to be \"0 + false easting\"\n\t       this is done here because of precision problems with \"cos(theta)\"\n\t       --------------------------------------------------------------------------*/\n\t  if (Math.PI / 2 - Math.abs(lat) < EPSLN) {\n\t    delta_lon = 0;\n\t  }\n\t  var x = 0.900316316158 * this.a * delta_lon * Math.cos(theta) + this.x0;\n\t  var y = 1.4142135623731 * this.a * Math.sin(theta) + this.y0;\n\n\t  p.x = x;\n\t  p.y = y;\n\t  return p;\n\t}\n\n\tfunction inverse$21(p) {\n\t  var theta;\n\t  var arg;\n\n\t  /* Inverse equations\n\t      -----------------*/\n\t  p.x -= this.x0;\n\t  p.y -= this.y0;\n\t  arg = p.y / (1.4142135623731 * this.a);\n\n\t  /* Because of division by zero problems, 'arg' can not be 1.  Therefore\n\t       a number very close to one is used instead.\n\t       -------------------------------------------------------------------*/\n\t  if (Math.abs(arg) > 0.999999999999) {\n\t    arg = 0.999999999999;\n\t  }\n\t  theta = Math.asin(arg);\n\t  var lon = adjust_lon(this.long0 + (p.x / (0.900316316158 * this.a * Math.cos(theta))));\n\t  if (lon < (-Math.PI)) {\n\t    lon = -Math.PI;\n\t  }\n\t  if (lon > Math.PI) {\n\t    lon = Math.PI;\n\t  }\n\t  arg = (2 * theta + Math.sin(2 * theta)) / Math.PI;\n\t  if (Math.abs(arg) > 1) {\n\t    arg = 1;\n\t  }\n\t  var lat = Math.asin(arg);\n\n\t  p.x = lon;\n\t  p.y = lat;\n\t  return p;\n\t}\n\n\tvar names$23 = [\"Mollweide\", \"moll\"];\n\tvar moll = {\n\t  init: init$22,\n\t  forward: forward$21,\n\t  inverse: inverse$21,\n\t  names: names$23\n\t};\n\n\tfunction init$23() {\n\n\t  /* Place parameters in static storage for common use\n\t      -------------------------------------------------*/\n\t  // Standard Parallels cannot be equal and on opposite sides of the equator\n\t  if (Math.abs(this.lat1 + this.lat2) < EPSLN) {\n\t    return;\n\t  }\n\t  this.lat2 = this.lat2 || this.lat1;\n\t  this.temp = this.b / this.a;\n\t  this.es = 1 - Math.pow(this.temp, 2);\n\t  this.e = Math.sqrt(this.es);\n\t  this.e0 = e0fn(this.es);\n\t  this.e1 = e1fn(this.es);\n\t  this.e2 = e2fn(this.es);\n\t  this.e3 = e3fn(this.es);\n\n\t  this.sinphi = Math.sin(this.lat1);\n\t  this.cosphi = Math.cos(this.lat1);\n\n\t  this.ms1 = msfnz(this.e, this.sinphi, this.cosphi);\n\t  this.ml1 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat1);\n\n\t  if (Math.abs(this.lat1 - this.lat2) < EPSLN) {\n\t    this.ns = this.sinphi;\n\t  }\n\t  else {\n\t    this.sinphi = Math.sin(this.lat2);\n\t    this.cosphi = Math.cos(this.lat2);\n\t    this.ms2 = msfnz(this.e, this.sinphi, this.cosphi);\n\t    this.ml2 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat2);\n\t    this.ns = (this.ms1 - this.ms2) / (this.ml2 - this.ml1);\n\t  }\n\t  this.g = this.ml1 + this.ms1 / this.ns;\n\t  this.ml0 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0);\n\t  this.rh = this.a * (this.g - this.ml0);\n\t}\n\n\t/* Equidistant Conic forward equations--mapping lat,long to x,y\n\t  -----------------------------------------------------------*/\n\tfunction forward$22(p) {\n\t  var lon = p.x;\n\t  var lat = p.y;\n\t  var rh1;\n\n\t  /* Forward equations\n\t      -----------------*/\n\t  if (this.sphere) {\n\t    rh1 = this.a * (this.g - lat);\n\t  }\n\t  else {\n\t    var ml = mlfn(this.e0, this.e1, this.e2, this.e3, lat);\n\t    rh1 = this.a * (this.g - ml);\n\t  }\n\t  var theta = this.ns * adjust_lon(lon - this.long0);\n\t  var x = this.x0 + rh1 * Math.sin(theta);\n\t  var y = this.y0 + this.rh - rh1 * Math.cos(theta);\n\t  p.x = x;\n\t  p.y = y;\n\t  return p;\n\t}\n\n\t/* Inverse equations\n\t  -----------------*/\n\tfunction inverse$22(p) {\n\t  p.x -= this.x0;\n\t  p.y = this.rh - p.y + this.y0;\n\t  var con, rh1, lat, lon;\n\t  if (this.ns >= 0) {\n\t    rh1 = Math.sqrt(p.x * p.x + p.y * p.y);\n\t    con = 1;\n\t  }\n\t  else {\n\t    rh1 = -Math.sqrt(p.x * p.x + p.y * p.y);\n\t    con = -1;\n\t  }\n\t  var theta = 0;\n\t  if (rh1 !== 0) {\n\t    theta = Math.atan2(con * p.x, con * p.y);\n\t  }\n\n\t  if (this.sphere) {\n\t    lon = adjust_lon(this.long0 + theta / this.ns);\n\t    lat = adjust_lat(this.g - rh1 / this.a);\n\t    p.x = lon;\n\t    p.y = lat;\n\t    return p;\n\t  }\n\t  else {\n\t    var ml = this.g - rh1 / this.a;\n\t    lat = imlfn(ml, this.e0, this.e1, this.e2, this.e3);\n\t    lon = adjust_lon(this.long0 + theta / this.ns);\n\t    p.x = lon;\n\t    p.y = lat;\n\t    return p;\n\t  }\n\n\t}\n\n\tvar names$24 = [\"Equidistant_Conic\", \"eqdc\"];\n\tvar eqdc = {\n\t  init: init$23,\n\t  forward: forward$22,\n\t  inverse: inverse$22,\n\t  names: names$24\n\t};\n\n\t/* Initialize the Van Der Grinten projection\n\t  ----------------------------------------*/\n\tfunction init$24() {\n\t  //this.R = 6370997; //Radius of earth\n\t  this.R = this.a;\n\t}\n\n\tfunction forward$23(p) {\n\n\t  var lon = p.x;\n\t  var lat = p.y;\n\n\t  /* Forward equations\n\t    -----------------*/\n\t  var dlon = adjust_lon(lon - this.long0);\n\t  var x, y;\n\n\t  if (Math.abs(lat) <= EPSLN) {\n\t    x = this.x0 + this.R * dlon;\n\t    y = this.y0;\n\t  }\n\t  var theta = asinz(2 * Math.abs(lat / Math.PI));\n\t  if ((Math.abs(dlon) <= EPSLN) || (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN)) {\n\t    x = this.x0;\n\t    if (lat >= 0) {\n\t      y = this.y0 + Math.PI * this.R * Math.tan(0.5 * theta);\n\t    }\n\t    else {\n\t      y = this.y0 + Math.PI * this.R * -Math.tan(0.5 * theta);\n\t    }\n\t    //  return(OK);\n\t  }\n\t  var al = 0.5 * Math.abs((Math.PI / dlon) - (dlon / Math.PI));\n\t  var asq = al * al;\n\t  var sinth = Math.sin(theta);\n\t  var costh = Math.cos(theta);\n\n\t  var g = costh / (sinth + costh - 1);\n\t  var gsq = g * g;\n\t  var m = g * (2 / sinth - 1);\n\t  var msq = m * m;\n\t  var con = Math.PI * this.R * (al * (g - msq) + Math.sqrt(asq * (g - msq) * (g - msq) - (msq + asq) * (gsq - msq))) / (msq + asq);\n\t  if (dlon < 0) {\n\t    con = -con;\n\t  }\n\t  x = this.x0 + con;\n\t  //con = Math.abs(con / (Math.PI * this.R));\n\t  var q = asq + g;\n\t  con = Math.PI * this.R * (m * q - al * Math.sqrt((msq + asq) * (asq + 1) - q * q)) / (msq + asq);\n\t  if (lat >= 0) {\n\t    //y = this.y0 + Math.PI * this.R * Math.sqrt(1 - con * con - 2 * al * con);\n\t    y = this.y0 + con;\n\t  }\n\t  else {\n\t    //y = this.y0 - Math.PI * this.R * Math.sqrt(1 - con * con - 2 * al * con);\n\t    y = this.y0 - con;\n\t  }\n\t  p.x = x;\n\t  p.y = y;\n\t  return p;\n\t}\n\n\t/* Van Der Grinten inverse equations--mapping x,y to lat/long\n\t  ---------------------------------------------------------*/\n\tfunction inverse$23(p) {\n\t  var lon, lat;\n\t  var xx, yy, xys, c1, c2, c3;\n\t  var a1;\n\t  var m1;\n\t  var con;\n\t  var th1;\n\t  var d;\n\n\t  /* inverse equations\n\t    -----------------*/\n\t  p.x -= this.x0;\n\t  p.y -= this.y0;\n\t  con = Math.PI * this.R;\n\t  xx = p.x / con;\n\t  yy = p.y / con;\n\t  xys = xx * xx + yy * yy;\n\t  c1 = -Math.abs(yy) * (1 + xys);\n\t  c2 = c1 - 2 * yy * yy + xx * xx;\n\t  c3 = -2 * c1 + 1 + 2 * yy * yy + xys * xys;\n\t  d = yy * yy / c3 + (2 * c2 * c2 * c2 / c3 / c3 / c3 - 9 * c1 * c2 / c3 / c3) / 27;\n\t  a1 = (c1 - c2 * c2 / 3 / c3) / c3;\n\t  m1 = 2 * Math.sqrt(-a1 / 3);\n\t  con = ((3 * d) / a1) / m1;\n\t  if (Math.abs(con) > 1) {\n\t    if (con >= 0) {\n\t      con = 1;\n\t    }\n\t    else {\n\t      con = -1;\n\t    }\n\t  }\n\t  th1 = Math.acos(con) / 3;\n\t  if (p.y >= 0) {\n\t    lat = (-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI;\n\t  }\n\t  else {\n\t    lat = -(-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI;\n\t  }\n\n\t  if (Math.abs(xx) < EPSLN) {\n\t    lon = this.long0;\n\t  }\n\t  else {\n\t    lon = adjust_lon(this.long0 + Math.PI * (xys - 1 + Math.sqrt(1 + 2 * (xx * xx - yy * yy) + xys * xys)) / 2 / xx);\n\t  }\n\n\t  p.x = lon;\n\t  p.y = lat;\n\t  return p;\n\t}\n\n\tvar names$25 = [\"Van_der_Grinten_I\", \"VanDerGrinten\", \"vandg\"];\n\tvar vandg = {\n\t  init: init$24,\n\t  forward: forward$23,\n\t  inverse: inverse$23,\n\t  names: names$25\n\t};\n\n\tfunction init$25() {\n\t  this.sin_p12 = Math.sin(this.lat0);\n\t  this.cos_p12 = Math.cos(this.lat0);\n\t}\n\n\tfunction forward$24(p) {\n\t  var lon = p.x;\n\t  var lat = p.y;\n\t  var sinphi = Math.sin(p.y);\n\t  var cosphi = Math.cos(p.y);\n\t  var dlon = adjust_lon(lon - this.long0);\n\t  var e0, e1, e2, e3, Mlp, Ml, tanphi, Nl1, Nl, psi, Az, G, H, GH, Hs, c, kp, cos_c, s, s2, s3, s4, s5;\n\t  if (this.sphere) {\n\t    if (Math.abs(this.sin_p12 - 1) <= EPSLN) {\n\t      //North Pole case\n\t      p.x = this.x0 + this.a * (HALF_PI - lat) * Math.sin(dlon);\n\t      p.y = this.y0 - this.a * (HALF_PI - lat) * Math.cos(dlon);\n\t      return p;\n\t    }\n\t    else if (Math.abs(this.sin_p12 + 1) <= EPSLN) {\n\t      //South Pole case\n\t      p.x = this.x0 + this.a * (HALF_PI + lat) * Math.sin(dlon);\n\t      p.y = this.y0 + this.a * (HALF_PI + lat) * Math.cos(dlon);\n\t      return p;\n\t    }\n\t    else {\n\t      //default case\n\t      cos_c = this.sin_p12 * sinphi + this.cos_p12 * cosphi * Math.cos(dlon);\n\t      c = Math.acos(cos_c);\n\t      kp = c / Math.sin(c);\n\t      p.x = this.x0 + this.a * kp * cosphi * Math.sin(dlon);\n\t      p.y = this.y0 + this.a * kp * (this.cos_p12 * sinphi - this.sin_p12 * cosphi * Math.cos(dlon));\n\t      return p;\n\t    }\n\t  }\n\t  else {\n\t    e0 = e0fn(this.es);\n\t    e1 = e1fn(this.es);\n\t    e2 = e2fn(this.es);\n\t    e3 = e3fn(this.es);\n\t    if (Math.abs(this.sin_p12 - 1) <= EPSLN) {\n\t      //North Pole case\n\t      Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);\n\t      Ml = this.a * mlfn(e0, e1, e2, e3, lat);\n\t      p.x = this.x0 + (Mlp - Ml) * Math.sin(dlon);\n\t      p.y = this.y0 - (Mlp - Ml) * Math.cos(dlon);\n\t      return p;\n\t    }\n\t    else if (Math.abs(this.sin_p12 + 1) <= EPSLN) {\n\t      //South Pole case\n\t      Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);\n\t      Ml = this.a * mlfn(e0, e1, e2, e3, lat);\n\t      p.x = this.x0 + (Mlp + Ml) * Math.sin(dlon);\n\t      p.y = this.y0 + (Mlp + Ml) * Math.cos(dlon);\n\t      return p;\n\t    }\n\t    else {\n\t      //Default case\n\t      tanphi = sinphi / cosphi;\n\t      Nl1 = gN(this.a, this.e, this.sin_p12);\n\t      Nl = gN(this.a, this.e, sinphi);\n\t      psi = Math.atan((1 - this.es) * tanphi + this.es * Nl1 * this.sin_p12 / (Nl * cosphi));\n\t      Az = Math.atan2(Math.sin(dlon), this.cos_p12 * Math.tan(psi) - this.sin_p12 * Math.cos(dlon));\n\t      if (Az === 0) {\n\t        s = Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi));\n\t      }\n\t      else if (Math.abs(Math.abs(Az) - Math.PI) <= EPSLN) {\n\t        s = -Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi));\n\t      }\n\t      else {\n\t        s = Math.asin(Math.sin(dlon) * Math.cos(psi) / Math.sin(Az));\n\t      }\n\t      G = this.e * this.sin_p12 / Math.sqrt(1 - this.es);\n\t      H = this.e * this.cos_p12 * Math.cos(Az) / Math.sqrt(1 - this.es);\n\t      GH = G * H;\n\t      Hs = H * H;\n\t      s2 = s * s;\n\t      s3 = s2 * s;\n\t      s4 = s3 * s;\n\t      s5 = s4 * s;\n\t      c = Nl1 * s * (1 - s2 * Hs * (1 - Hs) / 6 + s3 / 8 * GH * (1 - 2 * Hs) + s4 / 120 * (Hs * (4 - 7 * Hs) - 3 * G * G * (1 - 7 * Hs)) - s5 / 48 * GH);\n\t      p.x = this.x0 + c * Math.sin(Az);\n\t      p.y = this.y0 + c * Math.cos(Az);\n\t      return p;\n\t    }\n\t  }\n\n\n\t}\n\n\tfunction inverse$24(p) {\n\t  p.x -= this.x0;\n\t  p.y -= this.y0;\n\t  var rh, z, sinz, cosz, lon, lat, con, e0, e1, e2, e3, Mlp, M, N1, psi, Az, cosAz, tmp, A, B, D, Ee, F;\n\t  if (this.sphere) {\n\t    rh = Math.sqrt(p.x * p.x + p.y * p.y);\n\t    if (rh > (2 * HALF_PI * this.a)) {\n\t      return;\n\t    }\n\t    z = rh / this.a;\n\n\t    sinz = Math.sin(z);\n\t    cosz = Math.cos(z);\n\n\t    lon = this.long0;\n\t    if (Math.abs(rh) <= EPSLN) {\n\t      lat = this.lat0;\n\t    }\n\t    else {\n\t      lat = asinz(cosz * this.sin_p12 + (p.y * sinz * this.cos_p12) / rh);\n\t      con = Math.abs(this.lat0) - HALF_PI;\n\t      if (Math.abs(con) <= EPSLN) {\n\t        if (this.lat0 >= 0) {\n\t          lon = adjust_lon(this.long0 + Math.atan2(p.x, - p.y));\n\t        }\n\t        else {\n\t          lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y));\n\t        }\n\t      }\n\t      else {\n\t        /*con = cosz - this.sin_p12 * Math.sin(lat);\n\t        if ((Math.abs(con) < EPSLN) && (Math.abs(p.x) < EPSLN)) {\n\t          //no-op, just keep the lon value as is\n\t        } else {\n\t          var temp = Math.atan2((p.x * sinz * this.cos_p12), (con * rh));\n\t          lon = adjust_lon(this.long0 + Math.atan2((p.x * sinz * this.cos_p12), (con * rh)));\n\t        }*/\n\t        lon = adjust_lon(this.long0 + Math.atan2(p.x * sinz, rh * this.cos_p12 * cosz - p.y * this.sin_p12 * sinz));\n\t      }\n\t    }\n\n\t    p.x = lon;\n\t    p.y = lat;\n\t    return p;\n\t  }\n\t  else {\n\t    e0 = e0fn(this.es);\n\t    e1 = e1fn(this.es);\n\t    e2 = e2fn(this.es);\n\t    e3 = e3fn(this.es);\n\t    if (Math.abs(this.sin_p12 - 1) <= EPSLN) {\n\t      //North pole case\n\t      Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);\n\t      rh = Math.sqrt(p.x * p.x + p.y * p.y);\n\t      M = Mlp - rh;\n\t      lat = imlfn(M / this.a, e0, e1, e2, e3);\n\t      lon = adjust_lon(this.long0 + Math.atan2(p.x, - 1 * p.y));\n\t      p.x = lon;\n\t      p.y = lat;\n\t      return p;\n\t    }\n\t    else if (Math.abs(this.sin_p12 + 1) <= EPSLN) {\n\t      //South pole case\n\t      Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);\n\t      rh = Math.sqrt(p.x * p.x + p.y * p.y);\n\t      M = rh - Mlp;\n\n\t      lat = imlfn(M / this.a, e0, e1, e2, e3);\n\t      lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y));\n\t      p.x = lon;\n\t      p.y = lat;\n\t      return p;\n\t    }\n\t    else {\n\t      //default case\n\t      rh = Math.sqrt(p.x * p.x + p.y * p.y);\n\t      Az = Math.atan2(p.x, p.y);\n\t      N1 = gN(this.a, this.e, this.sin_p12);\n\t      cosAz = Math.cos(Az);\n\t      tmp = this.e * this.cos_p12 * cosAz;\n\t      A = -tmp * tmp / (1 - this.es);\n\t      B = 3 * this.es * (1 - A) * this.sin_p12 * this.cos_p12 * cosAz / (1 - this.es);\n\t      D = rh / N1;\n\t      Ee = D - A * (1 + A) * Math.pow(D, 3) / 6 - B * (1 + 3 * A) * Math.pow(D, 4) / 24;\n\t      F = 1 - A * Ee * Ee / 2 - D * Ee * Ee * Ee / 6;\n\t      psi = Math.asin(this.sin_p12 * Math.cos(Ee) + this.cos_p12 * Math.sin(Ee) * cosAz);\n\t      lon = adjust_lon(this.long0 + Math.asin(Math.sin(Az) * Math.sin(Ee) / Math.cos(psi)));\n\t      lat = Math.atan((1 - this.es * F * this.sin_p12 / Math.sin(psi)) * Math.tan(psi) / (1 - this.es));\n\t      p.x = lon;\n\t      p.y = lat;\n\t      return p;\n\t    }\n\t  }\n\n\t}\n\n\tvar names$26 = [\"Azimuthal_Equidistant\", \"aeqd\"];\n\tvar aeqd = {\n\t  init: init$25,\n\t  forward: forward$24,\n\t  inverse: inverse$24,\n\t  names: names$26\n\t};\n\n\tfunction init$26() {\n\t  //double temp;      /* temporary variable    */\n\n\t  /* Place parameters in static storage for common use\n\t      -------------------------------------------------*/\n\t  this.sin_p14 = Math.sin(this.lat0);\n\t  this.cos_p14 = Math.cos(this.lat0);\n\t}\n\n\t/* Orthographic forward equations--mapping lat,long to x,y\n\t    ---------------------------------------------------*/\n\tfunction forward$25(p) {\n\t  var sinphi, cosphi; /* sin and cos value        */\n\t  var dlon; /* delta longitude value      */\n\t  var coslon; /* cos of longitude        */\n\t  var ksp; /* scale factor          */\n\t  var g, x, y;\n\t  var lon = p.x;\n\t  var lat = p.y;\n\t  /* Forward equations\n\t      -----------------*/\n\t  dlon = adjust_lon(lon - this.long0);\n\n\t  sinphi = Math.sin(lat);\n\t  cosphi = Math.cos(lat);\n\n\t  coslon = Math.cos(dlon);\n\t  g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon;\n\t  ksp = 1;\n\t  if ((g > 0) || (Math.abs(g) <= EPSLN)) {\n\t    x = this.a * ksp * cosphi * Math.sin(dlon);\n\t    y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon);\n\t  }\n\t  p.x = x;\n\t  p.y = y;\n\t  return p;\n\t}\n\n\tfunction inverse$25(p) {\n\t  var rh; /* height above ellipsoid      */\n\t  var z; /* angle          */\n\t  var sinz, cosz; /* sin of z and cos of z      */\n\t  var con;\n\t  var lon, lat;\n\t  /* Inverse equations\n\t      -----------------*/\n\t  p.x -= this.x0;\n\t  p.y -= this.y0;\n\t  rh = Math.sqrt(p.x * p.x + p.y * p.y);\n\t  z = asinz(rh / this.a);\n\n\t  sinz = Math.sin(z);\n\t  cosz = Math.cos(z);\n\n\t  lon = this.long0;\n\t  if (Math.abs(rh) <= EPSLN) {\n\t    lat = this.lat0;\n\t    p.x = lon;\n\t    p.y = lat;\n\t    return p;\n\t  }\n\t  lat = asinz(cosz * this.sin_p14 + (p.y * sinz * this.cos_p14) / rh);\n\t  con = Math.abs(this.lat0) - HALF_PI;\n\t  if (Math.abs(con) <= EPSLN) {\n\t    if (this.lat0 >= 0) {\n\t      lon = adjust_lon(this.long0 + Math.atan2(p.x, - p.y));\n\t    }\n\t    else {\n\t      lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y));\n\t    }\n\t    p.x = lon;\n\t    p.y = lat;\n\t    return p;\n\t  }\n\t  lon = adjust_lon(this.long0 + Math.atan2((p.x * sinz), rh * this.cos_p14 * cosz - p.y * this.sin_p14 * sinz));\n\t  p.x = lon;\n\t  p.y = lat;\n\t  return p;\n\t}\n\n\tvar names$27 = [\"ortho\"];\n\tvar ortho = {\n\t  init: init$26,\n\t  forward: forward$25,\n\t  inverse: inverse$25,\n\t  names: names$27\n\t};\n\n\tvar includedProjections = function(proj4){\n\t  proj4.Proj.projections.add(tmerc);\n\t  proj4.Proj.projections.add(etmerc);\n\t  proj4.Proj.projections.add(utm);\n\t  proj4.Proj.projections.add(sterea);\n\t  proj4.Proj.projections.add(stere);\n\t  proj4.Proj.projections.add(somerc);\n\t  proj4.Proj.projections.add(omerc);\n\t  proj4.Proj.projections.add(lcc);\n\t  proj4.Proj.projections.add(krovak);\n\t  proj4.Proj.projections.add(cass);\n\t  proj4.Proj.projections.add(laea);\n\t  proj4.Proj.projections.add(aea);\n\t  proj4.Proj.projections.add(gnom);\n\t  proj4.Proj.projections.add(cea);\n\t  proj4.Proj.projections.add(eqc);\n\t  proj4.Proj.projections.add(poly);\n\t  proj4.Proj.projections.add(nzmg);\n\t  proj4.Proj.projections.add(mill);\n\t  proj4.Proj.projections.add(sinu);\n\t  proj4.Proj.projections.add(moll);\n\t  proj4.Proj.projections.add(eqdc);\n\t  proj4.Proj.projections.add(vandg);\n\t  proj4.Proj.projections.add(aeqd);\n\t  proj4.Proj.projections.add(ortho);\n\t};\n\n\tproj4$1.defaultDatum = 'WGS84'; //default datum\n\tproj4$1.Proj = Projection$1;\n\tproj4$1.WGS84 = new proj4$1.Proj('WGS84');\n\tproj4$1.Point = Point;\n\tproj4$1.toPoint = toPoint;\n\tproj4$1.defs = defs;\n\tproj4$1.transform = transform;\n\tproj4$1.mgrs = mgrs;\n\tproj4$1.version = version;\n\tincludedProjections(proj4$1);\n\n\treturn proj4$1;\n\n})));\n","(function (factory) {\r\n\tvar L, proj4;\r\n\tif (typeof define === 'function' && define.amd) {\r\n\t\t// AMD\r\n\t\tdefine(['leaflet', 'proj4'], factory);\r\n\t} else if (typeof module === 'object' && typeof module.exports === \"object\") {\r\n\t\t// Node/CommonJS\r\n\t\tL = require('leaflet');\r\n\t\tproj4 = require('proj4');\r\n\t\tmodule.exports = factory(L, proj4);\r\n\t} else {\r\n\t\t// Browser globals\r\n\t\tif (typeof window.L === 'undefined' || typeof window.proj4 === 'undefined')\r\n\t\t\tthrow 'Leaflet and proj4 must be loaded first';\r\n\t\tfactory(window.L, window.proj4);\r\n\t}\r\n}(function (L, proj4) {\r\n\r\n\tL.Proj = {};\r\n\r\n\tL.Proj._isProj4Obj = function(a) {\r\n\t\treturn (typeof a.inverse !== 'undefined' &&\r\n\t\t\ttypeof a.forward !== 'undefined');\r\n\t};\r\n\r\n\tL.Proj.Projection = L.Class.extend({\r\n\t\tinitialize: function(code, def, bounds) {\r\n\t\t\tvar isP4 = L.Proj._isProj4Obj(code);\r\n\t\t\tthis._proj = isP4 ? code : this._projFromCodeDef(code, def);\r\n\t\t\tthis.bounds = isP4 ? def : bounds;\r\n\t\t},\r\n\r\n\t\tproject: function (latlng) {\r\n\t\t\tvar point = this._proj.forward([latlng.lng, latlng.lat]);\r\n\t\t\treturn new L.Point(point[0], point[1]);\r\n\t\t},\r\n\r\n\t\tunproject: function (point, unbounded) {\r\n\t\t\tvar point2 = this._proj.inverse([point.x, point.y]);\r\n\t\t\treturn new L.LatLng(point2[1], point2[0], unbounded);\r\n\t\t},\r\n\r\n\t\t_projFromCodeDef: function(code, def) {\r\n\t\t\tif (def) {\r\n\t\t\t\tproj4.defs(code, def);\r\n\t\t\t} else if (proj4.defs[code] === undefined) {\r\n\t\t\t\tvar urn = code.split(':');\r\n\t\t\t\tif (urn.length > 3) {\r\n\t\t\t\t\tcode = urn[urn.length - 3] + ':' + urn[urn.length - 1];\r\n\t\t\t\t}\r\n\t\t\t\tif (proj4.defs[code] === undefined) {\r\n\t\t\t\t\tthrow 'No projection definition for code ' + code;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn proj4(code);\r\n\t\t}\r\n\t});\r\n\r\n\tL.Proj.CRS = L.Class.extend({\r\n\t\tincludes: L.CRS,\r\n\r\n\t\toptions: {\r\n\t\t\ttransformation: new L.Transformation(1, 0, -1, 0)\r\n\t\t},\r\n\r\n\t\tinitialize: function(a, b, c) {\r\n\t\t\tvar code,\r\n\t\t\t    proj,\r\n\t\t\t    def,\r\n\t\t\t    options;\r\n\r\n\t\t\tif (L.Proj._isProj4Obj(a)) {\r\n\t\t\t\tproj = a;\r\n\t\t\t\tcode = proj.srsCode;\r\n\t\t\t\toptions = b || {};\r\n\r\n\t\t\t\tthis.projection = new L.Proj.Projection(proj, options.bounds);\r\n\t\t\t} else {\r\n\t\t\t\tcode = a;\r\n\t\t\t\tdef = b;\r\n\t\t\t\toptions = c || {};\r\n\t\t\t\tthis.projection = new L.Proj.Projection(code, def, options.bounds);\r\n\t\t\t}\r\n\r\n\t\t\tL.Util.setOptions(this, options);\r\n\t\t\tthis.code = code;\r\n\t\t\tthis.transformation = this.options.transformation;\r\n\r\n\t\t\tif (this.options.origin) {\r\n\t\t\t\tthis.transformation =\r\n\t\t\t\t\tnew L.Transformation(1, -this.options.origin[0],\r\n\t\t\t\t\t\t-1, this.options.origin[1]);\r\n\t\t\t}\r\n\r\n\t\t\tif (this.options.scales) {\r\n\t\t\t\tthis._scales = this.options.scales;\r\n\t\t\t} else if (this.options.resolutions) {\r\n\t\t\t\tthis._scales = [];\r\n\t\t\t\tfor (var i = this.options.resolutions.length - 1; i >= 0; i--) {\r\n\t\t\t\t\tif (this.options.resolutions[i]) {\r\n\t\t\t\t\t\tthis._scales[i] = 1 / this.options.resolutions[i];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.infinite = !this.options.bounds;\r\n\r\n\t\t},\r\n\r\n\t\tscale: function(zoom) {\r\n\t\t\tvar iZoom = Math.floor(zoom),\r\n\t\t\t\tbaseScale,\r\n\t\t\t\tnextScale,\r\n\t\t\t\tscaleDiff,\r\n\t\t\t\tzDiff;\r\n\t\t\tif (zoom === iZoom) {\r\n\t\t\t\treturn this._scales[zoom];\r\n\t\t\t} else {\r\n\t\t\t\t// Non-integer zoom, interpolate\r\n\t\t\t\tbaseScale = this._scales[iZoom];\r\n\t\t\t\tnextScale = this._scales[iZoom + 1];\r\n\t\t\t\tscaleDiff = nextScale - baseScale;\r\n\t\t\t\tzDiff = (zoom - iZoom);\r\n\t\t\t\treturn baseScale + scaleDiff * zDiff;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tzoom: function(scale) {\r\n\t\t\t// Find closest number in this._scales, down\r\n\t\t\tvar downScale = this._closestElement(this._scales, scale),\r\n\t\t\t\tdownZoom = this._scales.indexOf(downScale),\r\n\t\t\t\tnextScale,\r\n\t\t\t\tnextZoom,\r\n\t\t\t\tscaleDiff;\r\n\t\t\t// Check if scale is downScale => return array index\r\n\t\t\tif (scale === downScale) {\r\n\t\t\t\treturn downZoom;\r\n\t\t\t}\r\n\t\t\t// Interpolate\r\n\t\t\tnextZoom = downZoom + 1;\r\n\t\t\tnextScale = this._scales[nextZoom];\r\n\t\t\tif (nextScale === undefined) {\r\n\t\t\t\treturn Infinity;\r\n\t\t\t}\r\n\t\t\tscaleDiff = nextScale - downScale;\r\n\t\t\treturn (scale - downScale) / scaleDiff + downZoom;\r\n\t\t},\r\n\r\n\t\tdistance: L.CRS.Earth.distance,\r\n\r\n\t\tR: L.CRS.Earth.R,\r\n\r\n\t\t/* Get the closest lowest element in an array */\r\n\t\t_closestElement: function(array, element) {\r\n\t\t\tvar low;\r\n\t\t\tfor (var i = array.length; i--;) {\r\n\t\t\t\tif (array[i] <= element && (low === undefined || low < array[i])) {\r\n\t\t\t\t\tlow = array[i];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn low;\r\n\t\t}\r\n\t});\r\n\r\n\tL.Proj.GeoJSON = L.GeoJSON.extend({\r\n\t\tinitialize: function(geojson, options) {\r\n\t\t\tthis._callLevel = 0;\r\n\t\t\tL.GeoJSON.prototype.initialize.call(this, geojson, options);\r\n\t\t},\r\n\r\n\t\taddData: function(geojson) {\r\n\t\t\tvar crs;\r\n\r\n\t\t\tif (geojson) {\r\n\t\t\t\tif (geojson.crs && geojson.crs.type === 'name') {\r\n\t\t\t\t\tcrs = new L.Proj.CRS(geojson.crs.properties.name);\r\n\t\t\t\t} else if (geojson.crs && geojson.crs.type) {\r\n\t\t\t\t\tcrs = new L.Proj.CRS(geojson.crs.type + ':' + geojson.crs.properties.code);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (crs !== undefined) {\r\n\t\t\t\t\tthis.options.coordsToLatLng = function(coords) {\r\n\t\t\t\t\t\tvar point = L.point(coords[0], coords[1]);\r\n\t\t\t\t\t\treturn crs.projection.unproject(point);\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Base class' addData might call us recursively, but\r\n\t\t\t// CRS shouldn't be cleared in that case, since CRS applies\r\n\t\t\t// to the whole GeoJSON, inluding sub-features.\r\n\t\t\tthis._callLevel++;\r\n\t\t\ttry {\r\n\t\t\t\tL.GeoJSON.prototype.addData.call(this, geojson);\r\n\t\t\t} finally {\r\n\t\t\t\tthis._callLevel--;\r\n\t\t\t\tif (this._callLevel === 0) {\r\n\t\t\t\t\tdelete this.options.coordsToLatLng;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\tL.Proj.geoJson = function(geojson, options) {\r\n\t\treturn new L.Proj.GeoJSON(geojson, options);\r\n\t};\r\n\r\n\tL.Proj.ImageOverlay = L.ImageOverlay.extend({\r\n\t\tinitialize: function (url, bounds, options) {\r\n\t\t\tL.ImageOverlay.prototype.initialize.call(this, url, null, options);\r\n\t\t\tthis._projectedBounds = bounds;\r\n\t\t},\r\n\r\n\t\t// Danger ahead: Overriding internal methods in Leaflet.\r\n\t\t// Decided to do this rather than making a copy of L.ImageOverlay\r\n\t\t// and doing very tiny modifications to it.\r\n\t\t// Future will tell if this was wise or not.\r\n\t\t_animateZoom: function (event) {\r\n\t\t\tvar scale = this._map.getZoomScale(event.zoom);\r\n\t\t\tvar northWest = L.point(this._projectedBounds.min.x, this._projectedBounds.max.y);\r\n\t\t\tvar offset = this._projectedToNewLayerPoint(northWest, event.zoom, event.center);\r\n\r\n\t\t\tL.DomUtil.setTransform(this._image, offset, scale);\r\n\t\t},\r\n\r\n\t\t_reset: function () {\r\n\t\t\tvar zoom = this._map.getZoom();\r\n\t\t\tvar pixelOrigin = this._map.getPixelOrigin();\r\n\t\t\tvar bounds = L.bounds(\r\n\t\t\t\tthis._transform(this._projectedBounds.min, zoom)._subtract(pixelOrigin),\r\n\t\t\t\tthis._transform(this._projectedBounds.max, zoom)._subtract(pixelOrigin)\r\n\t\t\t);\r\n\t\t\tvar size = bounds.getSize();\r\n\r\n\t\t\tL.DomUtil.setPosition(this._image, bounds.min);\r\n\t\t\tthis._image.style.width = size.x + 'px';\r\n\t\t\tthis._image.style.height = size.y + 'px';\r\n\t\t},\r\n\r\n\t\t_projectedToNewLayerPoint: function (point, zoom, center) {\r\n\t\t\tvar viewHalf = this._map.getSize()._divideBy(2);\r\n\t\t\tvar newTopLeft = this._map.project(center, zoom)._subtract(viewHalf)._round();\r\n\t\t\tvar topLeft = newTopLeft.add(this._map._getMapPanePos());\r\n\r\n\t\t\treturn this._transform(point, zoom)._subtract(topLeft);\r\n\t\t},\r\n\r\n\t\t_transform: function (point, zoom) {\r\n\t\t\tvar crs = this._map.options.crs;\r\n\t\t\tvar transformation = crs.transformation;\r\n\t\t\tvar scale = crs.scale(zoom);\r\n\r\n\t\t\treturn transformation.transform(point, scale);\r\n\t\t}\r\n\t});\r\n\r\n\tL.Proj.imageOverlay = function (url, bounds, options) {\r\n\t\treturn new L.Proj.ImageOverlay(url, bounds, options);\r\n\t};\r\n\r\n\treturn L.Proj;\r\n}));\r\n","'use strict';\n\nvar isArrayish = require('is-arrayish');\n\nvar concat = Array.prototype.concat;\nvar slice = Array.prototype.slice;\n\nvar swizzle = module.exports = function swizzle(args) {\n\tvar results = [];\n\n\tfor (var i = 0, len = args.length; i < len; i++) {\n\t\tvar arg = args[i];\n\n\t\tif (isArrayish(arg)) {\n\t\t\t// http://jsperf.com/javascript-array-concat-vs-push/98\n\t\t\tresults = concat.call(results, slice.call(arg));\n\t\t} else {\n\t\t\tresults.push(arg);\n\t\t}\n\t}\n\n\treturn results;\n};\n\nswizzle.wrap = function (fn) {\n\treturn function () {\n\t\treturn fn(swizzle(arguments));\n\t};\n};\n","'use strict';\n\nmodule.exports = function isArrayish(obj) {\n\tif (!obj || typeof obj === 'string') {\n\t\treturn false;\n\t}\n\n\treturn obj instanceof Array || Array.isArray(obj) ||\n\t\t(obj.length >= 0 && (obj.splice instanceof Function ||\n\t\t\t(Object.getOwnPropertyDescriptor(obj, (obj.length - 1)) && obj.constructor.name !== 'String')));\n};\n","var engine = require('../src/store-engine')\n\nvar storages = require('../storages/all')\nvar plugins = [require('../plugins/json2')]\n\nmodule.exports = engine.createStore(storages, plugins)\n","module.exports = json2Plugin\n\nfunction json2Plugin() {\n\trequire('./lib/json2')\n\treturn {}\n}\n","//  json2.js\n//  2016-10-28\n//  Public Domain.\n//  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n//  See http://www.JSON.org/js.html\n//  This code should be minified before deployment.\n//  See http://javascript.crockford.com/jsmin.html\n\n//  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO\n//  NOT CONTROL.\n\n//  This file creates a global JSON object containing two methods: stringify\n//  and parse. This file provides the ES5 JSON capability to ES3 systems.\n//  If a project might run on IE8 or earlier, then this file should be included.\n//  This file does nothing on ES5 systems.\n\n//      JSON.stringify(value, replacer, space)\n//          value       any JavaScript value, usually an object or array.\n//          replacer    an optional parameter that determines how object\n//                      values are stringified for objects. It can be a\n//                      function or an array of strings.\n//          space       an optional parameter that specifies the indentation\n//                      of nested structures. If it is omitted, the text will\n//                      be packed without extra whitespace. If it is a number,\n//                      it will specify the number of spaces to indent at each\n//                      level. If it is a string (such as \"\\t\" or \"&nbsp;\"),\n//                      it contains the characters used to indent at each level.\n//          This method produces a JSON text from a JavaScript value.\n//          When an object value is found, if the object contains a toJSON\n//          method, its toJSON method will be called and the result will be\n//          stringified. A toJSON method does not serialize: it returns the\n//          value represented by the name/value pair that should be serialized,\n//          or undefined if nothing should be serialized. The toJSON method\n//          will be passed the key associated with the value, and this will be\n//          bound to the value.\n\n//          For example, this would serialize Dates as ISO strings.\n\n//              Date.prototype.toJSON = function (key) {\n//                  function f(n) {\n//                      // Format integers to have at least two digits.\n//                      return (n < 10)\n//                          ? \"0\" + n\n//                          : n;\n//                  }\n//                  return this.getUTCFullYear()   + \"-\" +\n//                       f(this.getUTCMonth() + 1) + \"-\" +\n//                       f(this.getUTCDate())      + \"T\" +\n//                       f(this.getUTCHours())     + \":\" +\n//                       f(this.getUTCMinutes())   + \":\" +\n//                       f(this.getUTCSeconds())   + \"Z\";\n//              };\n\n//          You can provide an optional replacer method. It will be passed the\n//          key and value of each member, with this bound to the containing\n//          object. The value that is returned from your method will be\n//          serialized. If your method returns undefined, then the member will\n//          be excluded from the serialization.\n\n//          If the replacer parameter is an array of strings, then it will be\n//          used to select the members to be serialized. It filters the results\n//          such that only members with keys listed in the replacer array are\n//          stringified.\n\n//          Values that do not have JSON representations, such as undefined or\n//          functions, will not be serialized. Such values in objects will be\n//          dropped; in arrays they will be replaced with null. You can use\n//          a replacer function to replace those with JSON values.\n\n//          JSON.stringify(undefined) returns undefined.\n\n//          The optional space parameter produces a stringification of the\n//          value that is filled with line breaks and indentation to make it\n//          easier to read.\n\n//          If the space parameter is a non-empty string, then that string will\n//          be used for indentation. If the space parameter is a number, then\n//          the indentation will be that many spaces.\n\n//          Example:\n\n//          text = JSON.stringify([\"e\", {pluribus: \"unum\"}]);\n//          // text is '[\"e\",{\"pluribus\":\"unum\"}]'\n\n//          text = JSON.stringify([\"e\", {pluribus: \"unum\"}], null, \"\\t\");\n//          // text is '[\\n\\t\"e\",\\n\\t{\\n\\t\\t\"pluribus\": \"unum\"\\n\\t}\\n]'\n\n//          text = JSON.stringify([new Date()], function (key, value) {\n//              return this[key] instanceof Date\n//                  ? \"Date(\" + this[key] + \")\"\n//                  : value;\n//          });\n//          // text is '[\"Date(---current time---)\"]'\n\n//      JSON.parse(text, reviver)\n//          This method parses a JSON text to produce an object or array.\n//          It can throw a SyntaxError exception.\n\n//          The optional reviver parameter is a function that can filter and\n//          transform the results. It receives each of the keys and values,\n//          and its return value is used instead of the original value.\n//          If it returns what it received, then the structure is not modified.\n//          If it returns undefined then the member is deleted.\n\n//          Example:\n\n//          // Parse the text. Values that look like ISO date strings will\n//          // be converted to Date objects.\n\n//          myData = JSON.parse(text, function (key, value) {\n//              var a;\n//              if (typeof value === \"string\") {\n//                  a =\n//   /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2}(?:\\.\\d*)?)Z$/.exec(value);\n//                  if (a) {\n//                      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],\n//                          +a[5], +a[6]));\n//                  }\n//              }\n//              return value;\n//          });\n\n//          myData = JSON.parse('[\"Date(09/09/2001)\"]', function (key, value) {\n//              var d;\n//              if (typeof value === \"string\" &&\n//                      value.slice(0, 5) === \"Date(\" &&\n//                      value.slice(-1) === \")\") {\n//                  d = new Date(value.slice(5, -1));\n//                  if (d) {\n//                      return d;\n//                  }\n//              }\n//              return value;\n//          });\n\n//  This is a reference implementation. You are free to copy, modify, or\n//  redistribute.\n\n/*jslint\n    eval, for, this\n*/\n\n/*property\n    JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,\n    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,\n    lastIndex, length, parse, prototype, push, replace, slice, stringify,\n    test, toJSON, toString, valueOf\n*/\n\n\n// Create a JSON object only if one does not already exist. We create the\n// methods in a closure to avoid creating global variables.\n\nif (typeof JSON !== \"object\") {\n    JSON = {};\n}\n\n(function () {\n    \"use strict\";\n\n    var rx_one = /^[\\],:{}\\s]*$/;\n    var rx_two = /\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g;\n    var rx_three = /\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g;\n    var rx_four = /(?:^|:|,)(?:\\s*\\[)+/g;\n    var rx_escapable = /[\\\\\"\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;\n    var rx_dangerous = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;\n\n    function f(n) {\n        // Format integers to have at least two digits.\n        return n < 10\n            ? \"0\" + n\n            : n;\n    }\n\n    function this_value() {\n        return this.valueOf();\n    }\n\n    if (typeof Date.prototype.toJSON !== \"function\") {\n\n        Date.prototype.toJSON = function () {\n\n            return isFinite(this.valueOf())\n                ? this.getUTCFullYear() + \"-\" +\n                        f(this.getUTCMonth() + 1) + \"-\" +\n                        f(this.getUTCDate()) + \"T\" +\n                        f(this.getUTCHours()) + \":\" +\n                        f(this.getUTCMinutes()) + \":\" +\n                        f(this.getUTCSeconds()) + \"Z\"\n                : null;\n        };\n\n        Boolean.prototype.toJSON = this_value;\n        Number.prototype.toJSON = this_value;\n        String.prototype.toJSON = this_value;\n    }\n\n    var gap;\n    var indent;\n    var meta;\n    var rep;\n\n\n    function quote(string) {\n\n// If the string contains no control characters, no quote characters, and no\n// backslash characters, then we can safely slap some quotes around it.\n// Otherwise we must also replace the offending characters with safe escape\n// sequences.\n\n        rx_escapable.lastIndex = 0;\n        return rx_escapable.test(string)\n            ? \"\\\"\" + string.replace(rx_escapable, function (a) {\n                var c = meta[a];\n                return typeof c === \"string\"\n                    ? c\n                    : \"\\\\u\" + (\"0000\" + a.charCodeAt(0).toString(16)).slice(-4);\n            }) + \"\\\"\"\n            : \"\\\"\" + string + \"\\\"\";\n    }\n\n\n    function str(key, holder) {\n\n// Produce a string from holder[key].\n\n        var i;          // The loop counter.\n        var k;          // The member key.\n        var v;          // The member value.\n        var length;\n        var mind = gap;\n        var partial;\n        var value = holder[key];\n\n// If the value has a toJSON method, call it to obtain a replacement value.\n\n        if (value && typeof value === \"object\" &&\n                typeof value.toJSON === \"function\") {\n            value = value.toJSON(key);\n        }\n\n// If we were called with a replacer function, then call the replacer to\n// obtain a replacement value.\n\n        if (typeof rep === \"function\") {\n            value = rep.call(holder, key, value);\n        }\n\n// What happens next depends on the value's type.\n\n        switch (typeof value) {\n        case \"string\":\n            return quote(value);\n\n        case \"number\":\n\n// JSON numbers must be finite. Encode non-finite numbers as null.\n\n            return isFinite(value)\n                ? String(value)\n                : \"null\";\n\n        case \"boolean\":\n        case \"null\":\n\n// If the value is a boolean or null, convert it to a string. Note:\n// typeof null does not produce \"null\". The case is included here in\n// the remote chance that this gets fixed someday.\n\n            return String(value);\n\n// If the type is \"object\", we might be dealing with an object or an array or\n// null.\n\n        case \"object\":\n\n// Due to a specification blunder in ECMAScript, typeof null is \"object\",\n// so watch out for that case.\n\n            if (!value) {\n                return \"null\";\n            }\n\n// Make an array to hold the partial results of stringifying this object value.\n\n            gap += indent;\n            partial = [];\n\n// Is the value an array?\n\n            if (Object.prototype.toString.apply(value) === \"[object Array]\") {\n\n// The value is an array. Stringify every element. Use null as a placeholder\n// for non-JSON values.\n\n                length = value.length;\n                for (i = 0; i < length; i += 1) {\n                    partial[i] = str(i, value) || \"null\";\n                }\n\n// Join all of the elements together, separated with commas, and wrap them in\n// brackets.\n\n                v = partial.length === 0\n                    ? \"[]\"\n                    : gap\n                        ? \"[\\n\" + gap + partial.join(\",\\n\" + gap) + \"\\n\" + mind + \"]\"\n                        : \"[\" + partial.join(\",\") + \"]\";\n                gap = mind;\n                return v;\n            }\n\n// If the replacer is an array, use it to select the members to be stringified.\n\n            if (rep && typeof rep === \"object\") {\n                length = rep.length;\n                for (i = 0; i < length; i += 1) {\n                    if (typeof rep[i] === \"string\") {\n                        k = rep[i];\n                        v = str(k, value);\n                        if (v) {\n                            partial.push(quote(k) + (\n                                gap\n                                    ? \": \"\n                                    : \":\"\n                            ) + v);\n                        }\n                    }\n                }\n            } else {\n\n// Otherwise, iterate through all of the keys in the object.\n\n                for (k in value) {\n                    if (Object.prototype.hasOwnProperty.call(value, k)) {\n                        v = str(k, value);\n                        if (v) {\n                            partial.push(quote(k) + (\n                                gap\n                                    ? \": \"\n                                    : \":\"\n                            ) + v);\n                        }\n                    }\n                }\n            }\n\n// Join all of the member texts together, separated with commas,\n// and wrap them in braces.\n\n            v = partial.length === 0\n                ? \"{}\"\n                : gap\n                    ? \"{\\n\" + gap + partial.join(\",\\n\" + gap) + \"\\n\" + mind + \"}\"\n                    : \"{\" + partial.join(\",\") + \"}\";\n            gap = mind;\n            return v;\n        }\n    }\n\n// If the JSON object does not yet have a stringify method, give it one.\n\n    if (typeof JSON.stringify !== \"function\") {\n        meta = {    // table of character substitutions\n            \"\\b\": \"\\\\b\",\n            \"\\t\": \"\\\\t\",\n            \"\\n\": \"\\\\n\",\n            \"\\f\": \"\\\\f\",\n            \"\\r\": \"\\\\r\",\n            \"\\\"\": \"\\\\\\\"\",\n            \"\\\\\": \"\\\\\\\\\"\n        };\n        JSON.stringify = function (value, replacer, space) {\n\n// The stringify method takes a value and an optional replacer, and an optional\n// space parameter, and returns a JSON text. The replacer can be a function\n// that can replace values, or an array of strings that will select the keys.\n// A default replacer method can be provided. Use of the space parameter can\n// produce text that is more easily readable.\n\n            var i;\n            gap = \"\";\n            indent = \"\";\n\n// If the space parameter is a number, make an indent string containing that\n// many spaces.\n\n            if (typeof space === \"number\") {\n                for (i = 0; i < space; i += 1) {\n                    indent += \" \";\n                }\n\n// If the space parameter is a string, it will be used as the indent string.\n\n            } else if (typeof space === \"string\") {\n                indent = space;\n            }\n\n// If there is a replacer, it must be a function or an array.\n// Otherwise, throw an error.\n\n            rep = replacer;\n            if (replacer && typeof replacer !== \"function\" &&\n                    (typeof replacer !== \"object\" ||\n                    typeof replacer.length !== \"number\")) {\n                throw new Error(\"JSON.stringify\");\n            }\n\n// Make a fake root object containing our value under the key of \"\".\n// Return the result of stringifying the value.\n\n            return str(\"\", {\"\": value});\n        };\n    }\n\n\n// If the JSON object does not yet have a parse method, give it one.\n\n    if (typeof JSON.parse !== \"function\") {\n        JSON.parse = function (text, reviver) {\n\n// The parse method takes a text and an optional reviver function, and returns\n// a JavaScript value if the text is a valid JSON text.\n\n            var j;\n\n            function walk(holder, key) {\n\n// The walk method is used to recursively walk the resulting structure so\n// that modifications can be made.\n\n                var k;\n                var v;\n                var value = holder[key];\n                if (value && typeof value === \"object\") {\n                    for (k in value) {\n                        if (Object.prototype.hasOwnProperty.call(value, k)) {\n                            v = walk(value, k);\n                            if (v !== undefined) {\n                                value[k] = v;\n                            } else {\n                                delete value[k];\n                            }\n                        }\n                    }\n                }\n                return reviver.call(holder, key, value);\n            }\n\n\n// Parsing happens in four stages. In the first stage, we replace certain\n// Unicode characters with escape sequences. JavaScript handles many characters\n// incorrectly, either silently deleting them, or treating them as line endings.\n\n            text = String(text);\n            rx_dangerous.lastIndex = 0;\n            if (rx_dangerous.test(text)) {\n                text = text.replace(rx_dangerous, function (a) {\n                    return \"\\\\u\" +\n                            (\"0000\" + a.charCodeAt(0).toString(16)).slice(-4);\n                });\n            }\n\n// In the second stage, we run the text against regular expressions that look\n// for non-JSON patterns. We are especially concerned with \"()\" and \"new\"\n// because they can cause invocation, and \"=\" because it can cause mutation.\n// But just to be safe, we want to reject all unexpected forms.\n\n// We split the second stage into 4 regexp operations in order to work around\n// crippling inefficiencies in IE's and Safari's regexp engines. First we\n// replace the JSON backslash pairs with \"@\" (a non-JSON character). Second, we\n// replace all simple value tokens with \"]\" characters. Third, we delete all\n// open brackets that follow a colon or comma or that begin the text. Finally,\n// we look to see that the remaining characters are only whitespace or \"]\" or\n// \",\" or \":\" or \"{\" or \"}\". If that is so, then the text is safe for eval.\n\n            if (\n                rx_one.test(\n                    text\n                        .replace(rx_two, \"@\")\n                        .replace(rx_three, \"]\")\n                        .replace(rx_four, \"\")\n                )\n            ) {\n\n// In the third stage we use the eval function to compile the text into a\n// JavaScript structure. The \"{\" operator is subject to a syntactic ambiguity\n// in JavaScript: it can begin a block or an object literal. We wrap the text\n// in parens to eliminate the ambiguity.\n\n                j = eval(\"(\" + text + \")\");\n\n// In the optional fourth stage, we recursively walk the new structure, passing\n// each name/value pair to a reviver function for possible transformation.\n\n                return (typeof reviver === \"function\")\n                    ? walk({\"\": j}, \"\")\n                    : j;\n            }\n\n// If the text is not JSON parseable, then a SyntaxError is thrown.\n\n            throw new SyntaxError(\"JSON.parse\");\n        };\n    }\n}());","var util = require('./util')\nvar slice = util.slice\nvar pluck = util.pluck\nvar each = util.each\nvar create = util.create\nvar isList = util.isList\nvar isFunction = util.isFunction\nvar isObject = util.isObject\n\nmodule.exports = {\n\tcreateStore: createStore,\n}\n\nvar storeAPI = {\n\tversion: '2.0.4',\n\tenabled: false,\n\tstorage: null,\n\n\t// addStorage adds another storage to this store. The store\n\t// will use the first storage it receives that is enabled, so\n\t// call addStorage in the order of preferred storage.\n\taddStorage: function(storage) {\n\t\tif (this.enabled) { return }\n\t\tif (this._testStorage(storage)) {\n\t\t\tthis._storage.resolved = storage\n\t\t\tthis.enabled = true\n\t\t\tthis.storage = storage.name\n\t\t}\n\t},\n\n\t// addPlugin will add a plugin to this store.\n\taddPlugin: function(plugin) {\n\t\tvar self = this\n\n\t\t// If the plugin is an array, then add all plugins in the array.\n\t\t// This allows for a plugin to depend on other plugins.\n\t\tif (isList(plugin)) {\n\t\t\teach(plugin, function(plugin) {\n\t\t\t\tself.addPlugin(plugin)\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\t// Keep track of all plugins we've seen so far, so that we\n\t\t// don't add any of them twice.\n\t\tvar seenPlugin = pluck(this._seenPlugins, function(seenPlugin) { return (plugin === seenPlugin) })\n\t\tif (seenPlugin) {\n\t\t\treturn\n\t\t}\n\t\tthis._seenPlugins.push(plugin)\n\n\t\t// Check that the plugin is properly formed\n\t\tif (!isFunction(plugin)) {\n\t\t\tthrow new Error('Plugins must be function values that return objects')\n\t\t}\n\n\t\tvar pluginProperties = plugin.call(this)\n\t\tif (!isObject(pluginProperties)) {\n\t\t\tthrow new Error('Plugins must return an object of function properties')\n\t\t}\n\n\t\t// Add the plugin function properties to this store instance.\n\t\teach(pluginProperties, function(pluginFnProp, propName) {\n\t\t\tif (!isFunction(pluginFnProp)) {\n\t\t\t\tthrow new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')\n\t\t\t}\n\t\t\tself._assignPluginFnProp(pluginFnProp, propName)\n\t\t})\n\t},\n\n\t// get returns the value of the given key. If that value\n\t// is undefined, it returns optionalDefaultValue instead.\n\tget: function(key, optionalDefaultValue) {\n\t\tvar data = this._storage().read(this._namespacePrefix + key)\n\t\treturn this._deserialize(data, optionalDefaultValue)\n\t},\n\n\t// set will store the given value at key and returns value.\n\t// Calling set with value === undefined is equivalent to calling remove.\n\tset: function(key, value) {\n\t\tif (value === undefined) {\n\t\t\treturn this.remove(key)\n\t\t}\n\t\tthis._storage().write(this._namespacePrefix + key, this._serialize(value))\n\t\treturn value\n\t},\n\n\t// remove deletes the key and value stored at the given key.\n\tremove: function(key) {\n\t\tthis._storage().remove(this._namespacePrefix + key)\n\t},\n\n\t// each will call the given callback once for each key-value pair\n\t// in this store.\n\teach: function(callback) {\n\t\tvar self = this\n\t\tthis._storage().each(function(val, namespacedKey) {\n\t\t\tcallback(self._deserialize(val), namespacedKey.replace(self._namespaceRegexp, ''))\n\t\t})\n\t},\n\n\t// clearAll will remove all the stored key-value pairs in this store.\n\tclearAll: function() {\n\t\tthis._storage().clearAll()\n\t},\n\n\t// additional functionality that can't live in plugins\n\t// ---------------------------------------------------\n\n\t// hasNamespace returns true if this store instance has the given namespace.\n\thasNamespace: function(namespace) {\n\t\treturn (this._namespacePrefix == '__storejs_'+namespace+'_')\n\t},\n\n\t// namespace clones the current store and assigns it the given namespace\n\tnamespace: function(namespace) {\n\t\tif (!this._legalNamespace.test(namespace)) {\n\t\t\tthrow new Error('store.js namespaces can only have alhpanumerics + underscores and dashes')\n\t\t}\n\t\t// create a prefix that is very unlikely to collide with un-namespaced keys\n\t\tvar namespacePrefix = '__storejs_'+namespace+'_'\n\t\treturn create(this, {\n\t\t\t_namespacePrefix: namespacePrefix,\n\t\t\t_namespaceRegexp: namespacePrefix ? new RegExp('^'+namespacePrefix) : null\n\t\t})\n\t},\n\n\t// createStore creates a store.js instance with the first\n\t// functioning storage in the list of storage candidates,\n\t// and applies the the given mixins to the instance.\n\tcreateStore: function(storages, plugins) {\n\t\treturn createStore(storages, plugins)\n\t},\n}\n\nfunction createStore(storages, plugins) {\n\tvar _privateStoreProps = {\n\t\t_seenPlugins: [],\n\t\t_namespacePrefix: '',\n\t\t_namespaceRegexp: null,\n\t\t_legalNamespace: /^[a-zA-Z0-9_\\-]+$/, // alpha-numeric + underscore and dash\n\n\t\t_storage: function() {\n\t\t\tif (!this.enabled) {\n\t\t\t\tthrow new Error(\"store.js: No supported storage has been added! \"+\n\t\t\t\t\t\"Add one (e.g store.addStorage(require('store/storages/cookieStorage')) \"+\n\t\t\t\t\t\"or use a build with more built-in storages (e.g \"+\n\t\t\t\t\t\"https://github.com/marcuswestin/store.js/tree/master/dist/store.legacy.min.js)\")\n\t\t\t}\n\t\t\treturn this._storage.resolved\n\t\t},\n\n\t\t_testStorage: function(storage) {\n\t\t\ttry {\n\t\t\t\tvar testStr = '__storejs__test__'\n\t\t\t\tstorage.write(testStr, testStr)\n\t\t\t\tvar ok = (storage.read(testStr) === testStr)\n\t\t\t\tstorage.remove(testStr)\n\t\t\t\treturn ok\n\t\t\t} catch(e) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t},\n\n\t\t_assignPluginFnProp: function(pluginFnProp, propName) {\n\t\t\tvar oldFn = this[propName]\n\t\t\tthis[propName] = function pluginFn() {\n\t\t\t\tvar args = slice(arguments, 0)\n\t\t\t\tvar self = this\n\n\t\t\t\t// super_fn calls the old function which was overwritten by\n\t\t\t\t// this mixin.\n\t\t\t\tfunction super_fn() {\n\t\t\t\t\tif (!oldFn) { return }\n\t\t\t\t\teach(arguments, function(arg, i) {\n\t\t\t\t\t\targs[i] = arg\n\t\t\t\t\t})\n\t\t\t\t\treturn oldFn.apply(self, args)\n\t\t\t\t}\n\n\t\t\t\t// Give mixing function access to super_fn by prefixing all mixin function\n\t\t\t\t// arguments with super_fn.\n\t\t\t\tvar newFnArgs = [super_fn].concat(args)\n\n\t\t\t\treturn pluginFnProp.apply(self, newFnArgs)\n\t\t\t}\n\t\t},\n\n\t\t_serialize: function(obj) {\n\t\t\treturn JSON.stringify(obj)\n\t\t},\n\n\t\t_deserialize: function(strVal, defaultVal) {\n\t\t\tif (!strVal) { return defaultVal }\n\t\t\t// It is possible that a raw string value has been previously stored\n\t\t\t// in a storage without using store.js, meaning it will be a raw\n\t\t\t// string value instead of a JSON serialized string. By defaulting\n\t\t\t// to the raw string value in case of a JSON parse error, we allow\n\t\t\t// for past stored values to be forwards-compatible with store.js\n\t\t\tvar val = ''\n\t\t\ttry { val = JSON.parse(strVal) }\n\t\t\tcatch(e) { val = strVal }\n\n\t\t\treturn (val !== undefined ? val : defaultVal)\n\t\t},\n\t}\n\n\tvar store = create(_privateStoreProps, storeAPI)\n\teach(storages, function(storage) {\n\t\tstore.addStorage(storage)\n\t})\n\teach(plugins, function(plugin) {\n\t\tstore.addPlugin(plugin)\n\t})\n\treturn store\n}\n","var assign = make_assign()\nvar create = make_create()\nvar trim = make_trim()\nvar Global = (typeof window !== 'undefined' ? window : global)\n\nmodule.exports = {\n\tassign: assign,\n\tcreate: create,\n\ttrim: trim,\n\tbind: bind,\n\tslice: slice,\n\teach: each,\n\tmap: map,\n\tpluck: pluck,\n\tisList: isList,\n\tisFunction: isFunction,\n\tisObject: isObject,\n\tGlobal: Global,\n}\n\nfunction make_assign() {\n\tif (Object.assign) {\n\t\treturn Object.assign\n\t} else {\n\t\treturn function shimAssign(obj, props1, props2, etc) {\n\t\t\tfor (var i = 1; i < arguments.length; i++) {\n\t\t\t\teach(Object(arguments[i]), function(val, key) {\n\t\t\t\t\tobj[key] = val\n\t\t\t\t})\n\t\t\t}\t\t\t\n\t\t\treturn obj\n\t\t}\n\t}\n}\n\nfunction make_create() {\n\tif (Object.create) {\n\t\treturn function create(obj, assignProps1, assignProps2, etc) {\n\t\t\tvar assignArgsList = slice(arguments, 1)\n\t\t\treturn assign.apply(this, [Object.create(obj)].concat(assignArgsList))\n\t\t}\n\t} else {\n\t\tfunction F() {} // eslint-disable-line no-inner-declarations\n\t\treturn function create(obj, assignProps1, assignProps2, etc) {\n\t\t\tvar assignArgsList = slice(arguments, 1)\n\t\t\tF.prototype = obj\n\t\t\treturn assign.apply(this, [new F()].concat(assignArgsList))\n\t\t}\n\t}\n}\n\nfunction make_trim() {\n\tif (String.prototype.trim) {\n\t\treturn function trim(str) {\n\t\t\treturn String.prototype.trim.call(str)\n\t\t}\n\t} else {\n\t\treturn function trim(str) {\n\t\t\treturn str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '')\n\t\t}\n\t}\n}\n\nfunction bind(obj, fn) {\n\treturn function() {\n\t\treturn fn.apply(obj, Array.prototype.slice.call(arguments, 0))\n\t}\n}\n\nfunction slice(arr, index) {\n\treturn Array.prototype.slice.call(arr, index || 0)\n}\n\nfunction each(obj, fn) {\n\tpluck(obj, function(key, val) {\n\t\tfn(key, val)\n\t\treturn false\n\t})\n}\n\nfunction map(obj, fn) {\n\tvar res = (isList(obj) ? [] : {})\n\tpluck(obj, function(v, k) {\n\t\tres[k] = fn(v, k)\n\t\treturn false\n\t})\n\treturn res\n}\n\nfunction pluck(obj, fn) {\n\tif (isList(obj)) {\n\t\tfor (var i=0; i<obj.length; i++) {\n\t\t\tif (fn(obj[i], i)) {\n\t\t\t\treturn obj[i]\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor (var key in obj) {\n\t\t\tif (obj.hasOwnProperty(key)) {\n\t\t\t\tif (fn(obj[key], key)) {\n\t\t\t\t\treturn obj[key]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction isList(val) {\n\treturn (val != null && typeof val != 'function' && typeof val.length == 'number')\n}\n\nfunction isFunction(val) {\n\treturn val && {}.toString.call(val) === '[object Function]'\n}\n\nfunction isObject(val) {\n\treturn val && {}.toString.call(val) === '[object Object]'\n}\n","module.exports = {\n\t// Listed in order of usage preference\n\t'localStorage': require('./localStorage'),\n\t'oldFF-globalStorage': require('./oldFF-globalStorage'),\n\t'oldIE-userDataStorage': require('./oldIE-userDataStorage'),\n\t'cookieStorage': require('./cookieStorage'),\n\t'sessionStorage': require('./sessionStorage'),\n\t'memoryStorage': require('./memoryStorage'),\n}\n","// cookieStorage is useful Safari private browser mode, where localStorage\n// doesn't work but cookies do. This implementation is adopted from\n// https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage\n\nvar util = require('../src/util')\nvar Global = util.Global\nvar trim = util.trim\n\nmodule.exports = {\n\tname: 'cookieStorage',\n\tread: read,\n\twrite: write,\n\teach: each,\n\tremove: remove,\n\tclearAll: clearAll,\n}\n\nvar doc = Global.document\n\nfunction read(key) {\n\tif (!key || !_has(key)) { return null }\n\tvar regexpStr = \"(?:^|.*;\\\\s*)\" +\n\t\tescape(key).replace(/[\\-\\.\\+\\*]/g, \"\\\\$&\") +\n\t\t\"\\\\s*\\\\=\\\\s*((?:[^;](?!;))*[^;]?).*\"\n\treturn unescape(doc.cookie.replace(new RegExp(regexpStr), \"$1\"))\n}\n\nfunction each(callback) {\n\tvar cookies = doc.cookie.split(/; ?/g)\n\tfor (var i = cookies.length - 1; i >= 0; i--) {\n\t\tif (!trim(cookies[i])) {\n\t\t\tcontinue\n\t\t}\n\t\tvar kvp = cookies[i].split('=')\n\t\tvar key = unescape(kvp[0])\n\t\tvar val = unescape(kvp[1])\n\t\tcallback(val, key)\n\t}\n}\n\nfunction write(key, data) {\n\tif(!key) { return }\n\tdoc.cookie = escape(key) + \"=\" + escape(data) + \"; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/\"\n}\n\nfunction remove(key) {\n\tif (!key || !_has(key)) {\n\t\treturn\n\t}\n\tdoc.cookie = escape(key) + \"=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/\"\n}\n\nfunction clearAll() {\n\teach(function(_, key) {\n\t\tremove(key)\n\t})\n}\n\nfunction _has(key) {\n\treturn (new RegExp(\"(?:^|;\\\\s*)\" + escape(key).replace(/[\\-\\.\\+\\*]/g, \"\\\\$&\") + \"\\\\s*\\\\=\")).test(doc.cookie)\n}\n","var util = require('../src/util')\nvar Global = util.Global\n\nmodule.exports = {\n\tname: 'localStorage',\n\tread: read,\n\twrite: write,\n\teach: each,\n\tremove: remove,\n\tclearAll: clearAll,\n}\n\nfunction localStorage() {\n\treturn Global.localStorage\n}\n\nfunction read(key) {\n\treturn localStorage().getItem(key)\n}\n\nfunction write(key, data) {\n\treturn localStorage().setItem(key, data)\n}\n\nfunction each(fn) {\n\tfor (var i = localStorage().length - 1; i >= 0; i--) {\n\t\tvar key = localStorage().key(i)\n\t\tfn(read(key), key)\n\t}\n}\n\nfunction remove(key) {\n\treturn localStorage().removeItem(key)\n}\n\nfunction clearAll() {\n\treturn localStorage().clear()\n}\n","// memoryStorage is a useful last fallback to ensure that the store\n// is functions (meaning store.get(), store.set(), etc will all function).\n// However, stored values will not persist when the browser navigates to\n// a new page or reloads the current page.\n\nmodule.exports = {\n\tname: 'memoryStorage',\n\tread: read,\n\twrite: write,\n\teach: each,\n\tremove: remove,\n\tclearAll: clearAll,\n}\n\nvar memoryStorage = {}\n\nfunction read(key) {\n\treturn memoryStorage[key]\n}\n\nfunction write(key, data) {\n\tmemoryStorage[key] = data\n}\n\nfunction each(callback) {\n\tfor (var key in memoryStorage) {\n\t\tif (memoryStorage.hasOwnProperty(key)) {\n\t\t\tcallback(memoryStorage[key], key)\n\t\t}\n\t}\n}\n\nfunction remove(key) {\n\tdelete memoryStorage[key]\n}\n\nfunction clearAll(key) {\n\tmemoryStorage = {}\n}\n","// oldFF-globalStorage provides storage for Firefox\n// versions 6 and 7, where no localStorage, etc\n// is available.\n\nvar util = require('../src/util')\nvar Global = util.Global\n\nmodule.exports = {\n\tname: 'oldFF-globalStorage',\n\tread: read,\n\twrite: write,\n\teach: each,\n\tremove: remove,\n\tclearAll: clearAll,\n}\n\nvar globalStorage = Global.globalStorage\n\nfunction read(key) {\n\treturn globalStorage[key]\n}\n\nfunction write(key, data) {\n\tglobalStorage[key] = data\n}\n\nfunction each(fn) {\n\tfor (var i = globalStorage.length - 1; i >= 0; i--) {\n\t\tvar key = globalStorage.key(i)\n\t\tfn(globalStorage[key], key)\n\t}\n}\n\nfunction remove(key) {\n\treturn globalStorage.removeItem(key)\n}\n\nfunction clearAll() {\n\teach(function(key, _) {\n\t\tdelete globalStorage[key]\n\t})\n}\n","// oldIE-userDataStorage provides storage for Internet Explorer\n// versions 6 and 7, where no localStorage, sessionStorage, etc\n// is available.\n\nvar util = require('../src/util')\nvar Global = util.Global\n\nmodule.exports = {\n\tname: 'oldIE-userDataStorage',\n\twrite: write,\n\tread: read,\n\teach: each,\n\tremove: remove,\n\tclearAll: clearAll,\n}\n\nvar storageName = 'storejs'\nvar doc = Global.document\nvar _withStorageEl = _makeIEStorageElFunction()\nvar disable = (Global.navigator ? Global.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\\./) // MSIE 9.x, MSIE 10.x\n\nfunction write(unfixedKey, data) {\n\tif (disable) { return }\n\tvar fixedKey = fixKey(unfixedKey)\n\t_withStorageEl(function(storageEl) {\n\t\tstorageEl.setAttribute(fixedKey, data)\n\t\tstorageEl.save(storageName)\n\t})\n}\n\nfunction read(unfixedKey) {\n\tif (disable) { return }\n\tvar fixedKey = fixKey(unfixedKey)\n\tvar res = null\n\t_withStorageEl(function(storageEl) {\n\t\tres = storageEl.getAttribute(fixedKey)\n\t})\n\treturn res\n}\n\nfunction each(callback) {\n\t_withStorageEl(function(storageEl) {\n\t\tvar attributes = storageEl.XMLDocument.documentElement.attributes\n\t\tfor (var i=attributes.length-1; i>=0; i--) {\n\t\t\tvar attr = attributes[i]\n\t\t\tcallback(storageEl.getAttribute(attr.name), attr.name)\n\t\t}\n\t})\n}\n\nfunction remove(unfixedKey) {\n\tvar fixedKey = fixKey(unfixedKey)\n\t_withStorageEl(function(storageEl) {\n\t\tstorageEl.removeAttribute(fixedKey)\n\t\tstorageEl.save(storageName)\n\t})\n}\n\nfunction clearAll() {\n\t_withStorageEl(function(storageEl) {\n\t\tvar attributes = storageEl.XMLDocument.documentElement.attributes\n\t\tstorageEl.load(storageName)\n\t\tfor (var i=attributes.length-1; i>=0; i--) {\n\t\t\tstorageEl.removeAttribute(attributes[i].name)\n\t\t}\n\t\tstorageEl.save(storageName)\n\t})\n}\n\n// Helpers\n//////////\n\n// In IE7, keys cannot start with a digit or contain certain chars.\n// See https://github.com/marcuswestin/store.js/issues/40\n// See https://github.com/marcuswestin/store.js/issues/83\nvar forbiddenCharsRegex = new RegExp(\"[!\\\"#$%&'()*+,/\\\\\\\\:;<=>?@[\\\\]^`{|}~]\", \"g\")\nfunction fixKey(key) {\n\treturn key.replace(/^\\d/, '___$&').replace(forbiddenCharsRegex, '___')\n}\n\nfunction _makeIEStorageElFunction() {\n\tif (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {\n\t\treturn null\n\t}\n\tvar scriptTag = 'script',\n\t\tstorageOwner,\n\t\tstorageContainer,\n\t\tstorageEl\n\n\t// Since #userData storage applies only to specific paths, we need to\n\t// somehow link our data to a specific path.  We choose /favicon.ico\n\t// as a pretty safe option, since all browsers already make a request to\n\t// this URL anyway and being a 404 will not hurt us here.  We wrap an\n\t// iframe pointing to the favicon in an ActiveXObject(htmlfile) object\n\t// (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)\n\t// since the iframe access rules appear to allow direct access and\n\t// manipulation of the document element, even for a 404 page.  This\n\t// document can be used instead of the current document (which would\n\t// have been limited to the current path) to perform #userData storage.\n\ttry {\n\t\t/* global ActiveXObject */\n\t\tstorageContainer = new ActiveXObject('htmlfile')\n\t\tstorageContainer.open()\n\t\tstorageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src=\"/favicon.ico\"></iframe>')\n\t\tstorageContainer.close()\n\t\tstorageOwner = storageContainer.w.frames[0].document\n\t\tstorageEl = storageOwner.createElement('div')\n\t} catch(e) {\n\t\t// somehow ActiveXObject instantiation failed (perhaps some special\n\t\t// security settings or otherwse), fall back to per-path storage\n\t\tstorageEl = doc.createElement('div')\n\t\tstorageOwner = doc.body\n\t}\n\n\treturn function(storeFunction) {\n\t\tvar args = [].slice.call(arguments, 0)\n\t\targs.unshift(storageEl)\n\t\t// See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx\n\t\t// and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx\n\t\tstorageOwner.appendChild(storageEl)\n\t\tstorageEl.addBehavior('#default#userData')\n\t\tstorageEl.load(storageName)\n\t\tstoreFunction.apply(this, args)\n\t\tstorageOwner.removeChild(storageEl)\n\t\treturn\n\t}\n}\n","var util = require('../src/util')\nvar Global = util.Global\n\nmodule.exports = {\n\tname: 'sessionStorage',\n\tread: read,\n\twrite: write,\n\teach: each,\n\tremove: remove,\n\tclearAll: clearAll,\n}\n\nfunction sessionStorage() {\n\treturn Global.sessionStorage\n}\n\nfunction read(key) {\n\treturn sessionStorage().getItem(key)\n}\n\nfunction write(key, data) {\n\treturn sessionStorage().setItem(key, data)\n}\n\nfunction each(fn) {\n\tfor (var i = sessionStorage().length - 1; i >= 0; i--) {\n\t\tvar key = sessionStorage().key(i)\n\t\tfn(read(key), key)\n\t}\n}\n\nfunction remove(key) {\n\treturn sessionStorage().removeItem(key)\n}\n\nfunction clearAll() {\n\treturn sessionStorage().clear()\n}\n","/** @license\n *\n *  Copyright (C) 2012 K. Arthur Endsley (kaendsle@mtu.edu)\n *  Michigan Tech Research Institute (MTRI)\n *  3600 Green Court, Suite 100, Ann Arbor, MI, 48105\n *\n *  This program is free software: you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 3 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License\n *  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\n/**\n * @augments Wkt.Wkt\n * A framework-dependent flag, set for each Wkt.Wkt() instance, that indicates\n * whether or not a closed polygon geometry should be interpreted as a rectangle.\n */\nWkt.Wkt.prototype.isRectangle = false;\n\n/**\n * @augments Wkt.Wkt\n * Truncates an Array of coordinates by the closing coordinate when it is\n * equal to the first coordinate given--this is only to be used for closed\n * geometries in order to provide merely an \"implied\" closure to Leaflet.\n * @param   coords  {Array}     An Array of x,y coordinates (objects)\n * @return          {Array}\n */\nWkt.Wkt.prototype.trunc = function (coords) {\n    var i, verts = [];\n\n    for (i = 0; i < coords.length; i += 1) {\n        if (Wkt.isArray(coords[i])) {\n            verts.push(this.trunc(coords[i]));\n\n        } else {\n\n            // Add the first coord, but skip the last if it is identical\n            if (i === 0 || !this.sameCoords(coords[0], coords[i])) {\n                verts.push(coords[i]);\n            }\n        }\n    }\n\n    return verts;\n};\n\n/**\n * @augments Wkt.Wkt\n * An object of framework-dependent construction methods used to generate\n * objects belonging to the various geometry classes of the framework.\n */\nWkt.Wkt.prototype.construct = {\n    /**\n     * Creates the framework's equivalent point geometry object.\n     * @param   config      {Object}    An optional properties hash the object should use\n     * @param   component   {Object}    An optional component to build from\n     * @return              {L.marker}\n     */\n    point: function (config, component) {\n        var coord = component || this.components;\n        if (coord instanceof Array) {\n            coord = coord[0];\n        }\n\n        return L.marker(this.coordsToLatLng(coord), config);\n    },\n\n    /**\n     * Creates the framework's equivalent multipoint geometry object.\n     * @param   config  {Object}    An optional properties hash the object should use\n     * @return          {L.featureGroup}\n     */\n    multipoint: function (config) {\n        var i,\n            layers = [],\n            coords = this.components;\n\n        for (i = 0; i < coords.length; i += 1) {\n            layers.push(this.construct.point.call(this, config, coords[i]));\n        }\n\n        return L.featureGroup(layers, config);\n    },\n\n    /**\n     * Creates the framework's equivalent linestring geometry object.\n     * @param   config      {Object}    An optional properties hash the object should use\n     * @param   component   {Object}    An optional component to build from\n     * @return              {L.polyline}\n     */\n    linestring: function (config, component) {\n        var coords = component || this.components,\n            latlngs = this.coordsToLatLngs(coords);\n\n        return L.polyline(latlngs, config);\n    },\n\n    /**\n     * Creates the framework's equivalent multilinestring geometry object.\n     * @param   config  {Object}    An optional properties hash the object should use\n     * @return          {L.multiPolyline}\n     */\n    multilinestring: function (config) {\n        var coords = this.components,\n            latlngs = this.coordsToLatLngs(coords, 1);\n\n        if (L.multiPolyline) {\n            return L.multiPolyline(latlngs, config);\n        }\n        else {\n            return L.polyline(latlngs, config);\n        }\n    },\n\n    /**\n     * Creates the framework's equivalent polygon geometry object.\n     * @param   config      {Object}    An optional properties hash the object should use\n     * @return              {L.multiPolygon}\n     */\n    polygon: function (config) {\n        // Truncate the coordinates to remove the closing coordinate\n        var coords = this.trunc(this.components),\n            latlngs = this.coordsToLatLngs(coords, 1);\n        return L.polygon(latlngs, config);\n    },\n\n    /**\n     * Creates the framework's equivalent multipolygon geometry object.\n     * @param   config  {Object}    An optional properties hash the object should use\n     * @return          {L.multiPolygon}\n     */\n    multipolygon: function (config) {\n        // Truncate the coordinates to remove the closing coordinate\n        var coords = this.trunc(this.components),\n            latlngs = this.coordsToLatLngs(coords, 2);\n\n        if (L.multiPolygon) {\n            return L.multiPolygon(latlngs, config);\n        }\n        else {\n            return L.polygon(latlngs, config);\n        }\n    },\n\n    /**\n     * Creates the framework's equivalent collection of geometry objects.\n     * @param   config  {Object}    An optional properties hash the object should use\n     * @return          {L.featureGroup}\n     */\n    geometrycollection: function (config) {\n        var comps, i, layers;\n\n        comps = this.trunc(this.components);\n        layers = [];\n        for (i = 0; i < this.components.length; i += 1) {\n            layers.push(this.construct[comps[i].type].call(this, comps[i]));\n        }\n\n        return L.featureGroup(layers, config);\n\n    }\n};\n\nL.Util.extend(Wkt.Wkt.prototype, {\n    coordsToLatLngs: L.GeoJSON.coordsToLatLngs,\n    // TODO Why doesn't the coordsToLatLng function in L.GeoJSON already suffice?\n    coordsToLatLng: function (coords, reverse) {\n        var lat = reverse ? coords.x : coords.y,\n            lng = reverse ? coords.y : coords.x;\n\n        return L.latLng(lat, lng, true);\n    }\n});\n\n/**\n * @augments Wkt.Wkt\n * A framework-dependent deconstruction method used to generate internal\n * geometric representations from instances of framework geometry. This method\n * uses object detection to attempt to classify members of framework geometry\n * classes into the standard WKT types.\n * @param   obj {Object}    An instance of one of the framework's geometry classes\n * @return      {Object}    A hash of the 'type' and 'components' thus derived\n */\nWkt.Wkt.prototype.deconstruct = function (obj) {\n    var attr, coordsFromLatLngs, features, i, verts, rings, tmp;\n\n    /**\n     * Accepts an Array (arr) of LatLngs from which it extracts each one as a\n     *  vertex; calls itself recursively to deal with nested Arrays.\n     */\n    coordsFromLatLngs = function (arr) {\n        var i, coords;\n\n        coords = [];\n        for (i = 0; i < arr.length; i += 1) {\n            if (Wkt.isArray(arr[i])) {\n                coords.push(coordsFromLatLngs(arr[i]));\n\n            } else {\n                coords.push({\n                    x: arr[i].lng,\n                    y: arr[i].lat\n                });\n            }\n        }\n\n        return coords;\n    };\n\n    // L.Marker ////////////////////////////////////////////////////////////////\n    if (obj.constructor === L.Marker || obj.constructor === L.marker) {\n        return {\n            type: 'point',\n            components: [{\n                x: obj.getLatLng().lng,\n                y: obj.getLatLng().lat\n            }]\n        };\n    }\n\n    // L.Rectangle /////////////////////////////////////////////////////////////\n    if (obj.constructor === L.Rectangle || obj.constructor === L.rectangle) {\n        tmp = obj.getBounds(); // L.LatLngBounds instance\n        return {\n            type: 'polygon',\n            isRectangle: true,\n            components: [\n                [\n                    { // NW corner\n                        x: tmp.getSouthWest().lng,\n                        y: tmp.getNorthEast().lat\n                    },\n                    { // NE corner\n                        x: tmp.getNorthEast().lng,\n                        y: tmp.getNorthEast().lat\n                    },\n                    { // SE corner\n                        x: tmp.getNorthEast().lng,\n                        y: tmp.getSouthWest().lat\n                    },\n                    { // SW corner\n                        x: tmp.getSouthWest().lng,\n                        y: tmp.getSouthWest().lat\n                    },\n                    { // NW corner (again, for closure)\n                        x: tmp.getSouthWest().lng,\n                        y: tmp.getNorthEast().lat\n                    }\n                ]\n            ]\n        };\n\n    }\n\n    // L.Polyline //////////////////////////////////////////////////////////////\n    if (obj.constructor === L.Polyline || obj.constructor === L.polyline) {\n        verts = [];\n        tmp = obj.getLatLngs();\n\n        if (!tmp[0].equals(tmp[tmp.length - 1])) {\n\n            for (i = 0; i < tmp.length; i += 1) {\n                verts.push({\n                    x: tmp[i].lng,\n                    y: tmp[i].lat\n                });\n            }\n\n            return {\n                type: 'linestring',\n                components: verts\n            };\n\n        }\n    }\n\n    // L.Polygon ///////////////////////////////////////////////////////////////\n\n    if (obj.constructor === L.Polygon || obj.constructor === L.polygon) {\n        rings = [];\n        verts = [];\n        tmp = obj.getLatLngs();\n\n        // First, we deal with the boundary points\n        for (i = 0; i < obj._latlngs.length; i += 1) {\n            verts.push({ // Add the first coordinate again for closure\n                x: tmp[i].lng,\n                y: tmp[i].lat\n            });\n        }\n\n        verts.push({ // Add the first coordinate again for closure\n            x: tmp[0].lng,\n            y: tmp[0].lat\n        });\n\n        rings.push(verts);\n\n        // Now, any holes\n        if (obj._holes && obj._holes.length > 0) {\n            // Reworked to support holes properly\n            verts = coordsFromLatLngs(obj._holes);\n            for (i=0; i < verts.length;i++) {\n                verts[i].push(verts[i][0]); // Copy the beginning coords again for closure\n                rings.push(verts[i]);\n            }\n        }\n\n        return {\n            type: 'polygon',\n            components: rings\n        };\n\n    }\n\n    // L.MultiPolyline /////////////////////////////////////////////////////////\n    // L.MultiPolygon //////////////////////////////////////////////////////////\n    // L.LayerGroup ////////////////////////////////////////////////////////////\n    // L.FeatureGroup //////////////////////////////////////////////////////////\n    if (obj.constructor === L.MultiPolyline || obj.constructor === L.MultiPolygon\n            || obj.constructor === L.LayerGroup || obj.constructor === L.FeatureGroup) {\n\n        features = [];\n        tmp = obj._layers;\n\n        for (attr in tmp) {\n            if (tmp.hasOwnProperty(attr)) {\n                if (tmp[attr].getLatLngs || tmp[attr].getLatLng) {\n                    // Recursively deconstruct each layer\n                    features.push(this.deconstruct(tmp[attr]));\n                }\n            }\n        }\n\n        return {\n\n            type: (function () {\n                switch (obj.constructor) {\n                case L.MultiPolyline:\n                    return 'multilinestring';\n                case L.MultiPolygon:\n                    return 'multipolygon';\n                case L.FeatureGroup:\n                    return (function () {\n                        var i, mpgon, mpline, mpoint;\n\n                        // Assume that all layers are of one type (any one type)\n                        mpgon = true;\n                        mpline = true;\n                        mpoint = true;\n\n                        for (i in obj._layers) {\n                            if (obj._layers.hasOwnProperty(i)) {\n                                if (obj._layers[i].constructor !== L.Marker) {\n                                    mpoint = false;\n                                }\n                                if (obj._layers[i].constructor !== L.Polyline) {\n                                    mpline = false;\n                                }\n                                if (obj._layers[i].constructor !== L.Polygon) {\n                                    mpgon = false;\n                                }\n                            }\n                        }\n\n                        if (mpoint) {\n                            return 'multipoint';\n                        }\n                        if (mpline) {\n                            return 'multilinestring';\n                        }\n                        if (mpgon) {\n                            return 'multipolygon';\n                        }\n                        return 'geometrycollection';\n\n                    }());\n                default:\n                    return 'geometrycollection';\n                }\n            }()),\n\n            components: (function () {\n                // Pluck the components from each Wkt\n                var i, comps;\n\n                comps = [];\n                for (i = 0; i < features.length; i += 1) {\n                    if (features[i].components) {\n                        comps.push(features[i].components);\n                    }\n                }\n\n                return comps;\n            }())\n\n        };\n\n    }\n\n    // L.Circle ////////////////////////////////////////////////////////////////\n    if (obj.constructor === L.Circle || obj.constructor === L.circle) {\n        console.log('Deconstruction of L.Circle objects is not yet supported');\n\n    } else {\n        console.log('The passed object does not have any recognizable properties.');\n    }\n\n};\n","/** @license\n *\n *  Copyright (C) 2012 K. Arthur Endsley (kaendsle@mtu.edu)\n *  Michigan Tech Research Institute (MTRI)\n *  3600 Green Court, Suite 100, Ann Arbor, MI, 48105\n *\n *  This program is free software: you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 3 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License\n *  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\n(function (root, factory) {\n\n    if (typeof define === \"function\" && define.amd) {\n        // AMD (+ global for extensions)\n        define(function () {\n            return factory();\n        });\n    } else if (typeof module !== 'undefined' && typeof exports === \"object\") {\n        // CommonJS\n        module.exports = factory();\n    } else {\n        // Browser\n        root.Wkt = factory();\n    }\n}(this, function () {\n\n\n    var beginsWith, endsWith, root, Wkt;\n\n    // Establish the root object, window in the browser, or exports on the server\n    root = this;\n\n    /**\n     * @desc The Wkt namespace.\n     * @property    {String}    delimiter   - The default delimiter for separating components of atomic geometry (coordinates)\n     * @namespace\n     * @global\n     */\n    Wkt = function (obj) {\n        if (obj instanceof Wkt) return obj;\n        if (!(this instanceof Wkt)) return new Wkt(obj);\n        this._wrapped = obj;\n    };\n\n\n\n    /**\n     * Returns true if the substring is found at the beginning of the string.\n     * @param   str {String}    The String to search\n     * @param   sub {String}    The substring of interest\n     * @return      {Boolean}\n     * @private\n     */\n    beginsWith = function (str, sub) {\n        return str.substring(0, sub.length) === sub;\n    };\n\n    /**\n     * Returns true if the substring is found at the end of the string.\n     * @param   str {String}    The String to search\n     * @param   sub {String}    The substring of interest\n     * @return      {Boolean}\n     * @private\n     */\n    endsWith = function (str, sub) {\n        return str.substring(str.length - sub.length) === sub;\n    };\n\n    /**\n     * The default delimiter for separating components of atomic geometry (coordinates)\n     * @ignore\n     */\n    Wkt.delimiter = ' ';\n\n    /**\n     * Determines whether or not the passed Object is an Array.\n     * @param   obj {Object}    The Object in question\n     * @return      {Boolean}\n     * @member Wkt.isArray\n     * @method\n     */\n    Wkt.isArray = function (obj) {\n        return !!(obj && obj.constructor === Array);\n    };\n\n    /**\n     * Removes given character String(s) from a String.\n     * @param   str {String}    The String to search\n     * @param   sub {String}    The String character(s) to trim\n     * @return      {String}    The trimmed string\n     * @member Wkt.trim\n     * @method\n     */\n    Wkt.trim = function (str, sub) {\n        sub = sub || ' '; // Defaults to trimming spaces\n        // Trim beginning spaces\n        while (beginsWith(str, sub)) {\n            str = str.substring(1);\n        }\n        // Trim ending spaces\n        while (endsWith(str, sub)) {\n            str = str.substring(0, str.length - 1);\n        }\n        return str;\n    };\n\n    /**\n     * An object for reading WKT strings and writing geographic features\n     * @constructor this.Wkt.Wkt\n     * @param   initializer {String}    An optional WKT string for immediate read\n     * @property            {Array}     components      - Holder for atomic geometry objects (internal representation of geometric components)\n     * @property            {String}    delimiter       - The default delimiter for separating components of atomic geometry (coordinates)\n     * @property            {Object}    regExes         - Some regular expressions copied from OpenLayers.Format.WKT.js\n     * @property            {String}    type            - The Well-Known Text name (e.g. 'point') of the geometry\n     * @property            {Boolean}   wrapVerticies   - True to wrap vertices in MULTIPOINT geometries; If true: MULTIPOINT((30 10),(10 30),(40 40)); If false: MULTIPOINT(30 10,10 30,40 40)\n     * @return              {this.Wkt.Wkt}\n     * @memberof Wkt\n     */\n    Wkt.Wkt = function (initializer) {\n\n        /**\n         * The default delimiter between X and Y coordinates.\n         * @ignore\n         */\n        this.delimiter = Wkt.delimiter || ' ';\n\n        /**\n         * Configuration parameter for controlling how Wicket seralizes\n         * MULTIPOINT strings. Examples; both are valid WKT:\n         * If true: MULTIPOINT((30 10),(10 30),(40 40))\n         * If false: MULTIPOINT(30 10,10 30,40 40)\n         * @ignore\n         */\n        this.wrapVertices = true;\n\n        /**\n         * Some regular expressions copied from OpenLayers.Format.WKT.js\n         * @ignore\n         */\n        this.regExes = {\n            'typeStr': /^\\s*(\\w+)\\s*\\(\\s*(.*)\\s*\\)\\s*$/,\n            'spaces': /\\s+|\\+/, // Matches the '+' or the empty space\n            'numeric': /-*\\d+(\\.*\\d+)?/,\n            'comma': /\\s*,\\s*/,\n            'parenComma': /\\)\\s*,\\s*\\(/,\n            'coord': /-*\\d+\\.*\\d+ -*\\d+\\.*\\d+/, // e.g. \"24 -14\"\n            'doubleParenComma': /\\)\\s*\\)\\s*,\\s*\\(\\s*\\(/,\n            'trimParens': /^\\s*\\(?(.*?)\\)?\\s*$/,\n            'ogcTypes': /^(multi)?(point|line|polygon|box)?(string)?$/i, // Captures e.g. \"Multi\",\"Line\",\"String\"\n            'crudeJson': /^{.*\"(type|coordinates|geometries|features)\":.*}$/ // Attempts to recognize JSON strings\n        };\n\n        /**\n         * The internal representation of geometry--the \"components\" of geometry.\n         * @ignore\n         */\n        this.components = undefined;\n\n        // An initial WKT string may be provided\n        if (initializer && typeof initializer === 'string') {\n            this.read(initializer);\n        } else if (initializer && typeof initializer !== undefined) {\n            this.fromObject(initializer);\n        }\n\n    };\n\n\n\n    /**\n     * Returns true if the internal geometry is a collection of geometries.\n     * @return  {Boolean}   Returns true when it is a collection\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.isCollection = function () {\n        switch (this.type.slice(0, 5)) {\n            case 'multi':\n                // Trivial; any multi-geometry is a collection\n                return true;\n            case 'polyg':\n                // Polygons with holes are \"collections\" of rings\n                return true;\n            default:\n                // Any other geometry is not a collection\n                return false;\n        }\n    };\n\n    /**\n     * Compares two x,y coordinates for equality.\n     * @param   a   {Object}    An object with x and y properties\n     * @param   b   {Object}    An object with x and y properties\n     * @return      {Boolean}\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.sameCoords = function (a, b) {\n        return (a.x === b.x && a.y === b.y);\n    };\n\n    /**\n     * Sets internal geometry (components) from framework geometry (e.g.\n     * Google Polygon objects or google.maps.Polygon).\n     * @param   obj {Object}    The framework-dependent geometry representation\n     * @return      {this.Wkt.Wkt}   The object itself\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.fromObject = function (obj) {\n        var result;\n\n        if (obj.hasOwnProperty('type') && obj.hasOwnProperty('coordinates')) {\n            result = this.fromJson(obj);\n        } else {\n            result = this.deconstruct.call(this, obj);\n        }\n\n        this.components = result.components;\n        this.isRectangle = result.isRectangle || false;\n        this.type = result.type;\n        return this;\n    };\n\n    /**\n     * Creates external geometry objects based on a plug-in framework's\n     * construction methods and available geometry classes.\n     * @param   config  {Object}    An optional framework-dependent properties specification\n     * @return          {Object}    The framework-dependent geometry representation\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.toObject = function (config) {\n        var obj = this.construct[this.type].call(this, config);\n        // Don't assign the \"properties\" property to an Array\n        if (typeof obj === 'object' && !Wkt.isArray(obj)) {\n            obj.properties = this.properties;\n        }\n        return obj;\n    };\n\n    /**\n     * Returns the WKT string representation; the same as the write() method.\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.toString = function (config) {\n        return this.write();\n    };\n\n    /**\n     * Parses a JSON representation as an Object.\n     * @param\tobj\t{Object}\tAn Object with the GeoJSON schema\n     * @return\t{this.Wkt.Wkt}\tThe object itself\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.fromJson = function (obj) {\n        var i, j, k, coords, iring, oring;\n\n        this.type = obj.type.toLowerCase();\n        this.components = [];\n        if (obj.hasOwnProperty('geometry')) { //Feature\n            this.fromJson(obj.geometry);\n            this.properties = obj.properties;\n            return this;\n        }\n        coords = obj.coordinates;\n\n        if (!Wkt.isArray(coords[0])) { // Point\n            this.components.push({\n                x: coords[0],\n                y: coords[1]\n            });\n\n        } else {\n\n            for (i in coords) {\n                if (coords.hasOwnProperty(i)) {\n\n                    if (!Wkt.isArray(coords[i][0])) { // LineString\n\n                        if (this.type === 'multipoint') { // MultiPoint\n                            this.components.push([{\n                                x: coords[i][0],\n                                y: coords[i][1]\n                            }]);\n\n                        } else {\n                            this.components.push({\n                                x: coords[i][0],\n                                y: coords[i][1]\n                            });\n\n                        }\n\n                    } else {\n\n                        oring = [];\n                        for (j in coords[i]) {\n                            if (coords[i].hasOwnProperty(j)) {\n\n                                if (!Wkt.isArray(coords[i][j][0])) {\n                                    oring.push({\n                                        x: coords[i][j][0],\n                                        y: coords[i][j][1]\n                                    });\n\n                                } else {\n\n                                    iring = [];\n                                    for (k in coords[i][j]) {\n                                        if (coords[i][j].hasOwnProperty(k)) {\n\n                                            iring.push({\n                                                x: coords[i][j][k][0],\n                                                y: coords[i][j][k][1]\n                                            });\n\n                                        }\n                                    }\n\n                                    oring.push(iring);\n\n                                }\n\n                            }\n                        }\n\n                        this.components.push(oring);\n                    }\n                }\n            }\n\n        }\n\n        return this;\n    };\n\n    /**\n     * Creates a JSON representation, with the GeoJSON schema, of the geometry.\n     * @return    {Object}    The corresponding GeoJSON representation\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.toJson = function () {\n        var cs, json, i, j, k, ring, rings;\n\n        cs = this.components;\n        json = {\n            coordinates: [],\n            type: (function () {\n                var i, type, s;\n\n                type = this.regExes.ogcTypes.exec(this.type).slice(1);\n                s = [];\n\n                for (i in type) {\n                    if (type.hasOwnProperty(i)) {\n                        if (type[i] !== undefined) {\n                            s.push(type[i].toLowerCase().slice(0, 1).toUpperCase() + type[i].toLowerCase().slice(1));\n                        }\n                    }\n                }\n\n                return s;\n            }.call(this)).join('')\n        }\n\n        // Wkt BOX type gets a special bbox property in GeoJSON\n        if (this.type.toLowerCase() === 'box') {\n            json.type = 'Polygon';\n            json.bbox = [];\n\n            for (i in cs) {\n                if (cs.hasOwnProperty(i)) {\n                    json.bbox = json.bbox.concat([cs[i].x, cs[i].y]);\n                }\n            }\n\n            json.coordinates = [\n                [\n                    [cs[0].x, cs[0].y],\n                    [cs[0].x, cs[1].y],\n                    [cs[1].x, cs[1].y],\n                    [cs[1].x, cs[0].y],\n                    [cs[0].x, cs[0].y]\n                ]\n            ];\n\n            return json;\n        }\n\n        // For the coordinates of most simple features\n        for (i in cs) {\n            if (cs.hasOwnProperty(i)) {\n\n                // For those nested structures\n                if (Wkt.isArray(cs[i])) {\n                    rings = [];\n\n                    for (j in cs[i]) {\n                        if (cs[i].hasOwnProperty(j)) {\n\n                            if (Wkt.isArray(cs[i][j])) { // MULTIPOLYGONS\n                                ring = [];\n\n                                for (k in cs[i][j]) {\n                                    if (cs[i][j].hasOwnProperty(k)) {\n                                        ring.push([cs[i][j][k].x, cs[i][j][k].y]);\n                                    }\n                                }\n\n                                rings.push(ring);\n\n                            } else { // POLYGONS and MULTILINESTRINGS\n\n                                if (cs[i].length > 1) {\n                                    rings.push([cs[i][j].x, cs[i][j].y]);\n\n                                } else { // MULTIPOINTS\n                                    rings = rings.concat([cs[i][j].x, cs[i][j].y]);\n                                }\n                            }\n                        }\n                    }\n\n                    json.coordinates.push(rings);\n\n                } else {\n                    if (cs.length > 1) { // For LINESTRING type\n                        json.coordinates.push([cs[i].x, cs[i].y]);\n\n                    } else { // For POINT type\n                        json.coordinates = json.coordinates.concat([cs[i].x, cs[i].y]);\n                    }\n                }\n\n            }\n        }\n\n        return json;\n    };\n\n    /**\n     * Absorbs the geometry of another this.Wkt.Wkt instance, merging it with its own,\n     * creating a collection (MULTI-geometry) based on their types, which must agree.\n     * For example, creates a MULTIPOLYGON from a POLYGON type merged with another\n     * POLYGON type, or adds a POLYGON instance to a MULTIPOLYGON instance.\n     * @param   wkt {String}    A Wkt.Wkt object\n     * @return\t{this.Wkt.Wkt}\tThe object itself\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.merge = function (wkt) {\n        var prefix = this.type.slice(0, 5);\n\n        if (this.type !== wkt.type) {\n            if (this.type.slice(5, this.type.length) !== wkt.type) {\n                throw TypeError('The input geometry types must agree or the calling this.Wkt.Wkt instance must be a multigeometry of the other');\n            }\n        }\n\n        switch (prefix) {\n\n            case 'point':\n                this.components = [this.components.concat(wkt.components)];\n                break;\n\n            case 'multi':\n                this.components = this.components.concat((wkt.type.slice(0, 5) === 'multi') ? wkt.components : [wkt.components]);\n                break;\n\n            default:\n                this.components = [\n                    this.components,\n                    wkt.components\n                ];\n                break;\n\n        }\n\n        if (prefix !== 'multi') {\n            this.type = 'multi' + this.type;\n        }\n        return this;\n    };\n\n    /**\n     * Reads a WKT string, validating and incorporating it.\n     * @param   str {String}    A WKT or GeoJSON string\n     * @return\t{this.Wkt.Wkt}\tThe object itself\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.read = function (str) {\n        var matches;\n        matches = this.regExes.typeStr.exec(str);\n        if (matches) {\n            this.type = matches[1].toLowerCase();\n            this.base = matches[2];\n            if (this.ingest[this.type]) {\n                this.components = this.ingest[this.type].apply(this, [this.base]);\n            }\n\n        } else {\n            if (this.regExes.crudeJson.test(str)) {\n                if (typeof JSON === 'object' && typeof JSON.parse === 'function') {\n                    this.fromJson(JSON.parse(str));\n\n                } else {\n                    console.log('JSON.parse() is not available; cannot parse GeoJSON strings');\n                    throw {\n                        name: 'JSONError',\n                        message: 'JSON.parse() is not available; cannot parse GeoJSON strings'\n                    };\n                }\n\n            } else {\n                console.log('Invalid WKT string provided to read()');\n                throw {\n                    name: 'WKTError',\n                    message: 'Invalid WKT string provided to read()'\n                };\n            }\n        }\n\n        return this;\n    }; // eo readWkt\n\n    /**\n     * Writes a WKT string.\n     * @param   components  {Array}     An Array of internal geometry objects\n     * @return              {String}    The corresponding WKT representation\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.write = function (components) {\n        var i, pieces, data;\n\n        components = components || this.components;\n\n        pieces = [];\n\n        pieces.push(this.type.toUpperCase() + '(');\n\n        for (i = 0; i < components.length; i += 1) {\n            if (this.isCollection() && i > 0) {\n                pieces.push(',');\n            }\n\n            // There should be an extract function for the named type\n            if (!this.extract[this.type]) {\n                return null;\n            }\n\n            data = this.extract[this.type].apply(this, [components[i]]);\n            if (this.isCollection() && this.type !== 'multipoint') {\n                pieces.push('(' + data + ')');\n\n            } else {\n                pieces.push(data);\n\n                // If not at the end of the components, add a comma\n                if (i !== (components.length - 1) && this.type !== 'multipoint') {\n                    pieces.push(',');\n                }\n\n            }\n        }\n\n        pieces.push(')');\n\n        return pieces.join('');\n    };\n\n    /**\n     * This object contains functions as property names that extract WKT\n     * strings from the internal representation.\n     * @memberof this.Wkt.Wkt\n     * @namespace this.Wkt.Wkt.extract\n     * @instance\n     */\n    Wkt.Wkt.prototype.extract = {\n        /**\n         * Return a WKT string representing atomic (point) geometry\n         * @param   point   {Object}    An object with x and y properties\n         * @return          {String}    The WKT representation\n         * @memberof this.Wkt.Wkt.extract\n         * @instance\n         */\n        point: function (point) {\n            return String(point.x) + this.delimiter + String(point.y);\n        },\n\n        /**\n         * Return a WKT string representing multiple atoms (points)\n         * @param   multipoint  {Array}     Multiple x-and-y objects\n         * @return              {String}    The WKT representation\n         * @memberof this.Wkt.Wkt.extract\n         * @instance\n         */\n        multipoint: function (multipoint) {\n            var i, parts = [],\n                s;\n\n            for (i = 0; i < multipoint.length; i += 1) {\n                s = this.extract.point.apply(this, [multipoint[i]]);\n\n                if (this.wrapVertices) {\n                    s = '(' + s + ')';\n                }\n\n                parts.push(s);\n            }\n\n            return parts.join(',');\n        },\n\n        /**\n         * Return a WKT string representing a chain (linestring) of atoms\n         * @param   linestring  {Array}     Multiple x-and-y objects\n         * @return              {String}    The WKT representation\n         * @memberof this.Wkt.Wkt.extract\n         * @instance\n         */\n        linestring: function (linestring) {\n            // Extraction of linestrings is the same as for points\n            return this.extract.point.apply(this, [linestring]);\n        },\n\n        /**\n         * Return a WKT string representing multiple chains (multilinestring) of atoms\n         * @param   multilinestring {Array}     Multiple of multiple x-and-y objects\n         * @return                  {String}    The WKT representation\n         * @memberof this.Wkt.Wkt.extract\n         * @instance\n         */\n        multilinestring: function (multilinestring) {\n            var i, parts = [];\n\n            if (multilinestring.length) {\n                for (i = 0; i < multilinestring.length; i += 1) {\n                    parts.push(this.extract.linestring.apply(this, [multilinestring[i]]));\n                }\n            } else {\n                parts.push(this.extract.point.apply(this, [multilinestring]));\n            }\n\n            return parts.join(',');\n        },\n\n        /**\n         * Return a WKT string representing multiple atoms in closed series (polygon)\n         * @param   polygon {Array}     Collection of ordered x-and-y objects\n         * @return          {String}    The WKT representation\n         * @memberof this.Wkt.Wkt.extract\n         * @instance\n         */\n        polygon: function (polygon) {\n            // Extraction of polygons is the same as for multilinestrings\n            return this.extract.multilinestring.apply(this, [polygon]);\n        },\n\n        /**\n         * Return a WKT string representing multiple closed series (multipolygons) of multiple atoms\n         * @param   multipolygon    {Array}     Collection of ordered x-and-y objects\n         * @return                  {String}    The WKT representation\n         * @memberof this.Wkt.Wkt.extract\n         * @instance\n         */\n        multipolygon: function (multipolygon) {\n            var i, parts = [];\n            for (i = 0; i < multipolygon.length; i += 1) {\n                parts.push('(' + this.extract.polygon.apply(this, [multipolygon[i]]) + ')');\n            }\n            return parts.join(',');\n        },\n\n        /**\n         * Return a WKT string representing a 2DBox\n         * @param   multipolygon    {Array}     Collection of ordered x-and-y objects\n         * @return                  {String}    The WKT representation\n         * @memberof this.Wkt.Wkt.extract\n         * @instance\n         */\n        box: function (box) {\n            return this.extract.linestring.apply(this, [box]);\n        },\n\n        geometrycollection: function (str) {\n            console.log('The geometrycollection WKT type is not yet supported.');\n        }\n    };\n\n    /**\n     * This object contains functions as property names that ingest WKT\n     * strings into the internal representation.\n     * @memberof this.Wkt.Wkt\n     * @namespace this.Wkt.Wkt.ingest\n     * @instance\n     */\n    Wkt.Wkt.prototype.ingest = {\n\n        /**\n         * Return point feature given a point WKT fragment.\n         * @param   str {String}    A WKT fragment representing the point\n         * @memberof this.Wkt.Wkt.ingest\n         * @instance\n         */\n        point: function (str) {\n            var coords = Wkt.trim(str).split(this.regExes.spaces);\n            // In case a parenthetical group of coordinates is passed...\n            return [{ // ...Search for numeric substrings\n                x: parseFloat(this.regExes.numeric.exec(coords[0])[0]),\n                y: parseFloat(this.regExes.numeric.exec(coords[1])[0])\n            }];\n        },\n\n        /**\n         * Return a multipoint feature given a multipoint WKT fragment.\n         * @param   str {String}    A WKT fragment representing the multipoint\n         * @memberof this.Wkt.Wkt.ingest\n         * @instance\n         */\n        multipoint: function (str) {\n            var i, components, points;\n            components = [];\n            points = Wkt.trim(str).split(this.regExes.comma);\n            for (i = 0; i < points.length; i += 1) {\n                components.push(this.ingest.point.apply(this, [points[i]]));\n            }\n            return components;\n        },\n\n        /**\n         * Return a linestring feature given a linestring WKT fragment.\n         * @param   str {String}    A WKT fragment representing the linestring\n         * @memberof this.Wkt.Wkt.ingest\n         * @instance\n         */\n        linestring: function (str) {\n            var i, multipoints, components;\n\n            // In our x-and-y representation of components, parsing\n            //  multipoints is the same as parsing linestrings\n            multipoints = this.ingest.multipoint.apply(this, [str]);\n\n            // However, the points need to be joined\n            components = [];\n            for (i = 0; i < multipoints.length; i += 1) {\n                components = components.concat(multipoints[i]);\n            }\n            return components;\n        },\n\n        /**\n         * Return a multilinestring feature given a multilinestring WKT fragment.\n         * @param   str {String}    A WKT fragment representing the multilinestring\n         * @memberof this.Wkt.Wkt.ingest\n         * @instance\n         */\n        multilinestring: function (str) {\n            var i, components, line, lines;\n            components = [];\n\n            lines = Wkt.trim(str).split(this.regExes.doubleParenComma);\n            if (lines.length === 1) { // If that didn't work...\n                lines = Wkt.trim(str).split(this.regExes.parenComma);\n            }\n\n            for (i = 0; i < lines.length; i += 1) {\n                line = lines[i].replace(this.regExes.trimParens, '$1');\n                components.push(this.ingest.linestring.apply(this, [line]));\n            }\n\n            return components;\n        },\n\n        /**\n         * Return a polygon feature given a polygon WKT fragment.\n         * @param   str {String}    A WKT fragment representing the polygon\n         * @memberof this.Wkt.Wkt.ingest\n         * @instance\n         */\n        polygon: function (str) {\n            var i, j, components, subcomponents, ring, rings;\n            rings = Wkt.trim(str).split(this.regExes.parenComma);\n            components = []; // Holds one or more rings\n            for (i = 0; i < rings.length; i += 1) {\n                ring = rings[i].replace(this.regExes.trimParens, '$1').split(this.regExes.comma);\n                subcomponents = []; // Holds the outer ring and any inner rings (holes)\n                for (j = 0; j < ring.length; j += 1) {\n                    // Split on the empty space or '+' character (between coordinates)\n                    var split = ring[j].split(this.regExes.spaces);\n                    if (split.length > 2) {\n                        //remove the elements which are blanks\n                        split = split.filter(function (n) {\n                            return n != \"\"\n                        });\n                    }\n                    if (split.length === 2) {\n                        var x_cord = split[0];\n                        var y_cord = split[1];\n\n                        //now push\n                        subcomponents.push({\n                            x: parseFloat(x_cord),\n                            y: parseFloat(y_cord)\n                        });\n                    }\n                }\n                components.push(subcomponents);\n            }\n            return components;\n        },\n\n        /**\n         * Return box vertices (which would become the Rectangle bounds) given a Box WKT fragment.\n         * @param   str {String}    A WKT fragment representing the box\n         * @memberof this.Wkt.Wkt.ingest\n         * @instance\n         */\n        box: function (str) {\n            var i, multipoints, components;\n\n            // In our x-and-y representation of components, parsing\n            //  multipoints is the same as parsing linestrings\n            multipoints = this.ingest.multipoint.apply(this, [str]);\n\n            // However, the points need to be joined\n            components = [];\n            for (i = 0; i < multipoints.length; i += 1) {\n                components = components.concat(multipoints[i]);\n            }\n\n            return components;\n        },\n\n        /**\n         * Return a multipolygon feature given a multipolygon WKT fragment.\n         * @param   str {String}    A WKT fragment representing the multipolygon\n         * @memberof this.Wkt.Wkt.ingest\n         * @instance\n         */\n        multipolygon: function (str) {\n            var i, components, polygon, polygons;\n            components = [];\n            polygons = Wkt.trim(str).split(this.regExes.doubleParenComma);\n            for (i = 0; i < polygons.length; i += 1) {\n                polygon = polygons[i].replace(this.regExes.trimParens, '$1');\n                components.push(this.ingest.polygon.apply(this, [polygon]));\n            }\n            return components;\n        },\n\n        /**\n         * Return an array of features given a geometrycollection WKT fragment.\n         * @param   str {String}    A WKT fragment representing the geometry collection\n         * @memberof this.Wkt.Wkt.ingest\n         * @instance\n         */\n        geometrycollection: function (str) {\n            console.log('The geometrycollection WKT type is not yet supported.');\n        }\n\n    }; // eo ingest\n\n    return Wkt;\n}));\n","module.exports={\n  \"_from\": \"yasgui-utils@https://registry.npmjs.org/yasgui-utils/-/yasgui-utils-1.6.7.tgz\",\n  \"_id\": \"yasgui-utils@1.6.7\",\n  \"_inBundle\": false,\n  \"_integrity\": \"sha1-K8/FoxVojeOuYFeIPZrjQrIF8mc=\",\n  \"_location\": \"/yasgui-utils\",\n  \"_phantomChildren\": {},\n  \"_requested\": {\n    \"type\": \"remote\",\n    \"raw\": \"yasgui-utils@https://registry.npmjs.org/yasgui-utils/-/yasgui-utils-1.6.7.tgz\",\n    \"name\": \"yasgui-utils\",\n    \"escapedName\": \"yasgui-utils\",\n    \"rawSpec\": \"https://registry.npmjs.org/yasgui-utils/-/yasgui-utils-1.6.7.tgz\",\n    \"saveSpec\": \"https://registry.npmjs.org/yasgui-utils/-/yasgui-utils-1.6.7.tgz\",\n    \"fetchSpec\": \"https://registry.npmjs.org/yasgui-utils/-/yasgui-utils-1.6.7.tgz\"\n  },\n  \"_requiredBy\": [\n    \"/\",\n    \"/yasgui-yasqe\"\n  ],\n  \"_resolved\": \"https://registry.npmjs.org/yasgui-utils/-/yasgui-utils-1.6.7.tgz\",\n  \"_spec\": \"yasgui-utils@https://registry.npmjs.org/yasgui-utils/-/yasgui-utils-1.6.7.tgz\",\n  \"_where\": \"/home/lrd900/yasgui/yasr\",\n  \"author\": {\n    \"name\": \"Laurens Rietveld\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/YASGUI/Utils/issues\"\n  },\n  \"bundleDependencies\": false,\n  \"dependencies\": {\n    \"store\": \"^2.0.4\"\n  },\n  \"deprecated\": false,\n  \"description\": \"Utils for YASGUI libs\",\n  \"homepage\": \"https://github.com/YASGUI/Utils\",\n  \"licenses\": [\n    {\n      \"type\": \"MIT\",\n      \"url\": \"http://yasgui.github.io/license.txt\"\n    }\n  ],\n  \"main\": \"src/main.js\",\n  \"maintainers\": [\n    {\n      \"name\": \"Laurens Rietveld\",\n      \"email\": \"laurens.rietveld@gmail.com\",\n      \"url\": \"http://laurensrietveld.nl\"\n    }\n  ],\n  \"name\": \"yasgui-utils\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/YASGUI/Utils.git\"\n  },\n  \"version\": \"1.6.7\"\n}\n","window.console = window.console || {\"log\":function(){}};//make sure any console statements don't break IE\nmodule.exports = {\n\tstorage: require(\"./storage.js\"),\n\tsvg: require(\"./svg.js\"),\n\tversion: {\n\t\t\"yasgui-utils\" : require(\"../package.json\").version,\n\t},\n\tnestedExists : function(obj) {\n\t\tvar args = Array.prototype.slice.call(arguments, 1);\n\n\t\tfor (var i = 0; i < args.length; i++) {\n\t\t\tif (!obj || !obj.hasOwnProperty(args[i])) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tobj = obj[args[i]];\n\t\t}\n\t\treturn true;\n\t}\n};\n","var store = require(\"store\");\nvar times = {\n  day: function() {\n    return 1000 * 3600 * 24; //millis to day\n  },\n  month: function() {\n    times.day() * 30;\n  },\n  year: function() {\n    times.month() * 12;\n  }\n};\nfunction isQuotaExceeded(e) {\n  var quotaExceeded = false;\n  if (e) {\n    if (e.code) {\n      switch (e.code) {\n        case 22:\n          quotaExceeded = true;\n          break;\n        case 1014:\n          // Firefox\n          if (e.name === \"NS_ERROR_DOM_QUOTA_REACHED\") {\n            quotaExceeded = true;\n          }\n          break;\n      }\n    } else if (e.number === -2147024882) {\n      // Internet Explorer 8\n      quotaExceeded = true;\n    }\n  }\n  return quotaExceeded;\n}\nvar root = (module.exports = {\n  set: function(key, val, exp, onQuotaExceeded) {\n    if (!store.enabled) return; //this is probably in private mode. Don't run, as we might get Js errors\n    if (key && val !== undefined) {\n      if (typeof exp == \"string\") {\n        exp = times[exp]();\n      }\n      //try to store string for dom objects (e.g. XML result). Otherwise, we might get a circular reference error when stringifying this\n      if (val.documentElement) val = new XMLSerializer().serializeToString(val.documentElement);\n      try {\n        store.set(key, {\n          val: val,\n          exp: exp,\n          time: new Date().getTime()\n        });\n      } catch (e) {\n        e.quotaExceeded = isQuotaExceeded(e);\n        if (e.quotaExceeded && onQuotaExceeded) {\n          onQuotaExceeded(e);\n        } else {\n          throw e;\n        }\n      }\n    }\n  },\n  remove: function(key) {\n    if (!store.enabled) return; //this is probably in private mode. Don't run, as we might get Js errors\n    if (key) store.remove(key);\n  },\n  removeAll: function(filter) {\n    if (!store.enabled) return; //this is probably in private mode. Don't run, as we might get Js errors\n    if (!filter) {\n      store.clearAll();\n    } else if (typeof filter === \"function\") {\n      store.each(function(value, key) {\n        if (filter(key, value)) root.remove(key);\n      });\n    }\n  },\n  get: function(key) {\n    if (!store.enabled) return null; //this is probably in private mode. Don't run, as we might get Js errors\n    if (key) {\n      var info = store.get(key);\n      if (!info) {\n        return null;\n      }\n      if (info.exp && new Date().getTime() - info.time > info.exp) {\n        return null;\n      }\n      return info.val;\n    } else {\n      return null;\n    }\n  }\n});\n","module.exports = {\n\tdraw: function(parent, svgString) {\n\t\tif (!parent) return;\n\t\tvar el = module.exports.getElement(svgString);\n\t\tif (el) {\n\t\t\tif (parent.append) {\n\t\t\t\tparent.append(el);\n\t\t\t} else {\n\t\t\t\t//regular dom doc\n\t\t\t\tparent.appendChild(el);\n\t\t\t}\n\t\t}\n\t},\n\tgetElement: function(svgString) {\n\t\tif (svgString && svgString.indexOf(\"<svg\") == 0) {\n\t\t\t//no style passed via config. guess own styles\n\t\t\tvar parser = new DOMParser();\n\t\t\tvar dom = parser.parseFromString(svgString, \"text/xml\");\n\t\t\tvar svg = dom.documentElement;\n\t\t\t\n\t\t\tvar svgContainer = document.createElement(\"div\");\n\t\t\tsvgContainer.className = 'svgImg';\n\t\t\tsvgContainer.appendChild(svg);\n\t\t\treturn svgContainer;\n\t\t}\n\t\treturn false;\n\t}\n};","module.exports={\n  \"name\": \"yasgui-yasr\",\n  \"description\": \"Yet Another SPARQL Resultset GUI\",\n  \"version\": \"2.11.9\",\n  \"main\": \"src/main.js\",\n  \"license\": \"MIT\",\n  \"author\": \"Laurens Rietveld\",\n  \"homepage\": \"http://yasr.yasgui.org\",\n  \"devDependencies\": {\n    \"bootstrap-sass\": \"^3.3.7\",\n    \"browserify\": \"^13.1.0\",\n    \"browserify-transform-tools\": \"^1.6.0\",\n    \"exorcist\": \"^0.4.0\",\n    \"gulp\": \"^3.9.1\",\n    \"gulp-autoprefixer\": \"^3.1.0\",\n    \"gulp-bump\": \"^2.2.0\",\n    \"gulp-clean-css\": \"^2.0.12\",\n    \"gulp-concat\": \"^2.6.0\",\n    \"gulp-connect\": \"^4.2.0\",\n    \"gulp-cssimport\": \"^3.1.0\",\n    \"gulp-delete-lines\": \"0.0.7\",\n    \"gulp-embedlr\": \"^0.5.2\",\n    \"gulp-filter\": \"^4.0.0\",\n    \"gulp-git\": \"^2.4.1\",\n    \"gulp-html-replace\": \"^1.6.1\",\n    \"gulp-jsvalidate\": \"^2.1.0\",\n    \"gulp-livereload\": \"^3.8.1\",\n    \"gulp-minify-css\": \"1.2.4\",\n    \"gulp-notify\": \"^2.2.0\",\n    \"gulp-rename\": \"^1.2.2\",\n    \"gulp-sass\": \"^2.3.2\",\n    \"gulp-sourcemaps\": \"^1.6.0\",\n    \"gulp-streamify\": \"1.0.2\",\n    \"gulp-tag-version\": \"^1.3.0\",\n    \"gulp-uglify\": \"^1.5.4\",\n    \"node-sass\": \"^3.8.0\",\n    \"require-dir\": \"^0.3.2\",\n    \"run-sequence\": \"^1.2.2\",\n    \"vinyl-buffer\": \"^1.0.0\",\n    \"vinyl-source-stream\": \"~1.1.0\",\n    \"vinyl-transform\": \"1.0.0\",\n    \"watchify\": \"^3.7.0\",\n    \"yasgui-yasqe\": \"^2.10.1\"\n  },\n  \"bugs\": \"https://github.com/YASGUI/YASR/issues/\",\n  \"keywords\": [\n    \"JavaScript\",\n    \"SPARQL\",\n    \"Editor\",\n    \"Semantic Web\",\n    \"Linked Data\"\n  ],\n  \"scripts\": {\n    \"dev\": \"gulp serve\",\n    \"build\": \"gulp\",\n    \"patch\": \"gulp patch\",\n    \"minor\": \"gulp minor\",\n    \"major\": \"gulp major\"\n  },\n  \"maintainers\": [\n    {\n      \"name\": \"Laurens Rietveld\",\n      \"email\": \"laurens.rietveld@gmail.com\",\n      \"web\": \"http://laurensrietveld.nl\"\n    }\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/YASGUI/YASR.git\"\n  },\n  \"dependencies\": {\n    \"browserify-shim\": \"^3.8.12\",\n    \"codemirror\": \"^5.17.0\",\n    \"color\": \"^1.0.3\",\n    \"d3\": \"^4.1.1\",\n    \"datatables.net\": \"^1.10.15\",\n    \"datatables.net-dt\": \"^1.10.15\",\n    \"jquery\": \"^2.2.4\",\n    \"jquery-ui\": \"1.10.5\",\n    \"leaflet\": \"1.0.3\",\n    \"lodash\": \"^4.16.1\",\n    \"pivottable\": \"^2.1.0\",\n    \"proj4\": \"^2.4.3\",\n    \"proj4leaflet\": \"^1.0.1\",\n    \"wicket\": \"https://github.com/arthur-e/Wicket.git\",\n    \"yasgui-utils\": \"^1.6.7\"\n  },\n  \"browserify-shim\": {\n    \"google\": \"global:google\"\n  },\n  \"browserify\": {\n    \"transform\": [\n      \"browserify-shim\"\n    ]\n  },\n  \"optionalShim\": {\n    \"codemirror\": {\n      \"require\": \"codemirror\",\n      \"global\": \"CodeMirror\"\n    },\n    \"jquery\": {\n      \"require\": \"jquery\",\n      \"global\": \"jQuery\"\n    },\n    \"../../lib/codemirror\": {\n      \"require\": \"codemirror\",\n      \"global\": \"CodeMirror\"\n    },\n    \"datatables\": {\n      \"require\": \"datatables\",\n      \"global\": \"jQuery\"\n    },\n    \"d3\": {\n      \"require\": \"d3\",\n      \"global\": \"d3\"\n    },\n    \"jquery-ui/sortable\": {\n      \"require\": \"jquery-ui/sortable\",\n      \"global\": \"jQuery\"\n    },\n    \"pivottable\": {\n      \"require\": \"pivottable\",\n      \"global\": \"jQuery\"\n    }\n  }\n}\n","\"use strict\";\nmodule.exports = function(result) {\n  var quote = '\"';\n  var delimiter = \",\";\n  var lineBreak = \"\\n\";\n\n  var variables = result.head.vars;\n\n  var querySolutions = result.results.bindings;\n\n  var createHeader = function() {\n    for (var i = 0; i < variables.length; i++) {\n      addValueToString(variables[i]);\n    }\n    csvString += lineBreak;\n  };\n\n  var createBody = function() {\n    for (var i = 0; i < querySolutions.length; i++) {\n      addQuerySolutionToString(querySolutions[i]);\n      csvString += lineBreak;\n    }\n  };\n\n  var addQuerySolutionToString = function(querySolution) {\n    for (var i = 0; i < variables.length; i++) {\n      var variable = variables[i];\n      if (querySolution.hasOwnProperty(variable)) {\n        addValueToString(querySolution[variable][\"value\"]);\n      } else {\n        addValueToString(\"\");\n      }\n    }\n  };\n  var addValueToString = function(value) {\n    //Quotes in the string need to be escaped\n    if (needToQuoteString(value)) {\n      if (value.indexOf(quote) >= 0) {\n        //use double quotes to escape these\n        value = value.replace(new RegExp(quote, \"g\"), quote + quote);\n      }\n      //and finally add quotes all around\n      value = quote + value + quote;\n    }\n    csvString += \" \" + value + \" \" + delimiter;\n  };\n\n  var needToQuoteString = function(value) {\n    //quote when it contains whitespace or the delimiter\n    var needQuoting = false;\n    if (value.match(\"[\\\\w|\" + delimiter + \"|\" + quote + \"]\")) {\n      needQuoting = true;\n    }\n    return needQuoting;\n  };\n\n  var csvString = \"\";\n  createHeader();\n  createBody();\n  return csvString;\n};\n","\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\n\n/**\n * Constructor of plugin which displays boolean info\n * \n * @param yasr {object}\n * @param parent {DOM element}\n * @param options {object}\n * @class YASR.plugins.boolean\n * @return yasr-boolean (doc)\n * \n */\nvar root = module.exports = function(yasr) {\n  var container = $(\"<div class='booleanResult'></div>\");\n  var draw = function() {\n    container.empty().appendTo(yasr.resultsContainer);\n    var booleanVal = yasr.results.getBoolean();\n\n    var imgId = null;\n    var textVal = null;\n    if (booleanVal === true) {\n      imgId = \"check\";\n      textVal = \"True\";\n    } else if (booleanVal === false) {\n      imgId = \"cross\";\n      textVal = \"False\";\n    } else {\n      container.width(\"140\");\n      textVal = \"Could not find boolean value in response\";\n    }\n\n    //add icon\n    if (imgId) require(\"yasgui-utils\").svg.draw(container, require(\"./imgs.js\")[imgId]);\n\n    $(\"<span></span>\").text(textVal).appendTo(container);\n  };\n\n  var canHandleResults = function() {\n    return yasr.results.getBoolean && (yasr.results.getBoolean() === true || yasr.results.getBoolean() == false);\n  };\n\n  return {\n    name: null, //don't need to set this: we don't show it in the selection widget anyway, so don't need a human-friendly name\n    draw: draw,\n    hideFromSelection: true,\n    getPriority: 10,\n    canHandleResults: canHandleResults\n  };\n};\n\nroot.version = {\n  \"YASR-boolean\": require(\"../package.json\").version,\n  jquery: $.fn.jquery\n};\n","\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\nmodule.exports = {\n  /**\n\t * key of default plugin to use\n\t * @property output\n\t * @type string\n\t * @default \"table\"\n\t */\n  output: \"table\",\n  useGoogleCharts: true,\n  outputPlugins: [\"table\", \"error\", \"boolean\", \"rawResponse\", \"pivot\", \"gchart\", \"leaflet\"],\n\n  /**\n\t * Draw the output selector widget\n\t *\n\t * @property drawOutputSelector\n\t * @type boolean\n\t * @default true\n\t */\n  drawOutputSelector: true,\n\n  /**\n\t * Draw download icon. This issues html5 download functionality to 'download' files created on the client-side.\n\t *  This allows the user to download results already queried for, such as a CSV when a table is shown, or the original response when the raw response output is selected\n\t *\n\t * @property drawDownloadIcon\n\t * @type boolean\n\t * @default true\n\t */\n  drawDownloadIcon: true,\n  /**\n\t * Open links (anchor tags) of SPARQL results in a new browser tab/window (_blank), or the current one (_self)\n\t *\n\t * @property uriTarget\n\t * @type string ('_blank' | '_self')\n\t * @default '_blank'\n\t */\n  uriTarget: \"_blank\",\n  onQuotaExceeded: function(e) {\n    //fail silently\n    console.warn(\"Could not store in localstorage. Skipping..\", e);\n  },\n  getUsedPrefixes: null,\n  /**\n\t * Make certain settings and values of YASR persistent. Setting a key\n\t * to null, will disable persistancy: nothing is stored between browser\n\t * sessions Setting the values to a string (or a function which returns a\n\t * string), will store the query in localstorage using the specified string.\n\t * By default, the ID is dynamically generated by finding the nearest DOM element with an \"id\" set,\n\t * to avoid collissions when using multiple YASR items on one page\n\t *\n\t * @property persistency\n\t * @type object\n\t */\n  persistency: {\n    prefix: function(yasr) {\n      return \"yasr_\" + $(yasr.container).closest(\"[id]\").attr(\"id\") + \"_\";\n    },\n    /**\n\t\t * Persistency setting for the selected output\n\t\t *\n\t\t * @property persistency.outputSelector\n\t\t * @type string|function\n\t\t * @default function (determine unique id)\n\t\t */\n    outputSelector: function(yasr) {\n      return \"selector\";\n    },\n    /**\n\t\t * Persistency setting for query results.\n\t\t *\n\t\t * @property persistency.results\n\t\t * @type object\n\t\t */\n    results: {\n      /**\n\t\t\t * Get the key to store results in\n\t\t\t *\n\t\t\t * @property persistency.results.id\n\t\t\t * @type string|function\n\t\t\t * @default function (determine unique id)\n\t\t\t */\n      id: function(yasr) {\n        return \"results_\" + $(yasr.container).closest(\"[id]\").attr(\"id\");\n      },\n      key: \"results\",\n      /**\n\t\t\t * The result set might too large to fit in local storage.\n\t\t\t * It is impossible to detect how large the local storage is.\n\t\t\t * Therefore, we do not store all results in local storage, depending on a max number of characters in the SPARQL result serialization.\n\t\t\t * Set this function conservitavely. (especially when using multiple YASR instances on one page)\n\t\t\t *\n\t\t\t * @property persistency.results.maxSize\n\t\t\t * @type int\n\t\t\t * @default 100000\n\t\t\t */\n      maxSize: 100000 //char count\n    }\n  }\n};\n","//this is the entry-point for browserify.\n//the current browserify version does not support require-ing js files which are used as entry-point\n//this way, we can still require our main.js file\nmodule.exports = require(\"./main.js\");\n","\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\n\n/**\n * Constructor of plugin which displays SPARQL errors\n * \n * @param yasr {object}\n * @param parent {DOM element}\n * @param options {object}\n * @class YASR.plugins.boolean\n * @return yasr-erro (doc)\n * \n */\nvar root = module.exports = function(yasr) {\n  var $container = $(\"<div class='errorResult'></div>\");\n  var options = $.extend(true, {}, root.defaults);\n\n  var getTryBtn = function() {\n    var $tryBtn = null;\n    if (options.tryQueryLink) {\n      var link = options.tryQueryLink();\n      $tryBtn = $(\"<button>\", {\n        class: \"yasr_btn yasr_tryQuery\"\n      })\n        .text(\"Try query in new browser window\")\n        .click(function() {\n          window.open(link, \"_blank\");\n          $(this).blur();\n        });\n    }\n    return $tryBtn;\n  };\n\n  var draw = function() {\n    var error = yasr.results.getException();\n    $container.empty().appendTo(yasr.resultsContainer);\n    var $header = $(\"<div>\", {\n      class: \"errorHeader\"\n    }).appendTo($container);\n\n    if (error.status !== 0) {\n      var statusText = \"Error\";\n      if (error.statusText && error.statusText.length < 100) {\n        //use a max: otherwise the alert span will look ugly\n        statusText = error.statusText;\n      }\n      statusText += \" (#\" + error.status + \")\";\n\n      $header\n        .append(\n          $(\"<span>\", {\n            class: \"exception\"\n          }).text(statusText)\n        )\n        .append(getTryBtn());\n\n      var responseText = null;\n      if (error.responseText) {\n        responseText = error.responseText;\n      } else if (typeof error == \"string\") {\n        //for backwards compatability (when creating the error string was done externally\n        responseText = error;\n      }\n      if (responseText) $container.append($(\"<pre>\").text(responseText));\n    } else {\n      $header.append(getTryBtn());\n      //cors disabled, wrong url, or endpoint down\n      $container.append(\n        $(\"<div>\", {\n          class: \"corsMessage\"\n        }).append(options.corsMessage)\n      );\n    }\n  };\n\n  var canHandleResults = function(yasr) {\n    return yasr.results.getException() || false;\n  };\n\n  return {\n    name: null, //don't need to set this: we don't show it in the selection widget anyway, so don't need a human-friendly name\n    draw: draw,\n    getPriority: 20,\n    hideFromSelection: true,\n    canHandleResults: canHandleResults\n  };\n};\n\n/**\n * Defaults for error plugin\n * \n * @type object\n * @attribute YASR.plugins.error.defaults\n */\nroot.defaults = {\n  corsMessage: \"Unable to get response from endpoint\",\n  tryQueryLink: null\n};\n","module.exports = {\n  GoogleTypeException: function(foundTypes, varName) {\n    this.foundTypes = foundTypes;\n    this.varName = varName;\n    this.toString = function() {\n      var string = \"Conflicting data types found for variable \" +\n        this.varName +\n        '. Assuming all values of this variable are \"string\".';\n      string += \" To avoid this issue, cast the values in your SPARQL query to the intended xsd datatype\";\n\n      return string;\n    };\n    this.toHtml = function() {\n      var string = \"Conflicting data types found for variable <i>\" +\n        this.varName +\n        '</i>. Assuming all values of this variable are \"string\".';\n      string += \" As a result, several Google Charts will not render values of this particular variable.\";\n      string += \" To avoid this issue, cast the values in your SPARQL query to the intended xsd datatype\";\n\n      return string;\n    };\n  }\n};\n","var EventEmitter = require(\"events\").EventEmitter, $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\n//cannot package google loader via browserify....\nvar loadingMain = false;\nvar loadingFailed = false;\n\nvar loader = function() {\n  EventEmitter.call(this);\n  var mod = this;\n  this.init = function() {\n    if (!loadingFailed && !(typeof window !== \"undefined\" ? window['google'] : typeof global !== \"undefined\" ? global['google'] : null) && !loadingMain) {\n      //not initiated yet, not currently loading, and has not failed the previous time\n      loadingMain = true;\n      /**\n\t\t\t * It is extremely difficult to catch script loader errors (see http://www.html5rocks.com/en/tutorials/speed/script-loading/)\n\t\t\t * Existing libraries either ignore several browsers (e.g. jquery 2.x), or use ugly hacks (timeouts or something)\n\t\t\t * So, we use our own custom ugly hack (yes, timeouts)\n\t\t\t */\n      //use protocol relative req when served via http. Otherwise, just use http:// (e.g. when yasr is served via file://)\n      loadScript((window.location.protocol.indexOf(\"http\") === 0 ? \"//\" : \"http://\") + \"google.com/jsapi\", function() {\n        loadingMain = false;\n        mod.emit(\"initDone\");\n      });\n\n      var timeout = 100; //ms\n      var maxTimeout = 6000; //so 6 sec max\n      var startTime = +new Date();\n      var checkAndWait = function() {\n        if (!(typeof window !== \"undefined\" ? window['google'] : typeof global !== \"undefined\" ? global['google'] : null)) {\n          if (+new Date() - startTime > maxTimeout) {\n            //ok, we've waited long enough. Obviously we could not load the googleloader...\n            loadingFailed = true;\n            loadingMain = false;\n            mod.emit(\"initError\");\n\n            //TODO: clear initDone callbacks. they won't fire anymore anyway\n          } else {\n            setTimeout(checkAndWait, timeout);\n          }\n        } else {\n          //TODO: clear initFailed callbacks. they won't fire anymore anyway\n        }\n      };\n      checkAndWait();\n    } else {\n      if ((typeof window !== \"undefined\" ? window['google'] : typeof global !== \"undefined\" ? global['google'] : null)) {\n        //already loaded! everything is fine\n        mod.emit(\"initDone\");\n      } else if (loadingFailed) {\n        mod.emit(\"initError\");\n      } else {\n        //hmmm, should never get here\n      }\n    }\n  };\n  this.googleLoad = function() {\n    var load = function() {\n      (typeof window !== \"undefined\" ? window['google'] : typeof global !== \"undefined\" ? global['google'] : null).load(\"visualization\", \"1\", {\n        packages: [\"corechart\", \"charteditor\"],\n        callback: function() {\n          mod.emit(\"done\");\n        }\n      });\n    };\n    if (loadingMain) {\n      mod.once(\"initDone\", load);\n      mod.once(\"initError\", function() {\n        mod.emit(\"error\", \"Could not load google loader\");\n      });\n    } else if ((typeof window !== \"undefined\" ? window['google'] : typeof global !== \"undefined\" ? global['google'] : null)) {\n      //google loader is there. use it\n      load();\n    } else if (loadingFailed) {\n      mod.emit(\"error\", \"Could not load google loader\");\n    } else {\n      //not loading, no loading error, and not loaded. it must not have been initialized yet. Do that\n      mod.once(\"initDone\", load);\n      mod.once(\"initError\", function() {\n        mod.emit(\"error\", \"Could not load google loader\");\n      });\n    }\n  };\n};\n\nvar loadScript = function(url, callback) {\n  var script = document.createElement(\"script\");\n  script.type = \"text/javascript\";\n\n  if (script.readyState) {\n    //IE\n    script.onreadystatechange = function() {\n      if (script.readyState == \"loaded\" || script.readyState == \"complete\") {\n        script.onreadystatechange = null;\n        callback();\n      }\n    };\n  } else {\n    //Others\n    script.onload = function() {\n      callback();\n    };\n  }\n\n  script.src = url;\n  document.body.appendChild(script);\n};\nloader.prototype = new EventEmitter();\nmodule.exports = new loader();\n","\"use strict\";\n/**\n * todo: chart height as option\n * \n */\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})(), utils = require(\"./utils.js\"), yUtils = require(\"yasgui-utils\");\n\nvar root = module.exports = function(yasr) {\n  var options = $.extend(true, {}, root.defaults);\n  var id = yasr.container.closest(\"[id]\").attr(\"id\");\n\n  var chartWrapper = null;\n  var editor = null;\n\n  var initEditor = function(callback) {\n    var google = (typeof window !== \"undefined\" ? window['google'] : typeof global !== \"undefined\" ? global['google'] : null);\n    editor = new google.visualization.ChartEditor();\n    google.visualization.events.addListener(editor, \"ok\", function() {\n      var tmp;\n      chartWrapper = editor.getChartWrapper();\n      tmp = chartWrapper.getDataTable();\n      chartWrapper.setDataTable(null);\n      //ugly: need to parse json string to json obj again, as google chart does not provide access to object directly\n      options.chartConfig = JSON.parse(chartWrapper.toJSON());\n      //remove container ID though, for portability\n      if (options.chartConfig.containerId) delete options.chartConfig[\"containerId\"];\n      yasr.store();\n      chartWrapper.setDataTable(tmp);\n      var wrapperId = id + \"_gchartWrapper\";\n      var $wrapper = $(\"#\" + wrapperId);\n      chartWrapper.setOption(\"width\", $wrapper.width());\n      chartWrapper.setOption(\"height\", $wrapper.height());\n      chartWrapper.draw();\n      yasr.updateHeader();\n    });\n    if (callback) callback();\n  };\n\n  return {\n    name: \"Google Chart\",\n    hideFromSelection: false,\n    priority: 7,\n    options: options,\n    getPersistentSettings: function() {\n      return {\n        chartConfig: options.chartConfig,\n        motionChartState: options.motionChartState\n      };\n    },\n    setPersistentSettings: function(persSettings) {\n      if (persSettings[\"chartConfig\"]) options.chartConfig = persSettings[\"chartConfig\"];\n      if (persSettings[\"motionChartState\"]) options.motionChartState = persSettings[\"motionChartState\"];\n    },\n    canHandleResults: function(yasr) {\n      var results, variables;\n      return (results = yasr.results) != null && (variables = results.getVariables()) && variables.length > 0;\n    },\n    getDownloadInfo: function() {\n      if (!yasr.results) return null;\n      var svgEl = yasr.resultsContainer.find(\"svg\");\n      if (svgEl.length > 0) {\n        return {\n          getContent: function() {\n            if (svgEl[0].outerHTML) {\n              return svgEl[0].outerHTML;\n            } else {\n              //outerHTML not supported. use workaround\n              return $(\"<div>\").append(svgEl.clone()).html();\n            }\n          },\n          filename: \"queryResults.svg\",\n          contentType: \"image/svg+xml\",\n          buttonTitle: \"Download SVG Image\"\n        };\n      }\n      //ok, not a svg. is it a table?\n      var $table = yasr.resultsContainer.find(\".google-visualization-table-table\");\n      if ($table.length > 0) {\n        return {\n          getContent: function() {\n            return $table.tableToCsv();\n          },\n          filename: \"queryResults.csv\",\n          contentType: \"text/csv\",\n          buttonTitle: \"Download as CSV\"\n        };\n      }\n    },\n    getEmbedHtml: function() {\n      if (!yasr.results) return null;\n\n      var svgEl = yasr.resultsContainer\n        .find(\"svg\")\n        .clone() //create clone, as we'd like to remove height/width attributes\n        .removeAttr(\"height\")\n        .removeAttr(\"width\")\n        .css(\"height\", \"\")\n        .css(\"width\", \"\");\n      if (svgEl.length == 0) return null;\n\n      var htmlString = svgEl[0].outerHTML;\n      if (!htmlString) {\n        //outerHTML not supported. use workaround\n        htmlString = $(\"<div>\").append(svgEl.clone()).html();\n      }\n      //wrap in div, so users can more easily tune width/height\n      //don't use jquery, so we can easily influence indentation\n      return '<div style=\"width: 800px; height: 600px;\">\\n' + htmlString + \"\\n</div>\";\n    },\n    draw: function() {\n      var doDraw = function() {\n        //clear previous results (if any)\n        yasr.resultsContainer.empty();\n        var wrapperId = id + \"_gchartWrapper\";\n\n        yasr.resultsContainer\n          .append(\n            $(\"<button>\", {\n              class: \"openGchartBtn yasr_btn\"\n            })\n              .text(\"Chart Config\")\n              .click(function() {\n                editor.openDialog(chartWrapper);\n              })\n          )\n          .append(\n            $(\"<div>\", {\n              id: wrapperId,\n              class: \"gchartWrapper\"\n            })\n          );\n        var dataTable = new google.visualization.DataTable();\n        //clone, because we'll be manipulating the literals types\n        var jsonResults = $.extend(true, {}, yasr.results.getAsJson());\n        jsonResults.head.vars.forEach(function(variable) {\n          var type = \"string\";\n          try {\n            type = utils.getGoogleTypeForBindings(jsonResults.results.bindings, variable);\n          } catch (e) {\n            if (e instanceof require(\"./exceptions.js\").GoogleTypeException) {\n              yasr.warn(e.toHtml());\n            } else {\n              throw e;\n            }\n          }\n          dataTable.addColumn(type, variable);\n        });\n        var usedPrefixes = null;\n        if (yasr.options.getUsedPrefixes) {\n          usedPrefixes = typeof yasr.options.getUsedPrefixes == \"function\"\n            ? yasr.options.getUsedPrefixes(yasr)\n            : yasr.options.getUsedPrefixes;\n        }\n        jsonResults.results.bindings.forEach(function(binding) {\n          var row = [];\n          jsonResults.head.vars.forEach(function(variable, columnId) {\n            row.push(utils.castGoogleType(binding[variable], usedPrefixes, dataTable.getColumnType(columnId)));\n          });\n          dataTable.addRow(row);\n        });\n\n        if (options.chartConfig && options.chartConfig.chartType) {\n          options.chartConfig.containerId = wrapperId;\n          chartWrapper = new google.visualization.ChartWrapper(options.chartConfig);\n          if (chartWrapper.getChartType() === \"MotionChart\" && options.motionChartState) {\n            chartWrapper.setOption(\"state\", options.motionChartState);\n            google.visualization.events.addListener(chartWrapper, \"ready\", function() {\n              var motionChart;\n              motionChart = chartWrapper.getChart();\n              google.visualization.events.addListener(motionChart, \"statechange\", function() {\n                options.motionChartState = motionChart.getState();\n                yasr.store();\n              });\n            });\n          }\n          chartWrapper.setDataTable(dataTable);\n        } else {\n          chartWrapper = new google.visualization.ChartWrapper({\n            chartType: \"Table\",\n            dataTable: dataTable,\n            containerId: wrapperId\n          });\n        }\n        var $wrapper = $(\"#\" + wrapperId);\n        chartWrapper.setOption(\"width\", $wrapper.width());\n        chartWrapper.setOption(\"height\", $wrapper.height());\n        chartWrapper.draw();\n        google.visualization.events.addListener(chartWrapper, \"ready\", yasr.updateHeader);\n      };\n\n      if (!(typeof window !== \"undefined\" ? window['google'] : typeof global !== \"undefined\" ? global['google'] : null) || !(typeof window !== \"undefined\" ? window['google'] : typeof global !== \"undefined\" ? global['google'] : null).visualization || !editor) {\n        require(\"./gChartLoader.js\")\n          .on(\"done\", function() {\n            initEditor();\n            doDraw();\n          })\n          .on(\"error\", function() {\n            //TODO: disable or something?\n          })\n          .googleLoad();\n      } else {\n        //everything (editor as well) is already initialized\n        doDraw();\n      }\n    }\n  };\n};\nroot.defaults = {\n  height: \"100%\",\n  width: \"100%\",\n  persistencyId: \"gchart\",\n  chartConfig: null,\n  motionChartState: null\n};\n\nfunction deepEq$(x, y, type) {\n  var toString = ({}).toString,\n    hasOwnProperty = ({}).hasOwnProperty,\n    has = function(obj, key) {\n      return hasOwnProperty.call(obj, key);\n    };\n  var first = true;\n  return eq(x, y, []);\n\n  function eq(a, b, stack) {\n    var className, length, size, result, alength, blength, r, key, ref, sizeB;\n    if (a == null || b == null) {\n      return a === b;\n    }\n    if (a.__placeholder__ || b.__placeholder__) {\n      return true;\n    }\n    if (a === b) {\n      return a !== 0 || 1 / a == 1 / b;\n    }\n    className = toString.call(a);\n    if (toString.call(b) != className) {\n      return false;\n    }\n    switch (className) {\n      case \"[object String]\":\n        return a == String(b);\n      case \"[object Number]\":\n        return a != +a ? b != +b : a == 0 ? 1 / a == 1 / b : a == +b;\n      case \"[object Date]\":\n      case \"[object Boolean]\":\n        return +a == +b;\n      case \"[object RegExp]\":\n        return a.source == b.source &&\n          a.global == b.global &&\n          a.multiline == b.multiline &&\n          a.ignoreCase == b.ignoreCase;\n    }\n    if (typeof a != \"object\" || typeof b != \"object\") {\n      return false;\n    }\n    length = stack.length;\n    while (length--) {\n      if (stack[length] == a) {\n        return true;\n      }\n    }\n    stack.push(a);\n    size = 0;\n    result = true;\n    if (className == \"[object Array]\") {\n      alength = a.length;\n      blength = b.length;\n      if (first) {\n        switch (type) {\n          case \"===\":\n            result = alength === blength;\n            break;\n          case \"<==\":\n            result = alength <= blength;\n            break;\n          case \"<<=\":\n            result = alength < blength;\n            break;\n        }\n        size = alength;\n        first = false;\n      } else {\n        result = alength === blength;\n        size = alength;\n      }\n      if (result) {\n        while (size--) {\n          if (!(result = size in a == size in b && eq(a[size], b[size], stack))) {\n            break;\n          }\n        }\n      }\n    } else {\n      if (\"constructor\" in a != \"constructor\" in b || a.constructor != b.constructor) {\n        return false;\n      }\n      for (key in a) {\n        if (has(a, key)) {\n          size++;\n          if (!(result = has(b, key) && eq(a[key], b[key], stack))) {\n            break;\n          }\n        }\n      }\n      if (result) {\n        sizeB = 0;\n        for (key in b) {\n          if (has(b, key)) {\n            ++sizeB;\n          }\n        }\n        if (first) {\n          if (type === \"<<=\") {\n            result = size < sizeB;\n          } else if (type === \"<==\") {\n            result = size <= sizeB;\n          } else {\n            result = size === sizeB;\n          }\n        } else {\n          first = false;\n          result = size === sizeB;\n        }\n      }\n    }\n    stack.pop();\n    return result;\n  }\n}\n","\"use strict\";\nmodule.exports = {\n  cross: '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" x=\"0px\" y=\"0px\" width=\"30px\" height=\"30px\" viewBox=\"0 0 100 100\" enable-background=\"new 0 0 100 100\" xml:space=\"preserve\"><g>\t<path d=\"M83.288,88.13c-2.114,2.112-5.575,2.112-7.689,0L53.659,66.188c-2.114-2.112-5.573-2.112-7.687,0L24.251,87.907   c-2.113,2.114-5.571,2.114-7.686,0l-4.693-4.691c-2.114-2.114-2.114-5.573,0-7.688l21.719-21.721c2.113-2.114,2.113-5.573,0-7.686   L11.872,24.4c-2.114-2.113-2.114-5.571,0-7.686l4.842-4.842c2.113-2.114,5.571-2.114,7.686,0L46.12,33.591   c2.114,2.114,5.572,2.114,7.688,0l21.721-21.719c2.114-2.114,5.573-2.114,7.687,0l4.695,4.695c2.111,2.113,2.111,5.571-0.003,7.686   L66.188,45.973c-2.112,2.114-2.112,5.573,0,7.686L88.13,75.602c2.112,2.111,2.112,5.572,0,7.687L83.288,88.13z\"/></g></svg>',\n  check: '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" x=\"0px\" y=\"0px\" width=\"30px\" height=\"30px\" viewBox=\"0 0 100 100\" enable-background=\"new 0 0 100 100\" xml:space=\"preserve\"><path fill=\"#000000\" d=\"M14.301,49.982l22.606,17.047L84.361,4.903c2.614-3.733,7.76-4.64,11.493-2.026l0.627,0.462  c3.732,2.614,4.64,7.758,2.025,11.492l-51.783,79.77c-1.955,2.791-3.896,3.762-7.301,3.988c-3.405,0.225-5.464-1.039-7.508-3.084  L2.447,61.814c-3.263-3.262-3.263-8.553,0-11.814l0.041-0.019C5.75,46.718,11.039,46.718,14.301,49.982z\"/></svg>',\n  unsorted: '<svg   xmlns:dc=\"http://purl.org/dc/elements/1.1/\"   xmlns:cc=\"http://creativecommons.org/ns#\"   xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"   xmlns:svg=\"http://www.w3.org/2000/svg\"   xmlns=\"http://www.w3.org/2000/svg\"   xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\"   xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\"   version=\"1.1\"   id=\"Layer_1\"   x=\"0px\"   y=\"0px\"   width=\"100%\"   height=\"100%\"   viewBox=\"0 0 54.552711 113.78478\"   enable-background=\"new 0 0 100 100\"   xml:space=\"preserve\"><g     id=\"g5\"     transform=\"matrix(-0.70522156,-0.70898699,-0.70898699,0.70522156,97.988199,55.081205)\"><path       style=\"fill:#000000\"       inkscape:connector-curvature=\"0\"       id=\"path7\"       d=\"M 57.911,66.915 45.808,55.063 42.904,52.238 31.661,41.25 31.435,41.083 31.131,40.775 30.794,40.523 30.486,40.3 30.069,40.05 29.815,39.911 29.285,39.659 29.089,39.576 28.474,39.326 28.363,39.297 H 28.336 L 27.665,39.128 27.526,39.1 26.94,38.99 26.714,38.961 26.212,38.934 h -0.31 -0.444 l -0.339,0.027 c -1.45,0.139 -2.876,0.671 -4.11,1.564 l -0.223,0.141 -0.279,0.25 -0.335,0.308 -0.054,0.029 -0.171,0.194 -0.334,0.364 -0.224,0.279 -0.25,0.336 -0.225,0.362 -0.192,0.308 -0.197,0.421 -0.142,0.279 -0.193,0.477 -0.084,0.222 -12.441,38.414 c -0.814,2.458 -0.313,5.029 1.115,6.988 v 0.026 l 0.418,0.532 0.17,0.165 0.251,0.281 0.084,0.079 0.283,0.281 0.25,0.194 0.474,0.367 0.083,0.053 c 2.015,1.371 4.641,1.874 7.131,1.094 L 55.228,80.776 c 4.303,-1.342 6.679,-5.814 5.308,-10.006 -0.387,-1.259 -1.086,-2.35 -1.979,-3.215 l -0.368,-0.337 -0.278,-0.303 z m -6.318,5.896 0.079,0.114 -37.369,11.57 11.854,-36.538 10.565,10.317 2.876,2.825 11.995,11.712 z\" /></g><path     style=\"fill:#000000\"     inkscape:connector-curvature=\"0\"     id=\"path7-9\"     d=\"m 8.8748339,52.571766 16.9382111,-0.222584 4.050851,-0.06665 15.719154,-0.222166 0.27778,-0.04246 0.43276,0.0017 0.41632,-0.06121 0.37532,-0.0611 0.47132,-0.119342 0.27767,-0.08206 0.55244,-0.198047 0.19707,-0.08043 0.61095,-0.259721 0.0988,-0.05825 0.019,-0.01914 0.59303,-0.356548 0.11787,-0.0788 0.49125,-0.337892 0.17994,-0.139779 0.37317,-0.336871 0.21862,-0.219786 0.31311,-0.31479 0.21993,-0.259387 c 0.92402,-1.126057 1.55249,-2.512251 1.78961,-4.016904 l 0.0573,-0.25754 0.0195,-0.374113 0.0179,-0.454719 0.0175,-0.05874 -0.0169,-0.258049 -0.0225,-0.493503 -0.0398,-0.355569 -0.0619,-0.414201 -0.098,-0.414812 -0.083,-0.353334 L 53.23955,41.1484 53.14185,40.850967 52.93977,40.377742 52.84157,40.161628 34.38021,4.2507375 C 33.211567,1.9401875 31.035446,0.48226552 28.639484,0.11316952 l -0.01843,-0.01834 -0.671963,-0.07882 -0.236871,0.0042 L 27.335984,-4.7826577e-7 27.220736,0.00379952 l -0.398804,0.0025 -0.313848,0.04043 -0.594474,0.07724 -0.09611,0.02147 C 23.424549,0.60716252 21.216017,2.1142355 20.013025,4.4296865 L 0.93967491,40.894479 c -2.08310801,3.997178 -0.588125,8.835482 3.35080799,10.819749 1.165535,0.613495 2.43199,0.88731 3.675026,0.864202 l 0.49845,-0.02325 0.410875,0.01658 z M 9.1502369,43.934401 9.0136999,43.910011 27.164145,9.2564625 44.70942,43.42818 l -14.765289,0.214677 -4.031106,0.0468 -16.7627881,0.244744 z\" /></svg>',\n  sortDesc: '<svg   xmlns:dc=\"http://purl.org/dc/elements/1.1/\"   xmlns:cc=\"http://creativecommons.org/ns#\"   xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"   xmlns:svg=\"http://www.w3.org/2000/svg\"   xmlns=\"http://www.w3.org/2000/svg\"   xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\"   xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\"   version=\"1.1\"   id=\"Layer_1\"   x=\"0px\"   y=\"0px\"   width=\"100%\"   height=\"100%\"   viewBox=\"0 0 54.552711 113.78478\"   enable-background=\"new 0 0 100 100\"   xml:space=\"preserve\"><g     id=\"g5\"     transform=\"matrix(-0.70522156,-0.70898699,-0.70898699,0.70522156,97.988199,55.081205)\"><path       style=\"fill:#000000\"       inkscape:connector-curvature=\"0\"       id=\"path7\"       d=\"M 57.911,66.915 45.808,55.063 42.904,52.238 31.661,41.25 31.435,41.083 31.131,40.775 30.794,40.523 30.486,40.3 30.069,40.05 29.815,39.911 29.285,39.659 29.089,39.576 28.474,39.326 28.363,39.297 H 28.336 L 27.665,39.128 27.526,39.1 26.94,38.99 26.714,38.961 26.212,38.934 h -0.31 -0.444 l -0.339,0.027 c -1.45,0.139 -2.876,0.671 -4.11,1.564 l -0.223,0.141 -0.279,0.25 -0.335,0.308 -0.054,0.029 -0.171,0.194 -0.334,0.364 -0.224,0.279 -0.25,0.336 -0.225,0.362 -0.192,0.308 -0.197,0.421 -0.142,0.279 -0.193,0.477 -0.084,0.222 -12.441,38.414 c -0.814,2.458 -0.313,5.029 1.115,6.988 v 0.026 l 0.418,0.532 0.17,0.165 0.251,0.281 0.084,0.079 0.283,0.281 0.25,0.194 0.474,0.367 0.083,0.053 c 2.015,1.371 4.641,1.874 7.131,1.094 L 55.228,80.776 c 4.303,-1.342 6.679,-5.814 5.308,-10.006 -0.387,-1.259 -1.086,-2.35 -1.979,-3.215 l -0.368,-0.337 -0.278,-0.303 z m -6.318,5.896 0.079,0.114 -37.369,11.57 11.854,-36.538 10.565,10.317 2.876,2.825 11.995,11.712 z\" /></g><path     style=\"fill:#000000\"     inkscape:connector-curvature=\"0\"     id=\"path9\"     d=\"m 27.813273,0.12823506 0.09753,0.02006 c 2.39093,0.458209 4.599455,1.96811104 5.80244,4.28639004 L 52.785897,40.894525 c 2.088044,4.002139 0.590949,8.836902 -3.348692,10.821875 -1.329078,0.688721 -2.766603,0.943695 -4.133174,0.841768 l -0.454018,0.02 L 27.910392,52.354171 23.855313,52.281851 8.14393,52.061827 7.862608,52.021477 7.429856,52.021738 7.014241,51.959818 6.638216,51.900838 6.164776,51.779369 5.889216,51.699439 5.338907,51.500691 5.139719,51.419551 4.545064,51.145023 4.430618,51.105123 4.410168,51.084563 3.817138,50.730843 3.693615,50.647783 3.207314,50.310611 3.028071,50.174369 2.652795,49.833957 2.433471,49.613462 2.140099,49.318523 1.901127,49.041407 C 0.97781,47.916059 0.347935,46.528448 0.11153,45.021676 L 0.05352,44.766255 0.05172,44.371683 0.01894,43.936017 0,43.877277 0.01836,43.62206 0.03666,43.122889 0.0765,42.765905 0.13912,42.352413 0.23568,41.940425 0.32288,41.588517 0.481021,41.151945 0.579391,40.853806 0.77369,40.381268 0.876097,40.162336 19.338869,4.2542801 c 1.172169,-2.308419 3.34759,-3.76846504 5.740829,-4.17716604 l 0.01975,0.01985 0.69605,-0.09573 0.218437,0.0225 0.490791,-0.02132 0.39809,0.0046 0.315972,0.03973 0.594462,0.08149 z\" /></svg>',\n  sortAsc: '<svg   xmlns:dc=\"http://purl.org/dc/elements/1.1/\"   xmlns:cc=\"http://creativecommons.org/ns#\"   xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"   xmlns:svg=\"http://www.w3.org/2000/svg\"   xmlns=\"http://www.w3.org/2000/svg\"   xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\"   xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\"   version=\"1.1\"   id=\"Layer_1\"   x=\"0px\"   y=\"0px\"   width=\"100%\"   height=\"100%\"   viewBox=\"0 0 54.552711 113.78478\"   enable-background=\"new 0 0 100 100\"   xml:space=\"preserve\"><g     id=\"g5\"     transform=\"matrix(-0.70522156,0.70898699,-0.70898699,-0.70522156,97.988199,58.704807)\"><path       style=\"fill:#000000\"       inkscape:connector-curvature=\"0\"       id=\"path7\"       d=\"M 57.911,66.915 45.808,55.063 42.904,52.238 31.661,41.25 31.435,41.083 31.131,40.775 30.794,40.523 30.486,40.3 30.069,40.05 29.815,39.911 29.285,39.659 29.089,39.576 28.474,39.326 28.363,39.297 H 28.336 L 27.665,39.128 27.526,39.1 26.94,38.99 26.714,38.961 26.212,38.934 h -0.31 -0.444 l -0.339,0.027 c -1.45,0.139 -2.876,0.671 -4.11,1.564 l -0.223,0.141 -0.279,0.25 -0.335,0.308 -0.054,0.029 -0.171,0.194 -0.334,0.364 -0.224,0.279 -0.25,0.336 -0.225,0.362 -0.192,0.308 -0.197,0.421 -0.142,0.279 -0.193,0.477 -0.084,0.222 -12.441,38.414 c -0.814,2.458 -0.313,5.029 1.115,6.988 v 0.026 l 0.418,0.532 0.17,0.165 0.251,0.281 0.084,0.079 0.283,0.281 0.25,0.194 0.474,0.367 0.083,0.053 c 2.015,1.371 4.641,1.874 7.131,1.094 L 55.228,80.776 c 4.303,-1.342 6.679,-5.814 5.308,-10.006 -0.387,-1.259 -1.086,-2.35 -1.979,-3.215 l -0.368,-0.337 -0.278,-0.303 z m -6.318,5.896 0.079,0.114 -37.369,11.57 11.854,-36.538 10.565,10.317 2.876,2.825 11.995,11.712 z\" /></g><path     style=\"fill:#000000\"     inkscape:connector-curvature=\"0\"     id=\"path9\"     d=\"m 27.813273,113.65778 0.09753,-0.0201 c 2.39093,-0.45821 4.599455,-1.96811 5.80244,-4.28639 L 52.785897,72.891487 c 2.088044,-4.002139 0.590949,-8.836902 -3.348692,-10.821875 -1.329078,-0.688721 -2.766603,-0.943695 -4.133174,-0.841768 l -0.454018,-0.02 -16.939621,0.223997 -4.055079,0.07232 -15.711383,0.220024 -0.281322,0.04035 -0.432752,-2.61e-4 -0.415615,0.06192 -0.376025,0.05898 -0.47344,0.121469 -0.27556,0.07993 -0.550309,0.198748 -0.199188,0.08114 -0.594655,0.274528 -0.114446,0.0399 -0.02045,0.02056 -0.59303,0.35372 -0.123523,0.08306 -0.486301,0.337172 -0.179243,0.136242 -0.375276,0.340412 -0.219324,0.220495 -0.293372,0.294939 -0.238972,0.277116 C 0.97781,65.869953 0.347935,67.257564 0.11153,68.764336 L 0.05352,69.019757 0.05172,69.414329 0.01894,69.849995 0,69.908735 l 0.01836,0.255217 0.0183,0.499171 0.03984,0.356984 0.06262,0.413492 0.09656,0.411988 0.0872,0.351908 0.158141,0.436572 0.09837,0.298139 0.194299,0.472538 0.102407,0.218932 18.462772,35.908054 c 1.172169,2.30842 3.34759,3.76847 5.740829,4.17717 l 0.01975,-0.0199 0.69605,0.0957 0.218437,-0.0225 0.490791,0.0213 0.39809,-0.005 0.315972,-0.0397 0.594462,-0.0815 z\" /></svg>',\n  download: '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" baseProfile=\"tiny\" x=\"0px\" y=\"0px\" width=\"100%\" height=\"100%\" viewBox=\"0 0 100 100\" xml:space=\"preserve\"><g id=\"Captions\"></g><g id=\"Your_Icon\">\t<path fill-rule=\"evenodd\" fill=\"#000000\" d=\"M88,84v-2c0-2.961-0.859-4-4-4H16c-2.961,0-4,0.98-4,4v2c0,3.102,1.039,4,4,4h68   C87.02,88,88,87.039,88,84z M58,12H42c-5,0-6,0.941-6,6v22H16l34,34l34-34H64V18C64,12.941,62.939,12,58,12z\"/></g></svg>',\n  move: '<svg   xmlns:dc=\"http://purl.org/dc/elements/1.1/\"   xmlns:cc=\"http://creativecommons.org/ns#\"   xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"   xmlns:svg=\"http://www.w3.org/2000/svg\"   xmlns=\"http://www.w3.org/2000/svg\"   xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\"   xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\"   version=\"1.1\"   id=\"Layer_1\"   x=\"0px\"   y=\"0px\"   width=\"100%\"   height=\"100%\"   viewBox=\"5 -10 74.074074 100\"   enable-background=\"new 0 0 100 100\"   xml:space=\"preserve\"   inkscape:version=\"0.48.4 r9939\"   sodipodi:docname=\"noun_11656_cc.svg\"><metadata     ><rdf:RDF><cc:Work         rdf:about=\"\"><dc:format>image/svg+xml</dc:format><dc:type           rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" /></cc:Work></rdf:RDF></metadata><defs      /><sodipodi:namedview     pagecolor=\"#ffffff\"     bordercolor=\"#666666\"     borderopacity=\"1\"     objecttolerance=\"10\"     gridtolerance=\"10\"     guidetolerance=\"10\"     inkscape:pageopacity=\"0\"     inkscape:pageshadow=\"2\"     inkscape:window-width=\"753\"     inkscape:window-height=\"480\"          showgrid=\"false\"     fit-margin-top=\"0\"     fit-margin-left=\"0\"     fit-margin-right=\"0\"     fit-margin-bottom=\"0\"     inkscape:zoom=\"2.36\"     inkscape:cx=\"44.101509\"     inkscape:cy=\"31.481481\"     inkscape:window-x=\"287\"     inkscape:window-y=\"249\"     inkscape:window-maximized=\"0\"     inkscape:current-layer=\"Layer_1\" /><polygon     points=\"33,83 50,100 67,83 54,83 54,17 67,17 50,0 33,17 46,17 46,83 \"          transform=\"translate(-7.962963,-10)\" /><polygon     points=\"83,67 100,50 83,33 83,46 17,46 17,33 0,50 17,67 17,54 83,54 \"          transform=\"translate(-7.962963,-10)\" /></svg>',\n  fullscreen: '<svg   xmlns:dc=\"http://purl.org/dc/elements/1.1/\"   xmlns:cc=\"http://creativecommons.org/ns#\"   xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"   xmlns:svg=\"http://www.w3.org/2000/svg\"   xmlns=\"http://www.w3.org/2000/svg\"   xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\"   xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\"   version=\"1.1\"      x=\"0px\"   y=\"0px\"   width=\"100%\"   height=\"100%\"   viewBox=\"5 -10 74.074074 100\"   enable-background=\"new 0 0 100 100\"   xml:space=\"preserve\"   inkscape:version=\"0.48.4 r9939\"   sodipodi:docname=\"noun_2186_cc.svg\"><metadata     ><rdf:RDF><cc:Work         rdf:about=\"\"><dc:format>image/svg+xml</dc:format><dc:type           rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" /></cc:Work></rdf:RDF></metadata><defs      /><sodipodi:namedview     pagecolor=\"#ffffff\"     bordercolor=\"#666666\"     borderopacity=\"1\"     objecttolerance=\"10\"     gridtolerance=\"10\"     guidetolerance=\"10\"     inkscape:pageopacity=\"0\"     inkscape:pageshadow=\"2\"     inkscape:window-width=\"640\"     inkscape:window-height=\"480\"          showgrid=\"false\"     fit-margin-top=\"0\"     fit-margin-left=\"0\"     fit-margin-right=\"0\"     fit-margin-bottom=\"0\"     inkscape:zoom=\"2.36\"     inkscape:cx=\"44.101509\"     inkscape:cy=\"31.481481\"     inkscape:window-x=\"65\"     inkscape:window-y=\"24\"     inkscape:window-maximized=\"0\"     inkscape:current-layer=\"Layer_1\" /><path     d=\"m -7.962963,-10 v 38.889 l 16.667,-16.667 16.667,16.667 5.555,-5.555 -16.667,-16.667 16.667,-16.667 h -38.889 z\"          inkscape:connector-curvature=\"0\"     style=\"fill:#010101\" /><path     d=\"m 92.037037,-10 v 38.889 l -16.667,-16.667 -16.666,16.667 -5.556,-5.555 16.666,-16.667 -16.666,-16.667 h 38.889 z\"          inkscape:connector-curvature=\"0\"     style=\"fill:#010101\" /><path     d=\"M -7.962963,90 V 51.111 l 16.667,16.666 16.667,-16.666 5.555,5.556 -16.667,16.666 16.667,16.667 h -38.889 z\"          inkscape:connector-curvature=\"0\"     style=\"fill:#010101\" /><path     d=\"M 92.037037,90 V 51.111 l -16.667,16.666 -16.666,-16.666 -5.556,5.556 16.666,16.666 -16.666,16.667 h 38.889 z\"          inkscape:connector-curvature=\"0\"     style=\"fill:#010101\" /></svg>',\n  smallscreen: '<svg   xmlns:dc=\"http://purl.org/dc/elements/1.1/\"   xmlns:cc=\"http://creativecommons.org/ns#\"   xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"   xmlns:svg=\"http://www.w3.org/2000/svg\"   xmlns=\"http://www.w3.org/2000/svg\"   xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\"   xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\"   version=\"1.1\"      x=\"0px\"   y=\"0px\"   width=\"100%\"   height=\"100%\"   viewBox=\"5 -10 74.074074 100\"   enable-background=\"new 0 0 100 100\"   xml:space=\"preserve\"   inkscape:version=\"0.48.4 r9939\"   sodipodi:docname=\"noun_2186_cc.svg\"><metadata     ><rdf:RDF><cc:Work         rdf:about=\"\"><dc:format>image/svg+xml</dc:format><dc:type           rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" /></cc:Work></rdf:RDF></metadata><defs      /><sodipodi:namedview     pagecolor=\"#ffffff\"     bordercolor=\"#666666\"     borderopacity=\"1\"     objecttolerance=\"10\"     gridtolerance=\"10\"     guidetolerance=\"10\"     inkscape:pageopacity=\"0\"     inkscape:pageshadow=\"2\"     inkscape:window-width=\"1855\"     inkscape:window-height=\"1056\"          showgrid=\"false\"     fit-margin-top=\"0\"     fit-margin-left=\"0\"     fit-margin-right=\"0\"     fit-margin-bottom=\"0\"     inkscape:zoom=\"2.36\"     inkscape:cx=\"44.101509\"     inkscape:cy=\"31.481481\"     inkscape:window-x=\"65\"     inkscape:window-y=\"24\"     inkscape:window-maximized=\"1\"     inkscape:current-layer=\"Layer_1\" /><path     d=\"m 30.926037,28.889 0,-38.889 -16.667,16.667 -16.667,-16.667 -5.555,5.555 16.667,16.667 -16.667,16.667 38.889,0 z\"          inkscape:connector-curvature=\"0\"     style=\"fill:#010101\" /><path     d=\"m 53.148037,28.889 0,-38.889 16.667,16.667 16.666,-16.667 5.556,5.555 -16.666,16.667 16.666,16.667 -38.889,0 z\"          inkscape:connector-curvature=\"0\"     style=\"fill:#010101\" /><path     d=\"m 30.926037,51.111 0,38.889 -16.667,-16.666 -16.667,16.666 -5.555,-5.556 16.667,-16.666 -16.667,-16.667 38.889,0 z\"          inkscape:connector-curvature=\"0\"     style=\"fill:#010101\" /><path     d=\"m 53.148037,51.111 0,38.889 16.667,-16.666 16.666,16.666 5.556,-5.556 -16.666,-16.666 16.666,-16.667 -38.889,0 z\"          inkscape:connector-curvature=\"0\"     style=\"fill:#010101\" /></svg>'\n};\n","require(\"./tableToCsv.js\");\n","\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\n\n$.fn.tableToCsv = function(config) {\n  var csvString = \"\";\n  config = $.extend(\n    {\n      quote: '\"',\n      delimiter: \",\",\n      lineBreak: \"\\n\"\n    },\n    config\n  );\n\n  var needToQuoteString = function(value) {\n    //quote when it contains whitespace or the delimiter\n    var needQuoting = false;\n    if (value.match(\"[\\\\w|\" + config.delimiter + \"|\" + config.quote + \"]\")) {\n      needQuoting = true;\n    }\n    return needQuoting;\n  };\n  var addValueToString = function(value) {\n    //Quotes in the string need to be escaped\n    value.replace(config.quote, config.quote + config.quote);\n    if (needToQuoteString(value)) {\n      value = config.quote + value + config.quote;\n    }\n    csvString += \" \" + value + \" \" + config.delimiter;\n  };\n\n  var addRowToString = function(rowArray) {\n    rowArray.forEach(function(val) {\n      addValueToString(val);\n    });\n    csvString += config.lineBreak;\n  };\n\n  var tableArrays = [];\n  var $el = $(this);\n  var rowspans = {};\n\n  var totalColCount = 0;\n  $el.find(\"tr:first *\").each(function() {\n    if ($(this).attr(\"colspan\")) {\n      totalColCount += +$(this).attr(\"colspan\");\n    } else {\n      totalColCount++;\n    }\n  });\n\n  $el.find(\"tr\").each(function(rowId, tr) {\n    var $tr = $(tr);\n    var rowArray = [];\n\n    var htmlColId = 0;\n    var actualColId = 0;\n    while (actualColId < totalColCount) {\n      if (rowspans[actualColId]) {\n        rowArray.push(rowspans[actualColId].text);\n        rowspans[actualColId].rowSpan--;\n        if (!rowspans[actualColId].rowSpan) rowspans[actualColId] = null;\n        actualColId++;\n        continue;\n      }\n\n      var $cell = $tr.find(\":nth-child(\" + (htmlColId + 1) + \")\");\n      if (!$cell) break;\n      var colspan = $cell.attr(\"colspan\") || 1;\n      var rowspan = $cell.attr(\"rowspan\") || 1;\n\n      for (var i = 0; i < colspan; i++) {\n        rowArray.push($cell.text());\n        if (rowspan > 1) {\n          rowspans[actualColId] = {\n            rowSpan: rowspan - 1,\n            text: $cell.text()\n          };\n        }\n        actualColId++;\n      }\n      htmlColId++;\n    }\n    addRowToString(rowArray);\n  });\n\n  return csvString;\n};\n","\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\n\nvar Color = require(\"color\");\n\n\n\nvar root = (module.exports = function(yasr) {\n  var plugin = {};\n  var options = $.extend(true, {}, root.defaults);\n  var defaultColor = Color(options.defaultColor);\n  var defaultStyle = options.defaultStyle;\n\n  var cm = null;\n\n  var getOption = function(key) {\n    // if (!options[key]) return {};\n    if (options[key]) {\n      if (typeof options[key] === \"function\") {\n        return options[key](yasr, L);\n      } else {\n        return options[key];\n      }\n    } else {\n      return undefined;\n    }\n  };\n\n\n  var getSvgMarker = function(colors) {\n    var fillColor2 = colors.fill.lighten(0.3);\n    var borderColor2 = colors.border.lighten(0.3);\n    return (\n      '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"25\" height=\"40\"><defs><linearGradient id=\"c\"><stop offset=\"0\" stop-color=\"' +\n      colors.fill +\n      '\"/><stop offset=\"1\" stop-color=\"' +\n      fillColor2 +\n      '\"/></linearGradient><linearGradient id=\"d\"><stop offset=\"0\" stop-color=\"' +\n      colors.border +\n      '\"/><stop offset=\"1\" stop-color=\"' +\n      borderColor2 +\n      '\"/></linearGradient><linearGradient xlink:href=\"#a\" x1=\"351.1\" y1=\"551.6\" x2=\"351.1\" y2=\"512.9\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(-2.715)\"/><linearGradient xlink:href=\"#a\" x1=\"318.6\" y1=\"550.1\" x2=\"318.6\" y2=\"512.4\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(94.732,2.054)\"/><linearGradient xlink:href=\"#a\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"matrix(-1,0,0,1,731.268,2.054)\" x1=\"318.6\" y1=\"550.1\" x2=\"318.6\" y2=\"512.4\"/><linearGradient xlink:href=\"#a\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(94.232,2.054)\" x1=\"318.6\" y1=\"550.1\" x2=\"318.6\" y2=\"512.4\"/><linearGradient xlink:href=\"#a\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(-28.58,-0.437)\" x1=\"445.3\" y1=\"541.3\" x2=\"445.3\" y2=\"503.7\"/><linearGradient xlink:href=\"#b\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(63,-0.438)\" x1=\"351.7\" y1=\"522.8\" x2=\"351.7\" y2=\"503.7\"/><linearGradient xlink:href=\"#a\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(-28.58,-0.437)\" x1=\"445.3\" y1=\"541.3\" x2=\"445.3\" y2=\"503.7\"/><linearGradient xlink:href=\"#b\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(63,-0.438)\" x1=\"351.7\" y1=\"522.8\" x2=\"351.7\" y2=\"503.7\"/><linearGradient xlink:href=\"#a\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(-28.58,-0.437)\" x1=\"445.3\" y1=\"541.3\" x2=\"445.3\" y2=\"503.7\"/><linearGradient xlink:href=\"#b\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(63,-0.438)\" x1=\"351.7\" y1=\"522.8\" x2=\"351.7\" y2=\"503.7\"/><linearGradient xlink:href=\"#a\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(-432.796,-503.349)\" x1=\"445.3\" y1=\"541.3\" x2=\"445.3\" y2=\"503.7\"/><linearGradient xlink:href=\"#b\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(-341.216,-503.35)\" x1=\"351.7\" y1=\"522.8\" x2=\"351.7\" y2=\"503.7\"/><linearGradient xlink:href=\"#a\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(-28.846,-0.287)\" x1=\"445.3\" y1=\"541.3\" x2=\"445.3\" y2=\"503.7\"/><linearGradient xlink:href=\"#b\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(62.734,-0.288)\" x1=\"351.7\" y1=\"522.8\" x2=\"351.7\" y2=\"503.7\"/></defs><rect y=\"4.5\" x=\"6.3\" height=\"14.5\" width=\"12.6\" fill=\"#fff\"/><path d=\"M12.6 0.6C6 0.6 0.6 6.2 0.6 12.4c0 2.8 1.6 6.3 2.7 8.7l9.3 17.9 9.3-17.9c1.1-2.4 2.7-5.8 2.7-8.7 0-6.2-5.4-11.9-12-11.9zm0 7.2c2.6 0 4.7 2.1 4.7 4.7 0 2.6-2.1 4.7-4.7 4.7-2.6 0-4.7-2.1-4.7-4.7 0-2.6 2.1-4.7 4.7-4.7z\" style=\"fill:url(#c);stroke:url(#d)\"/><path d=\"m12.6 1.7c-5.9 0-10.9 5.2-10.9 10.8 0 2.4 1.4 5.8 2.6 8.3l0 0 8.3 16 8.3-16 0 0c1.1-2.4 2.6-5.7 2.6-8.2 0-5.5-4.9-10.7-10.9-10.7zm0 5c3.2 0 5.8 2.6 5.8 5.8 0 3.2-2.6 5.8-5.8 5.8-3.2 0-5.7-2.6-5.7-5.8 0-3.2 2.6-5.8 5.8-5.8z\" style=\"fill:none;stroke-opacity:0.1;stroke:#fff\"/></svg>'\n    );\n  };\n  var draw = function() {\n    var _L = options.L;\n    require(\"proj4\");\n    require(\"proj4leaflet\");\n    //Ugly... need to set this global, as wicket-leaflet tries to access this global variable\n    global.Wkt = require(\"wicket/wicket\");\n    require(\"wicket/wicket-leaflet\");\n    var zoomToEl = function(e) {\n      map.setView(e.latlng, 15);\n    };\n    var plotVariables = getGeoVariables();\n    if (plotVariables.length === 0)\n      return $('<div class=\"leaflet\">Nothing to draw</div>').appendTo(yasr.resultsContainer);\n    var mapWrapper = $('<div class=\"leaflet\"/>').appendTo(yasr.resultsContainer);\n    var mapConstructor = options.map;\n    if (!mapConstructor) mapConstructor = options.maps[options.defaultMap || \"osm\"];\n    if (!mapConstructor) {\n      console.error('Could not find leaflet configuration for map ' + options.defaultMap);\n      return;\n    }\n    var map = new _L.Map(mapWrapper.get()[0], mapConstructor(yasr, L));\n\n    var mapLayers = options.defaultOverlay;\n    if(mapLayers) _L.control.layers(null, mapLayers).addTo(map);\n\n\n    var features = [];\n    var bindings = yasr.results.getBindings();\n    var hasLabel = false;\n    for (var varId = 0; varId < plotVariables.length; varId++) {\n      var plotVariable = plotVariables[varId];\n\n      for (var i = 0; i < bindings.length; i++) {\n        var binding = bindings[i];\n        if (!binding[plotVariable].value) continue;\n\n        var getColor = function() {\n          var colorBinding = binding[plotVariable + \"Color\"];\n          if (colorBinding) return Color(colorBinding.value);\n          return defaultColor;\n        };\n\n        var colors = {\n          fill: getColor()\n        };\n        colors.border = colors.fill.saturate(0.2);\n\n        var wicket = new Wkt.Wkt();\n        var mySVGIcon = _L.divIcon({\n          iconSize: [25, 41],\n          // shadowSize: [25, 45],\n          iconAnchor: [12, 41],\n          popupAnchor: [0, -41],\n          html: getSvgMarker(colors)\n        });\n\n\n        var style = $.extend(true, defaultStyle, { icon: mySVGIcon, color: colors.fill})\n        var feature = wicket.read(binding[plotVariable].value).toObject(style);\n\n        var popupContent = options.formatPopup && options.formatPopup(yasr, L, plotVariable, binding);\n        if (popupContent) {\n          function addPopupAndEventsToMarker(el) {\n            el.on(\"dblclick\", zoomToEl);\n            var popupContent = options.formatPopup && options.formatPopup(yasr, L, plotVariable, binding);\n            if (popupContent) {\n              hasLabel = true;\n              el.bindPopup(popupContent);\n            }\n          }\n\n          var markerPos;\n          if (feature.getBounds) {\n            //get center of polygon or something\n            markerPos = feature.getBounds().getCenter();\n          } else if (feature.getLatLng) {\n            //its a point, just get the lat/lng\n            markerPos = feature.getLatLng();\n          }\n          if (markerPos) {\n            var shouldDrawSeparateMarker = !!feature.getBounds; //a lat/lng is already a marker\n            if (shouldDrawSeparateMarker) {\n              addPopupAndEventsToMarker(_L.marker(markerPos, { icon: mySVGIcon }).addTo(map));\n            } else {\n              addPopupAndEventsToMarker(feature);\n            }\n          }\n        }\n        features.push(feature);\n      }\n    }\n    if (features.length) {\n      try {\n        var group = new _L.featureGroup(features).addTo(map);\n        map.fitBounds(group.getBounds());\n      } catch(e) {\n        //This is a strange issue. Depending on which leaflet instance was used (i.e. the window.L one, or the required one)\n\t//we might run into issues where the returned bounds are undefined...\n\t//solved it by simply preferring the global instance (though this can be turned off)\n        throw e;\n      }\n    }\n\n    // missingPopupMsg: function(yasr, L, geoVariables, bindings) {\n    if (!hasLabel && options.missingPopupMsg) {\n      var msg = null;\n      if (typeof options.missingPopupMsg === \"string\") {\n        msg = options.missingPopupMsg;\n      } else if (typeof options.missingPopupMsg === \"function\") {\n        msg = options.missingPopupMsg(yasr, L, plotVariables);\n      }\n      if (msg) yasr.resultsContainer.prepend(msg);\n    }\n  };\n\n  var geoKeywords = [\"POINT\", \"POLYGON\", \"LINESTRING\", \"MULTIPOINT\", \"MULTILINESTRING\", \"MULTIPOLYGON\"];\n  var valueIsGeometric = function(val) {\n    val = val.trim().toUpperCase();\n    for (var i = 0; i < geoKeywords.length; i++) {\n      if (val.indexOf(geoKeywords[i]) === 0) {\n        return true;\n      }\n    }\n    return false;\n  };\n  var getGeoVariables = function() {\n    if (!yasr.results) return [];\n    var bindings = yasr.results.getBindings();\n    if (!bindings || bindings.length === 0) {\n      return [];\n    }\n    var geoVars = [];\n    var checkedVars = [];\n    for (var i = 0; i < bindings.length; i++) {\n      //we'd like to have checked at least 1 value for all variables. So keep looping\n      //in case the first row does not contain values for all bound vars (e.g. optional)\n      var binding = bindings[i];\n      for (var bindingVar in binding) {\n        if (checkedVars.indexOf(bindingVar) === -1 && binding[bindingVar].value) {\n          checkedVars.push(bindingVar);\n          if (valueIsGeometric(binding[bindingVar].value)) geoVars.push(bindingVar);\n        }\n      }\n      if (checkedVars.length === yasr.results.getVariables().length) {\n        //checked all vars. can break now\n        break;\n      }\n    }\n    return geoVars;\n  };\n  var canHandleResults = function() {\n    return getGeoVariables().length > 0;\n  };\n\n  return {\n    draw: draw,\n    name: \"Geo\",\n    canHandleResults: canHandleResults,\n    getPriority: 2\n  };\n});\n\nvar maps = {\n  osm: function(yasr, L) {\n    return {\n      layers: [\n        new L.tileLayer(\"http://{s}.tile.osm.org/{z}/{x}/{y}.png\", {\n          attribution: '&copy; <a href=\"http://osm.org/copyright\">OpenStreetMap</a> contributors'\n        })\n      ]\n    };\n  },\n  nlmaps: function(yasr, L) {\n    var res = [3440.64, 1720.32, 860.16, 430.08, 215.04, 107.52, 53.76, 26.88, 13.44, 6.72, 3.36, 1.68, 0.84, 0.42];\n    var scales = [];\n    res.forEach(function(res) {\n      scales.push(1 / res);\n    });\n\n    var k = new L.Proj\n      .CRS(\n      \"EPSG:28992\",\n      \"+proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +towgs84=565.2369,50.0087,465.658,-0.406857330322398,0.350732676542563,-1.8703473836068,4.0812 +no_defs\",\n      {\n        transformation: new L.Transformation(1, 285401.92, -1, 903401.92),\n        scales: scales,\n        bounds: new L.bounds([-285401.92, 22598.08], [595401.9199999999, 903401.9199999999])\n      }\n    );\n    return {\n      crs: k,\n      layers: [\n        new L.tileLayer.wms(\"http://geodata.nationaalgeoregister.nl/tms/1.0.0/brtachtergrondkaart/{z}/{x}/{y}.png\", {\n          minZoom: 1,\n          maxZoom: 13,\n          tms: true\n        })\n      ]\n    };\n  },\n  /* free only up to 25'000 megapixels/year see https://shop.swisstopo.admin.ch/en/products/geoservice/swisstopo_geoservices/WMTS_info for further informations */\n  chmaps: function(yasr, L) {\n    var url = 'https://wmts10.geo.admin.ch/1.0.0/ch.swisstopo.pixelkarte-farbe/default/current/3857/{z}/{x}/{y}.jpeg';\n    var stopoAttr = 'Map data &copy; <a href=\"https://www.swisstopo.admin.ch/\">swisstopo</a> , ';\n    var tilelayer = new L.tileLayer(url,{id: 'stopo.light', attribution: stopoAttr, minZoom: 4, maxZoom: 19});\n\n    return {\n      layers: [tilelayer] ,\n      crs: L.CRS.EPSG3857,\n          continuousWorld: true,\n          worldCopyJump: false\n    };\n  }\n};\nroot.defaults = {\n  maps: maps,\n  L: window.L || require('leaflet'),\n  formatPopup: function(yasr, L, forVariable, bindings) {\n    if (bindings[forVariable + \"Label\"] && bindings[forVariable + \"Label\"].value) {\n      return bindings[forVariable + \"Label\"].value;\n    }\n  },\n  missingPopupMsg: function(yasr, L, geoVariables) {\n    if (geoVariables && geoVariables.length) {\n      return (\n        \"<small>Tip: Add a label variable prefixed with the geo variable name to show popups on the map. E.g. <code>\" +\n        geoVariables[0] +\n        \"Label</code>. Or, append <code>Color</code> to change the color of the shape or marker.</small>\"\n      );\n    }\n  },\n  disabledTitle: \"Query for geo variables in WKT format to plot them on a map\",\n  defaultColor: \"#2e6c97\",\n  defaultStyle: {},\n  defaultOverlay: null,\n  defaultMap: \"osm\" //or nlmaps\n};\n\nroot.version = {\n  leaflet: root.defaults.L.version\n};\n","\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})(), EventEmitter = require(\"events\").EventEmitter, utils = require(\"yasgui-utils\");\nconsole = console || {\n  log: function() {}\n}; //make sure any console statements don't break in IE\n\nrequire(\"./jquery/extendJquery.js\");\n\n/**\n * Main YASR constructor\n *\n * @constructor\n * @param {DOM-Element} parent element to append editor to.\n * @param {object} settings\n * @class YASR\n * @return {doc} YASR document\n */\nvar YASR = function(parent, options, queryResults) {\n  EventEmitter.call(this);\n  var yasr = this;\n  // console.log(EventEmitter.call(this));\n\n  // var yasr = {};\n  // EventEmitter.call(yasr);\n  yasr.options = $.extend(true, {}, module.exports.defaults, options);\n  //the recursive copy does merge (overwrite) array values how we want it to. Do this manually\n  if (options && options.outputPlugins) yasr.options.outputPlugins = options.outputPlugins;\n\n  yasr.container = $(\"<div class='yasr'></div>\").appendTo(parent);\n  yasr.header = $(\"<div class='yasr_header'></div>\").appendTo(yasr.container);\n  yasr.resultsContainer = $(\"<div class='yasr_results'></div>\").appendTo(yasr.container);\n  yasr.storage = utils.storage;\n\n  var prefix = null;\n  yasr.getPersistencyId = function(postfix) {\n    if (prefix === null) {\n      //instantiate prefix\n      if (yasr.options.persistency && yasr.options.persistency.prefix) {\n        prefix = typeof yasr.options.persistency.prefix == \"string\"\n          ? yasr.options.persistency.prefix\n          : yasr.options.persistency.prefix(yasr);\n      } else {\n        prefix = false;\n      }\n    }\n    if (prefix && postfix != null) {\n      return prefix + (typeof postfix == \"string\" ? postfix : postfix(yasr));\n    } else {\n      return null;\n    }\n  };\n\n  if (yasr.options.useGoogleCharts) {\n    //pre-load google-loader\n    require(\"./gChartLoader.js\")\n      .once(\"initError\", function() {\n        yasr.options.useGoogleCharts = false;\n      })\n      .init();\n  }\n\n  //first initialize plugins\n  yasr.plugins = {};\n  for (var pluginName in module.exports.plugins) {\n    if (!yasr.options.useGoogleCharts && pluginName == \"gchart\") continue;\n    yasr.plugins[pluginName] = new module.exports.plugins[pluginName](yasr);\n  }\n\n  yasr.updateHeader = function() {\n    var downloadIcon = yasr.header.find(\".yasr_downloadIcon\").removeAttr(\"title\"); //and remove previous titles\n    var embedButton = yasr.header.find(\".yasr_embedBtn\");\n    var outputPlugin = yasr.plugins[yasr.options.output];\n    if (outputPlugin) {\n      //Manage download link\n      var info = outputPlugin.getDownloadInfo ? outputPlugin.getDownloadInfo() : null;\n      if (info) {\n        if (info.buttonTitle) downloadIcon.attr(\"title\", info.buttonTitle);\n        downloadIcon.prop(\"disabled\", false);\n        downloadIcon.find(\"path\").each(function() {\n          this.style.fill = \"black\";\n        });\n      } else {\n        downloadIcon.prop(\"disabled\", true).prop(\"title\", \"Download not supported for this result representation\");\n        downloadIcon.find(\"path\").each(function() {\n          this.style.fill = \"gray\";\n        });\n      }\n\n      //Manage embed button\n      var link = null;\n      if (outputPlugin.getEmbedHtml) link = outputPlugin.getEmbedHtml();\n      if (link && link.length > 0) {\n        embedButton.show();\n      } else {\n        embedButton.hide();\n      }\n    }\n  };\n  yasr.draw = function(output) {\n    if (!yasr.results) return false;\n    if (!output) output = yasr.options.output;\n\n    //ah, our default output does not take our current results. Try to autodetect\n    var selectedOutput = null;\n    var selectedOutputPriority = -1;\n    var unsupportedOutputs = [];\n    for (var tryOutput in yasr.plugins) {\n      if (yasr.plugins[tryOutput].canHandleResults(yasr)) {\n        var priority = yasr.plugins[tryOutput].getPriority;\n        if (typeof priority == \"function\") priority = priority(yasr);\n        if (priority != null && priority != undefined && priority > selectedOutputPriority) {\n          selectedOutputPriority = priority;\n          selectedOutput = tryOutput;\n        }\n      } else {\n        unsupportedOutputs.push(tryOutput);\n      }\n    }\n    disableOutputs(unsupportedOutputs);\n    var outputToDraw = null;\n    if (output in yasr.plugins && yasr.plugins[output].canHandleResults(yasr)) {\n      outputToDraw = output;\n    } else if (selectedOutput) {\n      outputToDraw = selectedOutput;\n    }\n\n    if (outputToDraw) {\n      $(yasr.resultsContainer).empty();\n      yasr.emit(\"draw\", yasr, yasr.plugins[outputToDraw]);\n      yasr.plugins[outputToDraw].draw();\n      yasr.emit(\"drawn\", yasr, yasr.plugins[outputToDraw]);\n      yasr.updateHeader();\n      return true;\n    } else {\n      yasr.updateHeader();\n      return false;\n    }\n  };\n\n  var disableOutputs = function(outputs) {\n    //first enable everything.\n    yasr.header.find(\".yasr_btnGroup .yasr_btn\").removeClass(\"disabled\");\n\n    //now disable the outputs passed as param\n    outputs.forEach(function(outputName) {\n      var disabledTitle, disabledMsg;\n      if (module.exports.plugins[outputName] && module.exports.plugins[outputName].defaults) {\n        disabledTitle = module.exports.plugins[outputName].defaults.disabledTitle;\n      }\n      yasr.header.find(\".yasr_btnGroup .select_\" + outputName).addClass(\"disabled\").attr(\"title\", disabledTitle || \"\");\n    });\n  };\n  yasr.somethingDrawn = function() {\n    return !yasr.resultsContainer.is(\":empty\");\n  };\n\n  yasr.setResponse = function(dataOrJqXhr, textStatus, jqXhrOrErrorString) {\n    try {\n      yasr.results = require(\"./parsers/wrapper.js\")(dataOrJqXhr, textStatus, jqXhrOrErrorString);\n    } catch (exception) {\n      console.log(exception);\n      yasr.results = {\n        getException: function() {\n          return exception;\n        }\n      };\n    }\n    yasr.draw();\n\n    //store if needed\n    var resultsId = yasr.getPersistencyId(yasr.options.persistency.results.key);\n    if (resultsId) {\n      if (\n        !yasr.results.getException() &&\n        yasr.results.getOriginalResponseAsString &&\n        yasr.results.getOriginalResponseAsString().length < yasr.options.persistency.results.maxSize\n      ) {\n        utils.storage.set(resultsId, yasr.results.getAsStoreObject(), \"month\", yasr.options.onQuotaExceeded);\n      } else {\n        //remove old string\n        utils.storage.remove(resultsId);\n      }\n    }\n  };\n  var $toggableWarning = null;\n  var $toggableWarningClose = null;\n  var $toggableWarningMsg = null;\n  yasr.warn = function(warning) {\n    if (!$toggableWarning) {\n      //first time instantiation\n      $toggableWarning = $(\"<div>\", {\n        class: \"toggableWarning\"\n      })\n        .prependTo(yasr.container)\n        .hide();\n      $toggableWarningClose = $(\"<span>\", {\n        class: \"toggleWarning\"\n      })\n        .html(\"&times;\")\n        .click(function() {\n          $toggableWarning.hide(400);\n        })\n        .appendTo($toggableWarning);\n      $toggableWarningMsg = $(\"<span>\", {\n        class: \"toggableMsg\"\n      }).appendTo($toggableWarning);\n    }\n    $toggableWarningMsg.empty();\n    if (warning instanceof $) {\n      $toggableWarningMsg.append(warning);\n    } else {\n      $toggableWarningMsg.html(warning);\n    }\n    $toggableWarning.show(400);\n  };\n\n  var blobDownloadSupported = null;\n  var checkBlobDownloadSupported = function() {\n    if (blobDownloadSupported === null) {\n      var windowUrl = window.URL || window.webkitURL || window.mozURL || window.msURL;\n      blobDownloadSupported = windowUrl && Blob;\n    }\n    return blobDownloadSupported;\n  };\n  var embedBtn = null;\n  var drawHeader = function(yasr) {\n    var drawOutputSelector = function() {\n      var btnGroup = $('<div class=\"yasr_btnGroup\"></div>');\n      $.each(yasr.options.outputPlugins, function(i, pluginName) {\n        var plugin = yasr.plugins[pluginName];\n        if (!plugin) return; //plugin not loaded\n\n        if (plugin.hideFromSelection) return;\n        var name = plugin.name || pluginName;\n        var button = $(\"<button class='yasr_btn'></button>\")\n          .text(name)\n          .addClass(\"select_\" + pluginName)\n          .click(function() {\n            //update buttons\n            btnGroup.find(\"button.selected\").removeClass(\"selected\");\n            $(this).addClass(\"selected\");\n            //set and draw output\n            yasr.options.output = pluginName;\n\n            //store if needed\n            yasr.store();\n\n            //close warning if there is any\n            if ($toggableWarning) $toggableWarning.hide(400);\n\n            yasr.draw();\n          })\n          .appendTo(btnGroup);\n        if (yasr.options.output == pluginName) button.addClass(\"selected\");\n      });\n\n      if (btnGroup.children().length > 1) yasr.header.append(btnGroup);\n    };\n    var drawDownloadIcon = function() {\n      var stringToUrl = function(string, contentType) {\n        var url = null;\n        var windowUrl = window.URL || window.webkitURL || window.mozURL || window.msURL;\n        if (windowUrl && Blob) {\n          var blob = new Blob([string], {\n            type: contentType\n          });\n          url = windowUrl.createObjectURL(blob);\n        }\n        return url;\n      };\n      var button = $(\"<button class='yasr_btn yasr_downloadIcon btn_icon'></button>\")\n        .append(require(\"yasgui-utils\").svg.getElement(require(\"./imgs.js\").download))\n        .click(function() {\n          var currentPlugin = yasr.plugins[yasr.options.output];\n          if (currentPlugin && currentPlugin.getDownloadInfo) {\n            var downloadInfo = currentPlugin.getDownloadInfo();\n            var downloadUrl = stringToUrl(\n              downloadInfo.getContent(),\n              downloadInfo.contentType ? downloadInfo.contentType : \"text/plain\"\n            );\n            var downloadMockLink = $(\"<a></a>\", {\n              href: downloadUrl,\n              download: downloadInfo.filename\n            });\n            require(\"./utils.js\").fireClick(downloadMockLink);\n            //\t\t\t\t\t\tdownloadMockLink[0].click();\n          }\n        });\n      yasr.header.append(button);\n    };\n    var drawFullscreenButton = function() {\n      var button = $(\"<button class='yasr_btn btn_fullscreen btn_icon'></button>\")\n        .append(require(\"yasgui-utils\").svg.getElement(require(\"./imgs.js\").fullscreen))\n        .click(function() {\n          yasr.container.addClass(\"yasr_fullscreen\");\n        });\n      yasr.header.append(button);\n    };\n    var drawSmallscreenButton = function() {\n      var button = $(\"<button class='yasr_btn btn_smallscreen btn_icon'></button>\")\n        .append(require(\"yasgui-utils\").svg.getElement(require(\"./imgs.js\").smallscreen))\n        .click(function() {\n          yasr.container.removeClass(\"yasr_fullscreen\");\n        });\n      yasr.header.append(button);\n    };\n    var drawEmbedButton = function() {\n      embedBtn = $(\"<button>\", {\n        class: \"yasr_btn yasr_embedBtn\",\n        title: \"Get HTML snippet to embed results on a web page\"\n      })\n        .text(\"</>\")\n        .click(function(event) {\n          var currentPlugin = yasr.plugins[yasr.options.output];\n          if (currentPlugin && currentPlugin.getEmbedHtml) {\n            var embedLink = currentPlugin.getEmbedHtml();\n\n            event.stopPropagation();\n            var popup = $(\"<div class='yasr_embedPopup'></div>\").appendTo(yasr.header);\n            $(\"html\").click(function() {\n              if (popup) popup.remove();\n            });\n\n            popup.click(function(event) {\n              event.stopPropagation();\n              //dont close when clicking on popup\n            });\n            var prePopup = $(\"<textarea>\").val(embedLink);\n            prePopup.focus(function() {\n              var $this = $(this);\n              $this.select();\n\n              // Work around Chrome's little problem\n              $this.mouseup(function() {\n                // Prevent further mouseup intervention\n                $this.unbind(\"mouseup\");\n                return false;\n              });\n            });\n\n            popup.empty().append(prePopup);\n            var positions = embedBtn.position();\n            var top = positions.top + embedBtn.outerHeight() + \"px\";\n            var left = Math.max(positions.left + embedBtn.outerWidth() - popup.outerWidth(), 0) + \"px\";\n\n            popup.css(\"top\", top).css(\"left\", left);\n          }\n        });\n      yasr.header.append(embedBtn);\n    };\n    drawFullscreenButton();\n    drawSmallscreenButton();\n    if (yasr.options.drawOutputSelector) drawOutputSelector();\n    if (yasr.options.drawDownloadIcon && checkBlobDownloadSupported()) drawDownloadIcon(); //only draw when it's supported\n    drawEmbedButton();\n  };\n\n  var persistentId = null;\n  //store persistent options (not results though. store these separately, as they are too large)\n  yasr.store = function() {\n    if (!persistentId) persistentId = yasr.getPersistencyId(\"main\");\n    if (persistentId) {\n      utils.storage.set(persistentId, yasr.getPersistentSettings(), null, yasr.options.onQuotaExceeded);\n    }\n  };\n\n  yasr.load = function() {\n    if (!persistentId) persistentId = yasr.getPersistencyId(\"main\");\n    yasr.setPersistentSettings(utils.storage.get(persistentId));\n  };\n\n  yasr.setPersistentSettings = function(settings) {\n    if (settings) {\n      if (settings.output) {\n        yasr.options.output = settings.output;\n      }\n      for (var pluginName in settings.plugins) {\n        if (yasr.plugins[pluginName] && yasr.plugins[pluginName].setPersistentSettings) {\n          yasr.plugins[pluginName].setPersistentSettings(settings.plugins[pluginName]);\n        }\n      }\n    }\n  };\n\n  yasr.getPersistentSettings = function() {\n    var settings = {\n      output: yasr.options.output,\n      plugins: {}\n    };\n    for (var pluginName in yasr.plugins) {\n      if (yasr.plugins[pluginName].getPersistentSettings) {\n        settings.plugins[pluginName] = yasr.plugins[pluginName].getPersistentSettings();\n      }\n    }\n    return settings;\n  };\n\n  /**\n\t * postprocess\n\t */\n  yasr.load();\n  drawHeader(yasr);\n  if (!queryResults && yasr.options.persistency && yasr.options.persistency.results) {\n    var resultsId = yasr.getPersistencyId(yasr.options.persistency.results.key);\n    var fromStorage;\n    if (resultsId) {\n      fromStorage = utils.storage.get(resultsId);\n    }\n\n    if (!fromStorage && yasr.options.persistency.results.id) {\n      //deprecated! But keep for backwards compatability\n      //if results are stored under old ID. Fetch the results, and delete that key (results can be large, and clutter space)\n      //setting the results, will automatically store it under the new key, so we don't have to worry about that here\n      var deprId = typeof yasr.options.persistency.results.id == \"string\"\n        ? yasr.options.persistency.results.id\n        : yasr.options.persistency.results.id(yasr);\n      if (deprId) {\n        fromStorage = utils.storage.get(deprId);\n        if (fromStorage) utils.storage.remove(deprId);\n      }\n    }\n    if (fromStorage) {\n      if ($.isArray(fromStorage)) {\n        yasr.setResponse.apply(this, fromStorage);\n      } else {\n        yasr.setResponse(fromStorage);\n      }\n    }\n  }\n\n  if (queryResults) {\n    yasr.setResponse(queryResults);\n  }\n  yasr.updateHeader();\n\n  return yasr;\n};\n\nYASR.prototype = new EventEmitter();\nmodule.exports = function(parent, options, queryResults) {\n  return new YASR(parent, options, queryResults);\n};\n\nmodule.exports.plugins = {};\nmodule.exports.registerOutput = function(name, constructor) {\n  module.exports.plugins[name] = constructor;\n};\n\n/**\n * The default options of YASR. Either change the default options by setting YASR.defaults, or by\n * passing your own options as second argument to the YASR constructor\n *\n * @attribute YASR.defaults\n */\nmodule.exports.defaults = require(\"./defaults.js\");\nmodule.exports.version = {\n  YASR: require(\"../package.json\").version,\n  jquery: $.fn.jquery,\n  \"yasgui-utils\": require(\"yasgui-utils\").version\n};\nmodule.exports.$ = $;\n\n//put these in a try-catch. When using the unbundled version, and when some dependencies are missing, then YASR as a whole will still function\ntry {\n  module.exports.registerOutput(\"boolean\", require(\"./boolean.js\"));\n} catch (e) {\n  console.warn(e);\n}\ntry {\n  module.exports.registerOutput(\"rawResponse\", require(\"./rawResponse.js\"));\n} catch (e) {\n  console.warn(e);\n}\ntry {\n  module.exports.registerOutput(\"leaflet\", require(\"./leaflet.js\"));\n} catch (e) {\n  console.warn(e);\n}\ntry {\n  module.exports.registerOutput(\"table\", require(\"./table.js\"));\n} catch (e) {\n  console.warn(e);\n}\ntry {\n  module.exports.registerOutput(\"error\", require(\"./error.js\"));\n} catch (e) {\n  console.warn(e);\n}\ntry {\n  module.exports.registerOutput(\"pivot\", require(\"./pivot.js\"));\n} catch (e) {\n  console.warn(e);\n}\ntry {\n  module.exports.registerOutput(\"gchart\", require(\"./gchart.js\"));\n} catch (e) {\n  console.warn(e);\n}\n","\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\nvar root = module.exports = function(queryResponse) {\n  return require(\"./dlv.js\")(queryResponse, \",\");\n};\n","\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\nrequire(\"../../lib/jquery.csv-0.71.js\");\nvar root = (module.exports = function(queryResponse, separator, opts) {\n  opts = opts || {};\n\n  var json = {};\n  var arrays = $.csv.toArrays(queryResponse, {\n    separator: separator\n  });\n  var detectType = function(value) {\n    if (value.indexOf(\"http\") == 0) {\n      return \"uri\";\n    } else {\n      return null;\n    }\n  };\n\n  var getBoolean = function() {\n    if (\n      arrays.length == 2 &&\n      arrays[0].length == 1 &&\n      arrays[1].length == 1 &&\n      arrays[0][0] == \"boolean\" &&\n      (arrays[1][0] == \"1\" || arrays[1][0] == \"0\")\n    ) {\n      json.boolean = arrays[1][0] == \"1\" ? true : false;\n      return true;\n    }\n    return false;\n  };\n\n  var getVariables = function() {\n    if (arrays.length > 0 && arrays[0].length > 0) {\n      json.head = {\n        vars: arrays[0].map(function(v) {\n          if (opts.mapVariable) return opts.mapVariable(v);\n          return v;\n        })\n      };\n      return true;\n    }\n    return false;\n  };\n\n  var getBindings = function() {\n    if (arrays.length > 1) {\n      json.results = {\n        bindings: []\n      };\n      for (var rowIt = 1; rowIt < arrays.length; rowIt++) {\n        var binding = {};\n        for (var colIt = 0; colIt < arrays[rowIt].length; colIt++) {\n          var varName = json.head.vars[colIt];\n          if (varName) {\n            var value = opts.mapValue ? opts.mapValue(arrays[rowIt][colIt]) : arrays[rowIt][colIt];\n            var detectedType = detectType(value);\n            binding[varName] = {\n              value: value\n            };\n            if (detectedType) binding[varName].type = detectedType;\n          }\n        }\n\n        json.results.bindings.push(binding);\n      }\n      return true;\n    }\n    return false;\n  };\n  var isBoolean = getBoolean();\n  if (!isBoolean) {\n    var varsFetched = getVariables();\n    if (varsFetched) getBindings();\n  }\n\n  return json;\n});\n","\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\nvar map = require(\"lodash/map\");\nvar reduce = require(\"lodash/reduce\");\n\nvar getAsObject = function(entity) {\n  if (typeof entity == \"object\") {\n    if (\"bnode\" == entity.type) {\n      entity.value = entity.value.slice(2);\n    }\n    return entity;\n  }\n  if (entity.indexOf(\"_:\") == 0) {\n    return {\n      type: \"bnode\",\n      value: entity.slice(2)\n    };\n  }\n  return {\n    type: \"uri\",\n    value: entity\n  };\n};\nvar root = module.exports = function(responseJson) {\n  if (responseJson) {\n    var hasContext = false;\n    var mapped = map(responseJson, function(value, subject) {\n      return map(value, function(value1, predicate) {\n        return map(value1, function(object) {\n          if (object.graphs) {\n            hasContext = true;\n            return map(object.graphs, function(context) {\n              return [getAsObject(subject), getAsObject(predicate), getAsObject(object), getAsObject(context)];\n            });\n          } else {\n            return [getAsObject(subject), getAsObject(predicate), getAsObject(object)];\n          }\n        });\n      });\n    });\n    var reduced = reduce(\n      mapped,\n      function(memo, el) {\n        return memo.concat(el);\n      },\n      []\n    );\n    reduced = reduce(\n      reduced,\n      function(memo, el) {\n        return memo.concat(el);\n      },\n      []\n    );\n    var bindings;\n    if (!hasContext) {\n      bindings = reduced.map(function(triple) {\n        return { subject: triple[0], predicate: triple[1], object: triple[2] };\n      });\n    } else {\n      reduced = reduce(\n        reduced,\n        function(memo, el) {\n          return memo.concat(el);\n        },\n        []\n      );\n      bindings = reduced.map(function(triple) {\n        return { subject: triple[0], predicate: triple[1], object: triple[2], context: triple[3] };\n      });\n    }\n    var variables = hasContext ? [\"subject\", \"predicate\", \"object\", \"context\"] : [\"subject\", \"predicate\", \"object\"];\n    return {\n      head: {\n        vars: variables\n      },\n      results: {\n        bindings: bindings\n      }\n    };\n  }\n  return false;\n};\n","\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\nvar root = module.exports = function(queryResponse) {\n  if (typeof queryResponse == \"string\") {\n    try {\n      return JSON.parse(queryResponse);\n    } catch (e) {\n      return false;\n    }\n  }\n  if (typeof queryResponse == \"object\" && queryResponse.constructor === ({}).constructor) {\n    return queryResponse;\n  }\n  return false;\n};\n","\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\nvar root = (module.exports = function(queryResponse) {\n  return require(\"./dlv.js\")(queryResponse, \"\\t\", {\n    mapVariable: function(variable) {\n      if (variable[0] === \"?\") return variable.substring(1);\n      return variable;\n    },\n    mapValue: function(val) {\n      if (val[0] === \"<\" && val[val.length - 1] === \">\") return val.substring(1, val.length - 1);\n      return val;\n    }\n  });\n});\n","\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\n\n/**\n * arg1 can be:\n * - a string (an exception, or e.g. a csv result string)\n * - an object (e.g. xml or json object)\n * - an object with exception key (contains solely a string to display)\n * - a jqXHR object (when this function is used as 'fail' callback for jquery)\n * arg2 can be:\n * - the textstatus of the response\n * arg3 can be:\n * - a jqXHR object (when this function is used as 'done/success' callback for jquery)\n * - an 'errorThrown' string (\n */\nvar root = (module.exports = function(dataOrJqXhr, textStatus, jqXhrOrErrorString) {\n  var parsers = {\n    xml: require(\"./xml.js\"),\n    json: require(\"./json.js\"),\n    tsv: require(\"./tsv.js\"),\n    csv: require(\"./csv.js\"),\n    graphJson: require(\"./graphJson.js\")\n  };\n  var contentType = null;\n  var origResponse = null;\n  var json = null;\n  var type = null; //json, xml, csv, or tsv\n  var exception = null;\n\n  var init = function() {\n    if (typeof dataOrJqXhr == \"object\") {\n      /**\n\t\t\t * Extract exception info (if there is any)\n\t\t\t */\n      if (dataOrJqXhr.exception) {\n        //this object just has this exception string, nothing more. (here for backwards compatability)\n        exception = dataOrJqXhr.exception;\n      } else if (dataOrJqXhr.status != undefined && (dataOrJqXhr.status >= 300 || dataOrJqXhr.status === 0)) {\n        //this is an exception, and jquery response\n        exception = {\n          status: dataOrJqXhr.status\n        };\n        if (typeof jqXhrOrErrorString == \"string\") exception.errorString = jqXhrOrErrorString;\n        if (dataOrJqXhr.responseText) exception.responseText = dataOrJqXhr.responseText;\n        if (dataOrJqXhr.statusText) exception.statusText = dataOrJqXhr.statusText;\n      }\n\n      /**\n\t\t\t * Extract content type info (if there is any)\n\t\t\t */\n      if (dataOrJqXhr.contentType) {\n        //this is not a jqXhr object, but a manually generated object (mostly for backwards compatability)\n        contentType = dataOrJqXhr.contentType.toLowerCase();\n      } else if (dataOrJqXhr.getResponseHeader && dataOrJqXhr.getResponseHeader(\"content-type\")) {\n        var ct = dataOrJqXhr.getResponseHeader(\"content-type\").trim().toLowerCase();\n        if (ct.length > 0) contentType = ct;\n      }\n\n      /**\n\t\t\t * extract original response\n\t\t\t */\n      if (dataOrJqXhr.response) {\n        //this is not a jqXhr object, but a manually generated object (mostly for backwards compatability)\n        origResponse = dataOrJqXhr.response;\n      } else if (!textStatus && !jqXhrOrErrorString) {\n        //not called from jquery, as these other arguments are undefined.\n        //so, we can only assume the current object is a proper response (e.g. xml or json) object\n        origResponse = dataOrJqXhr;\n      }\n    }\n    if (!exception && !origResponse) {\n      //if this is called via a jquery complete callback, we should fetch the result for the jqXHR object\n      if (dataOrJqXhr.responseText) {\n        origResponse = dataOrJqXhr.responseText;\n      } else {\n        //if all else fails, assume first arg to be data object\n        //(which should be the case for most situations)\n        origResponse = dataOrJqXhr;\n      }\n    }\n  };\n\n  var getAsJson = function() {\n    if (json) return json;\n    if (json === false || exception) return false; //already tried parsing this, and failed. do not try again...\n    var getParserFromContentType = function() {\n      if (contentType) {\n        if (contentType.indexOf(\"json\") > -1) {\n          try {\n            if (contentType.indexOf(\"sparql-results+json\") > -1) {\n              json = parsers.json(origResponse);\n            } else if (contentType.indexOf(\"application/rdf+json\") > -1) {\n              json = parsers.graphJson(parsers.json(origResponse));\n            }\n          } catch (e) {\n            exception = e;\n          }\n          type = \"json\";\n        } else if (contentType.indexOf(\"xml\") > -1) {\n          try {\n            json = parsers.xml(origResponse);\n          } catch (e) {\n            exception = e;\n          }\n          type = \"xml\";\n        } else if (contentType.indexOf(\"csv\") > -1) {\n          try {\n            json = parsers.csv(origResponse);\n          } catch (e) {\n            exception = e;\n          }\n          type = \"csv\";\n        } else if (contentType.indexOf(\"tab-separated\") > -1) {\n          try {\n            json = parsers.tsv(origResponse);\n          } catch (e) {\n            exception = e;\n          }\n          type = \"tsv\";\n        }\n      }\n    };\n\n    var doLuckyGuess = function() {\n      json = parsers.json(origResponse);\n      if (json) {\n        type = \"json\";\n      } else {\n        try {\n          json = parsers.xml(origResponse);\n          if (json) type = \"xml\";\n        } catch (err) {}\n      }\n    };\n\n    getParserFromContentType();\n    if (!json) {\n      doLuckyGuess();\n    }\n    if (!json) json = false; //explicitly set to false, so we don't try to parse this thing again..\n    return json;\n  };\n\n  var getVariables = function() {\n    var json = getAsJson();\n    if (json && \"head\" in json) {\n      return json.head.vars;\n    } else {\n      return null;\n    }\n  };\n\n  var getBindings = function() {\n    var json = getAsJson();\n    if (json && \"results\" in json) {\n      return json.results.bindings;\n    } else {\n      return null;\n    }\n  };\n\n  var getBoolean = function() {\n    var json = getAsJson();\n    if (json && \"boolean\" in json) {\n      return json.boolean;\n    } else {\n      return null;\n    }\n  };\n  var getOriginalResponse = function() {\n    return origResponse;\n  };\n  var getOriginalResponseAsString = function() {\n    var responseString = \"\";\n    if (typeof origResponse == \"string\") {\n      responseString = origResponse;\n    } else if (type == \"json\") {\n      responseString = JSON.stringify(origResponse, undefined, 2); //prettifies as well\n    } else if (type == \"xml\") {\n      responseString = new XMLSerializer().serializeToString(origResponse);\n    }\n    return responseString;\n  };\n  var getException = function() {\n    return exception;\n  };\n  var getType = function() {\n    if (type == null) getAsJson(); //detects type as well\n    return type;\n  };\n\n  //process the input parameters in such a way that we can store it in local storage (i.e., no function)\n  //and, make sure we can easily pass it on back to this wrapper function when loading it again from storage\n  var getAsStoreObject = function() {\n    var storeArray = [];\n    var arg1 = {};\n    if (dataOrJqXhr.status) {\n      //jqXhr object\n      arg1.status = dataOrJqXhr.status;\n      arg1.responseText = dataOrJqXhr.responseText;\n      arg1.statusText = dataOrJqXhr.statusText;\n      arg1.contentType = contentType; //this is a function in a jqXhr object (problem for storing). but this wrapper will read it as string as well\n    } else {\n      //the other instances of this param (whether it is a json, xml, or exception object), we can normally store\n      arg1 = dataOrJqXhr;\n    }\n\n    var arg2 = textStatus;\n    var arg3 = undefined;\n    if (typeof jqXhrOrErrorString == \"string\") arg3 = jqXhrOrErrorString;\n\n    return [arg1, arg2, arg3];\n  };\n\n  init();\n  json = getAsJson();\n\n  return {\n    getAsStoreObject: getAsStoreObject,\n    getAsJson: getAsJson,\n    getOriginalResponse: getOriginalResponse,\n    getOriginalResponseAsString: getOriginalResponseAsString,\n    getOriginalContentType: function() {\n      return contentType;\n    },\n    getVariables: getVariables,\n    getBindings: getBindings,\n    getBoolean: getBoolean,\n    getType: getType,\n    getException: getException\n  };\n});\n","\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})();\nvar root = module.exports = function(xml) {\n  /**\n\t * head\n\t */\n  var parseHead = function(node) {\n    json.head = {};\n    for (var headNodeIt = 0; headNodeIt < node.childNodes.length; headNodeIt++) {\n      var headNode = node.childNodes[headNodeIt];\n      if (headNode.nodeName == \"variable\") {\n        if (!json.head.vars) json.head.vars = [];\n        var name = headNode.getAttribute(\"name\");\n        if (name) json.head.vars.push(name);\n      }\n    }\n  };\n\n  var parseResults = function(node) {\n    json.results = {};\n    json.results.bindings = [];\n    for (var resultIt = 0; resultIt < node.childNodes.length; resultIt++) {\n      var resultNode = node.childNodes[resultIt];\n      var jsonResult = null;\n\n      for (var bindingIt = 0; bindingIt < resultNode.childNodes.length; bindingIt++) {\n        var bindingNode = resultNode.childNodes[bindingIt];\n        if (bindingNode.nodeName == \"binding\") {\n          var varName = bindingNode.getAttribute(\"name\");\n          if (varName) {\n            jsonResult = jsonResult || {};\n            jsonResult[varName] = {};\n            for (var bindingInfIt = 0; bindingInfIt < bindingNode.childNodes.length; bindingInfIt++) {\n              var bindingInf = bindingNode.childNodes[bindingInfIt];\n              var type = bindingInf.nodeName;\n              if (type == \"#text\") continue;\n              jsonResult[varName].type = type;\n              jsonResult[varName].value = bindingInf.innerHTML;\n              var dataType = bindingInf.getAttribute(\"datatype\");\n              if (dataType) jsonResult[varName].datatype = dataType;\n            }\n          }\n        }\n      }\n      if (jsonResult) json.results.bindings.push(jsonResult);\n    }\n  };\n\n  var parseBoolean = function(node) {\n    if (node.innerHTML == \"true\") {\n      json.boolean = true;\n    } else {\n      json.boolean = false;\n    }\n  };\n  var mainXml = null;\n  if (typeof xml == \"string\") {\n    mainXml = $.parseXML(xml);\n  } else if ($.isXMLDoc(xml)) {\n    mainXml = xml;\n  }\n  var xml = null;\n  if (mainXml.childNodes.length > 0) {\n    //enter the main 'sparql' node\n    xml = mainXml.childNodes[0];\n  } else {\n    return null;\n  }\n  var json = {};\n\n  for (var i = 0; i < xml.childNodes.length; i++) {\n    var node = xml.childNodes[i];\n    if (node.nodeName == \"head\") parseHead(node);\n    if (node.nodeName == \"results\") parseResults(node);\n    if (node.nodeName == \"boolean\") parseBoolean(node);\n  }\n\n  return json;\n};\n","\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})(), utils = require(\"./utils.js\"), yUtils = require(\"yasgui-utils\"), imgs = require(\"./imgs.js\");\n(function(){try{return require('jquery-ui/sortable')}catch(e){return window.jQuery}})();\n(function(){try{return require('pivottable')}catch(e){return window.jQuery}})();\n\nif (!$.fn.pivotUI) throw new Error(\"Pivot lib not loaded\");\nvar root = module.exports = function(yasr) {\n  var plugin = {};\n  var options = $.extend(true, {}, root.defaults);\n\n  if (options.useD3Chart) {\n    try {\n      var d3 = (function(){try{return require('d3')}catch(e){return window.d3}})();\n      if (d3) require(\"pivottable/dist/d3_renderers.js\");\n    } catch (e) {\n      //do nothing. just make sure we don't use this renderer\n    }\n    if ($.pivotUtilities.d3_renderers) $.extend(true, $.pivotUtilities.renderers, $.pivotUtilities.d3_renderers);\n  }\n\n  var $pivotWrapper;\n  var mergeLabelPostfix = null;\n  var getShownVariables = function() {\n    var variables = yasr.results.getVariables();\n    if (!options.mergeLabelsWithUris) return variables;\n    var shownVariables = [];\n\n    mergeLabelPostfix = typeof options.mergeLabelsWithUris == \"string\" ? options.mergeLabelsWithUris : \"Label\";\n    variables.forEach(function(variable) {\n      if (variable.indexOf(mergeLabelPostfix, variable.length - mergeLabelPostfix.length) !== -1) {\n        //this one ends with a postfix\n        if (variables.indexOf(variable.substring(0, variable.length - mergeLabelPostfix.length)) >= 0) {\n          //we have a shorter version of this variable. So, do not include the ..<postfix> variable in the table\n          return;\n        }\n      }\n      shownVariables.push(variable);\n    });\n    return shownVariables;\n  };\n\n  var formatForPivot = function(callback) {\n    var vars = getShownVariables();\n    var usedPrefixes = null;\n    if (yasr.options.getUsedPrefixes) {\n      usedPrefixes = typeof yasr.options.getUsedPrefixes == \"function\"\n        ? yasr.options.getUsedPrefixes(yasr)\n        : yasr.options.getUsedPrefixes;\n    }\n    yasr.results.getBindings().forEach(function(binding) {\n      var rowObj = {};\n      vars.forEach(function(variable) {\n        if (variable in binding) {\n          var val = binding[variable].value;\n          if (mergeLabelPostfix && binding[variable + mergeLabelPostfix]) {\n            val = binding[variable + mergeLabelPostfix].value;\n          } else if (binding[variable].type == \"uri\") {\n            val = utils.uriToPrefixed(usedPrefixes, val);\n          }\n          rowObj[variable] = val;\n        } else {\n          rowObj[variable] = null;\n        }\n      });\n      callback(rowObj);\n    });\n  };\n\n  var validatePivotTableOptions = function(pivotOptions) {\n    //validate settings. we may have different variables, or renderers might be gone\n    if (pivotOptions) {\n      if (yasr.results) {\n        var vars = yasr.results.getVariables();\n        var keepColsAndRows = true;\n        pivotOptions.cols.forEach(function(variable) {\n          if (vars.indexOf(variable) < 0) keepColsAndRows = false;\n        });\n        if (keepColsAndRows) {\n          pivotOptionse.rows.forEach(function(variable) {\n            if (vars.indexOf(variable) < 0) keepColsAndRows = false;\n          });\n        }\n        if (!keepColsAndRows) {\n          pivotOptions.cols = [];\n          pivotOptions.rows = [];\n        }\n        if (!$.pivotUtilities.renderers[settings.rendererName]) delete pivotOptions.rendererName;\n      }\n    } else {\n      pivotOptions = {};\n    }\n    return pivotOptions;\n  };\n  var draw = function() {\n    var doDraw = function() {\n      var onRefresh = function(pivotObj) {\n        options.pivotTable.cols = pivotObj.cols;\n        options.pivotTable.rows = pivotObj.rows;\n        options.pivotTable.rendererName = pivotObj.rendererName;\n        options.pivotTable.aggregatorName = pivotObj.aggregatorName;\n        options.pivotTable.vals = pivotObj.vals;\n        yasr.store();\n\n        if (pivotObj.rendererName.toLowerCase().indexOf(\" chart\") >= 0) {\n          openGchartBtn.show();\n        } else {\n          openGchartBtn.hide();\n        }\n        yasr.updateHeader();\n      };\n\n      var openGchartBtn = $(\"<button>\", {\n        class: \"openPivotGchart yasr_btn\"\n      })\n        .text(\"Chart Config\")\n        .click(function() {\n          $pivotWrapper.find('div[dir=\"ltr\"]').dblclick();\n        })\n        .appendTo(yasr.resultsContainer);\n      $pivotWrapper = $(\"<div>\", {\n        class: \"pivotTable\"\n      }).appendTo($(yasr.resultsContainer));\n\n      options.pivotTable.onRefresh = (function() {\n        var originalRefresh = options.pivotTable.onRefresh;\n        return function(pivotObj) {\n          onRefresh(pivotObj);\n          if (originalRefresh) originalRefresh(pivotObj);\n        };\n      })();\n\n      window.pivot = $pivotWrapper.pivotUI(formatForPivot, options.pivotTable);\n\n      /**\n\t\t\t * post process\n\t\t\t */\n      //use 'move' handler for variables. This removes the 'filter' button though. Might want to re-enable this in the future\n      var icon = $(yUtils.svg.getElement(imgs.move));\n      $pivotWrapper.find(\".pvtTriangle\").replaceWith(icon);\n\n      //add headers to selector rows\n      $(\".pvtCols\").prepend(\n        $(\"<div>\", {\n          class: \"containerHeader\"\n        }).text(\"Columns\")\n      );\n      $(\".pvtRows\").prepend(\n        $(\"<div>\", {\n          class: \"containerHeader\"\n        }).text(\"Rows\")\n      );\n      $(\".pvtUnused\").prepend(\n        $(\"<div>\", {\n          class: \"containerHeader\"\n        }).text(\"Available Variables\")\n      );\n      $(\".pvtVals\").prepend(\n        $(\"<div>\", {\n          class: \"containerHeader\"\n        }).text(\"Cells\")\n      );\n\n      //hmmm, directly after the callback finishes (i.e., directly after this line), the svg is draw.\n      //just use a short timeout to update the header\n      setTimeout(yasr.updateHeader, 400);\n    };\n\n    if (yasr.options.useGoogleCharts && options.useGoogleCharts && !$.pivotUtilities.gchart_renderers) {\n      require(\"./gChartLoader.js\")\n        .on(\"done\", function() {\n          try {\n            require(\"pivottable/dist/gchart_renderers.js\");\n            $.extend(true, $.pivotUtilities.renderers, $.pivotUtilities.gchart_renderers);\n          } catch (e) {\n            //hmm, still something went wrong. forget about it;\n            options.useGoogleCharts = false;\n          }\n          doDraw();\n        })\n        .on(\"error\", function() {\n          console.log(\"could not load gchart\");\n          options.useGoogleCharts = false;\n          doDraw();\n        })\n        .googleLoad();\n    } else {\n      //everything is already loaded. just draw\n      doDraw();\n    }\n  };\n  var canHandleResults = function() {\n    return yasr.results &&\n      yasr.results.getVariables &&\n      yasr.results.getVariables() &&\n      yasr.results.getVariables().length > 0;\n  };\n\n  var getDownloadInfo = function() {\n    if (!yasr.results) return null;\n    var svgEl = yasr.resultsContainer.find(\".pvtRendererArea svg\");\n    if (svgEl.length > 0) {\n      return {\n        getContent: function() {\n          if (svgEl[0].outerHTML) {\n            return svgEl[0].outerHTML;\n          } else {\n            //outerHTML not supported. use workaround\n            return $(\"<div>\").append(svgEl.clone()).html();\n          }\n        },\n\n        filename: \"queryResults.svg\",\n        contentType: \"image/svg+xml\",\n        buttonTitle: \"Download SVG Image\"\n      };\n    }\n\n    //ok, not a svg. is it a table?\n    var $table = yasr.resultsContainer.find(\".pvtRendererArea table\");\n    if ($table.length > 0) {\n      return {\n        getContent: function() {\n          return $table.tableToCsv();\n        },\n        filename: \"queryResults.csv\",\n        contentType: \"text/csv\",\n        buttonTitle: \"Download as CSV\"\n      };\n    }\n  };\n  var getEmbedHtml = function() {\n    if (!yasr.results) return null;\n\n    var svgEl = yasr.resultsContainer\n      .find(\".pvtRendererArea svg\")\n      .clone() //create clone, as we'd like to remove height/width attributes\n      .removeAttr(\"height\")\n      .removeAttr(\"width\")\n      .css(\"height\", \"\")\n      .css(\"width\", \"\");\n    if (svgEl.length == 0) return null;\n\n    var htmlString = svgEl[0].outerHTML;\n    if (!htmlString) {\n      //outerHTML not supported. use workaround\n      htmlString = $(\"<div>\").append(svgEl.clone()).html();\n    }\n    //wrap in div, so users can more easily tune width/height\n    //don't use jquery, so we can easily influence indentation\n    return '<div style=\"width: 800px; height: 600px;\">\\n' + htmlString + \"\\n</div>\";\n  };\n  return {\n    getPersistentSettings: function() {\n      return {\n        pivotTable: options.pivotTable\n      };\n    },\n    setPersistentSettings: function(newSettings) {\n      if (newSettings.pivotTable) {\n        options.pivotTable = validatePivotTableOptions(newSettings.pivotTable);\n      }\n    },\n    getDownloadInfo: getDownloadInfo,\n    getEmbedHtml: getEmbedHtml,\n    options: options,\n    draw: draw,\n    name: \"Pivot Table\",\n    canHandleResults: canHandleResults,\n    getPriority: 4\n  };\n};\n\nroot.defaults = {\n  mergeLabelsWithUris: false,\n  useGoogleCharts: true,\n  useD3Chart: true,\n  persistencyId: \"pivot\",\n  pivotTable: {}\n};\n\nroot.version = {\n  \"YASR-rawResponse\": require(\"../package.json\").version,\n  jquery: $.fn.jquery\n};\n","\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})(), CodeMirror = (function(){try{return require('codemirror')}catch(e){return window.CodeMirror}})();\n\nrequire(\"codemirror/addon/fold/foldcode.js\");\nrequire(\"codemirror/addon/fold/foldgutter.js\");\nrequire(\"codemirror/addon/fold/xml-fold.js\");\nrequire(\"codemirror/addon/fold/brace-fold.js\");\n\nrequire(\"codemirror/addon/edit/matchbrackets.js\");\nrequire(\"codemirror/mode/xml/xml.js\");\nrequire(\"codemirror/mode/javascript/javascript.js\");\n\nvar root = module.exports = function(yasr) {\n  var plugin = {};\n  var options = $.extend(true, {}, root.defaults);\n  var cm = null;\n  var draw = function() {\n    var cmOptions = options.CodeMirror;\n    cmOptions.value = yasr.results.getOriginalResponseAsString();\n\n    var mode = yasr.results.getType();\n    if (mode) {\n      if (mode == \"json\") {\n        mode = {\n          name: \"javascript\",\n          json: true\n        };\n      }\n      cmOptions.mode = mode;\n    }\n\n    cm = CodeMirror(yasr.resultsContainer.get()[0], cmOptions);\n\n    //CM has some issues with folding and unfolding (blank parts in the codemirror area, which are only filled after clicking it)\n    //so, refresh cm after folding/unfolding\n    cm.on(\"fold\", function() {\n      cm.refresh();\n    });\n    cm.on(\"unfold\", function() {\n      cm.refresh();\n    });\n  };\n  var canHandleResults = function() {\n    if (!yasr.results) return false;\n    if (!yasr.results.getOriginalResponseAsString) return false;\n    var response = yasr.results.getOriginalResponseAsString();\n    if ((!response || response.length == 0) && yasr.results.getException()) return false; //in this case, show exception instead, as we have nothing to show anyway\n    return true;\n  };\n\n  var getDownloadInfo = function() {\n    if (!yasr.results) return null;\n    var contentType = yasr.results.getOriginalContentType();\n    var type = yasr.results.getType();\n    return {\n      getContent: function() {\n        return yasr.results.getOriginalResponse();\n      },\n      filename: \"queryResults\" + (type ? \".\" + type : \"\"),\n      contentType: contentType ? contentType : \"text/plain\",\n      buttonTitle: \"Download raw response\"\n    };\n  };\n\n  return {\n    draw: draw,\n    name: \"Raw Response\",\n    canHandleResults: canHandleResults,\n    getPriority: 2,\n    getDownloadInfo: getDownloadInfo\n  };\n};\n\nroot.defaults = {\n  CodeMirror: {\n    readOnly: true,\n    lineNumbers: true,\n    lineWrapping: true,\n    foldGutter: true,\n    gutters: [\"CodeMirror-linenumbers\", \"CodeMirror-foldgutter\"]\n  }\n};\n\nroot.version = {\n  \"YASR-rawResponse\": require(\"../package.json\").version,\n  jquery: $.fn.jquery,\n  CodeMirror: CodeMirror.version\n};\n","\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})(), yutils = require(\"yasgui-utils\"), utils = require(\"./utils.js\"), imgs = require(\"./imgs.js\");\nrequire(\"datatables.net\")();\nrequire(\"../lib/colResizable-1.4.js\");\n\n/**\n * Constructor of plugin which displays results as a table\n *\n * @param yasr {object}\n * @param parent {DOM element}\n * @param options {object}\n * @class YASR.plugins.table\n * @return yasr-table (doc)\n *\n */\nvar root = (module.exports = function(yasr) {\n  var table = null;\n  var plugin = {\n    name: \"Table\",\n    getPriority: 10\n  };\n  var options = (plugin.options = $.extend(true, {}, root.defaults));\n  var tableLengthPersistencyId = options.persistency ? yasr.getPersistencyId(options.persistency.tableLength) : null;\n\n  var getRows = function() {\n    var rows = [];\n    var bindings = yasr.results.getBindings();\n    var vars = yasr.results.getVariables();\n    var usedPrefixes = null;\n    if (yasr.options.getUsedPrefixes) {\n      usedPrefixes = typeof yasr.options.getUsedPrefixes == \"function\"\n        ? yasr.options.getUsedPrefixes(yasr)\n        : yasr.options.getUsedPrefixes;\n    }\n    for (var rowId = 0; rowId < bindings.length; rowId++) {\n      var row = [];\n      row.push(\"\"); //row numbers\n      var binding = bindings[rowId];\n      for (var colId = 0; colId < vars.length; colId++) {\n        var sparqlVar = vars[colId];\n        if (sparqlVar in binding) {\n          if (options.getCellContent) {\n            row.push(\n              options.getCellContent(yasr, plugin, binding, sparqlVar, {\n                rowId: rowId,\n                colId: colId,\n                usedPrefixes: usedPrefixes\n              })\n            );\n          } else {\n            row.push(\"\");\n          }\n        } else {\n          row.push(\"\");\n        }\n      }\n      rows.push(row);\n    }\n    return rows;\n  };\n\n  var eventId = yasr.getPersistencyId(\"eventId\") || \"yasr_\" + $(yasr.container).closest(\"[id]\").attr(\"id\");\n  var addEvents = function() {\n    table.on(\"order.dt\", function() {\n      drawSvgIcons();\n    });\n    if (tableLengthPersistencyId) {\n      table.on(\"length.dt\", function(e, settings, len) {\n        yutils.storage.set(tableLengthPersistencyId, len, \"month\", yasr.options.onQuotaExceeded);\n      });\n    }\n    $.extend(true, options.callbacks, options.handlers);\n    table\n      .delegate(\"td\", \"click\", function(event) {\n        if (options.callbacks && options.callbacks.onCellClick) {\n          var result = options.callbacks.onCellClick(this, event);\n          if (result === false) return false;\n        }\n      })\n      .delegate(\"td\", \"mouseenter\", function(event) {\n        if (options.callbacks && options.callbacks.onCellMouseEnter) {\n          options.callbacks.onCellMouseEnter(this, event);\n        }\n        var tdEl = $(this);\n        if (\n          options.fetchTitlesFromPreflabel &&\n          tdEl.attr(\"title\") === undefined &&\n          tdEl.text().trim().indexOf(\"http\") == 0\n        ) {\n          addPrefLabel(tdEl);\n        }\n      })\n      .delegate(\"td\", \"mouseleave\", function(event) {\n        if (options.callbacks && options.callbacks.onCellMouseLeave) {\n          options.callbacks.onCellMouseLeave(this, event);\n        }\n      });\n  };\n\n  plugin.draw = function() {\n    table = $('<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"resultsTable\"></table>');\n    $(yasr.resultsContainer).html(table);\n\n    var dataTableConfig = options.datatable;\n    dataTableConfig.data = getRows();\n    dataTableConfig.columns = options.getColumns(yasr, plugin);\n\n    //fetch stored datatables length value\n    var pLength = yutils.storage.get(tableLengthPersistencyId);\n    if (pLength) dataTableConfig.pageLength = pLength;\n\n    table.DataTable($.extend(true, {}, dataTableConfig)); //make copy. datatables adds properties for backwards compatability reasons, and don't want this cluttering our own\n\n    drawSvgIcons();\n\n    addEvents();\n\n    //finally, make the columns dragable:\n    table.colResizable();\n  };\n\n  var drawSvgIcons = function() {\n    var sortings = {\n      sorting: \"unsorted\",\n      sorting_asc: \"sortAsc\",\n      sorting_desc: \"sortDesc\"\n    };\n    table.find(\".sortIcons\").remove();\n    for (var sorting in sortings) {\n      var svgDiv = $(\"<div class='sortIcons'></div>\");\n      yutils.svg.draw(svgDiv, imgs[sortings[sorting]]);\n      table.find(\"th.\" + sorting).append(svgDiv);\n    }\n  };\n  /**\n\t * Check whether this plugin can handler the current results\n\t *\n\t * @property canHandleResults\n\t * @type function\n\t * @default If resultset contains variables in the resultset, return true\n\t */\n  plugin.canHandleResults = function() {\n    return (\n      yasr.results && yasr.results.getVariables && yasr.results.getVariables() && yasr.results.getVariables().length > 0\n    );\n  };\n\n  plugin.getDownloadInfo = function() {\n    if (!yasr.results) return null;\n    return {\n      getContent: function() {\n        return require(\"./bindingsToCsv.js\")(yasr.results.getAsJson());\n      },\n      filename: \"queryResults.csv\",\n      contentType: \"text/csv\",\n      buttonTitle: \"Download as CSV\"\n    };\n  };\n\n  return plugin;\n});\n\nvar formatLiteral = function(yasr, plugin, literalBinding) {\n  var stringRepresentation = utils.escapeHtmlEntities(literalBinding.value);\n  if (literalBinding[\"xml:lang\"]) {\n    stringRepresentation = '\"' + stringRepresentation + '\"<sup>@' + literalBinding[\"xml:lang\"] + \"</sup>\";\n  } else if (literalBinding.datatype) {\n    var xmlSchemaNs = \"http://www.w3.org/2001/XMLSchema#\";\n    var dataType = literalBinding.datatype;\n    if (dataType.indexOf(xmlSchemaNs) === 0) {\n      dataType = \"xsd:\" + dataType.substring(xmlSchemaNs.length);\n    } else {\n      dataType = \"&lt;\" + dataType + \"&gt;\";\n    }\n\n    stringRepresentation = '\"' + stringRepresentation + '\"<sup>^^' + dataType + \"</sup>\";\n  }\n  return stringRepresentation;\n};\nvar getCellContent = function(yasr, plugin, bindings, sparqlVar, context) {\n  var binding = bindings[sparqlVar];\n  var value = null;\n  if (binding.type == \"uri\") {\n    var title = null;\n    var href = binding.value;\n    var visibleString = href;\n    if (context.usedPrefixes) {\n      for (var prefix in context.usedPrefixes) {\n        if (visibleString.indexOf(context.usedPrefixes[prefix]) == 0) {\n          visibleString = prefix + \":\" + href.substring(context.usedPrefixes[prefix].length);\n          break;\n        }\n      }\n    }\n    if (plugin.options.mergeLabelsWithUris) {\n      var postFix = typeof plugin.options.mergeLabelsWithUris == \"string\"\n        ? plugin.options.mergeLabelsWithUris\n        : \"Label\";\n      if (bindings[sparqlVar + postFix]) {\n        visibleString = formatLiteral(yasr, plugin, bindings[sparqlVar + postFix]);\n        title = href;\n      }\n    }\n    value =\n      \"<a \" +\n      (title ? \"title='\" + href + \"' \" : \"\") +\n      \"class='uri' target='\" +\n      yasr.options.uriTarget +\n      \"' href='\" +\n      href +\n      \"'>\" +\n      visibleString +\n      \"</a>\";\n  } else {\n    value = \"<span class='nonUri'>\" + formatLiteral(yasr, plugin, binding) + \"</span>\";\n  }\n  return \"<div>\" + value + \"</div>\";\n};\n\nvar addPrefLabel = function(td) {\n  var addEmptyTitle = function() {\n    td.attr(\"title\", \"\"); //this avoids trying to fetch the label again on next hover\n  };\n  $.get(\"//preflabel.org/api/v1/label/\" + encodeURIComponent(td.text()) + \"?silent=true\")\n    .success(function(data) {\n      if (typeof data == \"object\" && data.label) {\n        td.attr(\"title\", data.label);\n      } else if (typeof data == \"string\" && data.length > 0) {\n        td.attr(\"title\", data);\n      } else {\n        addEmptyTitle();\n      }\n    })\n    .fail(addEmptyTitle);\n};\n\nvar openCellUriInNewWindow = function(cell) {\n  if (cell.className.indexOf(\"uri\") >= 0) {\n    window.open(this.innerHTML);\n  }\n};\n\n/**\n * Defaults for table plugin\n *\n * @type object\n * @attribute YASR.plugins.table.defaults\n */\nroot.defaults = {\n  /**\n\t * Draw the cell content, from a given binding\n\t *\n\t * @property drawCellContent\n\t * @param binding {object}\n\t * @type function\n\t * @return string\n\t * @default YASR.plugins.table.getFormattedValueFromBinding\n\t */\n  getCellContent: getCellContent,\n\n  persistency: {\n    tableLength: \"tableLength\"\n  },\n\n  getColumns: function(yasr, plugin) {\n    var includeVariable = function(variableToCheck) {\n      if (!plugin.options.mergeLabelsWithUris) return true;\n      var postFix = typeof plugin.options.mergeLabelsWithUris == \"string\"\n        ? plugin.options.mergeLabelsWithUris\n        : \"Label\";\n      if (variableToCheck.indexOf(postFix, variableToCheck.length - postFix.length) !== -1) {\n        //this one ends with a postfix\n        if (\n          yasr.results.getVariables().indexOf(variableToCheck.substring(0, variableToCheck.length - postFix.length)) >=\n          0\n        ) {\n          //we have a shorter version of this variable. So, do not include the ..<postfix> variable in the table\n          return false;\n        }\n      }\n      return true;\n    };\n\n    var cols = [];\n    cols.push({\n      title: \"\"\n    }); //row numbers column\n    yasr.results.getVariables().forEach(function(variable) {\n      cols.push({\n        title: \"<span>\" + variable + \"</span>\",\n        visible: includeVariable(variable)\n      });\n    });\n    return cols;\n  },\n  /**\n\t * Try to fetch the label representation for each URI, using the preflabel.org services. (fetching occurs when hovering over the cell)\n\t *\n\t * @property fetchTitlesFromPreflabel\n\t * @type boolean\n\t * @default false, if YASR is served via https\n\t */\n  //important to keep supporting serving yasr via file:// protocol\n  fetchTitlesFromPreflabel: window.location.protocol === \"https:\" ? false : true,\n\n  mergeLabelsWithUris: false,\n  /**\n\t * Set a number of handlers for the table\n\t *\n\t * @property handlers\n\t * @type object\n\t */\n  callbacks: {\n    /**\n\t\t * Mouse-enter-cell event\n\t\t *\n\t\t * @property handlers.onCellMouseEnter\n\t\t * @type function\n\t\t * @param td-element\n\t\t * @default null\n\t\t */\n    onCellMouseEnter: null,\n    /**\n\t\t * Mouse-leave-cell event\n\t\t *\n\t\t * @property handlers.onCellMouseLeave\n\t\t * @type function\n\t\t * @param td-element\n\t\t * @default null\n\t\t */\n    onCellMouseLeave: null,\n    /**\n\t\t * Cell clicked event\n\t\t *\n\t\t * @property handlers.onCellClick\n\t\t * @type function\n\t\t * @param td-element\n\t\t * @default null\n\t\t */\n    onCellClick: null\n  },\n  /**\n\t * This plugin uses the datatables jquery plugin (See datatables.net). For any datatables specific defaults, change this object.\n\t * See the datatables reference for more information\n\t *\n\t * @property datatable\n\t * @type object\n\t */\n  datatable: {\n    autoWidth: true,\n    dom: '<\"dtTopHeader\"ilf>rtip',\n    order: [], //disable initial sorting\n    pageLength: 50, //default page length\n    lengthMenu: [[10, 50, 100, 1000, -1], [10, 50, 100, 1000, \"All\"]], //possible page lengths\n    lengthChange: true, //allow changing page length\n    pagingType: \"full_numbers\", //how to show the pagination options\n    drawCallback: function(oSettings) {\n      //trick to show row numbers\n      for (var i = 0; i < oSettings.aiDisplay.length; i++) {\n        $(\"td:eq(0)\", oSettings.aoData[oSettings.aiDisplay[i]].nTr).html(i + 1);\n      }\n\n      //Hide pagination when we have a single page\n      var activePaginateButton = false;\n      $(oSettings.nTableWrapper).find(\".paginate_button\").each(function() {\n        if ($(this).attr(\"class\").indexOf(\"current\") == -1 && $(this).attr(\"class\").indexOf(\"disabled\") == -1) {\n          activePaginateButton = true;\n        }\n      });\n      if (activePaginateButton) {\n        $(oSettings.nTableWrapper).find(\".dataTables_paginate\").show();\n      } else {\n        $(oSettings.nTableWrapper).find(\".dataTables_paginate\").hide();\n      }\n    },\n    columnDefs: [\n      {\n        width: \"32px\",\n        orderable: false,\n        targets: 0\n      } //disable row sorting for first col\n    ]\n  }\n};\nroot.version = {\n  \"YASR-table\": require(\"../package.json\").version,\n  jquery: $.fn.jquery,\n  \"jquery-datatables\": $.fn.DataTable.version\n};\n","\"use strict\";\nvar $ = (function(){try{return require('jquery')}catch(e){return window.jQuery}})(), GoogleTypeException = require(\"./exceptions.js\").GoogleTypeException;\n\nmodule.exports = {\n  escapeHtmlEntities: function(unescaped) {\n    //taken from http://stackoverflow.com/questions/5499078/fastest-method-to-escape-html-tags-as-html-entities\n    //cast to string first, to avoid problems with e.g. integers\n    return (\"\" + unescaped).replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n  },\n  uriToPrefixed: function(prefixes, uri) {\n    if (prefixes) {\n      for (var prefix in prefixes) {\n        if (uri.indexOf(prefixes[prefix]) == 0) {\n          uri = prefix + \":\" + uri.substring(prefixes[prefix].length);\n          break;\n        }\n      }\n    }\n    return uri;\n  },\n  getGoogleTypeForBinding: function(binding) {\n    if (binding == null) return null;\n    if (binding.type != null && (binding.type === \"typed-literal\" || binding.type === \"literal\")) {\n      switch (binding.datatype) {\n        case \"http://www.w3.org/2001/XMLSchema#double\":\n        case \"http://www.w3.org/2001/XMLSchema#float\":\n        case \"http://www.w3.org/2001/XMLSchema#decimal\":\n        case \"http://www.w3.org/2001/XMLSchema#int\":\n        case \"http://www.w3.org/2001/XMLSchema#integer\":\n        case \"http://www.w3.org/2001/XMLSchema#long\":\n        case \"http://www.w3.org/2001/XMLSchema#gYearMonth\":\n        case \"http://www.w3.org/2001/XMLSchema#gYear\":\n        case \"http://www.w3.org/2001/XMLSchema#gMonthDay\":\n        case \"http://www.w3.org/2001/XMLSchema#gDay\":\n        case \"http://www.w3.org/2001/XMLSchema#gMonth\":\n          return \"number\";\n        case \"http://www.w3.org/2001/XMLSchema#date\":\n          return \"date\";\n        case \"http://www.w3.org/2001/XMLSchema#dateTime\":\n          return \"datetime\";\n        case \"http://www.w3.org/2001/XMLSchema#time\":\n          return \"timeofday\";\n        default:\n          return \"string\";\n      }\n    } else {\n      return \"string\";\n    }\n  },\n  getGoogleTypeForBindings: function(bindings, varName) {\n    var types = {};\n    var typeCount = 0;\n    bindings.forEach(function(binding) {\n      var type = module.exports.getGoogleTypeForBinding(binding[varName]);\n      if (type != null) {\n        if (!(type in types)) {\n          types[type] = 0;\n          typeCount++;\n        }\n        types[type]++;\n      }\n    });\n    if (typeCount == 0) {\n      return \"string\";\n    } else if (typeCount == 1) {\n      for (var type in types) {\n        return type; //just return this one\n      }\n    } else {\n      //we have conflicting types. Throw error\n      throw new GoogleTypeException(types, varName);\n    }\n  },\n\n  castGoogleType: function(binding, prefixes, googleType) {\n    if (binding == null) {\n      return null;\n    }\n\n    if (\n      googleType != \"string\" && binding.type != null && (binding.type === \"typed-literal\" || binding.type === \"literal\")\n    ) {\n      switch (binding.datatype) {\n        case \"http://www.w3.org/2001/XMLSchema#float\":\n        case \"http://www.w3.org/2001/XMLSchema#decimal\":\n        case \"http://www.w3.org/2001/XMLSchema#int\":\n        case \"http://www.w3.org/2001/XMLSchema#integer\":\n        case \"http://www.w3.org/2001/XMLSchema#long\":\n        case \"http://www.w3.org/2001/XMLSchema#gYearMonth\":\n        case \"http://www.w3.org/2001/XMLSchema#gYear\":\n        case \"http://www.w3.org/2001/XMLSchema#gMonthDay\":\n        case \"http://www.w3.org/2001/XMLSchema#gDay\":\n        case \"http://www.w3.org/2001/XMLSchema#gMonth\":\n          return Number(binding.value);\n        case \"http://www.w3.org/2001/XMLSchema#double\":\n          return Number(parseFloat(binding.value));\n        case \"http://www.w3.org/2001/XMLSchema#date\":\n          //grrr, the date function does not parse -any- date (including most xsd dates!)\n          //datetime and time seem to be fine though.\n          //so, first try our custom parser. if that does not work, try the regular date parser anyway\n          var date = parseXmlSchemaDate(binding.value);\n          if (date) return date;\n        case \"http://www.w3.org/2001/XMLSchema#dateTime\":\n        case \"http://www.w3.org/2001/XMLSchema#time\":\n          return new Date(binding.value);\n        default:\n          return binding.value;\n      }\n    } else {\n      if (binding.type = \"uri\") {\n        return module.exports.uriToPrefixed(prefixes, binding.value);\n      } else {\n        return binding.value;\n      }\n    }\n  },\n  fireClick: function($els) {\n    if (!$els) return;\n    $els.each(function(i, el) {\n      var $el = $(el);\n      if (document.dispatchEvent) {\n        // W3C\n        var oEvent = document.createEvent(\"MouseEvents\");\n        oEvent.initMouseEvent(\"click\", true, true, window, 1, 1, 1, 1, 1, false, false, false, false, 0, $el[0]);\n        $el[0].dispatchEvent(oEvent);\n      } else if (document.fireEvent) {\n        // IE\n        $el[0].click();\n      }\n    });\n  }\n};\n//There are no PROPER xml schema to js date parsers\n//A few libraries exist: moment, jsdate, Xdate, but none of them parse valid xml schema dates (e.g. 1999-11-05+02:00).\n//And: I'm not going to write one myself\n//There are other hacky solutions (regular expressions based on trial/error) such as http://stackoverflow.com/questions/2731579/convert-an-xml-schema-date-string-to-a-javascript-date\n//But if we're doing hacky stuff, I at least want to do it MYSELF!\nvar parseXmlSchemaDate = function(dateString) {\n  //change +02:00 to Z+02:00 (something which is parseable by js date)\n  var date = new Date(dateString.replace(/(\\d)([\\+-]\\d{2}:\\d{2})/, \"$1Z$2\"));\n  if (isNaN(date)) return null;\n  return date;\n};\n"],"sourceRoot":"/source/"}