{"version":3,"sources":["../../../../../usr/local/lib/node_modules/watchify/node_modules/browserify/node_modules/browser-pack/_prelude.js","css/creek.css","css/font-awesome.css","lib/sm2/bar-ui/css/bar-ui.css","creek-build.js","js/creek-util.js","js/creek-data.js","js/creek-debug.js","js/creek-content.js","js/creek-audio-lib.js","js/sm2-bar-ui-creek.js","js/creek-audio.js","js/creek-persist-iframe.js","js/creek-live-api.js","js/creek-persist-singlepage.js","js/creek-shows.js","js/creek-share.js","node_modules/jquery/dist/jquery.js","node_modules/soundmanager2/script/soundmanager2-nodebug-jsmin.js","js/creek-audio-volume.js","js/jquery-htmldoc-fixer.js","js/vue-moment.js","js/templates/audio-player.js","js/templates/audio-toolbar.js","js/creek-archives.js","js/templates/show.js","js/templates/content-page.js","js/templates/shows-all.js","node_modules/browserify-css/browser.js","node_modules/moment/moment.js","node_modules/socket.io-client/lib/index.js","node_modules/vue-router/dist/vue-router.js","js/templates/archives.js","node_modules/socket.io-client/lib/url.js","node_modules/socket.io-client/lib/manager.js","node_modules/socket.io-client/lib/socket.js","node_modules/vue/dist/vue.common.js","node_modules/socket.io-client/node_modules/socket.io-parser/index.js","node_modules/socket.io-client/node_modules/debug/browser.js","node_modules/socket.io-client/lib/on.js","../../../../../usr/local/lib/node_modules/watchify/node_modules/browserify/node_modules/process/browser.js","node_modules/socket.io-client/node_modules/socket.io-parser/binary.js","node_modules/socket.io-client/node_modules/socket.io-parser/is-buffer.js","node_modules/socket.io-client/node_modules/debug/debug.js","node_modules/socket.io-client/node_modules/component-emitter/index.js","node_modules/socket.io-client/node_modules/parseuri/index.js","node_modules/socket.io-client/node_modules/component-bind/index.js","node_modules/socket.io-client/node_modules/engine.io-client/index.js","node_modules/socket.io-client/node_modules/indexof/index.js","node_modules/socket.io-client/node_modules/backo2/index.js","node_modules/socket.io-client/node_modules/has-binary/index.js","node_modules/socket.io-client/node_modules/to-array/index.js","node_modules/socket.io-client/node_modules/socket.io-parser/node_modules/json3/lib/json3.js","node_modules/socket.io-client/node_modules/engine.io-client/lib/index.js","node_modules/socket.io-client/node_modules/debug/node_modules/ms/index.js","node_modules/socket.io-client/node_modules/engine.io-client/lib/socket.js","node_modules/socket.io-client/node_modules/engine.io-client/node_modules/engine.io-parser/lib/browser.js","node_modules/socket.io-client/node_modules/engine.io-client/lib/transport.js","node_modules/socket.io-client/node_modules/engine.io-client/lib/transports/index.js","node_modules/socket.io-client/node_modules/engine.io-client/node_modules/component-emitter/index.js","node_modules/socket.io-client/node_modules/engine.io-client/node_modules/parseqs/index.js","node_modules/socket.io-client/node_modules/engine.io-client/node_modules/parsejson/index.js","node_modules/socket.io-client/node_modules/engine.io-client/node_modules/engine.io-parser/lib/keys.js","node_modules/socket.io-client/node_modules/engine.io-client/lib/xmlhttprequest.js","node_modules/socket.io-client/node_modules/engine.io-client/lib/transports/polling-xhr.js","node_modules/socket.io-client/node_modules/engine.io-client/lib/transports/polling-jsonp.js","node_modules/socket.io-client/node_modules/engine.io-client/lib/transports/websocket.js","node_modules/socket.io-client/node_modules/engine.io-client/node_modules/engine.io-parser/node_modules/utf8/utf8.js","node_modules/socket.io-client/node_modules/engine.io-client/node_modules/engine.io-parser/node_modules/has-binary/index.js","node_modules/socket.io-client/node_modules/engine.io-client/node_modules/engine.io-parser/node_modules/arraybuffer.slice/index.js","node_modules/socket.io-client/node_modules/engine.io-client/node_modules/engine.io-parser/node_modules/after/index.js","node_modules/socket.io-client/node_modules/engine.io-client/node_modules/engine.io-parser/node_modules/blob/index.js","node_modules/socket.io-client/node_modules/engine.io-client/node_modules/engine.io-parser/node_modules/base64-arraybuffer/lib/base64-arraybuffer.js","node_modules/socket.io-client/node_modules/engine.io-client/lib/transports/polling.js","node_modules/socket.io-client/node_modules/engine.io-client/node_modules/has-cors/index.js","node_modules/socket.io-client/node_modules/engine.io-client/node_modules/engine.io-parser/node_modules/has-binary/node_modules/isarray/index.js","node_modules/socket.io-client/node_modules/engine.io-client/node_modules/yeast/index.js","node_modules/socket.io-client/node_modules/engine.io-client/node_modules/component-inherit/index.js","js/templates/shows.js"],"names":["Creek","$","require","jQuery","css","css_fontawesome","css_sm2_bar_ui","init","config","data","page","reset","debug","util","content","audio","sm2_bar","liveApi","persist","enable","type","console","error","instance","share","shows","window","module","exports","append","fixLinks","html","router","replace","str","find","RegExp","linkReplacements","cookies","create","name","value","seconds","date","Date","setTime","getTime","expires","toGMTString","document","cookie","read","nameEQ","ca","split","i","length","c","charAt","substring","indexOf","Cookies","images","imageExists","image_url","http","XMLHttpRequest","open","send","status","capitalizeFirstLetter","string","toUpperCase","slice","defaults","demo","station","domain","id","title","ssl","broadcasting","now","next","upcoming","Track","streams","toolbar","showImageSize","container","players","backgroundColor","textLightOrDark","prefix","schedule","all","enableTitles","baseUrlOrPath","loadingHtml","showsName","/shows/","/broadcasts/view/","/broadcasts/","/profiles/","settings","iframe","mainElement","singlepage","loadNewAssets","loadingIndicatorDelay","loadingStatus","onLoading","onLoaded","onComplete","onCompleteArray","ignorePaths","stream","main","url","newDataPlusDefaults","extend","schema","url_prefix","active","log","message","refresh","ga","location","FB","XFBML","parse","replaceAudioTags","build","initiate","magnificPopup","soundManager","soundManager2_url","player","selected","state","current_player_id","streamUrl","update","Show","attr","originURL","Image","img_size","show_url","short_name","addClass","removeClass","tbv","hasClass","updateTrack","fadeOut","artist","fadeIn","setState","playing","paused","stopped","switchToLive","stream_title","station_name","stopAll","data_selected","switchToFile","resetSpacerHeight","h","outerHeight","analytics","startListening","listenTimer","setInterval","stopListening","clearInterval","bar_ui_html","fn","outerHTML","this","eq","clone","replaceWith","audio_files","map","push","dark_text","Player","playerOptions","utils","playerSelector","on","play","dom","playlistTarget","innerText","textContent","href","resume","finish","pause","end","stopOtherSounds","excludeClass","setup","html5PollingInterval","flashVersion","playerNode","callback","method","msec","useString","nSec","Math","floor","hh","min","sec","setTitle","item","links","getElementsByTagName","innerHTML","extras","loadFailedCharacter","scrollWidth","offsetWidth","makeSound","sound","createSound","volume","defaultVolume","whileplaying","left","width","progressMaxLeft","max","position","durationEstimate","duration","progress","style","progressBar","time","onbufferchange","isBuffering","add","o","remove","onplay","swap","onpause","onresume","whileloading","isHTML5","onload","ok","_iO","onerror","element","playlistController","getItem","playlist","selectedIndex","navigator","userAgent","match","actions","timer","clearTimeout","setTimeout","onstop","onfinish","lastIndex","getNext","select","getURL","playLink","link","canPlayURL","soundObject","stop","parentNode","PlaylistController","getPlaylist","offset","list","undefined","findOffsetFromItem","j","loopMode","getPrevious","resetLastSelected","items","getAll","itemTop","itemBottom","containerHeight","scrollTop","itemPadding","liElement","ancestor","offsetTop","offsetHeight","playlistContainer","playItemByOffset","refreshDOM","warn","initDOM","get","defaultOptions","has","playlistOpen","menu","isRightClick","e","which","button","getActionData","target","actionData","x","getOffX","y","getOffY","height","backgroundSize","parseInt","handleMouseDown","srcElement","nodeName","toLowerCase","events","adjustVolume","releaseVolume","handleClick","evt","targetNodeName","methodName","handled","event","lastIndexOf","substr","preventDefault","handleMouse","barX","barWidth","newPosition","progressTrack","clientX","setPosition","apply","releaseMouse","legacy","noVolume","defaultItem","firstOpen","disabled","offsetOrEvent","isNaN","playState","togglePause","readyState","prev","shuffle","toggle","shuffleMode","repeat","ignoreToggle","isOpen","scrollHeight","backgroundMargin","pixelMargin","clip","setVolume","arguments","backgroundOffset","from","to","array","compare","property","result","a","b","temp","random","cStr","className","test","swapClass","cStr1","cStr2","tmpClass","toggleClass","found","param1","param2","node","selector","results","documentElement","querySelectorAll","checkCurrent","curleft","offsetParent","offsetLeft","curtop","styleProp","currentStyle","getComputedStyle","defaultView","getPropertyValue","evtName","evtHandler","eventObject","detach","addEventListener","attachEvent","removeEventListener","detachEvent","returnValue","cancelBubble","features","prop","testDiv","attempt","transform","getAnimationFrame","localAnimationFrame","localFeatures","styles","createElement","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","ie","moz","opera","webkit","w3","rotate","has3D","css_2d","css_3d","nodes","sm2BarPlayers","sm2BarPlayerOptions","SM2BarPlayer","onready","preferFlash","useHighPerformance","wmode","useFastPolling","buildHtml","setUrl","restart","currentUrl","setUrlFromStationApi","website","resumeAll","pauseAll","loaded","unload","destruct","before","after","persistSettings","persistInstance","checkFirefox","checkInternetExplorer","ua","msie","trident","rv","edge","checkIfBrowserSupport","insideIframe","frameElement","createMagicIframe","not","prepend","updateCurrentURLFromIframe","getElementById","contentDocument","history","replaceState","updateIframeURL","src","io","activateStation","updateBroadcasting","audio_data","album","label","socket_url","socket","emit","htmldocFix","pageEverChanged","loading","loadElementsWithClass","new_HTML_for_element","methods","request_page","abort","handleContentData","filter","text","doTheNew","current_elements","new_elements","tag","each","its_new","attr_new","key_n","v_n","attr_current","js_html","new_html","htmlDoc","push_state","pushState","close","scrollPos","loadContent","initial_history_action","checkIfFileUrl","ext","pop","end_of_path","checkIfIgnorePaths","url_without_path","pathname","checkLink","closest","loadingBar","start","startAnimation","endAnimation","animate","scrollOffset","top","bind","originalEvent","moment","Vue","VueRouter","use","input","components","swapPageClass","index","join","component","template","route","transition","getJSON","params","getShows","weekday_number","filteredData","programs","Shows","format","Broadcast","broadcast_id","activate","Profile","username","Schedule","ShowsAll","findTerm","App","saveScrollPosition","/","/weekday/:weekday_number","/profiles/:username","/broadcasts/:broadcast_id","/schedule","/all","/shows/:short_name","/archives","/play","/:short_name","render","show_id","show_element","image_group","grouped_image_element","handlers","fb","winWidth","winHeight","winTop","screen","winLeft","tw","opts","url_encoded","encodeURIComponent","email_button_render","html_email_box","email_button_show","val","focus","email_button_hide","share_clicked","global","factory","w","Error","noGlobal","isArrayLike","obj","isWindow","winnow","elements","qualifier","isFunction","grep","elem","call","nodeType","risSimple","sibling","cur","dir","createOptions","options","object","rnotwhite","_","flag","completed","ready","Data","expando","uid","dataAttr","key","rmultiDash","getAttribute","rbrace","parseJSON","dataUser","set","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","rcssNum","exec","context","ret","merge","setGlobalEval","elems","refElements","l","dataPriv","buildFragment","scripts","selection","ignored","tmp","wrap","contains","fragment","createDocumentFragment","rhtml","appendChild","rtagName","wrapMap","_default","htmlPrefilter","lastChild","childNodes","firstChild","createTextNode","inArray","ownerDocument","rscriptType","returnTrue","returnFalse","safeActiveElement","activeElement","err","types","one","origFn","off","guid","manipulationTarget","disableScript","restoreScript","rscriptTypeMasked","removeAttribute","cloneCopyEvent","dest","pdataOld","pdataCur","udataOld","udataCur","hasData","access","handle","fixInput","rcheckableType","checked","defaultValue","domManip","collection","args","concat","first","hasScripts","doc","iNoClone","support","checkClone","rchecked","self","_evalUrl","globalEval","rcleanScript","keepData","cleanData","removeChild","actualDisplay","appendTo","body","display","defaultDisplay","elemdisplay","write","curCSS","computed","minWidth","maxWidth","getStyles","pixelMarginRight","rnumnonpx","rmargin","addGetHookIf","conditionFn","hookFn","vendorPropName","emptyStyle","capName","cssPrefixes","setPositiveNumber","subtract","matches","augmentWidthOrHeight","extra","isBorderBox","cssExpand","getWidthOrHeight","valueIsBorderBox","msFullscreenElement","getClientRects","round","getBoundingClientRect","boxSizingReliable","parseFloat","showHide","show","hidden","values","isHidden","Tween","easing","prototype","createFxNow","fxNow","genFx","includeWidth","attrs","opacity","createTween","animation","Animation","tweeners","defaultPrefilter","props","hooks","oldfire","checkDisplay","anim","orig","dataShow","queue","_queueHooks","unqueued","empty","fire","always","overflow","overflowX","overflowY","rfxtypes","isEmptyObject","done","hide","propFilter","specialEasing","camelCase","isArray","cssHooks","expand","properties","prefilters","deferred","Deferred","tick","currentTime","remaining","startTime","percent","tweens","run","notifyWith","resolveWith","promise","originalProperties","originalOptions","gotoEnd","rejectWith","proxy","fx","complete","fail","getClass","addToPrefiltersOrTransports","structure","dataTypeExpression","func","dataType","dataTypes","unshift","inspectPrefiltersOrTransports","jqXHR","inspect","inspected","prefilterOrFactory","dataTypeOrTransport","seekingTransport","transports","ajaxExtend","deep","flatOptions","ajaxSettings","ajaxHandleResponses","s","responses","ct","finalDataType","firstDataType","contents","shift","mimeType","getResponseHeader","converters","ajaxConvert","response","isSuccess","conv2","current","conv","responseFields","dataFilter","buildParams","traditional","v","rbracket","getWindow","arr","class2type","toString","hasOwn","hasOwnProperty","version","rtrim","rmsPrefix","rdashAlpha","fcamelCase","letter","jquery","constructor","toArray","num","pushStack","prevObject","last","len","sort","splice","copy","copyIsArray","isPlainObject","isReady","msg","noop","Array","isNumeric","realStringObj","code","script","indirect","eval","trim","head","makeArray","Object","second","invert","callbackInverse","callbackExpect","arg","Symbol","iterator","Sizzle","seed","m","nid","nidselect","groups","newSelector","newContext","preferredDoc","setDocument","documentIsHTML","rquickExpr","getElementsByClassName","qsa","compilerCache","rbuggyQSA","rescape","setAttribute","tokenize","ridentifier","toSelector","rsibling","testContext","qsaError","createCache","cache","keys","Expr","cacheLength","markFunction","assert","div","addHandle","handler","attrHandle","siblingCheck","diff","sourceIndex","MAX_NEGATIVE","nextSibling","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","setFilters","tokens","addCombinator","matcher","combinator","base","checkNonElements","doneName","xml","oldCache","uniqueCache","outerCache","newCache","dirruns","uniqueID","elementMatcher","matchers","multipleContexts","contexts","condense","unmatched","newUnmatched","mapped","setMatcher","preFilter","postFilter","postFinder","postSelector","preMap","postMap","preexisting","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","relative","implicitRelative","matchContext","matchAnyContext","outermostContext","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","uniqueSort","getText","isXML","compile","sortInput","hasDuplicate","docElem","rbuggyMatches","classCache","tokenCache","sortOrder","push_native","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","rcomma","rcombinators","rattributeQuotes","rpseudo","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rnative","runescape","funescape","escaped","escapedWhitespace","high","String","fromCharCode","unloadHandler","els","hasCompare","parent","createComment","getById","getElementsByName","attrId","getAttributeNode","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","sortDetached","aup","ap","bp","expr","specified","duplicates","detectDuplicates","sortStable","nodeValue","selectors","createPseudo",">"," ","+","~","excess","unquoted","nodeNameSelector","pattern","operator","check","what","simple","forward","ofType","nodeIndex","useCache","pseudo","idx","matched","lang","elemLang","hash","root","hasFocus","tabIndex","enabled","header","even","odd","lt","gt","radio","checkbox","file","password","image","submit","filters","parseOnly","soFar","preFilters","cached","token","compiled","div1","unique","isXMLDoc","until","truncate","is","siblings","n","rneedsContext","rsingleTag","rootjQuery","parseHTML","rparentsprev","guaranteedUnique","children","targets","pos","prevAll","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","reverse","Callbacks","firing","memory","fired","locked","firingIndex","once","stopOnFalse","disable","lock","fireWith","tuples","then","fns","newDefer","tuple","returned","notify","resolve","reject","pipe","stateString","when","subordinate","progressValues","progressContexts","resolveContexts","resolveValues","updateFunc","readyList","readyWait","holdReady","hold","wait","triggerHandler","doScroll","chainable","emptyGet","raw","bulk","acceptData","owner","register","defineProperty","writable","configurable","stored","camel","removeData","_data","_removeData","camelKey","dequeue","startLength","setter","clearQueue","count","defer","pnum","source","el","option","thead","col","tr","td","optgroup","tbody","tfoot","colgroup","caption","th","cloneNode","noCloneChecked","rkeyEvent","rmouseEvent","rtypenamespace","handleObjIn","eventHandle","t","handleObj","special","namespaces","origType","elemData","triggered","dispatch","delegateType","bindType","namespace","delegateCount","mappedTypes","origCount","teardown","removeEvent","fix","handlerQueue","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","stopPropagation","postDispatch","sel","fixHooks","keyHooks","original","charCode","keyCode","mouseHooks","eventDoc","pageX","scrollLeft","clientLeft","pageY","clientY","clientTop","fixHook","Event","load","noBubble","trigger","blur","click","beforeunload","isDefaultPrevented","defaultPrevented","timeStamp","stopImmediatePropagation","mouseenter","mouseleave","pointerenter","pointerleave","related","relatedTarget","rxhtmlTag","rnoInnerhtml","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","insertBefore","replaceChild","prependTo","insertAfter","replaceAll","insert","HTML","BODY","view","opener","old","computeStyleTests","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","marginLeft","boxSizingReliableVal","marginRight","pixelMarginRightVal","backgroundClip","clearCloneStyle","pixelPosition","reliableMarginLeft","reliableMarginRight","marginDiv","rdisplayswap","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","lineHeight","order","orphans","widows","zIndex","zoom","cssProps","float","origName","isFinite","margin","padding","border","suffix","expanded","parts","propHooks","eased","step","linear","p","swing","cos","PI","timerId","rrun","*","tweener","prefilter","speed","opt","speeds","fadeTo","optall","doAnimation","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeToggle","interval","slow","fast","delay","timeout","checkOn","optSelected","optDisabled","radioValue","boolHook","removeAttr","nType","attrHooks","propName","attrNames","propFix","getter","rfocusable","rclickable","removeProp","tabindex","for","class","rclass","classes","curValue","clazz","finalValue","stateVal","classNames","rreturn","valHooks","optionSet","rfocusMorph","onlyHandlers","bubbleType","ontype","eventPath","isTrigger","parentWindow","simulate","isSimulated","hover","fnOver","fnOut","focusin","attaches","nonce","rquery","JSON","parseXML","DOMParser","parseFromString","rhash","rts","rheaders","rlocalProtocol","rnoContent","rprotocol","allTypes","originAnchor","lastModified","etag","isLocal","protocol","processData","async","contentType","accepts","json","* text","text html","text json","text xml","ajaxSetup","ajaxPrefilter","ajaxTransport","ajax","nativeStatusText","headers","success","modified","statusText","timeoutTimer","transport","responseHeadersString","ifModified","cacheURL","callbackContext","statusCode","fireGlobals","globalEventContext","completeDeferred","responseHeaders","urlAnchor","requestHeaders","requestHeadersNames","strAbort","getAllResponseHeaders","setRequestHeader","lname","overrideMimeType","finalText","crossDomain","host","param","hasContent","beforeSend","getScript","throws","wrapAll","firstElementChild","wrapInner","unwrap","visible","r20","rCRLF","rsubmitterTypes","rsubmittable","serialize","serializeArray","xhr","xhrSuccessStatus",0,1223,"xhrSupported","cors","errorCallback","xhrFields","onabort","onreadystatechange","responseType","responseText","binary","text script","charset","scriptCharset","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","_load","animated","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","calculatePosition","curElem","using","win","box","pageYOffset","pageXOffset","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","size","andSelf","define","amd","_jQuery","_$","noConflict","g","gb","Z","A","ignoreFlash","flash","r","d","_s","_a","setupOptions","debugMode","debugFlash","useConsole","consoleOnly","waitForWindowLoad","bgColor","flashPollingInterval","flashLoadTimeout","allowScriptAccess","useFlashBlock","useHTML5Audio","forceUseGlobalHTML5Audio","ignoreMobileRestrictions","html5Test","noSWFCache","idPrefix","autoLoad","autoPlay","loops","onid3","onposition","onfailure","multiShot","multiShotEvents","pan","usePolicyFile","flash9Options","isMovieStar","usePeakData","useWaveformData","useEQData","ondataerror","movieStarOptions","bufferTime","serverURL","onconnect","audioFormats","mp3","required","mp4","ogg","opus","wav","movieID","debugID","debugURLParam","versionNumber","altURL","movieURL","swfLoaded","oMC","sounds","soundIDs","didFlashBlock","muted","filePattern","filePatterns","flash8","flash9","buffering","peakData","waveformData","eqData","movieStar","sandbox","html5","usingFlash","html5Only","N","aa","pa","Qa","qa","Q","sa","ba","ta","F","H","I","Ra","va","J","da","G","wa","R","xa","ea","K","Sa","ya","Ta","za","Ua","T","Ba","L","fa","q","Va","Wa","Xa","ia","X","Ya","ja","Y","D","ka","Da","Za","Ea","Fa","$a","C","la","Ga","Oa","k","u","Pa","O","P","B","ra","S","Aa","U","Ca","ha","V","W","hb","z","ab","Ha","Ia","E","ib","ma","Ja","na","bb","Ka","oa","cb","db","La","jb","eb","kb","mimePattern","useAltURL","Ma","Audio","canPlayType","lb","hasHTML5","globalHTML5","ignoreMobile","beginDelayedInit","supported","getMovie","f","_setup_html5","_createSound","connected","destroySound","onPosition","clearOnPosition","setPan","mute","muteAll","unmute","unmuteAll","toggleMute","getMemoryUse","_getMemoryUse","canPlayMIME","canPlayLink","getSoundById","ontimeout","_wD","_writeDebug","_debug","reboot","getMoviePercent","PercentLoaded","M","sID","instanceOptions","id3","_called_load","_html5_canplay","autobuffer","preload","fatal","_unload","_destroySound","Na","getAutoPlay","setAutoPlay","instanceCount","_oncanplay","_onfinish","_start","onplayerror","_onbufferchange","_resetOnPosition","_onTimer","_stop","_setAutoPlay","_setPosition","_pause","_setPan","_setVolume","scope","_processOnPosition","_hasTimer","bytesLoaded","bytesTotal","buffered","right","failures","metadata","_get_html5_duration","_whileplaying","Infinity","_apply_loop","loop","decodeURI","_added_events","_onload","_onsuspend","onsuspend","_onfailure","_onwarning","onwarning","_whileloading","bufferLength","leftPeak","rightPeak","leftEQ","rightEQ","_oncaptiondata","captiondata","oncaptiondata","_onmetadata","onmetadata","_onid3","_onconnect","_ondataerror","Function","canplay","canplaythrough","durationchange","ended","loadeddata","_loaded","loadedmetadata","loadstart","total","ratechange","suspend","stalled","timeupdate","waiting","_called_unload","_setPolling","ignoreInit","plugins","ActiveXObject","mimeTypes","enabledPlugin","description","_setSandboxType","_externalInterfaceOK","platform","spcWmode","quality","bgcolor","pluginspage","hasPriority","FlashVars","bottom","abs","oninitmovie","_externalInterfaceTest","_disableDebug","needFlash","SM2_DEFER","SoundManager","getInstance","volumeOpen","volumeDragging","hideVolume","showVolume","dragVolume","posY","clickWhere","theVolume","fillerHeight","mouseup","matchTag","htmlParsed","slash","addends","addend","subtrahends","subtrahend","isValid","removeSuffix","fromNow","referenceTime","calendar","build_audio_rows","audio_files_html","dark_text_class","playlist_open","html_filtered","getBroadcasts","input_limit","limit","input_offset","input_term","input_show","input_show_category","input_date_start","input_date_end","initialLoad","$Archives","broadcasts","categories","data2","createLink","rel","createStyle","sheet","styleSheet","utils_hooks__hooks","hookCallback","setHookCallback","isDate","res","hasOwnProp","valueOf","create_utc__createUTC","locale","strict","createLocalOrUTC","utc","defaultParsingFlags","unusedTokens","unusedInput","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","getParsingFlags","_pf","valid__isValid","_isValid","flags","_d","invalidWeekday","_strict","bigHour","valid__createInvalid","NaN","isUndefined","copyConfig","_isAMomentObject","_i","_f","_l","_tzm","_isUTC","_offset","_locale","momentProperties","Moment","updateInProgress","updateOffset","isMoment","absFloor","number","ceil","toInt","argumentForCoercion","coercedNumber","compareArrays","array1","array2","dontConvert","lengthDiff","diffs","Locale","normalizeLocale","chooseLocale","names","loadLocale","oldLocale","locales","globalLocale","_abbr","locale_locales__getSetGlobalLocale","locale_locales__getLocale","defineLocale","abbr","addUnitAlias","shorthand","lowerCase","aliases","normalizeUnits","units","normalizeObjectUnits","inputObject","normalizedProp","normalizedInput","makeGetSet","keepTime","get_set__set","get_set__get","mom","getSet","zeroFill","targetLength","forceSign","absNumber","zerosToFill","sign","pow","addFormatToken","padded","ordinal","formatTokenFunctions","localeData","removeFormattingTokens","makeFormatFunction","formattingTokens","output","formatMoment","expandFormat","formatFunctions","invalidDate","replaceLongDateFormatTokens","longDateFormat","localFormattingTokens","addRegexToken","regex","strictRegex","regexes","isStrict","getParseRegexForToken","unescapeFormat","regexEscape","p1","p2","p3","p4","addParseToken","addWeekParseToken","_w","addTimeToArrayFromToken","daysInMonth","year","month","UTC","getUTCDate","localeMonths","_months","MONTHS_IN_FORMAT","localeMonthsShort","_monthsShort","localeMonthsParse","monthName","_monthsParse","_longMonthsParse","_shortMonthsParse","months","monthsShort","setMonth","dayOfMonth","monthsParse","getSetMonth","getDaysInMonth","monthsShortRegex","_monthsParseExact","computeMonthsParse","_monthsShortStrictRegex","_monthsShortRegex","monthsRegex","_monthsStrictRegex","_monthsRegex","cmpLenRev","shortPieces","longPieces","mixedPieces","checkOverflow","MONTH","DATE","YEAR","HOUR","MINUTE","SECOND","MILLISECOND","_overflowDayOfYear","_overflowWeeks","WEEK","_overflowWeekday","WEEKDAY","suppressDeprecationWarnings","deprecate","firstTime","stack","deprecateSimple","deprecations","configFromISO","allowTime","dateFormat","timeFormat","tzFormat","extendedIsoRegex","basicIsoRegex","isoDates","isoTimes","tzRegex","configFromStringAndFormat","configFromString","aspNetJsonRegex","createFromInputFallback","createDate","ms","getFullYear","setFullYear","createUTCDate","getUTCFullYear","setUTCFullYear","daysInYear","isLeapYear","getIsLeapYear","firstWeekOffset","dow","doy","fwd","fwdlw","getUTCDay","dayOfYearFromWeeks","week","weekday","resYear","resDayOfYear","localWeekday","weekOffset","dayOfYear","weekOfYear","resWeek","weeksInYear","weekOffsetNext","currentDateArray","nowValue","_useUTC","getUTCMonth","getMonth","getDate","configFromArray","currentDate","yearToUse","dayOfYearFromWeekInfo","_dayOfYear","_nextDay","setUTCMinutes","getUTCMinutes","weekYear","weekdayOverflow","GG","local__createLocal","_week","gg","ISO_8601","parsedInput","skipped","stringLength","totalParsedInputLength","meridiemFixWrap","_meridiem","hour","meridiem","isPm","meridiemHour","isPM","configFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","score","configFromObject","day","minute","millisecond","createFromConfig","prepareConfig","preparse","configFromInput","isUTC","pickBy","moments","Duration","years","quarters","quarter","weeks","days","hours","minutes","milliseconds","_milliseconds","_days","_bubble","isDuration","separator","utcOffset","offsetFromString","chunk","chunkOffset","cloneWithOffset","model","local","getDateOffset","getTimezoneOffset","getSetOffset","keepLocalTime","localAdjust","matchShortOffset","_changeInProgress","add_subtract__addSubtract","create__createDuration","getSetZone","setOffsetToUTC","setOffsetToLocal","setOffsetToParsedOffset","matchOffset","hasAlignedHourOffset","isDaylightSavingTime","isDaylightSavingTimeShifted","_isDSTShifted","other","isUtcOffset","isUtc","diffRes","aspNetRegex","isoRegex","parseIso","momentsDifference","inp","positiveMomentsDifference","isAfter","isBefore","createAdder","direction","period","dur","isAdding","moment_calendar__calendar","formats","sod","startOf","localInput","endOf","isBetween","isSame","inputMs","isSameOrAfter","isSameOrBefore","asFloat","that","zoneDelta","delta","monthDiff","anchor2","adjust","wholeMonthDiff","anchor","moment_format__toISOString","toISOString","toDate","inputString","defaultFormat","postformat","withoutSuffix","humanize","toNow","newLocaleData","isoWeekday","to_type__valueOf","unix","toObject","toJSON","moment_valid__isValid","parsingFlags","invalidAt","creationData","addWeekYearFormatToken","getSetWeekYear","getSetWeekYearHelper","getSetISOWeekYear","isoWeek","getISOWeeksInYear","getWeeksInYear","weekInfo","weeksTarget","setWeekAll","dayOfYearData","getSetQuarter","localeWeek","localeFirstDayOfWeek","localeFirstDayOfYear","getSetWeek","getSetISOWeek","parseWeekday","weekdaysParse","localeWeekdays","_weekdays","isFormat","localeWeekdaysShort","_weekdaysShort","localeWeekdaysMin","_weekdaysMin","localeWeekdaysParse","weekdayName","_weekdaysParse","_minWeekdaysParse","_shortWeekdaysParse","_fullWeekdaysParse","weekdays","weekdaysShort","weekdaysMin","getSetDayOfWeek","getDay","getSetLocaleDayOfWeek","getSetISODayOfWeek","getSetDayOfYear","hFormat","lowercase","matchMeridiem","_meridiemParse","localeIsPM","localeMeridiem","isLower","parseMs","getZoneAbbr","getZoneName","moment__createUnix","moment__createInZone","parseZone","locale_calendar__calendar","_calendar","_longDateFormat","formatUpper","_invalidDate","_ordinal","preParsePostFormat","relative__relativeTime","isFuture","_relativeTime","pastFuture","locale_set__set","_ordinalParseLenient","_ordinalParse","lists__get","field","out","lists__listMonths","lists__listMonthsShort","lists__listWeekdays","lists__listWeekdaysShort","lists__listWeekdaysMin","duration_abs__abs","mathAbs","duration_add_subtract__addSubtract","duration_add_subtract__add","duration_add_subtract__subtract","absCeil","bubble","monthsFromDays","monthsToDays","daysToMonths","as","duration_as__valueOf","makeAs","alias","duration_get__get","makeGetter","substituteTimeAgo","relativeTime","duration_humanize__relativeTime","posNegDuration","thresholds","duration_humanize__getSetRelativeTimeThreshold","threshold","withSuffix","iso_string__toISOString","iso_string__abs","asSeconds","match1","match2","match3","match4","match6","match1to2","match3to4","match5to6","match1to3","match1to4","match1to6","matchUnsigned","matchSigned","matchTimestamp","matchWord","defaultLocaleMonths","defaultLocaleMonthsShort","defaultMonthsShortRegex","defaultMonthsRegex","parseTwoDigitYear","getSetYear","prototypeMin","prototypeMax","add_subtract__add","add_subtract__subtract","isoWeekYear","defaultLocaleWeek","getSetDayOfMonth","defaultLocaleWeekdays","defaultLocaleWeekdaysShort","defaultLocaleWeekdaysMin","_isPm","pos1","pos2","defaultLocaleMeridiemParse","getSetHour","getSetMinute","getSetSecond","getSetMillisecond","momentPrototype__proto","isoWeeks","isoWeeksInYear","isDST","isDSTShifted","zoneAbbr","zoneName","dates","zone","momentPrototype","defaultCalendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","defaultLongDateFormat","LTS","LT","LL","LLL","LLLL","defaultInvalidDate","defaultOrdinal","defaultOrdinalParse","defaultRelativeTime","future","past","mm","dd","MM","yy","prototype__proto","firstDayOfYear","firstDayOfWeek","ordinalParse","langData","asMilliseconds","asMinutes","asHours","asDays","asWeeks","asMonths","asYears","duration_prototype__proto","toIsoString","invalid","relativeTimeThreshold","_moment","lookup","uri","path","sameNamespace","nsps","newConnection","forceNew","multiplex","Manager","parser","managers","connect","Socket","Target","Matcher","routes","generateMatch","startingPath","nestedCallback","fullPath","addRoute","routeArray","eachRoute","baseRoute","binding","addRouteCallback","StaticSegment","DynamicSegment","StarSegment","EpsilonSegment","specificity","segments","segment","State","charSpec","nextStates","sortSolutions","states","recognizeChar","ch","RecognizeResults","queryParams","findHandler","captures","currentCapture","isDynamic","addSegment","currentState","eachChar","put","decodeQueryParamPart","part","decodeURIComponent","exports$1","resolvePath","query","isPromise","getRouteConfig","$options","resolveAsyncComponent","resolver","_resolveComponent","Component","mapParams","stringify","genQuery","canReuse","childVM","canReuseFn","canDeactivate","fromComponent","hook","callHook","expectBoolean","canActivate","aborted","deactivate","callHooks","depth","reuse","activateQueue","saveChildView","_bound","setComponent","activateHook","dataHook","waitForData","activated","$loadingRouteData","unbuild","_meta","created","_routerView","keepAlive","cachedChildView","_keepAliveRouterView","childView","cleanup","$destroy","_rendered","_transitionOnLoad","setCurrent","$before","afterData","afterActivate","loadData","onError","_needMerge","reduce","forEach","promises","resolvedVal","$set","$emit","expectData","isPlainOjbect","applyOverride","_Vue$util","defineReactive","_init","_parent","$router","$route","_children","_defineMeta","destroy","_destroy","_isBeingDestroyed","$remove","strats","optionMergeStrategies","hooksToMergeRE","parentVal","childVal","View","componentDef","directive","internalDirectives","viewDef","_isRouterView","vm","_isDynamicLiteral","parentView","$parent","_rootView","_currentTransition","elementDirective","Link","sameOrigin","hostname","port","_bind","isObject","priority","__v_link_active","unwatch","$watch","onRouteUpdate","activeEl","tagName","onClick","exact","prevActiveClass","activeClass","metaKey","ctrlKey","shiftKey","go","newPath","_stringifyPath","updateActiveMatch","updateHref","updateClasses","activeRE","queryStringRE","regexEscapeRE","isAbsolute","mode","formatPath","_linkActiveClass","trailingSlashRE","guardComponent","comp","babelHelpers","classCallCheck","Constructor","TypeError","willAddRoute","addChild","contextEntered","specials","escapeRegex","validChars","generate","invalidChars","child","isEqual","chars","oCreate","proto","RouteRecognizer","rootState","allSegments","isEmpty","handlersFor","hasRoute","generateQueryString","pairs","pair","arrayPair","parseQueryString","queryString","keyLength","recognize","pathLen","queryStart","isSlashDropped","solutions","VERSION","hashRE","HTML5History","_ref","onChange","rootRE","baseEl","querySelector","_this","listener","search","hashMatch","HashHistory","hashbang","formattedPath","isAbsoloute","AbstractHistory","currentPath","RouteTransition","abortingOnLoad","redirect","deactivateQueue","reverseDeactivateQueue","reuseQueue","runQueue","_onTransitionValidated","_view","_ref$expectBoolean","_ref$expectData","nextCalled","_suppress","exposed","resIsPromise","internalKeysRE","Route","_recognizer","_notFoundHandler","freeze","historyBackends","abstract","Router","_ref$hashbang","_ref$abstract","_ref$history","_ref$saveScrollPosition","_ref$transitionOnLoad","transitionOnLoad","_ref$suppressTransitionError","suppressTransitionError","_ref$root","_ref$linkActiveClass","linkActiveClass","installed","app","_guardRecognizer","_started","_startCb","_currentRoute","_previousTransition","_notFoundRedirect","_beforeEachHooks","_afterEachHooks","_root","_abstract","_hashbang","hasPushState","_history","_historyFallback","inBrowser","History","_match","_saveScrollPosition","_map","rootPath","_notFound","_addRoute","_addRedirect","_addAlias","beforeEach","afterEach","_appContainer","Ctor","_appConstructor","_location","assign","subRoutes","subPath","redirectPath","_addGuard","aliasPath","mappedPath","_handler","_this2","realPath","_checkGuard","_this3","currentRoute","currentTransition","_prevTransition","beforeHooks","startTransition","_postTransition","nextTick","scrollX","currentParams","targetParams","encodeURI","install","externalVue","loc","parseuri","ipv6","subs","reconnection","reconnectionAttempts","reconnectionDelay","reconnectionDelayMax","randomizationFactor","backoff","Backoff","jitter","connecting","lastPing","encoding","packetBuffer","encoder","Encoder","decoder","Decoder","autoConnect","eio","Emitter","emitAll","nsp","updateSocketIds","engine","_reconnection","_reconnectionAttempts","_reconnectionDelay","setMin","_randomizationFactor","setJitter","_reconnectionDelayMax","setMax","_timeout","maybeReconnectOnOpen","reconnecting","attempts","reconnect","skipReconnect","openSub","onopen","errorSub","onping","onpong","ondata","ondecoded","packet","onConnecting","encode","encodedPackets","processPacketQueue","pack","sub","disconnect","onclose","reason","onreconnect","ids","acks","receiveBuffer","sendBuffer","disconnected","hasBin","connect_error","connect_timeout","reconnect_attempt","reconnect_failed","reconnect_error","ping","pong","subEvents","ev","parserType","EVENT","BINARY_EVENT","compress","CONNECT","onpacket","onevent","ACK","onack","BINARY_ACK","DISCONNECT","ondisconnect","ERROR","ack","sent","emitBuffered","_isVue","ob","__ob__","convert","dep","vms","_proxy","_digest","del","_unproxy","isLiteral","exp","literalValueRE","isReserved","charCodeAt","_toString","toNumber","Number","toBoolean","stripQuotes","camelize","camelizeRE","toUpper","hyphenate","hyphenateRE","classify","classifyRE","bind$1","ctx","OBJECT_STRING","def","enumerable","_debounce","timestamp","later","cancellable","cancelled","cancel","looseEqual","Cache","tail","_keymap","pushFilter","lastFilterIndex","filterTokenRE","processFilterArg","reservedArgRE","dynamic","stripped","parseDirective","hit","cache$1","inSingle","inDouble","curly","square","paren","expression","compileRegex","delimiters","unsafeOpen","unsafeDelimiters","unsafeClose","tagRE","htmlRE","parseText","oneTime","tokensToExp","formatToken","single","$eval","inlineFilters","filterRE$1","appendWithTransition","applyTransition","beforeWithTransition","removeWithTransition","op","__v_trans","transitionEndEvent","_isCompiled","action","process","env","NODE_ENV","inDoc","getAttr","_attr","getBindAttr","hasBindAttr","hasAttribute","on$1","useCapture","setClass","cls","isIE9","SVGElement","classList","tar","extractContent","asFragment","rawContent","isTemplate","DocumentFragment","hasChildNodes","trimNode","isTrimmable","createAnchor","__vue_anchor","findRef","hasAttributes","refRE","mapNodeRange","removeNodeRange","frag","onRemoved","removed","checkComponentAttr","hasAttrs","commonTagRE","reservedTagRE","getIsBinding","resolveAsset","initProp","coerceProp","assertProp","expectedType","valid","Boolean","formatType","formatValue","validator","coerce","mergeData","toVal","fromVal","mergeAssets","guardArrayAssets","guardComponents","guardProps","assets","asset","mergeOptions","mergeField","strat","defaultStrat","mixins","camelizedId","assertAsset","Dep","uid$3","Observer","augment","hasProto","protoAugment","copyAugment","arrayMethods","arrayKeys","observeArray","walk","__proto__","observe","isExtensible","addVm","convertAllProperties","getOwnPropertyDescriptor","childOb","depend","newVal","initMixin","$el","$root","$children","$refs","$els","_watchers","_directives","_uid","_events","_eventsCount","_isFragment","_fragment","_fragmentStart","_fragmentEnd","_isDestroyed","_isReady","_isAttached","_vForRemoving","_unlinkFn","_context","_scope","_frag","_runtimeData","_updateRef","_callHook","_initState","_initEvents","$mount","getPathCharType","formatSubPath","trimmed","maybeUnescapeQuote","nextChar","IN_SINGLE_QUOTE","IN_DOUBLE_QUOTE","newChar","APPEND","typeMap","BEFORE_PATH","subPathDepth","PUSH","INC_SUB_PATH_DEPTH","PUSH_SUB_PATH","IN_SUB_PATH","pathStateMachine","AFTER_PATH","parsePath","pathCache","getPath","parseExpression","setPath","warnNonExistent","save","isString","saved","newlineRE","rewrite","allowedKeywordsRE","restoreRE","restore","compileGetter","improperKeywordsRE","saveRE","wsRE","identRE","makeGetterFn","compileSetter","needSet","expressionCache","isSimplePath","pathTestRE","booleanLiteralRE","resetBatcherState","userQueue","circular","internalQueueDepleted","flushBatcherQueue","runBatcherQueue","devtools","watcher","_maxUpdateCount","pushWatcher","user","Watcher","expOrFn","isFn","uid$2","dirty","lazy","deps","newDeps","prevError","twoWay","queued","shallow","traverse","normalize","propCache","upper","testEl","prefixed","prefixes","camelPrefixes","keyFilter","codes","keyCodes","stopFilter","preventFilter","selfFilter","getValue","multi","_value","indexOf$1","isRealTemplate","stringToFragment","templateString","cacheKey","templateCache","tagMatch","tagRE$1","entityMatch","entityRE","efault","nodeToFragment","clonedNode","cloned","hasBrokenTemplate","tempClone","hasTextareaCloneBug","parseTemplate","shouldClone","idSelectorCache","Fragment","linker","parentFrag","childFrags","inserted","unlink","singleBefore","singleRemove","multiBefore","multiRemove","__vfrag__","withTransition","attach","shouldCallRemove","beforeRemove","FragmentFactory","cid","cacheId","linkerCache","findPrevFrag","previousSibling","forId","findVmFromFrag","__vue__","range","pushJob","job","queue$1","flush","Transition","enterClass","leaveClass","pendingCssEvent","pendingCssCb","pendingJsCb","justEntered","entered","typeCache","TYPE_TRANSITION","TYPE_ANIMATION","stringToObject","contains$1","compileProps","propOptions","identRE$1","propBindingModes","ONE_WAY","TWO_WAY","ONE_TIME","optimizedLiteral","settablePathRE","parentPath","makePropsLinkFn","_props","getDefault","$get","_bindDir","propDef","partial","nodeLinkFn","_asComponent","compileNode","childLinkFn","terminal","compileNodeList","dirs","linkAndCapture","makeUnlinkFn","originalDirCount","directiveComparator","descriptor","DEFAULT_PRIORITY","contextDirs","destroying","teardownDirs","_teardown","compileAndLinkProps","propsLinkFn","propDirs","compileRoot","contextOptions","contextLinkFn","replacerLinkFn","containerAttrs","_containerAttrs","replacerAttrs","_replacerAttrs","compileDirectives","onRE","plural","selfDirs","compileElement","compileTextNode","linkFn","checkTerminalDirectives","checkElementDirectives","checkComponent","_skip","removeText","wholeText","processTextToken","makeTextNodeLinkFn","setTokenType","publicDirectives","fragClone","nodeList","linkFns","makeChildLinkFn","childrenLinkFn","makeTerminalNodeLinkFn","ref","modifiers","literal","componentLinkFn","skip","previousElementSibling","dirName","terminalDirectives","pushDir","interpTokens","hasOneTimeToken","hasOneTime","rawName","rawValue","interp","dirDef","parseModifiers","modifierRE","some","transitionRE","bindRE","dirAttrRE","makeNodeLinkFn","directives","transclude","extractAttrs","_content","transcludeTemplate","replacer","mergeAttrs","specialCharRE","stateMixin","makeComputedGetter","evaluate","newData","_setData","_initProps","_initMeta","_initMethods","_initData","_initComputed","_propsUnlinkFn","runtimeData","propsData","optionsDataFn","optionsData","oldData","removeVm","userDef","metas","eventsMixin","registerComponentEvents","eventRE","_fromParent","$on","registerCallbacks","onAttached","callAttach","onDetached","callDetach","watch","_initDOMHooks","Directive","_locked","_listeners","_host","_vue_directives","lifecycleMixin","refs","_compile","_initElement","contentLinkFn","rootLinker","ctor","_linkerCachable","rootUnlinkFn","contentUnlinkFn","deferCleanup","_cleanup","destroyReady","pendingRemoval","cleanupIfPossible","$off","miscMixin","_applyFilters","oldValue","resolved","requested","pendingCallbacks","cbs","globalAPI","createClass","compiler","parsers","text$1","extendOptions","Super","isFirstExtend","_Ctor","Sub","_assetTypes","plugin","mixin","definition","dataAPI","clean","asStatement","$arguments","$delete","sync","immediate","filterRE","$interpolate","$log","domAPI","op1","op2","targetIsDetached","shouldCallHook","beforeWithCb","removeWithCb","$nextTick","$appendTo","$prependTo","$after","inDocument","realCb","eventsAPI","modifyListenerCount","hookRE","$once","isSource","shouldPropagate","hasParentCbs","$broadcast","$dispatch","lifecycleAPI","$compile","limitBy","filterBy","delimiter","convertArray","$value","$key","orderBy","sortKey","extractFragment","__v_selected","__VUE_DEVTOOLS_GLOBAL_HOOK__","isAndroid","transitionProp","animationProp","animationEndEvent","isWebkitTrans","ontransitionend","onwebkittransitionend","isWebkitAnim","onanimationend","onwebkitanimationend","nextTickHandler","pending","copies","callbacks","timerFunc","MutationObserver","counter","observer","textNode","characterData","setImmediate","entry","newer","older","returnEntry","defineProperties","silent","warnExpressionErrors","_delimitersChanged","_propBindingModes","hasConsole","instanceData","defaultData","attached","detached","beforeCompile","beforeDestroy","destroyed","paramAttributes","arrayProto","addSub","removeSub","addDep","getOwnPropertyNames","debounce","IN_PATH","BEFORE_IDENT","IN_IDENT","ws","ident","[","eof",".","'","\"","]","else","allowedKeywords","improperKeywords","beforeGet","preProcess","postProcess","afterGet","forContext","$forContext","_withLock","$index","depIds","cloak","ON","MODEL","BIND","TRANSITION","EL","COMPONENT","PARTIAL","FOR","IF","SLOT","importantRE","handleObject","handleSingle","isImportant","setProperty","removeProperty","xlinkNS","xlinkRE","disallowedInterpAttrRE","attrWithPropsRE","modelProps","true-value","false-value","modelProp","__v_model","setAttributeNS","esc","tab","enter","space","delete","up","down","acceptStatement","iframeBind","contentWindow","capture","prevent","getBooleanValue","_trueValue","_falseValue","_watcher","afterBind","forceUpdate","multiple","initValue","text$2","isRange","composing","focused","rawListener","hasjQuery","checkFilters","hasRead","hasWrite","_unbind","nextElementSibling","elseEl","legend","defs","symbol","circle","ellipse","line","polygon","polyline","rect","placeholder","vIf","elseFactory","elseFrag","uid$1","vFor","inMatch","itMatch","isOption","updateRef","updateModel","primitive","convertedFromObject","fromObject","trackByKey","trackBy","oldFrags","frags","getCachedFrag","reused","fresh","removalIndex","totalRemoved","deleteCachedFrag","targetPrev","prevEl","currentPrev","insertionIndex","staggerCb","staggerAnchor","move","parentScope","cacheFrag","staggerAmount","getStagger","warnDuplicate","trans","stagger","_preProcess","_postProcess","if","transDurationProp","animDurationProp","p$1","cancelPending","callHookWithCb","enterCancelled","enterNextTick","enterDone","getCssTransitionType","setupCssCb","leave","leaveCancelled","leaveDone","leaveNextTick","hasPending","inlineStyles","computedStyles","transDuration","animDuration","onEnd","oldId","bindingModes","childKey","parentKey","parentWatcher","childWatcher","inlineTemplate","pendingComponentCb","pendingRemovals","pendingRemovalCb","invalidatePending","resolveComponent","mountComponent","ComponentName","getCached","newComponent","waitingFor","extraOptions","_inactive","transitionMode","vClass","handleArray","prevKeys","_setupParams","_checkStatement","_update","oldVal","mappedKey","_setupParamWatcher","called","paramWatchers","_paramUnwatchFns","$event","listeners","unwatchFns","digitsRE","indent","capitalize","uppercase","currency","_currency","stringified","toFixed","_int","_float","pluralize","slot","fallback","slotName","tryCompile","elseBlock","namedSlot","elementDirectives","_namedSlot","transitions","partials","encodeAsString","attachments","encodeAsBinary","writeEncoding","bloblessData","deconstruction","deconstructPacket","buffers","removeBlobs","reconstructor","decodeString","buf","BinaryReconstructor","reconPack","isBuf","base64","takeBinaryData","finishedReconstruction","binData","reconstructPacket","useColors","firebug","exception","table","$1","formatArgs","color","lastC","storage","removeItem","localstorage","localStorage","chrome","colors","formatters","removeListener","cleanUpNextTick","draining","currentQueue","queueIndex","drainQueue","Item","fun","browser","argv","versions","addListener","removeAllListeners","cwd","chdir","umask","_deconstructPacket","_placeholder","packetData","_reconstructPacket","_removeBlobs","curKey","containingObject","Blob","File","pendingBlobs","fileReader","FileReader","readAsArrayBuffer","Buffer","isBuffer","ArrayBuffer","selectColor","prevColor","curr","prevTime","formatter","logFn","skips","_callbacks","hasListeners","re","authority","ipv6uri","factor","rand","deviation","hasBinary","_hasBinary","runInContext","undef","isSupported","serialized","stringifySupported","isExtended","parseSupported","SyntaxError","nativeJSON","isProperty","objectProto","getUTCHours","getUTCSeconds","getUTCMilliseconds","functionClass","dateClass","numberClass","stringClass","arrayClass","booleanClass","charIndexBuggy","Months","members","Properties","isConstructor","hasProperty","objectTypes","Escapes",92,34,8,12,10,13,9,"leadingZeroes","toPaddedString","unicodePrefix","quote","useCharIndex","symbols","indentation","Index","Source","Unescapes",47,98,116,110,102,114,"lex","begin","isSigned","hasMembers","isLoader","function","freeExports","freeGlobal","previousJSON","isRestored","JSON3","short","long","secure","agent","parseqs","decode","upgrade","forceJSONP","forceBase64","enablesXDR","timestampParam","timestampRequests","writeBuffer","policyPort","rememberUpgrade","binaryType","onlyBinaryUpgrades","perMessageDeflate","pfx","passphrase","cert","ciphers","rejectUnauthorized","extraHeaders","parsejson","priorWebsocketSuccess","Transport","createTransport","EIO","sid","setTransport","onDrain","onPacket","onClose","probe","onTransportOpen","upgradeLosesBinary","supportsBinary","failed","upgrading","freezeTransport","onTransportClose","onupgrade","onOpen","upgrades","onHandshake","setPing","filterUpgrades","pingInterval","pingTimeout","onHeartbeat","pingTimeoutTimer","pingIntervalTimer","sendPacket","prevBufferLen","cleanupAndClose","waitForUpgrade","desc","filteredUpgrades","encodeBase64Object","packets","encodeArrayBuffer","encodeBase64Packet","contentArray","Uint8Array","resultBuffer","byteLength","buffer","encodeBlobAsArrayBuffer","fr","encodePacket","encodeBlob","dontSendBlobs","blob","ary","eachWithIndex","sliceBuffer","base64encoder","utf8","isPhantomJS","packetslist","utf8encode","encoded","b64","readAsDataURL","b64data","typed","basic","btoa","decodePacket","utf8decode","decodeBase64Packet","asArray","rest","encodePayload","setLengthHeader","encodeOne","doneCallback","isBinary","encodePayloadAsBlob","encodePayloadAsArrayBuffer","decodePayload","decodePayloadAsBinary","chr","totalLength","acc","resultArray","bufferIndex","lenStr","binaryIdentifier","lengthAry","bufferTail","numberTooLong","tailArray","msgLength","doOpen","doClose","onData","polling","xd","xs","isSSL","xdomain","xscheme","XHR","JSONP","websocket","qs","qry","rvalidchars","rvalidescape","rvalidtokens","rvalidbraces","rtrimLeft","rtrimRight","hasCORS","XDomainRequest","Polling","Request","requests","inherit","request","doWrite","req","sendXhr","doPoll","pollXhr","setDisableHeaderCheck","withCredentials","hasXDR","onLoad","requestsCount","onSuccess","fromError","ui8Arr","dataArray","JSONPPolling","___eio","rNewline","rEscapedNewline","form","insertAt","isUAgecko","initIframe","iframeId","area","WS","yeast","BrowserWebSocket","WebSocket","MozWebSocket","protocols","supports","addEventListeners","onmessage","ucs2decode","ucs2encode","stringFromCharCode","checkScalarValue","codePoint","createByte","encodeCodePoint","codePoints","byteString","readContinuationByte","byteIndex","byteCount","continuationByte","byteArray","decodeSymbol","byte1","byte2","byte3","byte4","freeModule","arraybuffer","bytes","abv","ii","err_cb","bail","mapArrayBufferViews","byteOffset","BlobBuilderConstructor","BlobBuilder","getBlob","BlobConstructor","WebKitBlobBuilder","MSBlobBuilder","MozBlobBuilder","blobSupported","blobSupportsArrayBufferView","blobBuilderSupported","encoded1","encoded2","encoded3","encoded4","hasXHR2","poll","onPause","callbackfn","alphabet","decoded"],"mappings":"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","file":"bundle.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})","var css = \"/**\\r\\n * SoundManager 2: \\\"Bar UI\\\" player - CSS\\r\\n * Copyright (c) 2014, Scott Schiller. All rights reserved.\\r\\n * http://www.schillmania.com/projects/soundmanager2/\\r\\n * Code provided under BSD license.\\r\\n * http://schillmania.com/projects/soundmanager2/license.txt\\r\\n */\\n.sm2-bar-ui a {\\n  border-bottom: 0 !important;\\n}\\n.sm2-bar-ui {\\n  position: relative;\\n  display: inline-block;\\n  width: 100%;\\n  font-family: helvetica, arial, verdana, sans-serif;\\n  font-weight: normal;\\n  /* prevent background border bleed */\\n  -webkit-background-clip: padding-box;\\n  background-clip: padding-box;\\n  /* because indeed, fonts do look pretty \\\"fat\\\" otherwise in this case. */\\n  -moz-osx-font-smoothing: grayscale;\\n  -webkit-font-smoothing: antialiased;\\n  /* general font niceness? */\\n  font-smoothing: antialiased;\\n  text-rendering: optimizeLegibility;\\n  min-width: 20em;\\n  max-width: 30em;\\n  /* take out overflow if you want an absolutely-positioned playlist dropdown. */\\n  border-radius: 2px;\\n  overflow: hidden;\\n  /* just for fun (animate normal / full-width) */\\n  transition: max-width 0.2s ease-in-out;\\n}\\n.sm2-bar-ui .sm2-playlist li {\\n  text-align: center;\\n  margin-top: -2px;\\n  font-size: 95%;\\n  line-height: 1em;\\n}\\n.sm2-bar-ui.compact {\\n  min-width: 1em;\\n  max-width: 15em;\\n}\\n.sm2-bar-ui ul {\\n  line-height: 1em;\\n}\\n/* want things left-aligned? */\\n.sm2-bar-ui.left .sm2-playlist li {\\n  text-align: left;\\n}\\n.sm2-bar-ui .sm2-playlist li .load-error {\\n  cursor: help;\\n}\\n.sm2-bar-ui.full-width {\\n  max-width: 100%;\\n  z-index: 5;\\n}\\n.sm2-bar-ui.fixed {\\n  position: fixed;\\n  top: auto;\\n  bottom: 0px;\\n  left: 0px;\\n  border-radius: 0px;\\n  /* so the absolutely-positioned playlist can show... */\\n  overflow: visible;\\n  /* and this should probably have a high z-index. tweak as needed. */\\n  z-index: 999;\\n}\\n.sm2-bar-ui.fixed .bd,\\n.sm2-bar-ui.bottom .bd {\\n  /* display: table; */\\n  border-radius: 0px;\\n  border-bottom: none;\\n}\\n.sm2-bar-ui.bottom {\\n  /* absolute bottom-aligned UI */\\n  top: auto;\\n  bottom: 0px;\\n  left: 0px;\\n  border-radius: 0px;\\n  /* so the absolutely-positioned playlist can show... */\\n  overflow: visible;\\n}\\n.sm2-bar-ui.playlist-open .bd {\\n  border-bottom-left-radius: 0px;\\n  border-bottom-right-radius: 0px;\\n  border-bottom-color: transparent;\\n}\\n.sm2-bar-ui .bd,\\n.sm2-bar-ui .sm2-extra-controls {\\n  position: relative;\\n  background-color: #2288cc;\\n  /*\\r\\n transition: background 0.2s ease-in-out;\\r\\n */\\n}\\n.sm2-bar-ui .sm2-inline-gradient {\\n  /* gradient */\\n  position: absolute;\\n  left: 0px;\\n  top: 0px;\\n  width: 100%;\\n  height: 100%;\\n  background-image: -moz-linear-gradient(to bottom, rgba(255,255,255,0.125) 5%, rgba(255,255,255,0.125) 45%, rgba(255,255,255,0.15) 52%, rgba(0,0,0,0.01) 51%, rgba(0,0,0,0.1) 95%);\\n  /* W3C */\\n  background-image: linear-gradient(to bottom, rgba(255,255,255,0.125) 5%, rgba(255,255,255,0.125) 45%, rgba(255,255,255,0.15) 50%, rgba(0,0,0,0.1) 51%, rgba(0,0,0,0.1) 95%);\\n  /* W3C */\\n}\\n.sm2-bar-ui.flat .sm2-inline-gradient {\\n  background-image: none;\\n}\\n.sm2-bar-ui.flat .sm2-box-shadow {\\n  display: none;\\n  box-shadow: none;\\n}\\n.sm2-bar-ui.no-volume .sm2-volume {\\n  /* mobile devices (android + iOS) ignore attempts to set volume. */\\n  display: none;\\n}\\n.sm2-bar-ui.textured .sm2-inline-texture {\\n  position: absolute;\\n  top: 0px;\\n  left: 0px;\\n  width: 100%;\\n  height: 100%;\\n  /* for example */\\n  /* background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/wood_pattern_dark.png); */\\n  /* additional opacity effects can be applied here. */\\n  opacity: 0.75;\\n}\\n.sm2-bar-ui.textured.dark-text .sm2-inline-texture {\\n  /* dark text + textured case: use light wood background (for example.) */\\n  /* background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/patterns/wood_pattern.png); */\\n}\\n.sm2-bar-ui.textured.dark-text .sm2-playlist-wrapper {\\n  /* dark text + textured case: ditch 10% dark on playlist body. */\\n  background-color: transparent;\\n}\\n.sm2-bar-ui.textured.dark-text .sm2-playlist-wrapper ul li:hover a,\\n.sm2-bar-ui.textured.dark-text .sm2-playlist-wrapper ul li.selected a {\\n  /* dark + textured case: dark highlights */\\n  background-color: rgba(0,0,0,0.1);\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/black-10.png);\\n  /* modern browsers don't neeed the image */\\n  background-image: none, none;\\n}\\n.sm2-bar-ui .bd {\\n  display: table;\\n  border-bottom: none;\\n}\\n.sm2-bar-ui .sm2-playlist-wrapper {\\n  background-color: rgba(0,0,0,0.1);\\n}\\n.sm2-bar-ui .sm2-extra-controls .bd {\\n  background-color: rgba(0,0,0,0.2);\\n}\\n.sm2-bar-ui.textured .sm2-extra-controls .bd {\\n  /* lighten extra color overlays */\\n  background-color: rgba(0,0,0,0.05);\\n}\\n.sm2-bar-ui .sm2-extra-controls {\\n  background-color: transparent;\\n  border: none;\\n}\\n.sm2-bar-ui .sm2-extra-controls .bd {\\n  /* override full-width table behaviour */\\n  display: block;\\n  border: none;\\n}\\n.sm2-bar-ui .sm2-extra-controls .sm2-inline-element {\\n  display: inline-block;\\n}\\n.sm2-bar-ui,\\n.sm2-bar-ui .bd a {\\n  color: #fff;\\n}\\n.sm2-bar-ui.dark-text,\\n.sm2-bar-ui.dark-text .bd a {\\n  color: #000;\\n}\\n.sm2-bar-ui.dark-text .sm2-inline-button {\\n  /* Warning/disclaimer: SVG might be fuzzy when inverted on Chrome, losing resolution on hi-DPI displays. */\\n  -webkit-filter: invert(1);\\n  /* SVG-based invert filter for Firefox */\\n  filter: url(\\\"data:image/svg+xml;utf8,<svg xmlns=\\\\'http://www.w3.org/2000/svg\\\\'><filter id=\\\\'invert\\\\'><feColorMatrix in='SourceGraphic' type='matrix' values='-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0'/></filter></svg>#invert\\\");\\n  /* IE 8 inverse filter, may only match pure black/white */\\n  /* filter: xray; */\\n  /* pending W3 standard */\\n  filter: invert(1);\\n  /* not you, IE < 10. */\\n  filter: none\\\\9;\\n}\\n.sm2-bar-ui .bd a {\\n  text-decoration: none;\\n}\\n.sm2-bar-ui .bd .sm2-button-element:hover {\\n  background-color: rgba(0,0,0,0.1);\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/black-10.png);\\n  background-image: none, none;\\n}\\n.sm2-bar-ui .bd .sm2-button-element:active {\\n  background-color: rgba(0,0,0,0.25);\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/black-25.png);\\n  background-image: none, none;\\n}\\n.sm2-bar-ui .bd .sm2-extra-controls .sm2-button-element:active .sm2-inline-button,\\n.sm2-bar-ui .bd .active .sm2-inline-button/*,\\n.sm2-bar-ui.playlist-open .sm2-menu a */ {\\n  -ms-transform: scale(0.9);\\n  -webkit-transform: scale(0.9);\\n  -webkit-transform-origin: 50% 50%;\\n  /* firefox doesn't scale quite right. */\\n  transform: scale(0.9);\\n  transform-origin: 50% 50%;\\n  /* firefox doesn't scale quite right. */\\n  -moz-transform: none;\\n}\\n.sm2-bar-ui .bd .sm2-extra-controls .sm2-button-element:hover,\\n.sm2-bar-ui .bd .sm2-extra-controls .sm2-button-element:active,\\n.sm2-bar-ui .bd .active {\\n  background-color: rgba(0,0,0,0.1);\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/black-10.png);\\n  background-image: none, none;\\n}\\n.sm2-bar-ui .bd .sm2-extra-controls .sm2-button-element:active {\\n  /* box shadow is excessive on smaller elements. */\\n  box-shadow: none;\\n}\\n.sm2-bar-ui {\\n  /* base font size */\\n  font-size: 15px;\\n  text-shadow: none;\\n}\\n.sm2-bar-ui .sm2-inline-element {\\n  position: relative;\\n  display: inline-block;\\n  vertical-align: middle;\\n  padding: 0px;\\n  overflow: hidden;\\n}\\n.sm2-bar-ui .sm2-inline-element,\\n.sm2-bar-ui .sm2-button-element .sm2-button-bd {\\n  position: relative;\\n  /**\\r\\n  * .sm2-button-bd exists because of a Firefox bug from 2000\\r\\n  * re: nested relative / absolute elements inside table cells.\\r\\n  * https://bugzilla.mozilla.org/show_bug.cgi?id=63895\\r\\n  */\\n}\\n.sm2-bar-ui .sm2-inline-element,\\n.sm2-bar-ui .sm2-button-element .sm2-button-bd {\\n  /**\\r\\n  * if you play with UI width/height, these are the important ones.\\r\\n  * NOTE: match these values if you want square UI buttons.\\r\\n  */\\n  min-width: 2.8em;\\n  min-height: 2.8em;\\n}\\n.sm2-bar-ui .sm2-inline-button {\\n  position: absolute;\\n  top: 0px;\\n  left: 0px;\\n  width: 100%;\\n  height: 100%;\\n}\\n.sm2-bar-ui .sm2-extra-controls .bd {\\n  /* don't double-layer. */\\n  background-image: none;\\n  background-color: rgba(0,0,0,0.15);\\n}\\n.sm2-bar-ui .sm2-extra-controls .sm2-inline-element {\\n  width: 25px;\\n  /* bare minimum */\\n  min-height: 1.75em;\\n  min-width: 2.5em;\\n}\\n.sm2-bar-ui .sm2-inline-status {\\n  line-height: 100%;\\n  /* how much to allow before truncating song artist / title with ellipsis */\\n  display: inline-block;\\n  min-width: 200px;\\n  max-width: 20em;\\n  /* a little more spacing */\\n  padding-left: 0.75em;\\n  padding-right: 0.75em;\\n}\\n.sm2-bar-ui .sm2-inline-element {\\n  /* extra-small em scales up nicely, vs. 1px which gets fat */\\n  border-right: 0.075em dotted #666;\\n  /* legacy */\\n  border-right: 0.075em solid rgba(0,0,0,0.1);\\n}\\n.sm2-bar-ui .sm2-inline-element.noborder {\\n  border-right: none;\\n}\\n.sm2-bar-ui .sm2-inline-element.compact {\\n  min-width: 2em;\\n  padding: 0px 0.25em;\\n}\\n.sm2-bar-ui .sm2-inline-element:first-of-type {\\n  border-top-left-radius: 3px;\\n  border-bottom-left-radius: 3px;\\n  overflow: hidden;\\n}\\n.sm2-bar-ui .sm2-inline-element:last-of-type {\\n  border-right: none;\\n  border-top-right-radius: 3px;\\n  border-bottom-right-radius: 3px;\\n}\\n.sm2-bar-ui .sm2-inline-status a:hover {\\n  background-color: transparent;\\n  text-decoration: underline;\\n}\\n.sm2-inline-time,\\n.sm2-inline-duration {\\n  display: table-cell;\\n  width: 1%;\\n  font-size: 75%;\\n  line-height: 0.9em;\\n  min-width: 2em;\\n  /* if you have sounds > 10:00 in length, make this bigger. */\\n  vertical-align: middle;\\n}\\n.sm2-bar-ui .sm2-playlist {\\n  position: relative;\\n  height: 1.45em;\\n}\\n.sm2-bar-ui .sm2-playlist-target {\\n  /* initial render / empty case */\\n  position: relative;\\n  min-height: 1em;\\n}\\n.sm2-bar-ui .sm2-playlist ul {\\n  position: absolute;\\n  left: 0px;\\n  top: 0px;\\n  width: 100%;\\n  list-style-type: none;\\n  overflow: hidden;\\n  white-space: nowrap;\\n  text-overflow: ellipsis;\\n}\\n.sm2-bar-ui p,\\n.sm2-bar-ui .sm2-playlist ul,\\n.sm2-bar-ui .sm2-playlist ul li {\\n  margin: 0px;\\n  padding: 0px;\\n}\\n.sm2-bar-ui .sm2-playlist ul li {\\n  position: relative;\\n}\\n.sm2-bar-ui .sm2-playlist ul li,\\n.sm2-bar-ui .sm2-playlist ul li a {\\n  position: relative;\\n  display: block;\\n  /* prevent clipping of characters like \\\"g\\\" */\\n  height: 1.5em;\\n  white-space: nowrap;\\n  overflow: hidden;\\n  text-overflow: ellipsis;\\n  text-align: center;\\n}\\n.sm2-row {\\n  position: relative;\\n  display: table-row;\\n}\\n.sm2-progress-bd {\\n  /* spacing between progress track/ball and time (position) */\\n  padding: 0px 0.8em;\\n}\\n.sm2-progress .sm2-progress-track,\\n.sm2-progress .sm2-progress-ball,\\n.sm2-progress .sm2-progress-bar {\\n  position: relative;\\n  width: 100%;\\n  height: 0.65em;\\n  border-radius: 0.65em;\\n}\\n.sm2-progress .sm2-progress-bar {\\n  /* element which follows the progres \\\"ball\\\" as it moves */\\n  position: absolute;\\n  left: 0px;\\n  top: 0px;\\n  width: 0px;\\n  background-color: rgba(0,0,0,0.33);\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/black-33.png);\\n  background-image: none, none;\\n}\\n.volume-shade,\\n.playing .sm2-progress .sm2-progress-track,\\n.paused .sm2-progress .sm2-progress-track {\\n  cursor: pointer;\\n}\\n.playing .sm2-progress .sm2-progress-ball {\\n  cursor: -moz-grab;\\n  cursor: -webkit-grab;\\n  cursor: grab;\\n}\\n.sm2-progress .sm2-progress-ball {\\n  position: absolute;\\n  top: 0px;\\n  left: 0px;\\n  width: 1em;\\n  height: 1em;\\n  margin: -0.2em 0px 0px -0.5em;\\n  width: 14px;\\n  height: 14px;\\n  margin: -2px 0px 0px -7px;\\n  width: 0.9333em;\\n  height: 0.9333em;\\n  margin: -0.175em 0px 0px -0.466em;\\n  background-color: #fff;\\n  padding: 0px;\\n  /*\\r\\n z-index: 1;\\r\\n*/\\n  -webkit-transition: -webkit-transform 0.15s ease-in-out;\\n  transition: transform 0.15s ease-in-out;\\n}\\n/*\\r\\n.sm2-bar-ui.dark-text .sm2-progress .sm2-progress-ball {\\r\\n background-color: #000;\\r\\n}\\r\\n*/\\n.sm2-progress .sm2-progress-track {\\n  background-color: rgba(0,0,0,0.4);\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/black-33.png);\\n  /* legacy */\\n  background-image: none, none;\\n  /* modern browsers */\\n}\\n/* scrollbar rules have to be separate, browsers not supporting this syntax will skip them when combined. */\\n.sm2-playlist-wrapper ul::-webkit-scrollbar-track {\\n  background-color: rgba(0,0,0,0.4);\\n}\\n.playing.grabbing .sm2-progress .sm2-progress-track,\\n.playing.grabbing .sm2-progress .sm2-progress-ball {\\n  cursor: -moz-grabbing;\\n  cursor: -webkit-grabbing;\\n  cursor: grabbing;\\n}\\n.sm2-bar-ui.grabbing .sm2-progress .sm2-progress-ball {\\n  -webkit-transform: scale(1.15);\\n  transform: scale(1.15);\\n}\\n.sm2-inline-button {\\n  background-position: 50% 50%;\\n  background-repeat: no-repeat;\\n  /* hide inner text */\\n  line-height: 10em;\\n  /**\\r\\n  * image-rendering seems to apply mostly to Firefox in this case. Use with caution.\\r\\n  * https://developer.mozilla.org/en-US/docs/Web/CSS/image-rendering#Browser_compatibility\\r\\n  */\\n  image-rendering: -moz-crisp-edges;\\n  image-rendering: -webkit-optimize-contrast;\\n  image-rendering: crisp-edges;\\n  -ms-interpolation-mode: nearest-neighbor;\\n  -ms-interpolation-mode: bicubic;\\n}\\n.play-pause,\\n.play-pause:hover,\\n.paused .play-pause:hover {\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/PNG/play.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/SVG/play.svg);\\n  background-size: 67.5%;\\n  background-position: 40% 53%;\\n}\\n.playing .play-pause {\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/PNG/pause.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/SVG/pause.svg);\\n  background-size: 57.6%;\\n  background-position: 50% 53%;\\n}\\n.sm2-volume-control {\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/PNG/volume.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/SVG/volume.svg);\\n}\\n.sm2-volume-control,\\n.sm2-volume-shade {\\n  background-position: 42% 50%;\\n  background-size: 56%;\\n}\\n.volume-shade {\\n  filter: alpha(opacity=33);\\n  /* <= IE 8 */\\n  opacity: 0.33;\\n  /* -webkit-filter: invert(1);*/\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-000000/PNG/volume.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-000000/SVG/volume.svg);\\n}\\n.menu {\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/PNG/list2.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/SVG/list2.svg);\\n  background-size: 58%;\\n  background-position: 54% 51%;\\n}\\n.previous {\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/PNG/first.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/SVG/first.svg);\\n}\\n.next {\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/PNG/last.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/SVG/last.svg);\\n}\\n.previous,\\n.next {\\n  background-size: 49.5%;\\n  background-position: 50% 50%;\\n}\\n.sm2-extra-controls .previous,\\n.sm2-extra-controls .next {\\n  backgound-size: 53%;\\n}\\n.shuffle {\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/PNG/shuffle.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/SVG/shuffle.svg);\\n  background-size: 45%;\\n  background-position: 50% 50%;\\n}\\n.repeat {\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/PNG/loop.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/SVG/loop.svg);\\n  background-position: 50% 43%;\\n  background-size: 54%;\\n}\\n.sm2-extra-controls .repeat {\\n  background-position: 50% 45%;\\n}\\n.sm2-playlist-wrapper ul li .sm2-row {\\n  display: table;\\n  width: 100%;\\n}\\n.sm2-playlist-wrapper ul li .sm2-col {\\n  display: table-cell;\\n  vertical-align: top;\\n  /* by default, collapse. */\\n  width: 0%;\\n}\\n.sm2-playlist-wrapper ul li .sm2-col.sm2-wide {\\n  /* take 100% width. */\\n  width: 100%;\\n}\\n.sm2-playlist-wrapper ul li .sm2-icon {\\n  display: inline-block;\\n  overflow: hidden;\\n  width: 2em;\\n  color: transparent !important;\\n  /* hide text */\\n  white-space: nowrap;\\n  /* don't let text affect height */\\n  padding-left: 0px;\\n  padding-right: 0px;\\n  text-indent: 2em;\\n  /* IE 8, mostly */\\n}\\n.sm2-playlist-wrapper ul li .sm2-icon,\\n.sm2-playlist-wrapper ul li:hover .sm2-icon,\\n.sm2-playlist-wrapper ul li.selected .sm2-icon {\\n  background-size: 55%;\\n  background-position: 50% 50%;\\n  background-repeat: no-repeat;\\n}\\n.sm2-playlist-wrapper ul li .sm2-col {\\n  /* sibling table cells get borders. */\\n  border-right: 1px solid rgba(0,0,0,0.075);\\n}\\n.sm2-playlist-wrapper ul li.selected .sm2-col {\\n  border-color: rgba(255,255,255,0.075);\\n}\\n.sm2-playlist-wrapper ul li .sm2-col:last-of-type {\\n  border-right: none;\\n}\\n.sm2-playlist-wrapper ul li .sm2-cart,\\n.sm2-playlist-wrapper ul li:hover .sm2-cart,\\n.sm2-playlist-wrapper ul li.selected .sm2-cart {\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/PNG/cart.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/SVG/cart.svg);\\n  /* slight alignment tweak */\\n  background-position: 48% 50%;\\n}\\n.sm2-playlist-wrapper ul li .sm2-music,\\n.sm2-playlist-wrapper ul li:hover .sm2-music,\\n.sm2-playlist-wrapper ul li.selected .sm2-music {\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/PNG/music.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/SVG/music.svg);\\n}\\n.sm2-bar-ui.dark-text .sm2-playlist-wrapper ul li .sm2-cart,\\n.sm2-bar-ui.dark-text .sm2-playlist-wrapper ul li:hover .sm2-cart,\\n.sm2-bar-ui.dark-text .sm2-playlist-wrapper ul li.selected .sm2-cart {\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-000000/PNG/cart.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-000000/SVG/cart.svg);\\n}\\n.sm2-bar-ui.dark-text .sm2-playlist-wrapper ul li .sm2-music,\\n.sm2-bar-ui.dark-text .sm2-playlist-wrapper ul li:hover .sm2-music,\\n.sm2-bar-ui.dark-text .sm2-playlist-wrapper ul li.selected .sm2-music {\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-000000/PNG/music.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-000000/SVG/music.svg);\\n}\\n.sm2-bar-ui.dark-text .sm2-playlist-wrapper ul li .sm2-col {\\n  border-left-color: rgba(0,0,0,0.15);\\n}\\n.sm2-playlist-wrapper ul li .sm2-icon:hover {\\n  background-color: rgba(0,0,0,0.33);\\n}\\n.sm2-bar-ui .sm2-playlist-wrapper ul li .sm2-icon:hover {\\n  background-color: rgba(0,0,0,0.45);\\n}\\n.sm2-bar-ui.dark-text .sm2-playlist-wrapper ul li.selected .sm2-icon:hover {\\n  background-color: rgba(255,255,255,0.25);\\n  border-color: rgba(0,0,0,0.125);\\n}\\n.sm2-progress-ball .icon-overlay {\\n  position: absolute;\\n  width: 100%;\\n  height: 100%;\\n  top: 0px;\\n  left: 0px;\\n  background: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/free-25px-000000/SVG/spinner.svg);\\n  background-size: 72%;\\n  background-position: 50%;\\n  background-repeat: no-repeat;\\n  display: none;\\n}\\n.playing.buffering .sm2-progress-ball .icon-overlay {\\n  display: block;\\n  -webkit-animation: spin 0.6s linear infinite;\\n  animation: spin 0.6s linear infinite;\\n}\\n@-webkit-keyframes spin {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n  }\\n\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n  }\\n}\\n@-moz-keyframes spin {\\n  0% {\\n    transform: rotate(0deg);\\n  }\\n\\n  100% {\\n    transform: rotate(360deg);\\n  }\\n}\\n@keyframes spin {\\n  0% {\\n    transform: rotate(0deg);\\n  }\\n\\n  100% {\\n    transform: rotate(360deg);\\n  }\\n}\\n.sm2-element ul {\\n  font-size: 95%;\\n  list-style-type: none;\\n}\\n.sm2-element ul,\\n.sm2-element ul li {\\n  margin: 0px;\\n  padding: 0px;\\n}\\n.bd.sm2-playlist-drawer {\\n  /* optional: absolute positioning */\\n  /* position: absolute; */\\n  z-index: 3;\\n  border-radius: 0px;\\n  width: 100%;\\n  height: 0px;\\n  border: none;\\n  background-image: none;\\n  display: block;\\n  overflow: hidden;\\n  transition: height 0.2s ease-in-out;\\n}\\n.sm2-bar-ui.fixed .bd.sm2-playlist-drawer,\\n.sm2-bar-ui.bottom .bd.sm2-playlist-drawer {\\n  position: absolute;\\n}\\n.sm2-bar-ui.fixed .sm2-playlist-wrapper,\\n.sm2-bar-ui.bottom .sm2-playlist-wrapper {\\n  padding-bottom: 0px;\\n}\\n.sm2-bar-ui.fixed .bd.sm2-playlist-drawer,\\n.sm2-bar-ui.bottom .bd.sm2-playlist-drawer {\\n  /* show playlist on top */\\n  bottom: 2.8em;\\n}\\n.sm2-bar-ui .bd.sm2-playlist-drawer {\\n  opacity: 0.5;\\n  /* redraw fix for Chrome, background color doesn't always draw when playlist drawer open. */\\n  transform: translateZ(0);\\n}\\n/* experimental, may not perform well. */\\n/*\\r\\n.sm2-bar-ui .bd.sm2-playlist-drawer a {\\r\\n -webkit-filter: blur(5px);\\r\\n}\\r\\n*/\\n.sm2-bar-ui.playlist-open .bd.sm2-playlist-drawer {\\n  height: auto;\\n  opacity: 1;\\n}\\n.sm2-bar-ui.playlist-open .bd.sm2-playlist-drawer a {\\n  -webkit-filter: none;\\n  /* blur(0px) was still blurred on retina displays, as of 07/2014 */\\n}\\n.sm2-bar-ui.fixed.playlist-open .bd.sm2-playlist-drawer .sm2-playlist-wrapper,\\n.sm2-bar-ui.bottom.playlist-open .bd.sm2-playlist-drawer .sm2-playlist-wrapper {\\n  /* extra padding when open */\\n  padding-bottom: 0.5em;\\n  box-shadow: none;\\n}\\n.sm2-bar-ui .bd.sm2-playlist-drawer {\\n  transition: all 0.2s ease-in-out;\\n  transition-property: transform, height, opacity, background-color, -webkit-filter;\\n}\\n.sm2-bar-ui .bd.sm2-playlist-drawer a {\\n  transition: -webkit-filter 0.2s ease-in-out;\\n}\\n.sm2-bar-ui .bd.sm2-playlist-drawer .sm2-inline-texture {\\n  /* negative offset for height of top bar, so background is seamless. */\\n  background-position: 0px -2.8em;\\n}\\n.sm2-box-shadow {\\n  position: absolute;\\n  left: 0px;\\n  top: 0px;\\n  width: 100%;\\n  height: 100%;\\n  box-shadow: inset 0px 1px 6px rgba(0,0,0,0.15);\\n}\\n.sm2-playlist-wrapper {\\n  position: relative;\\n  padding: 0.5em 0.5em 0.5em 0.25em;\\n  background-image: none, none;\\n}\\n.sm2-playlist-wrapper ul {\\n  max-height: 9.25em;\\n  overflow: auto;\\n}\\n.sm2-playlist-wrapper ul li {\\n  border-bottom: 1px solid rgba(0,0,0,0.05);\\n}\\n.sm2-playlist-wrapper ul li:nth-child(odd) {\\n  background-color: rgba(255,255,255,0.03);\\n}\\n.sm2-playlist-wrapper ul li a {\\n  display: block;\\n  padding: 0.5em 0.25em 0.5em 0.75em;\\n  margin-right: 0px;\\n  font-size: 90%;\\n  vertical-align: middle;\\n}\\n.sm2-playlist-wrapper ul li a.sm2-exclude {\\n  display: inline-block;\\n}\\n.sm2-playlist-wrapper ul li a.sm2-exclude .label {\\n  font-size: 95%;\\n  line-height: 1em;\\n  margin-left: 0px;\\n  padding: 2px 4px;\\n}\\n.sm2-playlist-wrapper ul li:hover a {\\n  background-color: rgba(0,0,0,0.20);\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/black-20.png);\\n  background-image: none, none;\\n}\\n.sm2-bar-ui.dark-text .sm2-playlist-wrapper ul li:hover a {\\n  background-color: rgba(255,255,255,0.1);\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/black-10.png);\\n  background-image: none, none;\\n}\\n.sm2-playlist-wrapper ul li.selected a {\\n  background-color: rgba(0,0,0,0.25);\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/black-20.png);\\n  background-image: none, none;\\n}\\n.sm2-bar-ui.dark-text ul li.selected a {\\n  background-color: rgba(255,255,255,0.1);\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/black-10.png);\\n  background-image: none, none;\\n}\\n.sm2-bar-ui .disabled {\\n  filter: alpha(opacity=33);\\n  /* <= IE 8 */\\n  opacity: 0.33;\\n}\\n.sm2-bar-ui .bd .sm2-button-element.disabled:hover {\\n  background-color: transparent;\\n}\\n.sm2-bar-ui .active,\\n/*.sm2-bar-ui.playlist-open .sm2-menu,\\n*/\\r\\n.sm2-bar-ui.playlist-open .sm2-menu:hover {\\n  /* depressed / \\\"on\\\" state */\\n  box-shadow: inset 0px 0px 2px rgba(0,0,0,0.1);\\n  background-image: none;\\n}\\n.firefox-fix {\\n  /**\\r\\n  * This exists because of a Firefox bug from 2000\\r\\n  * re: nested relative / absolute elements inside table cells.\\r\\n  * https://bugzilla.mozilla.org/show_bug.cgi?id=63895\\r\\n  */\\n  position: relative;\\n  display: inline-block;\\n  width: 100%;\\n  height: 100%;\\n}\\n/* some custom scrollbar trickery, where supported */\\n.sm2-playlist-wrapper ul::-webkit-scrollbar {\\n  width: 10px;\\n}\\n.sm2-playlist-wrapper ul::-webkit-scrollbar-track {\\n  background: rgba(0,0,0,0.33);\\n  border-radius: 10px;\\n}\\n.sm2-playlist-wrapper ul::-webkit-scrollbar-thumb {\\n  border-radius: 10px;\\n  background: #fff;\\n}\\n.sm2-extra-controls {\\n  font-size: 0px;\\n  text-align: center;\\n}\\n.sm2-bar-ui .label {\\n  position: relative;\\n  display: inline-block;\\n  font-size: 0.7em;\\n  margin-left: 0.25em;\\n  vertical-align: top;\\n  background-color: rgba(0,0,0,0.25);\\n  border-radius: 3px;\\n  padding: 0px 3px;\\n  box-sizing: padding-box;\\n}\\n.sm2-bar-ui.dark-text .label {\\n  background-color: rgba(0,0,0,0.1);\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/black-10.png);\\n  background-image: none, none;\\n}\\n.sm2-bar-ui .sm2-playlist-drawer .label {\\n  font-size: 0.8em;\\n  padding: 0px 3px;\\n}\\n/* --- full width stuff --- */\\n.sm2-bar-ui .sm2-inline-element {\\n  display: table-cell;\\n}\\n.sm2-bar-ui .sm2-inline-element {\\n  /* collapse */\\n  width: 1%;\\n}\\n.sm2-bar-ui .sm2-inline-status {\\n  /* full width */\\n  width: 100%;\\n  min-width: 100%;\\n  max-width: 100%;\\n}\\n.sm2-bar-ui > .bd {\\n  width: 100%;\\n}\\n.sm2-bar-ui .sm2-playlist-drawer {\\n  /* re-hide playlist */\\n  display: block;\\n  overflow: hidden;\\n}\\n/*!\\n *  Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome\\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\\n */\\n@font-face {\\n  font-family: 'FontAwesome';\\n  src: url('node_modules/font-awesome/fonts/fontawesome-webfont.eot?v=4.5.0');\\n  src: url('node_modules/font-awesome/fonts/fontawesome-webfont.eot?#iefix&v=4.5.0') format('embedded-opentype'),url('node_modules/font-awesome/fonts/fontawesome-webfont.woff2?v=4.5.0') format('woff2'),url('node_modules/font-awesome/fonts/fontawesome-webfont.woff?v=4.5.0') format('woff'),url('node_modules/font-awesome/fonts/fontawesome-webfont.ttf?v=4.5.0') format('truetype'),url('node_modules/font-awesome/fonts/fontawesome-webfont.svg?v=4.5.0#fontawesomeregular') format('svg');\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.fa {\\n  display: inline-block;\\n  font: normal normal normal 14px/1 FontAwesome;\\n  font-size: inherit;\\n  text-rendering: auto;\\n  -webkit-font-smoothing: antialiased;\\n  -moz-osx-font-smoothing: grayscale;\\n}\\n.fa-lg {\\n  font-size: 1.33333333em;\\n  line-height: .75em;\\n  vertical-align: -15%;\\n}\\n.fa-2x {\\n  font-size: 2em;\\n}\\n.fa-3x {\\n  font-size: 3em;\\n}\\n.fa-4x {\\n  font-size: 4em;\\n}\\n.fa-5x {\\n  font-size: 5em;\\n}\\n.fa-fw {\\n  width: 1.28571429em;\\n  text-align: center;\\n}\\n.fa-ul {\\n  padding-left: 0;\\n  margin-left: 2.14285714em;\\n  list-style-type: none;\\n}\\n.fa-ul>li {\\n  position: relative;\\n}\\n.fa-li {\\n  position: absolute;\\n  left: -2.14285714em;\\n  width: 2.14285714em;\\n  top: .14285714em;\\n  text-align: center;\\n}\\n.fa-li.fa-lg {\\n  left: -1.85714286em;\\n}\\n.fa-border {\\n  padding: .2em .25em .15em;\\n  border: solid .08em #eee;\\n  border-radius: .1em;\\n}\\n.fa-pull-left {\\n  float: left;\\n}\\n.fa-pull-right {\\n  float: right;\\n}\\n.fa.fa-pull-left {\\n  margin-right: .3em;\\n}\\n.fa.fa-pull-right {\\n  margin-left: .3em;\\n}\\n.pull-right {\\n  float: right;\\n}\\n.pull-left {\\n  float: left;\\n}\\n.fa.pull-left {\\n  margin-right: .3em;\\n}\\n.fa.pull-right {\\n  margin-left: .3em;\\n}\\n.fa-spin {\\n  -webkit-animation: fa-spin 2s infinite linear;\\n  animation: fa-spin 2s infinite linear;\\n}\\n.fa-pulse {\\n  -webkit-animation: fa-spin 1s infinite steps(8);\\n  animation: fa-spin 1s infinite steps(8);\\n}\\n@-webkit-keyframes fa-spin {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n\\n  100% {\\n    -webkit-transform: rotate(359deg);\\n    transform: rotate(359deg);\\n  }\\n}\\n@keyframes fa-spin {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n\\n  100% {\\n    -webkit-transform: rotate(359deg);\\n    transform: rotate(359deg);\\n  }\\n}\\n.fa-rotate-90 {\\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);\\n  -webkit-transform: rotate(90deg);\\n  -ms-transform: rotate(90deg);\\n  transform: rotate(90deg);\\n}\\n.fa-rotate-180 {\\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);\\n  -webkit-transform: rotate(180deg);\\n  -ms-transform: rotate(180deg);\\n  transform: rotate(180deg);\\n}\\n.fa-rotate-270 {\\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);\\n  -webkit-transform: rotate(270deg);\\n  -ms-transform: rotate(270deg);\\n  transform: rotate(270deg);\\n}\\n.fa-flip-horizontal {\\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);\\n  -webkit-transform: scale(-1, 1);\\n  -ms-transform: scale(-1, 1);\\n  transform: scale(-1, 1);\\n}\\n.fa-flip-vertical {\\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\\n  -webkit-transform: scale(1, -1);\\n  -ms-transform: scale(1, -1);\\n  transform: scale(1, -1);\\n}\\n:root .fa-rotate-90,\\n:root .fa-rotate-180,\\n:root .fa-rotate-270,\\n:root .fa-flip-horizontal,\\n:root .fa-flip-vertical {\\n  filter: none;\\n}\\n.fa-stack {\\n  position: relative;\\n  display: inline-block;\\n  width: 2em;\\n  height: 2em;\\n  line-height: 2em;\\n  vertical-align: middle;\\n}\\n.fa-stack-1x,\\n.fa-stack-2x {\\n  position: absolute;\\n  left: 0;\\n  width: 100%;\\n  text-align: center;\\n}\\n.fa-stack-1x {\\n  line-height: inherit;\\n}\\n.fa-stack-2x {\\n  font-size: 2em;\\n}\\n.fa-inverse {\\n  color: #fff;\\n}\\n.fa-glass:before {\\n  content: \\\"\\\\f000\\\";\\n}\\n.fa-music:before {\\n  content: \\\"\\\\f001\\\";\\n}\\n.fa-search:before {\\n  content: \\\"\\\\f002\\\";\\n}\\n.fa-envelope-o:before {\\n  content: \\\"\\\\f003\\\";\\n}\\n.fa-heart:before {\\n  content: \\\"\\\\f004\\\";\\n}\\n.fa-star:before {\\n  content: \\\"\\\\f005\\\";\\n}\\n.fa-star-o:before {\\n  content: \\\"\\\\f006\\\";\\n}\\n.fa-user:before {\\n  content: \\\"\\\\f007\\\";\\n}\\n.fa-film:before {\\n  content: \\\"\\\\f008\\\";\\n}\\n.fa-th-large:before {\\n  content: \\\"\\\\f009\\\";\\n}\\n.fa-th:before {\\n  content: \\\"\\\\f00a\\\";\\n}\\n.fa-th-list:before {\\n  content: \\\"\\\\f00b\\\";\\n}\\n.fa-check:before {\\n  content: \\\"\\\\f00c\\\";\\n}\\n.fa-remove:before,\\n.fa-close:before,\\n.fa-times:before {\\n  content: \\\"\\\\f00d\\\";\\n}\\n.fa-search-plus:before {\\n  content: \\\"\\\\f00e\\\";\\n}\\n.fa-search-minus:before {\\n  content: \\\"\\\\f010\\\";\\n}\\n.fa-power-off:before {\\n  content: \\\"\\\\f011\\\";\\n}\\n.fa-signal:before {\\n  content: \\\"\\\\f012\\\";\\n}\\n.fa-gear:before,\\n.fa-cog:before {\\n  content: \\\"\\\\f013\\\";\\n}\\n.fa-trash-o:before {\\n  content: \\\"\\\\f014\\\";\\n}\\n.fa-home:before {\\n  content: \\\"\\\\f015\\\";\\n}\\n.fa-file-o:before {\\n  content: \\\"\\\\f016\\\";\\n}\\n.fa-clock-o:before {\\n  content: \\\"\\\\f017\\\";\\n}\\n.fa-road:before {\\n  content: \\\"\\\\f018\\\";\\n}\\n.fa-download:before {\\n  content: \\\"\\\\f019\\\";\\n}\\n.fa-arrow-circle-o-down:before {\\n  content: \\\"\\\\f01a\\\";\\n}\\n.fa-arrow-circle-o-up:before {\\n  content: \\\"\\\\f01b\\\";\\n}\\n.fa-inbox:before {\\n  content: \\\"\\\\f01c\\\";\\n}\\n.fa-play-circle-o:before {\\n  content: \\\"\\\\f01d\\\";\\n}\\n.fa-rotate-right:before,\\n.fa-repeat:before {\\n  content: \\\"\\\\f01e\\\";\\n}\\n.fa-refresh:before {\\n  content: \\\"\\\\f021\\\";\\n}\\n.fa-list-alt:before {\\n  content: \\\"\\\\f022\\\";\\n}\\n.fa-lock:before {\\n  content: \\\"\\\\f023\\\";\\n}\\n.fa-flag:before {\\n  content: \\\"\\\\f024\\\";\\n}\\n.fa-headphones:before {\\n  content: \\\"\\\\f025\\\";\\n}\\n.fa-volume-off:before {\\n  content: \\\"\\\\f026\\\";\\n}\\n.fa-volume-down:before {\\n  content: \\\"\\\\f027\\\";\\n}\\n.fa-volume-up:before {\\n  content: \\\"\\\\f028\\\";\\n}\\n.fa-qrcode:before {\\n  content: \\\"\\\\f029\\\";\\n}\\n.fa-barcode:before {\\n  content: \\\"\\\\f02a\\\";\\n}\\n.fa-tag:before {\\n  content: \\\"\\\\f02b\\\";\\n}\\n.fa-tags:before {\\n  content: \\\"\\\\f02c\\\";\\n}\\n.fa-book:before {\\n  content: \\\"\\\\f02d\\\";\\n}\\n.fa-bookmark:before {\\n  content: \\\"\\\\f02e\\\";\\n}\\n.fa-print:before {\\n  content: \\\"\\\\f02f\\\";\\n}\\n.fa-camera:before {\\n  content: \\\"\\\\f030\\\";\\n}\\n.fa-font:before {\\n  content: \\\"\\\\f031\\\";\\n}\\n.fa-bold:before {\\n  content: \\\"\\\\f032\\\";\\n}\\n.fa-italic:before {\\n  content: \\\"\\\\f033\\\";\\n}\\n.fa-text-height:before {\\n  content: \\\"\\\\f034\\\";\\n}\\n.fa-text-width:before {\\n  content: \\\"\\\\f035\\\";\\n}\\n.fa-align-left:before {\\n  content: \\\"\\\\f036\\\";\\n}\\n.fa-align-center:before {\\n  content: \\\"\\\\f037\\\";\\n}\\n.fa-align-right:before {\\n  content: \\\"\\\\f038\\\";\\n}\\n.fa-align-justify:before {\\n  content: \\\"\\\\f039\\\";\\n}\\n.fa-list:before {\\n  content: \\\"\\\\f03a\\\";\\n}\\n.fa-dedent:before,\\n.fa-outdent:before {\\n  content: \\\"\\\\f03b\\\";\\n}\\n.fa-indent:before {\\n  content: \\\"\\\\f03c\\\";\\n}\\n.fa-video-camera:before {\\n  content: \\\"\\\\f03d\\\";\\n}\\n.fa-photo:before,\\n.fa-image:before,\\n.fa-picture-o:before {\\n  content: \\\"\\\\f03e\\\";\\n}\\n.fa-pencil:before {\\n  content: \\\"\\\\f040\\\";\\n}\\n.fa-map-marker:before {\\n  content: \\\"\\\\f041\\\";\\n}\\n.fa-adjust:before {\\n  content: \\\"\\\\f042\\\";\\n}\\n.fa-tint:before {\\n  content: \\\"\\\\f043\\\";\\n}\\n.fa-edit:before,\\n.fa-pencil-square-o:before {\\n  content: \\\"\\\\f044\\\";\\n}\\n.fa-share-square-o:before {\\n  content: \\\"\\\\f045\\\";\\n}\\n.fa-check-square-o:before {\\n  content: \\\"\\\\f046\\\";\\n}\\n.fa-arrows:before {\\n  content: \\\"\\\\f047\\\";\\n}\\n.fa-step-backward:before {\\n  content: \\\"\\\\f048\\\";\\n}\\n.fa-fast-backward:before {\\n  content: \\\"\\\\f049\\\";\\n}\\n.fa-backward:before {\\n  content: \\\"\\\\f04a\\\";\\n}\\n.fa-play:before {\\n  content: \\\"\\\\f04b\\\";\\n}\\n.fa-pause:before {\\n  content: \\\"\\\\f04c\\\";\\n}\\n.fa-stop:before {\\n  content: \\\"\\\\f04d\\\";\\n}\\n.fa-forward:before {\\n  content: \\\"\\\\f04e\\\";\\n}\\n.fa-fast-forward:before {\\n  content: \\\"\\\\f050\\\";\\n}\\n.fa-step-forward:before {\\n  content: \\\"\\\\f051\\\";\\n}\\n.fa-eject:before {\\n  content: \\\"\\\\f052\\\";\\n}\\n.fa-chevron-left:before {\\n  content: \\\"\\\\f053\\\";\\n}\\n.fa-chevron-right:before {\\n  content: \\\"\\\\f054\\\";\\n}\\n.fa-plus-circle:before {\\n  content: \\\"\\\\f055\\\";\\n}\\n.fa-minus-circle:before {\\n  content: \\\"\\\\f056\\\";\\n}\\n.fa-times-circle:before {\\n  content: \\\"\\\\f057\\\";\\n}\\n.fa-check-circle:before {\\n  content: \\\"\\\\f058\\\";\\n}\\n.fa-question-circle:before {\\n  content: \\\"\\\\f059\\\";\\n}\\n.fa-info-circle:before {\\n  content: \\\"\\\\f05a\\\";\\n}\\n.fa-crosshairs:before {\\n  content: \\\"\\\\f05b\\\";\\n}\\n.fa-times-circle-o:before {\\n  content: \\\"\\\\f05c\\\";\\n}\\n.fa-check-circle-o:before {\\n  content: \\\"\\\\f05d\\\";\\n}\\n.fa-ban:before {\\n  content: \\\"\\\\f05e\\\";\\n}\\n.fa-arrow-left:before {\\n  content: \\\"\\\\f060\\\";\\n}\\n.fa-arrow-right:before {\\n  content: \\\"\\\\f061\\\";\\n}\\n.fa-arrow-up:before {\\n  content: \\\"\\\\f062\\\";\\n}\\n.fa-arrow-down:before {\\n  content: \\\"\\\\f063\\\";\\n}\\n.fa-mail-forward:before,\\n.fa-share:before {\\n  content: \\\"\\\\f064\\\";\\n}\\n.fa-expand:before {\\n  content: \\\"\\\\f065\\\";\\n}\\n.fa-compress:before {\\n  content: \\\"\\\\f066\\\";\\n}\\n.fa-plus:before {\\n  content: \\\"\\\\f067\\\";\\n}\\n.fa-minus:before {\\n  content: \\\"\\\\f068\\\";\\n}\\n.fa-asterisk:before {\\n  content: \\\"\\\\f069\\\";\\n}\\n.fa-exclamation-circle:before {\\n  content: \\\"\\\\f06a\\\";\\n}\\n.fa-gift:before {\\n  content: \\\"\\\\f06b\\\";\\n}\\n.fa-leaf:before {\\n  content: \\\"\\\\f06c\\\";\\n}\\n.fa-fire:before {\\n  content: \\\"\\\\f06d\\\";\\n}\\n.fa-eye:before {\\n  content: \\\"\\\\f06e\\\";\\n}\\n.fa-eye-slash:before {\\n  content: \\\"\\\\f070\\\";\\n}\\n.fa-warning:before,\\n.fa-exclamation-triangle:before {\\n  content: \\\"\\\\f071\\\";\\n}\\n.fa-plane:before {\\n  content: \\\"\\\\f072\\\";\\n}\\n.fa-calendar:before {\\n  content: \\\"\\\\f073\\\";\\n}\\n.fa-random:before {\\n  content: \\\"\\\\f074\\\";\\n}\\n.fa-comment:before {\\n  content: \\\"\\\\f075\\\";\\n}\\n.fa-magnet:before {\\n  content: \\\"\\\\f076\\\";\\n}\\n.fa-chevron-up:before {\\n  content: \\\"\\\\f077\\\";\\n}\\n.fa-chevron-down:before {\\n  content: \\\"\\\\f078\\\";\\n}\\n.fa-retweet:before {\\n  content: \\\"\\\\f079\\\";\\n}\\n.fa-shopping-cart:before {\\n  content: \\\"\\\\f07a\\\";\\n}\\n.fa-folder:before {\\n  content: \\\"\\\\f07b\\\";\\n}\\n.fa-folder-open:before {\\n  content: \\\"\\\\f07c\\\";\\n}\\n.fa-arrows-v:before {\\n  content: \\\"\\\\f07d\\\";\\n}\\n.fa-arrows-h:before {\\n  content: \\\"\\\\f07e\\\";\\n}\\n.fa-bar-chart-o:before,\\n.fa-bar-chart:before {\\n  content: \\\"\\\\f080\\\";\\n}\\n.fa-twitter-square:before {\\n  content: \\\"\\\\f081\\\";\\n}\\n.fa-facebook-square:before {\\n  content: \\\"\\\\f082\\\";\\n}\\n.fa-camera-retro:before {\\n  content: \\\"\\\\f083\\\";\\n}\\n.fa-key:before {\\n  content: \\\"\\\\f084\\\";\\n}\\n.fa-gears:before,\\n.fa-cogs:before {\\n  content: \\\"\\\\f085\\\";\\n}\\n.fa-comments:before {\\n  content: \\\"\\\\f086\\\";\\n}\\n.fa-thumbs-o-up:before {\\n  content: \\\"\\\\f087\\\";\\n}\\n.fa-thumbs-o-down:before {\\n  content: \\\"\\\\f088\\\";\\n}\\n.fa-star-half:before {\\n  content: \\\"\\\\f089\\\";\\n}\\n.fa-heart-o:before {\\n  content: \\\"\\\\f08a\\\";\\n}\\n.fa-sign-out:before {\\n  content: \\\"\\\\f08b\\\";\\n}\\n.fa-linkedin-square:before {\\n  content: \\\"\\\\f08c\\\";\\n}\\n.fa-thumb-tack:before {\\n  content: \\\"\\\\f08d\\\";\\n}\\n.fa-external-link:before {\\n  content: \\\"\\\\f08e\\\";\\n}\\n.fa-sign-in:before {\\n  content: \\\"\\\\f090\\\";\\n}\\n.fa-trophy:before {\\n  content: \\\"\\\\f091\\\";\\n}\\n.fa-github-square:before {\\n  content: \\\"\\\\f092\\\";\\n}\\n.fa-upload:before {\\n  content: \\\"\\\\f093\\\";\\n}\\n.fa-lemon-o:before {\\n  content: \\\"\\\\f094\\\";\\n}\\n.fa-phone:before {\\n  content: \\\"\\\\f095\\\";\\n}\\n.fa-square-o:before {\\n  content: \\\"\\\\f096\\\";\\n}\\n.fa-bookmark-o:before {\\n  content: \\\"\\\\f097\\\";\\n}\\n.fa-phone-square:before {\\n  content: \\\"\\\\f098\\\";\\n}\\n.fa-twitter:before {\\n  content: \\\"\\\\f099\\\";\\n}\\n.fa-facebook-f:before,\\n.fa-facebook:before {\\n  content: \\\"\\\\f09a\\\";\\n}\\n.fa-github:before {\\n  content: \\\"\\\\f09b\\\";\\n}\\n.fa-unlock:before {\\n  content: \\\"\\\\f09c\\\";\\n}\\n.fa-credit-card:before {\\n  content: \\\"\\\\f09d\\\";\\n}\\n.fa-feed:before,\\n.fa-rss:before {\\n  content: \\\"\\\\f09e\\\";\\n}\\n.fa-hdd-o:before {\\n  content: \\\"\\\\f0a0\\\";\\n}\\n.fa-bullhorn:before {\\n  content: \\\"\\\\f0a1\\\";\\n}\\n.fa-bell:before {\\n  content: \\\"\\\\f0f3\\\";\\n}\\n.fa-certificate:before {\\n  content: \\\"\\\\f0a3\\\";\\n}\\n.fa-hand-o-right:before {\\n  content: \\\"\\\\f0a4\\\";\\n}\\n.fa-hand-o-left:before {\\n  content: \\\"\\\\f0a5\\\";\\n}\\n.fa-hand-o-up:before {\\n  content: \\\"\\\\f0a6\\\";\\n}\\n.fa-hand-o-down:before {\\n  content: \\\"\\\\f0a7\\\";\\n}\\n.fa-arrow-circle-left:before {\\n  content: \\\"\\\\f0a8\\\";\\n}\\n.fa-arrow-circle-right:before {\\n  content: \\\"\\\\f0a9\\\";\\n}\\n.fa-arrow-circle-up:before {\\n  content: \\\"\\\\f0aa\\\";\\n}\\n.fa-arrow-circle-down:before {\\n  content: \\\"\\\\f0ab\\\";\\n}\\n.fa-globe:before {\\n  content: \\\"\\\\f0ac\\\";\\n}\\n.fa-wrench:before {\\n  content: \\\"\\\\f0ad\\\";\\n}\\n.fa-tasks:before {\\n  content: \\\"\\\\f0ae\\\";\\n}\\n.fa-filter:before {\\n  content: \\\"\\\\f0b0\\\";\\n}\\n.fa-briefcase:before {\\n  content: \\\"\\\\f0b1\\\";\\n}\\n.fa-arrows-alt:before {\\n  content: \\\"\\\\f0b2\\\";\\n}\\n.fa-group:before,\\n.fa-users:before {\\n  content: \\\"\\\\f0c0\\\";\\n}\\n.fa-chain:before,\\n.fa-link:before {\\n  content: \\\"\\\\f0c1\\\";\\n}\\n.fa-cloud:before {\\n  content: \\\"\\\\f0c2\\\";\\n}\\n.fa-flask:before {\\n  content: \\\"\\\\f0c3\\\";\\n}\\n.fa-cut:before,\\n.fa-scissors:before {\\n  content: \\\"\\\\f0c4\\\";\\n}\\n.fa-copy:before,\\n.fa-files-o:before {\\n  content: \\\"\\\\f0c5\\\";\\n}\\n.fa-paperclip:before {\\n  content: \\\"\\\\f0c6\\\";\\n}\\n.fa-save:before,\\n.fa-floppy-o:before {\\n  content: \\\"\\\\f0c7\\\";\\n}\\n.fa-square:before {\\n  content: \\\"\\\\f0c8\\\";\\n}\\n.fa-navicon:before,\\n.fa-reorder:before,\\n.fa-bars:before {\\n  content: \\\"\\\\f0c9\\\";\\n}\\n.fa-list-ul:before {\\n  content: \\\"\\\\f0ca\\\";\\n}\\n.fa-list-ol:before {\\n  content: \\\"\\\\f0cb\\\";\\n}\\n.fa-strikethrough:before {\\n  content: \\\"\\\\f0cc\\\";\\n}\\n.fa-underline:before {\\n  content: \\\"\\\\f0cd\\\";\\n}\\n.fa-table:before {\\n  content: \\\"\\\\f0ce\\\";\\n}\\n.fa-magic:before {\\n  content: \\\"\\\\f0d0\\\";\\n}\\n.fa-truck:before {\\n  content: \\\"\\\\f0d1\\\";\\n}\\n.fa-pinterest:before {\\n  content: \\\"\\\\f0d2\\\";\\n}\\n.fa-pinterest-square:before {\\n  content: \\\"\\\\f0d3\\\";\\n}\\n.fa-google-plus-square:before {\\n  content: \\\"\\\\f0d4\\\";\\n}\\n.fa-google-plus:before {\\n  content: \\\"\\\\f0d5\\\";\\n}\\n.fa-money:before {\\n  content: \\\"\\\\f0d6\\\";\\n}\\n.fa-caret-down:before {\\n  content: \\\"\\\\f0d7\\\";\\n}\\n.fa-caret-up:before {\\n  content: \\\"\\\\f0d8\\\";\\n}\\n.fa-caret-left:before {\\n  content: \\\"\\\\f0d9\\\";\\n}\\n.fa-caret-right:before {\\n  content: \\\"\\\\f0da\\\";\\n}\\n.fa-columns:before {\\n  content: \\\"\\\\f0db\\\";\\n}\\n.fa-unsorted:before,\\n.fa-sort:before {\\n  content: \\\"\\\\f0dc\\\";\\n}\\n.fa-sort-down:before,\\n.fa-sort-desc:before {\\n  content: \\\"\\\\f0dd\\\";\\n}\\n.fa-sort-up:before,\\n.fa-sort-asc:before {\\n  content: \\\"\\\\f0de\\\";\\n}\\n.fa-envelope:before {\\n  content: \\\"\\\\f0e0\\\";\\n}\\n.fa-linkedin:before {\\n  content: \\\"\\\\f0e1\\\";\\n}\\n.fa-rotate-left:before,\\n.fa-undo:before {\\n  content: \\\"\\\\f0e2\\\";\\n}\\n.fa-legal:before,\\n.fa-gavel:before {\\n  content: \\\"\\\\f0e3\\\";\\n}\\n.fa-dashboard:before,\\n.fa-tachometer:before {\\n  content: \\\"\\\\f0e4\\\";\\n}\\n.fa-comment-o:before {\\n  content: \\\"\\\\f0e5\\\";\\n}\\n.fa-comments-o:before {\\n  content: \\\"\\\\f0e6\\\";\\n}\\n.fa-flash:before,\\n.fa-bolt:before {\\n  content: \\\"\\\\f0e7\\\";\\n}\\n.fa-sitemap:before {\\n  content: \\\"\\\\f0e8\\\";\\n}\\n.fa-umbrella:before {\\n  content: \\\"\\\\f0e9\\\";\\n}\\n.fa-paste:before,\\n.fa-clipboard:before {\\n  content: \\\"\\\\f0ea\\\";\\n}\\n.fa-lightbulb-o:before {\\n  content: \\\"\\\\f0eb\\\";\\n}\\n.fa-exchange:before {\\n  content: \\\"\\\\f0ec\\\";\\n}\\n.fa-cloud-download:before {\\n  content: \\\"\\\\f0ed\\\";\\n}\\n.fa-cloud-upload:before {\\n  content: \\\"\\\\f0ee\\\";\\n}\\n.fa-user-md:before {\\n  content: \\\"\\\\f0f0\\\";\\n}\\n.fa-stethoscope:before {\\n  content: \\\"\\\\f0f1\\\";\\n}\\n.fa-suitcase:before {\\n  content: \\\"\\\\f0f2\\\";\\n}\\n.fa-bell-o:before {\\n  content: \\\"\\\\f0a2\\\";\\n}\\n.fa-coffee:before {\\n  content: \\\"\\\\f0f4\\\";\\n}\\n.fa-cutlery:before {\\n  content: \\\"\\\\f0f5\\\";\\n}\\n.fa-file-text-o:before {\\n  content: \\\"\\\\f0f6\\\";\\n}\\n.fa-building-o:before {\\n  content: \\\"\\\\f0f7\\\";\\n}\\n.fa-hospital-o:before {\\n  content: \\\"\\\\f0f8\\\";\\n}\\n.fa-ambulance:before {\\n  content: \\\"\\\\f0f9\\\";\\n}\\n.fa-medkit:before {\\n  content: \\\"\\\\f0fa\\\";\\n}\\n.fa-fighter-jet:before {\\n  content: \\\"\\\\f0fb\\\";\\n}\\n.fa-beer:before {\\n  content: \\\"\\\\f0fc\\\";\\n}\\n.fa-h-square:before {\\n  content: \\\"\\\\f0fd\\\";\\n}\\n.fa-plus-square:before {\\n  content: \\\"\\\\f0fe\\\";\\n}\\n.fa-angle-double-left:before {\\n  content: \\\"\\\\f100\\\";\\n}\\n.fa-angle-double-right:before {\\n  content: \\\"\\\\f101\\\";\\n}\\n.fa-angle-double-up:before {\\n  content: \\\"\\\\f102\\\";\\n}\\n.fa-angle-double-down:before {\\n  content: \\\"\\\\f103\\\";\\n}\\n.fa-angle-left:before {\\n  content: \\\"\\\\f104\\\";\\n}\\n.fa-angle-right:before {\\n  content: \\\"\\\\f105\\\";\\n}\\n.fa-angle-up:before {\\n  content: \\\"\\\\f106\\\";\\n}\\n.fa-angle-down:before {\\n  content: \\\"\\\\f107\\\";\\n}\\n.fa-desktop:before {\\n  content: \\\"\\\\f108\\\";\\n}\\n.fa-laptop:before {\\n  content: \\\"\\\\f109\\\";\\n}\\n.fa-tablet:before {\\n  content: \\\"\\\\f10a\\\";\\n}\\n.fa-mobile-phone:before,\\n.fa-mobile:before {\\n  content: \\\"\\\\f10b\\\";\\n}\\n.fa-circle-o:before {\\n  content: \\\"\\\\f10c\\\";\\n}\\n.fa-quote-left:before {\\n  content: \\\"\\\\f10d\\\";\\n}\\n.fa-quote-right:before {\\n  content: \\\"\\\\f10e\\\";\\n}\\n.fa-spinner:before {\\n  content: \\\"\\\\f110\\\";\\n}\\n.fa-circle:before {\\n  content: \\\"\\\\f111\\\";\\n}\\n.fa-mail-reply:before,\\n.fa-reply:before {\\n  content: \\\"\\\\f112\\\";\\n}\\n.fa-github-alt:before {\\n  content: \\\"\\\\f113\\\";\\n}\\n.fa-folder-o:before {\\n  content: \\\"\\\\f114\\\";\\n}\\n.fa-folder-open-o:before {\\n  content: \\\"\\\\f115\\\";\\n}\\n.fa-smile-o:before {\\n  content: \\\"\\\\f118\\\";\\n}\\n.fa-frown-o:before {\\n  content: \\\"\\\\f119\\\";\\n}\\n.fa-meh-o:before {\\n  content: \\\"\\\\f11a\\\";\\n}\\n.fa-gamepad:before {\\n  content: \\\"\\\\f11b\\\";\\n}\\n.fa-keyboard-o:before {\\n  content: \\\"\\\\f11c\\\";\\n}\\n.fa-flag-o:before {\\n  content: \\\"\\\\f11d\\\";\\n}\\n.fa-flag-checkered:before {\\n  content: \\\"\\\\f11e\\\";\\n}\\n.fa-terminal:before {\\n  content: \\\"\\\\f120\\\";\\n}\\n.fa-code:before {\\n  content: \\\"\\\\f121\\\";\\n}\\n.fa-mail-reply-all:before,\\n.fa-reply-all:before {\\n  content: \\\"\\\\f122\\\";\\n}\\n.fa-star-half-empty:before,\\n.fa-star-half-full:before,\\n.fa-star-half-o:before {\\n  content: \\\"\\\\f123\\\";\\n}\\n.fa-location-arrow:before {\\n  content: \\\"\\\\f124\\\";\\n}\\n.fa-crop:before {\\n  content: \\\"\\\\f125\\\";\\n}\\n.fa-code-fork:before {\\n  content: \\\"\\\\f126\\\";\\n}\\n.fa-unlink:before,\\n.fa-chain-broken:before {\\n  content: \\\"\\\\f127\\\";\\n}\\n.fa-question:before {\\n  content: \\\"\\\\f128\\\";\\n}\\n.fa-info:before {\\n  content: \\\"\\\\f129\\\";\\n}\\n.fa-exclamation:before {\\n  content: \\\"\\\\f12a\\\";\\n}\\n.fa-superscript:before {\\n  content: \\\"\\\\f12b\\\";\\n}\\n.fa-subscript:before {\\n  content: \\\"\\\\f12c\\\";\\n}\\n.fa-eraser:before {\\n  content: \\\"\\\\f12d\\\";\\n}\\n.fa-puzzle-piece:before {\\n  content: \\\"\\\\f12e\\\";\\n}\\n.fa-microphone:before {\\n  content: \\\"\\\\f130\\\";\\n}\\n.fa-microphone-slash:before {\\n  content: \\\"\\\\f131\\\";\\n}\\n.fa-shield:before {\\n  content: \\\"\\\\f132\\\";\\n}\\n.fa-calendar-o:before {\\n  content: \\\"\\\\f133\\\";\\n}\\n.fa-fire-extinguisher:before {\\n  content: \\\"\\\\f134\\\";\\n}\\n.fa-rocket:before {\\n  content: \\\"\\\\f135\\\";\\n}\\n.fa-maxcdn:before {\\n  content: \\\"\\\\f136\\\";\\n}\\n.fa-chevron-circle-left:before {\\n  content: \\\"\\\\f137\\\";\\n}\\n.fa-chevron-circle-right:before {\\n  content: \\\"\\\\f138\\\";\\n}\\n.fa-chevron-circle-up:before {\\n  content: \\\"\\\\f139\\\";\\n}\\n.fa-chevron-circle-down:before {\\n  content: \\\"\\\\f13a\\\";\\n}\\n.fa-html5:before {\\n  content: \\\"\\\\f13b\\\";\\n}\\n.fa-css3:before {\\n  content: \\\"\\\\f13c\\\";\\n}\\n.fa-anchor:before {\\n  content: \\\"\\\\f13d\\\";\\n}\\n.fa-unlock-alt:before {\\n  content: \\\"\\\\f13e\\\";\\n}\\n.fa-bullseye:before {\\n  content: \\\"\\\\f140\\\";\\n}\\n.fa-ellipsis-h:before {\\n  content: \\\"\\\\f141\\\";\\n}\\n.fa-ellipsis-v:before {\\n  content: \\\"\\\\f142\\\";\\n}\\n.fa-rss-square:before {\\n  content: \\\"\\\\f143\\\";\\n}\\n.fa-play-circle:before {\\n  content: \\\"\\\\f144\\\";\\n}\\n.fa-ticket:before {\\n  content: \\\"\\\\f145\\\";\\n}\\n.fa-minus-square:before {\\n  content: \\\"\\\\f146\\\";\\n}\\n.fa-minus-square-o:before {\\n  content: \\\"\\\\f147\\\";\\n}\\n.fa-level-up:before {\\n  content: \\\"\\\\f148\\\";\\n}\\n.fa-level-down:before {\\n  content: \\\"\\\\f149\\\";\\n}\\n.fa-check-square:before {\\n  content: \\\"\\\\f14a\\\";\\n}\\n.fa-pencil-square:before {\\n  content: \\\"\\\\f14b\\\";\\n}\\n.fa-external-link-square:before {\\n  content: \\\"\\\\f14c\\\";\\n}\\n.fa-share-square:before {\\n  content: \\\"\\\\f14d\\\";\\n}\\n.fa-compass:before {\\n  content: \\\"\\\\f14e\\\";\\n}\\n.fa-toggle-down:before,\\n.fa-caret-square-o-down:before {\\n  content: \\\"\\\\f150\\\";\\n}\\n.fa-toggle-up:before,\\n.fa-caret-square-o-up:before {\\n  content: \\\"\\\\f151\\\";\\n}\\n.fa-toggle-right:before,\\n.fa-caret-square-o-right:before {\\n  content: \\\"\\\\f152\\\";\\n}\\n.fa-euro:before,\\n.fa-eur:before {\\n  content: \\\"\\\\f153\\\";\\n}\\n.fa-gbp:before {\\n  content: \\\"\\\\f154\\\";\\n}\\n.fa-dollar:before,\\n.fa-usd:before {\\n  content: \\\"\\\\f155\\\";\\n}\\n.fa-rupee:before,\\n.fa-inr:before {\\n  content: \\\"\\\\f156\\\";\\n}\\n.fa-cny:before,\\n.fa-rmb:before,\\n.fa-yen:before,\\n.fa-jpy:before {\\n  content: \\\"\\\\f157\\\";\\n}\\n.fa-ruble:before,\\n.fa-rouble:before,\\n.fa-rub:before {\\n  content: \\\"\\\\f158\\\";\\n}\\n.fa-won:before,\\n.fa-krw:before {\\n  content: \\\"\\\\f159\\\";\\n}\\n.fa-bitcoin:before,\\n.fa-btc:before {\\n  content: \\\"\\\\f15a\\\";\\n}\\n.fa-file:before {\\n  content: \\\"\\\\f15b\\\";\\n}\\n.fa-file-text:before {\\n  content: \\\"\\\\f15c\\\";\\n}\\n.fa-sort-alpha-asc:before {\\n  content: \\\"\\\\f15d\\\";\\n}\\n.fa-sort-alpha-desc:before {\\n  content: \\\"\\\\f15e\\\";\\n}\\n.fa-sort-amount-asc:before {\\n  content: \\\"\\\\f160\\\";\\n}\\n.fa-sort-amount-desc:before {\\n  content: \\\"\\\\f161\\\";\\n}\\n.fa-sort-numeric-asc:before {\\n  content: \\\"\\\\f162\\\";\\n}\\n.fa-sort-numeric-desc:before {\\n  content: \\\"\\\\f163\\\";\\n}\\n.fa-thumbs-up:before {\\n  content: \\\"\\\\f164\\\";\\n}\\n.fa-thumbs-down:before {\\n  content: \\\"\\\\f165\\\";\\n}\\n.fa-youtube-square:before {\\n  content: \\\"\\\\f166\\\";\\n}\\n.fa-youtube:before {\\n  content: \\\"\\\\f167\\\";\\n}\\n.fa-xing:before {\\n  content: \\\"\\\\f168\\\";\\n}\\n.fa-xing-square:before {\\n  content: \\\"\\\\f169\\\";\\n}\\n.fa-youtube-play:before {\\n  content: \\\"\\\\f16a\\\";\\n}\\n.fa-dropbox:before {\\n  content: \\\"\\\\f16b\\\";\\n}\\n.fa-stack-overflow:before {\\n  content: \\\"\\\\f16c\\\";\\n}\\n.fa-instagram:before {\\n  content: \\\"\\\\f16d\\\";\\n}\\n.fa-flickr:before {\\n  content: \\\"\\\\f16e\\\";\\n}\\n.fa-adn:before {\\n  content: \\\"\\\\f170\\\";\\n}\\n.fa-bitbucket:before {\\n  content: \\\"\\\\f171\\\";\\n}\\n.fa-bitbucket-square:before {\\n  content: \\\"\\\\f172\\\";\\n}\\n.fa-tumblr:before {\\n  content: \\\"\\\\f173\\\";\\n}\\n.fa-tumblr-square:before {\\n  content: \\\"\\\\f174\\\";\\n}\\n.fa-long-arrow-down:before {\\n  content: \\\"\\\\f175\\\";\\n}\\n.fa-long-arrow-up:before {\\n  content: \\\"\\\\f176\\\";\\n}\\n.fa-long-arrow-left:before {\\n  content: \\\"\\\\f177\\\";\\n}\\n.fa-long-arrow-right:before {\\n  content: \\\"\\\\f178\\\";\\n}\\n.fa-apple:before {\\n  content: \\\"\\\\f179\\\";\\n}\\n.fa-windows:before {\\n  content: \\\"\\\\f17a\\\";\\n}\\n.fa-android:before {\\n  content: \\\"\\\\f17b\\\";\\n}\\n.fa-linux:before {\\n  content: \\\"\\\\f17c\\\";\\n}\\n.fa-dribbble:before {\\n  content: \\\"\\\\f17d\\\";\\n}\\n.fa-skype:before {\\n  content: \\\"\\\\f17e\\\";\\n}\\n.fa-foursquare:before {\\n  content: \\\"\\\\f180\\\";\\n}\\n.fa-trello:before {\\n  content: \\\"\\\\f181\\\";\\n}\\n.fa-female:before {\\n  content: \\\"\\\\f182\\\";\\n}\\n.fa-male:before {\\n  content: \\\"\\\\f183\\\";\\n}\\n.fa-gittip:before,\\n.fa-gratipay:before {\\n  content: \\\"\\\\f184\\\";\\n}\\n.fa-sun-o:before {\\n  content: \\\"\\\\f185\\\";\\n}\\n.fa-moon-o:before {\\n  content: \\\"\\\\f186\\\";\\n}\\n.fa-archive:before {\\n  content: \\\"\\\\f187\\\";\\n}\\n.fa-bug:before {\\n  content: \\\"\\\\f188\\\";\\n}\\n.fa-vk:before {\\n  content: \\\"\\\\f189\\\";\\n}\\n.fa-weibo:before {\\n  content: \\\"\\\\f18a\\\";\\n}\\n.fa-renren:before {\\n  content: \\\"\\\\f18b\\\";\\n}\\n.fa-pagelines:before {\\n  content: \\\"\\\\f18c\\\";\\n}\\n.fa-stack-exchange:before {\\n  content: \\\"\\\\f18d\\\";\\n}\\n.fa-arrow-circle-o-right:before {\\n  content: \\\"\\\\f18e\\\";\\n}\\n.fa-arrow-circle-o-left:before {\\n  content: \\\"\\\\f190\\\";\\n}\\n.fa-toggle-left:before,\\n.fa-caret-square-o-left:before {\\n  content: \\\"\\\\f191\\\";\\n}\\n.fa-dot-circle-o:before {\\n  content: \\\"\\\\f192\\\";\\n}\\n.fa-wheelchair:before {\\n  content: \\\"\\\\f193\\\";\\n}\\n.fa-vimeo-square:before {\\n  content: \\\"\\\\f194\\\";\\n}\\n.fa-turkish-lira:before,\\n.fa-try:before {\\n  content: \\\"\\\\f195\\\";\\n}\\n.fa-plus-square-o:before {\\n  content: \\\"\\\\f196\\\";\\n}\\n.fa-space-shuttle:before {\\n  content: \\\"\\\\f197\\\";\\n}\\n.fa-slack:before {\\n  content: \\\"\\\\f198\\\";\\n}\\n.fa-envelope-square:before {\\n  content: \\\"\\\\f199\\\";\\n}\\n.fa-wordpress:before {\\n  content: \\\"\\\\f19a\\\";\\n}\\n.fa-openid:before {\\n  content: \\\"\\\\f19b\\\";\\n}\\n.fa-institution:before,\\n.fa-bank:before,\\n.fa-university:before {\\n  content: \\\"\\\\f19c\\\";\\n}\\n.fa-mortar-board:before,\\n.fa-graduation-cap:before {\\n  content: \\\"\\\\f19d\\\";\\n}\\n.fa-yahoo:before {\\n  content: \\\"\\\\f19e\\\";\\n}\\n.fa-google:before {\\n  content: \\\"\\\\f1a0\\\";\\n}\\n.fa-reddit:before {\\n  content: \\\"\\\\f1a1\\\";\\n}\\n.fa-reddit-square:before {\\n  content: \\\"\\\\f1a2\\\";\\n}\\n.fa-stumbleupon-circle:before {\\n  content: \\\"\\\\f1a3\\\";\\n}\\n.fa-stumbleupon:before {\\n  content: \\\"\\\\f1a4\\\";\\n}\\n.fa-delicious:before {\\n  content: \\\"\\\\f1a5\\\";\\n}\\n.fa-digg:before {\\n  content: \\\"\\\\f1a6\\\";\\n}\\n.fa-pied-piper:before {\\n  content: \\\"\\\\f1a7\\\";\\n}\\n.fa-pied-piper-alt:before {\\n  content: \\\"\\\\f1a8\\\";\\n}\\n.fa-drupal:before {\\n  content: \\\"\\\\f1a9\\\";\\n}\\n.fa-joomla:before {\\n  content: \\\"\\\\f1aa\\\";\\n}\\n.fa-language:before {\\n  content: \\\"\\\\f1ab\\\";\\n}\\n.fa-fax:before {\\n  content: \\\"\\\\f1ac\\\";\\n}\\n.fa-building:before {\\n  content: \\\"\\\\f1ad\\\";\\n}\\n.fa-child:before {\\n  content: \\\"\\\\f1ae\\\";\\n}\\n.fa-paw:before {\\n  content: \\\"\\\\f1b0\\\";\\n}\\n.fa-spoon:before {\\n  content: \\\"\\\\f1b1\\\";\\n}\\n.fa-cube:before {\\n  content: \\\"\\\\f1b2\\\";\\n}\\n.fa-cubes:before {\\n  content: \\\"\\\\f1b3\\\";\\n}\\n.fa-behance:before {\\n  content: \\\"\\\\f1b4\\\";\\n}\\n.fa-behance-square:before {\\n  content: \\\"\\\\f1b5\\\";\\n}\\n.fa-steam:before {\\n  content: \\\"\\\\f1b6\\\";\\n}\\n.fa-steam-square:before {\\n  content: \\\"\\\\f1b7\\\";\\n}\\n.fa-recycle:before {\\n  content: \\\"\\\\f1b8\\\";\\n}\\n.fa-automobile:before,\\n.fa-car:before {\\n  content: \\\"\\\\f1b9\\\";\\n}\\n.fa-cab:before,\\n.fa-taxi:before {\\n  content: \\\"\\\\f1ba\\\";\\n}\\n.fa-tree:before {\\n  content: \\\"\\\\f1bb\\\";\\n}\\n.fa-spotify:before {\\n  content: \\\"\\\\f1bc\\\";\\n}\\n.fa-deviantart:before {\\n  content: \\\"\\\\f1bd\\\";\\n}\\n.fa-soundcloud:before {\\n  content: \\\"\\\\f1be\\\";\\n}\\n.fa-database:before {\\n  content: \\\"\\\\f1c0\\\";\\n}\\n.fa-file-pdf-o:before {\\n  content: \\\"\\\\f1c1\\\";\\n}\\n.fa-file-word-o:before {\\n  content: \\\"\\\\f1c2\\\";\\n}\\n.fa-file-excel-o:before {\\n  content: \\\"\\\\f1c3\\\";\\n}\\n.fa-file-powerpoint-o:before {\\n  content: \\\"\\\\f1c4\\\";\\n}\\n.fa-file-photo-o:before,\\n.fa-file-picture-o:before,\\n.fa-file-image-o:before {\\n  content: \\\"\\\\f1c5\\\";\\n}\\n.fa-file-zip-o:before,\\n.fa-file-archive-o:before {\\n  content: \\\"\\\\f1c6\\\";\\n}\\n.fa-file-sound-o:before,\\n.fa-file-audio-o:before {\\n  content: \\\"\\\\f1c7\\\";\\n}\\n.fa-file-movie-o:before,\\n.fa-file-video-o:before {\\n  content: \\\"\\\\f1c8\\\";\\n}\\n.fa-file-code-o:before {\\n  content: \\\"\\\\f1c9\\\";\\n}\\n.fa-vine:before {\\n  content: \\\"\\\\f1ca\\\";\\n}\\n.fa-codepen:before {\\n  content: \\\"\\\\f1cb\\\";\\n}\\n.fa-jsfiddle:before {\\n  content: \\\"\\\\f1cc\\\";\\n}\\n.fa-life-bouy:before,\\n.fa-life-buoy:before,\\n.fa-life-saver:before,\\n.fa-support:before,\\n.fa-life-ring:before {\\n  content: \\\"\\\\f1cd\\\";\\n}\\n.fa-circle-o-notch:before {\\n  content: \\\"\\\\f1ce\\\";\\n}\\n.fa-ra:before,\\n.fa-rebel:before {\\n  content: \\\"\\\\f1d0\\\";\\n}\\n.fa-ge:before,\\n.fa-empire:before {\\n  content: \\\"\\\\f1d1\\\";\\n}\\n.fa-git-square:before {\\n  content: \\\"\\\\f1d2\\\";\\n}\\n.fa-git:before {\\n  content: \\\"\\\\f1d3\\\";\\n}\\n.fa-y-combinator-square:before,\\n.fa-yc-square:before,\\n.fa-hacker-news:before {\\n  content: \\\"\\\\f1d4\\\";\\n}\\n.fa-tencent-weibo:before {\\n  content: \\\"\\\\f1d5\\\";\\n}\\n.fa-qq:before {\\n  content: \\\"\\\\f1d6\\\";\\n}\\n.fa-wechat:before,\\n.fa-weixin:before {\\n  content: \\\"\\\\f1d7\\\";\\n}\\n.fa-send:before,\\n.fa-paper-plane:before {\\n  content: \\\"\\\\f1d8\\\";\\n}\\n.fa-send-o:before,\\n.fa-paper-plane-o:before {\\n  content: \\\"\\\\f1d9\\\";\\n}\\n.fa-history:before {\\n  content: \\\"\\\\f1da\\\";\\n}\\n.fa-circle-thin:before {\\n  content: \\\"\\\\f1db\\\";\\n}\\n.fa-header:before {\\n  content: \\\"\\\\f1dc\\\";\\n}\\n.fa-paragraph:before {\\n  content: \\\"\\\\f1dd\\\";\\n}\\n.fa-sliders:before {\\n  content: \\\"\\\\f1de\\\";\\n}\\n.fa-share-alt:before {\\n  content: \\\"\\\\f1e0\\\";\\n}\\n.fa-share-alt-square:before {\\n  content: \\\"\\\\f1e1\\\";\\n}\\n.fa-bomb:before {\\n  content: \\\"\\\\f1e2\\\";\\n}\\n.fa-soccer-ball-o:before,\\n.fa-futbol-o:before {\\n  content: \\\"\\\\f1e3\\\";\\n}\\n.fa-tty:before {\\n  content: \\\"\\\\f1e4\\\";\\n}\\n.fa-binoculars:before {\\n  content: \\\"\\\\f1e5\\\";\\n}\\n.fa-plug:before {\\n  content: \\\"\\\\f1e6\\\";\\n}\\n.fa-slideshare:before {\\n  content: \\\"\\\\f1e7\\\";\\n}\\n.fa-twitch:before {\\n  content: \\\"\\\\f1e8\\\";\\n}\\n.fa-yelp:before {\\n  content: \\\"\\\\f1e9\\\";\\n}\\n.fa-newspaper-o:before {\\n  content: \\\"\\\\f1ea\\\";\\n}\\n.fa-wifi:before {\\n  content: \\\"\\\\f1eb\\\";\\n}\\n.fa-calculator:before {\\n  content: \\\"\\\\f1ec\\\";\\n}\\n.fa-paypal:before {\\n  content: \\\"\\\\f1ed\\\";\\n}\\n.fa-google-wallet:before {\\n  content: \\\"\\\\f1ee\\\";\\n}\\n.fa-cc-visa:before {\\n  content: \\\"\\\\f1f0\\\";\\n}\\n.fa-cc-mastercard:before {\\n  content: \\\"\\\\f1f1\\\";\\n}\\n.fa-cc-discover:before {\\n  content: \\\"\\\\f1f2\\\";\\n}\\n.fa-cc-amex:before {\\n  content: \\\"\\\\f1f3\\\";\\n}\\n.fa-cc-paypal:before {\\n  content: \\\"\\\\f1f4\\\";\\n}\\n.fa-cc-stripe:before {\\n  content: \\\"\\\\f1f5\\\";\\n}\\n.fa-bell-slash:before {\\n  content: \\\"\\\\f1f6\\\";\\n}\\n.fa-bell-slash-o:before {\\n  content: \\\"\\\\f1f7\\\";\\n}\\n.fa-trash:before {\\n  content: \\\"\\\\f1f8\\\";\\n}\\n.fa-copyright:before {\\n  content: \\\"\\\\f1f9\\\";\\n}\\n.fa-at:before {\\n  content: \\\"\\\\f1fa\\\";\\n}\\n.fa-eyedropper:before {\\n  content: \\\"\\\\f1fb\\\";\\n}\\n.fa-paint-brush:before {\\n  content: \\\"\\\\f1fc\\\";\\n}\\n.fa-birthday-cake:before {\\n  content: \\\"\\\\f1fd\\\";\\n}\\n.fa-area-chart:before {\\n  content: \\\"\\\\f1fe\\\";\\n}\\n.fa-pie-chart:before {\\n  content: \\\"\\\\f200\\\";\\n}\\n.fa-line-chart:before {\\n  content: \\\"\\\\f201\\\";\\n}\\n.fa-lastfm:before {\\n  content: \\\"\\\\f202\\\";\\n}\\n.fa-lastfm-square:before {\\n  content: \\\"\\\\f203\\\";\\n}\\n.fa-toggle-off:before {\\n  content: \\\"\\\\f204\\\";\\n}\\n.fa-toggle-on:before {\\n  content: \\\"\\\\f205\\\";\\n}\\n.fa-bicycle:before {\\n  content: \\\"\\\\f206\\\";\\n}\\n.fa-bus:before {\\n  content: \\\"\\\\f207\\\";\\n}\\n.fa-ioxhost:before {\\n  content: \\\"\\\\f208\\\";\\n}\\n.fa-angellist:before {\\n  content: \\\"\\\\f209\\\";\\n}\\n.fa-cc:before {\\n  content: \\\"\\\\f20a\\\";\\n}\\n.fa-shekel:before,\\n.fa-sheqel:before,\\n.fa-ils:before {\\n  content: \\\"\\\\f20b\\\";\\n}\\n.fa-meanpath:before {\\n  content: \\\"\\\\f20c\\\";\\n}\\n.fa-buysellads:before {\\n  content: \\\"\\\\f20d\\\";\\n}\\n.fa-connectdevelop:before {\\n  content: \\\"\\\\f20e\\\";\\n}\\n.fa-dashcube:before {\\n  content: \\\"\\\\f210\\\";\\n}\\n.fa-forumbee:before {\\n  content: \\\"\\\\f211\\\";\\n}\\n.fa-leanpub:before {\\n  content: \\\"\\\\f212\\\";\\n}\\n.fa-sellsy:before {\\n  content: \\\"\\\\f213\\\";\\n}\\n.fa-shirtsinbulk:before {\\n  content: \\\"\\\\f214\\\";\\n}\\n.fa-simplybuilt:before {\\n  content: \\\"\\\\f215\\\";\\n}\\n.fa-skyatlas:before {\\n  content: \\\"\\\\f216\\\";\\n}\\n.fa-cart-plus:before {\\n  content: \\\"\\\\f217\\\";\\n}\\n.fa-cart-arrow-down:before {\\n  content: \\\"\\\\f218\\\";\\n}\\n.fa-diamond:before {\\n  content: \\\"\\\\f219\\\";\\n}\\n.fa-ship:before {\\n  content: \\\"\\\\f21a\\\";\\n}\\n.fa-user-secret:before {\\n  content: \\\"\\\\f21b\\\";\\n}\\n.fa-motorcycle:before {\\n  content: \\\"\\\\f21c\\\";\\n}\\n.fa-street-view:before {\\n  content: \\\"\\\\f21d\\\";\\n}\\n.fa-heartbeat:before {\\n  content: \\\"\\\\f21e\\\";\\n}\\n.fa-venus:before {\\n  content: \\\"\\\\f221\\\";\\n}\\n.fa-mars:before {\\n  content: \\\"\\\\f222\\\";\\n}\\n.fa-mercury:before {\\n  content: \\\"\\\\f223\\\";\\n}\\n.fa-intersex:before,\\n.fa-transgender:before {\\n  content: \\\"\\\\f224\\\";\\n}\\n.fa-transgender-alt:before {\\n  content: \\\"\\\\f225\\\";\\n}\\n.fa-venus-double:before {\\n  content: \\\"\\\\f226\\\";\\n}\\n.fa-mars-double:before {\\n  content: \\\"\\\\f227\\\";\\n}\\n.fa-venus-mars:before {\\n  content: \\\"\\\\f228\\\";\\n}\\n.fa-mars-stroke:before {\\n  content: \\\"\\\\f229\\\";\\n}\\n.fa-mars-stroke-v:before {\\n  content: \\\"\\\\f22a\\\";\\n}\\n.fa-mars-stroke-h:before {\\n  content: \\\"\\\\f22b\\\";\\n}\\n.fa-neuter:before {\\n  content: \\\"\\\\f22c\\\";\\n}\\n.fa-genderless:before {\\n  content: \\\"\\\\f22d\\\";\\n}\\n.fa-facebook-official:before {\\n  content: \\\"\\\\f230\\\";\\n}\\n.fa-pinterest-p:before {\\n  content: \\\"\\\\f231\\\";\\n}\\n.fa-whatsapp:before {\\n  content: \\\"\\\\f232\\\";\\n}\\n.fa-server:before {\\n  content: \\\"\\\\f233\\\";\\n}\\n.fa-user-plus:before {\\n  content: \\\"\\\\f234\\\";\\n}\\n.fa-user-times:before {\\n  content: \\\"\\\\f235\\\";\\n}\\n.fa-hotel:before,\\n.fa-bed:before {\\n  content: \\\"\\\\f236\\\";\\n}\\n.fa-viacoin:before {\\n  content: \\\"\\\\f237\\\";\\n}\\n.fa-train:before {\\n  content: \\\"\\\\f238\\\";\\n}\\n.fa-subway:before {\\n  content: \\\"\\\\f239\\\";\\n}\\n.fa-medium:before {\\n  content: \\\"\\\\f23a\\\";\\n}\\n.fa-yc:before,\\n.fa-y-combinator:before {\\n  content: \\\"\\\\f23b\\\";\\n}\\n.fa-optin-monster:before {\\n  content: \\\"\\\\f23c\\\";\\n}\\n.fa-opencart:before {\\n  content: \\\"\\\\f23d\\\";\\n}\\n.fa-expeditedssl:before {\\n  content: \\\"\\\\f23e\\\";\\n}\\n.fa-battery-4:before,\\n.fa-battery-full:before {\\n  content: \\\"\\\\f240\\\";\\n}\\n.fa-battery-3:before,\\n.fa-battery-three-quarters:before {\\n  content: \\\"\\\\f241\\\";\\n}\\n.fa-battery-2:before,\\n.fa-battery-half:before {\\n  content: \\\"\\\\f242\\\";\\n}\\n.fa-battery-1:before,\\n.fa-battery-quarter:before {\\n  content: \\\"\\\\f243\\\";\\n}\\n.fa-battery-0:before,\\n.fa-battery-empty:before {\\n  content: \\\"\\\\f244\\\";\\n}\\n.fa-mouse-pointer:before {\\n  content: \\\"\\\\f245\\\";\\n}\\n.fa-i-cursor:before {\\n  content: \\\"\\\\f246\\\";\\n}\\n.fa-object-group:before {\\n  content: \\\"\\\\f247\\\";\\n}\\n.fa-object-ungroup:before {\\n  content: \\\"\\\\f248\\\";\\n}\\n.fa-sticky-note:before {\\n  content: \\\"\\\\f249\\\";\\n}\\n.fa-sticky-note-o:before {\\n  content: \\\"\\\\f24a\\\";\\n}\\n.fa-cc-jcb:before {\\n  content: \\\"\\\\f24b\\\";\\n}\\n.fa-cc-diners-club:before {\\n  content: \\\"\\\\f24c\\\";\\n}\\n.fa-clone:before {\\n  content: \\\"\\\\f24d\\\";\\n}\\n.fa-balance-scale:before {\\n  content: \\\"\\\\f24e\\\";\\n}\\n.fa-hourglass-o:before {\\n  content: \\\"\\\\f250\\\";\\n}\\n.fa-hourglass-1:before,\\n.fa-hourglass-start:before {\\n  content: \\\"\\\\f251\\\";\\n}\\n.fa-hourglass-2:before,\\n.fa-hourglass-half:before {\\n  content: \\\"\\\\f252\\\";\\n}\\n.fa-hourglass-3:before,\\n.fa-hourglass-end:before {\\n  content: \\\"\\\\f253\\\";\\n}\\n.fa-hourglass:before {\\n  content: \\\"\\\\f254\\\";\\n}\\n.fa-hand-grab-o:before,\\n.fa-hand-rock-o:before {\\n  content: \\\"\\\\f255\\\";\\n}\\n.fa-hand-stop-o:before,\\n.fa-hand-paper-o:before {\\n  content: \\\"\\\\f256\\\";\\n}\\n.fa-hand-scissors-o:before {\\n  content: \\\"\\\\f257\\\";\\n}\\n.fa-hand-lizard-o:before {\\n  content: \\\"\\\\f258\\\";\\n}\\n.fa-hand-spock-o:before {\\n  content: \\\"\\\\f259\\\";\\n}\\n.fa-hand-pointer-o:before {\\n  content: \\\"\\\\f25a\\\";\\n}\\n.fa-hand-peace-o:before {\\n  content: \\\"\\\\f25b\\\";\\n}\\n.fa-trademark:before {\\n  content: \\\"\\\\f25c\\\";\\n}\\n.fa-registered:before {\\n  content: \\\"\\\\f25d\\\";\\n}\\n.fa-creative-commons:before {\\n  content: \\\"\\\\f25e\\\";\\n}\\n.fa-gg:before {\\n  content: \\\"\\\\f260\\\";\\n}\\n.fa-gg-circle:before {\\n  content: \\\"\\\\f261\\\";\\n}\\n.fa-tripadvisor:before {\\n  content: \\\"\\\\f262\\\";\\n}\\n.fa-odnoklassniki:before {\\n  content: \\\"\\\\f263\\\";\\n}\\n.fa-odnoklassniki-square:before {\\n  content: \\\"\\\\f264\\\";\\n}\\n.fa-get-pocket:before {\\n  content: \\\"\\\\f265\\\";\\n}\\n.fa-wikipedia-w:before {\\n  content: \\\"\\\\f266\\\";\\n}\\n.fa-safari:before {\\n  content: \\\"\\\\f267\\\";\\n}\\n.fa-chrome:before {\\n  content: \\\"\\\\f268\\\";\\n}\\n.fa-firefox:before {\\n  content: \\\"\\\\f269\\\";\\n}\\n.fa-opera:before {\\n  content: \\\"\\\\f26a\\\";\\n}\\n.fa-internet-explorer:before {\\n  content: \\\"\\\\f26b\\\";\\n}\\n.fa-tv:before,\\n.fa-television:before {\\n  content: \\\"\\\\f26c\\\";\\n}\\n.fa-contao:before {\\n  content: \\\"\\\\f26d\\\";\\n}\\n.fa-500px:before {\\n  content: \\\"\\\\f26e\\\";\\n}\\n.fa-amazon:before {\\n  content: \\\"\\\\f270\\\";\\n}\\n.fa-calendar-plus-o:before {\\n  content: \\\"\\\\f271\\\";\\n}\\n.fa-calendar-minus-o:before {\\n  content: \\\"\\\\f272\\\";\\n}\\n.fa-calendar-times-o:before {\\n  content: \\\"\\\\f273\\\";\\n}\\n.fa-calendar-check-o:before {\\n  content: \\\"\\\\f274\\\";\\n}\\n.fa-industry:before {\\n  content: \\\"\\\\f275\\\";\\n}\\n.fa-map-pin:before {\\n  content: \\\"\\\\f276\\\";\\n}\\n.fa-map-signs:before {\\n  content: \\\"\\\\f277\\\";\\n}\\n.fa-map-o:before {\\n  content: \\\"\\\\f278\\\";\\n}\\n.fa-map:before {\\n  content: \\\"\\\\f279\\\";\\n}\\n.fa-commenting:before {\\n  content: \\\"\\\\f27a\\\";\\n}\\n.fa-commenting-o:before {\\n  content: \\\"\\\\f27b\\\";\\n}\\n.fa-houzz:before {\\n  content: \\\"\\\\f27c\\\";\\n}\\n.fa-vimeo:before {\\n  content: \\\"\\\\f27d\\\";\\n}\\n.fa-black-tie:before {\\n  content: \\\"\\\\f27e\\\";\\n}\\n.fa-fonticons:before {\\n  content: \\\"\\\\f280\\\";\\n}\\n.fa-reddit-alien:before {\\n  content: \\\"\\\\f281\\\";\\n}\\n.fa-edge:before {\\n  content: \\\"\\\\f282\\\";\\n}\\n.fa-credit-card-alt:before {\\n  content: \\\"\\\\f283\\\";\\n}\\n.fa-codiepie:before {\\n  content: \\\"\\\\f284\\\";\\n}\\n.fa-modx:before {\\n  content: \\\"\\\\f285\\\";\\n}\\n.fa-fort-awesome:before {\\n  content: \\\"\\\\f286\\\";\\n}\\n.fa-usb:before {\\n  content: \\\"\\\\f287\\\";\\n}\\n.fa-product-hunt:before {\\n  content: \\\"\\\\f288\\\";\\n}\\n.fa-mixcloud:before {\\n  content: \\\"\\\\f289\\\";\\n}\\n.fa-scribd:before {\\n  content: \\\"\\\\f28a\\\";\\n}\\n.fa-pause-circle:before {\\n  content: \\\"\\\\f28b\\\";\\n}\\n.fa-pause-circle-o:before {\\n  content: \\\"\\\\f28c\\\";\\n}\\n.fa-stop-circle:before {\\n  content: \\\"\\\\f28d\\\";\\n}\\n.fa-stop-circle-o:before {\\n  content: \\\"\\\\f28e\\\";\\n}\\n.fa-shopping-bag:before {\\n  content: \\\"\\\\f290\\\";\\n}\\n.fa-shopping-basket:before {\\n  content: \\\"\\\\f291\\\";\\n}\\n.fa-hashtag:before {\\n  content: \\\"\\\\f292\\\";\\n}\\n.fa-bluetooth:before {\\n  content: \\\"\\\\f293\\\";\\n}\\n.fa-bluetooth-b:before {\\n  content: \\\"\\\\f294\\\";\\n}\\n.fa-percent:before {\\n  content: \\\"\\\\f295\\\";\\n}\\n/*@import url(\\\"/Users/travis/Documents/Git/embed/lib/sm2/bar-ui/css/bar-ui.css\\\");*/\\n.creek-loading-bar {\\n  position: fixed;\\n  top: 0;\\n  left: 0;\\n  width: 1%;\\n  height: 2px;\\n  background: #fff;\\n  box-shadow: 0 0 20px #fff;\\n  display: none;\\n  z-index: 9999999999;\\n  opacity: 1;\\n}\\n.creek-loading-bar-visible {\\n  display: block;\\n}\\n/* Global */\\n.clearfix {\\n  overflow: auto;\\n}\\n.creek-page-container {\\n  overflow: auto;\\n}\\n.creek-hide {\\n  display: none !important;\\n}\\n.sm2-bar-ui {\\n  font-size: 16px;\\n}\\n.sm2-bar-ui .sm2-main-controls,\\n.sm2-bar-ui .sm2-playlist-drawer {\\n  background-color: #f4f4f4;\\n}\\n.sm2-bar-ui .sm2-inline-texture {\\n  background: transparent;\\n}\\n.sm2-bar-ui p {\\n  font-size: 16px;\\n}\\n.sm2-bar-ui p::before {\\n  display: none !important;\\n}\\n.sm2-bar-ui p {\\n  margin: 0 !important;\\n}\\n/* -----------------------------------\\n\\n  Audio player\\n\\n-------------------------------------- */\\n/* Hide the player by default, since it will be replaced by SM2 player (rather than flashing the audio player for a second before the SM2 player kicks in). */\\naudio.creek-audio-player {\\n  display: none;\\n}\\n/* -----------------------------------\\n\\n  Audio toolbar\\n\\n-------------------------------------- */\\n#creek-audio-toolbar {\\n  /*border-top:1px solid #000;*/\\n  position: fixed;\\n  z-index: 999999;\\n  bottom: 0;\\n  left: 0;\\n  width: 100%;\\n  background: rgba(255,255,255,1);\\n  /*box-shadow: 0 0 8px rgba(0,0,0,.2);*/\\n  /*height:200px;*/\\n  font-size: 18px;\\n  line-height: 140%;\\n  min-height: 64px;\\n}\\n#creek-audio-toolbar .creek-audio-toolbar-container {\\n  padding: 10px 20px;\\n}\\n#creek-audio-toolbar .creek-audio-toolbar-inner {\\n  padding: 10px 20px;\\n  max-width: 1100px;\\n  margin: 0 auto;\\n}\\n#creek-audio-toolbar .creek-audio-toolbar {\\n  float: none;\\n}\\n#creek-audio-toolbar div.creek-audio-info {\\n  float: none;\\n}\\n#creek-audio-toolbar-spacer {\\n  /*height:80px;*/\\n}\\n#creek-audio-toolbar .creek-track {\\n  overflow: hidden;\\n}\\n#creek-audio-toolbar .creek-audio-toolbar-container {\\n  padding: 10px 20px;\\n}\\n/*#creek-audio-toolbar .creek-audio-pause-icon, #creek-audio-toolbar .creek-audio-play-icon  { color:#000; }*/\\n#creek-audio-toolbar .creek-audio-pause-icon {\\n  display: none;\\n}\\n#creek-audio-toolbar .creek-audio-main-button {\\n  float: left;\\n  font-size: 20px;\\n}\\n#creek-audio-toolbar .creek-audio-switch-to-live {\\n  float: left;\\n  font-size: 14px;\\n  border: 1px solid #ccc;\\n  color: #999;\\n  border-radius: 4px;\\n  padding: 4px 8px;\\n  margin: 0 10px 8px 0;\\n}\\n#creek-audio-toolbar .fa-stack {\\n  line-height: 100%;\\n}\\n.creek-audio-show-image {\\n  float: left;\\n  display: none;\\n}\\n.creek-audio-has-show-image .creek-audio-show-image {\\n  display: block;\\n}\\n/* Toggle visibility of audio toolbar. */\\n#creek-audio-toolbar {\\n  display: none;\\n}\\nbody.creek-audio-toolbar-visible #creek-audio-toolbar {\\n  display: block;\\n}\\nbody.creek-audio-toolbar-visible #creek-audio-toolbar {\\n  display: block;\\n}\\nbody.creek-audio-toolbar-visible #creek-audio-toolbar-spacer {\\n  display: block;\\n}\\n/* Toggle visibility of play/pause buttons. */\\nbody.creek-audio-playing #creek-audio-toolbar .creek-audio-pause-icon {\\n  display: inline-block;\\n}\\nbody.creek-audio-playing #creek-audio-toolbar .creek-audio-play-icon {\\n  display: none;\\n}\\n/* Toggle visibility of show image. */\\n#creek-audio-show-image {\\n  display: none;\\n}\\nbody.creek-audio-has-show-image #creek-audio-show-image {\\n  display: inline-block;\\n}\\n/* Toggle visibility of volume buttons and toolbar. */\\nbody.creek-audio-volume-visible .creek-audio-volume-button-open {\\n  display: none;\\n}\\nbody.creek-audio-volume-visible .creek-audio-volume-button-close {\\n  display: inline-block;\\n}\\nbody.creek-audio-volume-visible #creek-audio-volume-tool {\\n  display: block !important;\\n}\\n.creek-audio-volume-button {\\n  float: right;\\n  display: block;\\n  font-size: 30px;\\n  padding: 10px;\\n}\\nbody .creek-audio-volume-button-close {\\n  display: none;\\n}\\n#creek-audio-volume-tool {\\n  display: none;\\n  position: relative;\\n  z-index: 9999999;\\n  background: #fff;\\n  opacity: 1;\\n  box-shadow: 0px 0px 10px rgba(0,0,0,0.2);\\n  padding: 8px;\\n  margin: -184px 7px 0 0;\\n  float: right;\\n  clear: right;\\n}\\n#creek-audio-volume-tool .bar {\\n  position: relative;\\n  width: 14px;\\n  height: 100px;\\n  background: #000;\\n}\\n#creek-audio-volume-tool .bar:hover {\\n  cursor: pointer;\\n}\\n#creek-audio-volume-tool .filler {\\n  background: #ddd;\\n  position: absolute;\\n  bottom: 0;\\n  width: 14px;\\n  left: 0;\\n  border-top: 2px solid #fff;\\n  height: 93px;\\n}\\n/* -----------------------------------\\n\\n  Content pages\\n\\n-------------------------------------- */\\nh1.creek-title {\\n  margin: 0 0 20px 0;\\n}\\n/* -----------------------------------\\n\\n  Shows\\n\\n-------------------------------------- */\\n.creek-page-show .creek-featured-image {\\n  float: right;\\n  padding: 0 0 20px 20px;\\n}\\n.creek-page-show .creek-featured-image img {\\n  max-width: 400px;\\n}\\n.creek-page-show .creek-image-container img {\\n  max-width: 240px;\\n  float: right;\\n  margin: 0 0 10px 20px;\\n}\\n.creek-page-show .creek-airtimes-container {\\n  margin: 0 0 20px 0;\\n  padding: 0;\\n}\\n.creek-page-show .creek-airtimes-container ul {\\n  margin: 0 0 0px 0;\\n  padding: 0;\\n}\\n.creek-page-show .creek-airtimes-container li {\\n  list-style: none;\\n  margin: 0 0 0px 0;\\n}\\n.creek-page-show .creek-hosts-container {\\n  margin: 0 0 20px 0;\\n}\\n.creek-page-show .creek-hosts-container ul {\\n  padding: 0;\\n  margin: 0;\\n}\\n.creek-page-show .creek-hosts-container li {\\n  display: inline-block;\\n  list-style: none;\\n}\\n\\n.creek-page-show .creek-broadcasts-container ul {\\n  list-style: none;\\n  margin: 0;\\n}\\n.creek-page-show .creek-broadcast {\\n  overflow: auto;\\n  margin: 0 0 0px 0;\\n  padding: 12px 0;\\n  border-top: 1px solid rgba(0,0,0,.1);\\n}\\n.creek-page-show .creek-broadcast .creek-image-container {\\n  float: left;\\n}\\n.creek-page-show .creek-broadcast .image {\\n  float: left;\\n}\\n.creek-page-show .creek-broadcast .image img {\\n  max-width: 100px;\\n  height: auto;\\n}\\n.creek-page-show .creek-broadcast .creek-image-container img {\\n  margin: 0 20px 10px 0;\\n}\\n/* -----------------------------------\\n\\n  Broadcasts\\n\\n-------------------------------------- */\\n.creek-page-broadcast .creek-featured-image {\\n  float: right;\\n}\\n.creek-page-broadcast .creek-image-container img {\\n  max-width: 240px;\\n  float: right;\\n  margin: 0 0 10px 20px;\\n}\\n.creek-page-broadcast .creek-text {\\n  margin: 0 0 30px 0;\\n}\\n.creek-page-broadcast .creek-media-audio-container {\\n  margin: 0 0 30px 0;\\n}\\n/* -----------------------------------\\n\\n  Archives\\n\\n-------------------------------------- */\\n.creek-broadcasts .creek-info a {\\n  display: block;\\n}\\n.creek-broadcasts .creek-broadcast {\\n  padding: 10px;\\n  overflow: auto;\\n}\\n.creek-broadcasts .creek-image {\\n  display: block;\\n  float: left;\\n  margin: 0 10px 0 0;\\n}\\n.creek-broadcasts .creek-image img {\\n  max-width: 90px;\\n  height: auto;\\n}\\n/* -----------------------------------\\n\\n  Playlists\\n\\n-------------------------------------- */\\n.creek-playlist {\\n  border: 1px solid #ddd;\\n  padding: 10px;\\n  margin: 0 0 20px 0;\\n}\\n.creek-playlist ul {\\n  padding: 0;\\n  margin: 0;\\n}\\n.creek-playlist li.creek-track {\\n  list-style: none;\\n}\\n.creek-playlist .creek-track-time {\\n  margin-right: 10px;\\n  color: #999;\\n}\\n.creek-playlist .creek-track-title {\\n  font-weight: bold;\\n}\\n.creek-playlist .creek-track-artist {\\n  font-weight: bold;\\n}\\n.creek-playlist .creek-track-link {\\n  color: #999;\\n  margin: 0 0 0 10px;\\n  text-decoration: underline;\\n}\\n.creek-playlist .creek-track-link:hover {\\n  color: #000;\\n}\\n/* -----------------------------------\\n\\n  Media\\n\\n-------------------------------------- */\\n.creek-media-attachments-container {\\n  margin: 0 0 20px 0;\\n}\\n/* -----------------------------------\\n\\n  Hosts\\n\\n-------------------------------------- */\\n.creek-page-host .creek-featured-image {\\n  float: right;\\n}\\n.creek-page-host .creek-image {\\n  float: right;\\n}\\n.creek-page-host .creek-image img {\\n  max-width: 240px;\\n  float: right;\\n  margin: 0 0 10px 20px;\\n}\\n.creek-page-host .creek-text {\\n  margin: 0 0 30px 0;\\n}\\n.creek-page-host .creek-shows-container {\\n  margin: 0 0 20px 0;\\n  padding: 0;\\n}\\n.creek-page-host .creek-shows-container ul {\\n  margin: 0;\\n  padding: 0;\\n}\\n.creek-page-host .creek-shows-container li {\\n  margin: 0 0 6px 0;\\n  padding: 0;\\n  list-style: none;\\n}\\n/* -----------------------------------\\n\\n  Schedule\\n\\n-------------------------------------- */\\n.creek-shows-container .creek-weekdays {\\n  margin: 0 0 20px 0;\\n}\\n.creek-shows-container .creek-weekdays ul {\\n  margin: 0;\\n  padding: 0;\\n}\\n.creek-shows-container .creek-weekdays ul li {\\n  list-style: none;\\n}\\n.creek-shows-container .creek-weekdays .creek-weekday {\\n  display: inline-block;\\n  margin: 0 10px 0 0;\\n  padding: 8px 12px;\\n}\\n.creek-shows-container .creek-weekdays .creek-weekday a {\\n  text-decoration: none;\\n}\\n\\n.creek-shows-container .creek-weekdays .creek-weekday.selected {\\n  background: #fff;\\n  border-radius: 4px;\\n  box-shadow: 0 2px 4px rgba(0,0,0,.2);\\n  padding: 7px 11px;\\n}\\n.creek-shows-container .creek-shows-find {\\n  margin: 0 0 20px 0;\\n}\\n.creek-shows-container .creek-shows .creek-show {\\n  display: inline-block;\\n  vertical-align: top;\\n  width: 210px;\\n  text-align: center;\\n  border-radius: 4px;\\n  margin: 0 20px 20px 0;\\n  background: #fff;\\n  box-shadow: 0 2px 4px rgba(0,0,0,.2);\\n}\\n.creek-shows-container .creek-shows .creek-show .creek-time-container {\\n  padding: 6px 10px;\\n  border-bottom: 1px solid rgba(0, 0, 0, 0.1);\\n}\\n.creek-shows-container .creek-shows .creek-show .creek-image-container {\\n  padding: 8px 10px;\\n  overflow: hidden;\\n  float: none;\\n  text-align: center;\\n}\\n.creek-shows-container .creek-shows .creek-show .creek-image-container img {\\n  float: none;\\n  display: inline;\\n}\\n.creek-shows-container .creek-shows .creek-show .creek-hosts-container {\\n  margin: 0 0 8px 0;\\n}\\n.creek-shows-container .creek-shows .creek-show .creek-hosts-container ul {\\n  padding: 0;\\n  margin: 0;\\n}\\n.creek-shows-container .creek-shows .creek-show .creek-hosts-container li {\\n  display: inline-block;\\n  list-style: none;\\n  font-size: .9em;\\n  margin: 0 8px 0;\\n}\\n.creek-shows-container .creek-shows .creek-show .creek-grouped-image-container {\\n  padding: 10px 10px;\\n  overflow: hidden;\\n}\\n.creek-shows-container .creek-shows .creek-show .creek-grouped-image-container img {\\n  height: 150px !important;\\n  float: none;\\n}\\n.creek-shows-container .creek-shows .creek-show .creek-grouped-image-container .creek-grouped-image img {\\n  display: none;\\n}\\n.creek-shows-container .creek-shows .creek-show .creek-grouped-image-container .creek-grouped-image:first-child img {\\n  display: inline-block;\\n}\\n.creek-shows-container .creek-shows .creek-show .creek-info-container {\\n  padding: 0px 12px 16px 12px;\\n}\\n.creek-shows-container .creek-shows .creek-show .creek-show-group-titles h3 .creek-show-group-title .creek-show-group-titles-divider {\\n  color: #999;\\n  margin: 0 10px;\\n}\\n.creek-shows-container .creek-shows .creek-show .creek-show-group-titles h3 .creek-show-group-title:first-child .creek-show-group-titles-divider {\\n  display: none;\\n}\\n.creek-shows-container .creek-shows .creek-show h3 {\\n  margin: 0 0 10px 0;\\n  font-size: 15px;\\n  font-weight: 600;\\n  line-height: 130%;\\n}\\n.creek-shows-container .creek-shows .creek-show h3 a {\\n  text-decoration: none;\\n}\\n.creek-broadcasts-container .creek-broadcast .creek-info {\\n  margin: 0 0 10px 0;\\n}\\n.creek-broadcasts-container .creek-broadcast .creek-info .creek-time {\\n  font-size: 14px;\\n}\\n.creek-broadcasts-container .creek-broadcast .creek-info .creek-title {\\n  font-weight: 600;\\n}\\n.creek-broadcasts-container .creek-broadcast {\\n  clear: both;\\n}\\n.creek-show-schedule {\\n  border-top: 1px solid rgba(0,0,0,.1);\\n  border-left: 1px solid rgba(0,0,0,.1);\\n  font-size: 14px;\\n}\\n.creek-show-schedule .creek-cell-empty,\\n.creek-show-schedule .creek-cell-show,\\n.creek-show-schedule .creek-row-time,\\n.creek-show-schedule .creek-weekday,\\n.creek-show-schedule .creek-corner {\\n  border-right: 1px solid rgba(0,0,0,.1);\\n  border-bottom: 1px solid rgba(0,0,0,.1);\\n  padding: 10px;\\n}\\n\\n\\n/* -----------------------------------\\n\\n  Overrides\\n\\n-------------------------------------- */\\n.creek-current-show-label {\\n  color: #999;\\n  border: 1px solid #ddd;\\n  padding: 0px 8px;\\n  margin: -2px 8px 0 0;\\n  display: inline-block;\\n  font-size: 14px;\\n}\\ninput.picker__input[readonly]:hover {\\n  cursor: pointer !important;\\n}\\n.creek-audio-mode-file .creek-current-show-label {\\n  display: none;\\n}\\n.creek-page-show .creek-social-buttons {\\n  margin: 30px 0;\\n}\\n.creek-page-show .creek-broadcast .creek-social-buttons {\\n  margin: 0 0 30px 0;\\n}\\n.creek-page-show .creek-broadcast .creek-time {\\n  display: none;\\n}\\n.creek-shows-container .creek-shows .creek-show {\\n  border: 1px solid rgba(0,0,0,.14);\\n  box-shadow: none;\\n}\\n.creek-shows-container .creek-weekdays .creek-weekday.selected {\\n  border: 1px solid rgba(0,0,0,.14);\\n  box-shadow: none;\\n}\\n.sm2-bar-ui .sm2-main-controls,\\n.sm2-bar-ui .sm2-playlist-drawer {\\n  background: rgba(0,0,0,.1);\\n}\\n.creek-page-container p {\\n  padding: inherit;\\n}\\n.sm2-bar-ui {\\n  margin: 0 0 20px 0;\\n}\\n/* -----------------------------------\\n\\n  Social Buttons\\n\\n-------------------------------------- */\\n.creek-social-buttons {\\n  margin: 0 0 10px 0;\\n}\\n.creek-social-button {\\n  color: #fff;\\n  padding: 4px 10px;\\n  border-radius: 3px;\\n  position: relative;\\n  z-index: 2;\\n  margin: 0 10px 0 0;\\n  display: inline-block;\\n}\\n.creek-social-button .fa {\\n  margin-right: 3px;\\n}\\n.creek-social-button:hover {\\n  opacity: 0.8;\\n  cursor: pointer;\\n}\\n.creek-social-button-twitter {\\n  background: #4099FF;\\n}\\n.creek-social-button-facebook {\\n  background: #3b5998;\\n}\\n.creek-social-button-email {\\n  background: #777;\\n}\\n.creek-social-email-box {\\n  z-index: 100;\\n  position: absolute;\\n  padding: 10px;\\n  border-radius: 4px;\\n  top: 0;\\n  left: 0;\\n  background: #fff;\\n  box-shadow: 0 2px 8px rgba(0,0,0,.1);\\n}\\n.creek-social-email-box p {\\n  margin: 0 0 10px 0;\\n  white-space: nowrap;\\n  font-size: 14px;\\n}\\n#creek-email-link {\\n  display: block !important;\\n  box-sizing: border-box;\\n  border: 1px solid #ddd !important;\\n  padding: 8px 12px !important;\\n  margin: 0 0 10px 0 !important;\\n  width: 100%;\\n  height: auto;\\n}\\n.creek-close {\\n  display: block;\\n  border: 1px solid #ddd;\\n  border-bottom: 2px solid #ddd;\\n  padding: 4px 12px;\\n  text-align: center;\\n  border-radius: 4px;\\n}\\n.creek-close:hover {\\n  cursor: pointer;\\n  border-color: #ccc;\\n}\\n/* -----------------------------------\\n\\n  Persistence\\n\\n-------------------------------------- */\\nbody.creek-persist-reset-body-css {\\n  padding: 0 !important;\\n  margin: 0 !important;\\n}\\nbody.creek-persist-reset-body-css:before {\\n  display: none !important;\\n  content: '' !important;\\n}\\nbody.creek-persist-reset-body-css:after {\\n  content: '' !important;\\n  display: none !important;\\n}\\n\"; (require(\"browserify-css\").createStyle(css, { \"href\": \"css/creek.css\"})); module.exports = css;","var css = \"/*!\\n *  Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome\\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\\n */\\n/* FONT PATH\\n * -------------------------- */\\n@font-face {\\n  font-family: 'FontAwesome';\\n  src: url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.6.3/fonts/fontawesome-webfont.eot?v=4.6.3');\\n  src: url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.6.3/fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'), url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.6.3/fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'), url('fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'), url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.6.3/fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'), url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.6.3/fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular') format('svg');\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.fa {\\n  display: inline-block;\\n  font: normal normal normal 14px/1 FontAwesome;\\n  font-size: inherit;\\n  text-rendering: auto;\\n  -webkit-font-smoothing: antialiased;\\n  -moz-osx-font-smoothing: grayscale;\\n}\\n/* makes the font 33% larger relative to the icon container */\\n.fa-lg {\\n  font-size: 1.33333333em;\\n  line-height: 0.75em;\\n  vertical-align: -15%;\\n}\\n.fa-2x {\\n  font-size: 2em;\\n}\\n.fa-3x {\\n  font-size: 3em;\\n}\\n.fa-4x {\\n  font-size: 4em;\\n}\\n.fa-5x {\\n  font-size: 5em;\\n}\\n.fa-fw {\\n  width: 1.28571429em;\\n  text-align: center;\\n}\\n.fa-ul {\\n  padding-left: 0;\\n  margin-left: 2.14285714em;\\n  list-style-type: none;\\n}\\n.fa-ul > li {\\n  position: relative;\\n}\\n.fa-li {\\n  position: absolute;\\n  left: -2.14285714em;\\n  width: 2.14285714em;\\n  top: 0.14285714em;\\n  text-align: center;\\n}\\n.fa-li.fa-lg {\\n  left: -1.85714286em;\\n}\\n.fa-border {\\n  padding: .2em .25em .15em;\\n  border: solid 0.08em #eeeeee;\\n  border-radius: .1em;\\n}\\n.fa-pull-left {\\n  float: left;\\n}\\n.fa-pull-right {\\n  float: right;\\n}\\n.fa.fa-pull-left {\\n  margin-right: .3em;\\n}\\n.fa.fa-pull-right {\\n  margin-left: .3em;\\n}\\n/* Deprecated as of 4.4.0 */\\n.pull-right {\\n  float: right;\\n}\\n.pull-left {\\n  float: left;\\n}\\n.fa.pull-left {\\n  margin-right: .3em;\\n}\\n.fa.pull-right {\\n  margin-left: .3em;\\n}\\n.fa-spin {\\n  -webkit-animation: fa-spin 2s infinite linear;\\n  animation: fa-spin 2s infinite linear;\\n}\\n.fa-pulse {\\n  -webkit-animation: fa-spin 1s infinite steps(8);\\n  animation: fa-spin 1s infinite steps(8);\\n}\\n@-webkit-keyframes fa-spin {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n\\n  100% {\\n    -webkit-transform: rotate(359deg);\\n    transform: rotate(359deg);\\n  }\\n}\\n@keyframes fa-spin {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n\\n  100% {\\n    -webkit-transform: rotate(359deg);\\n    transform: rotate(359deg);\\n  }\\n}\\n.fa-rotate-90 {\\n  -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\\\";\\n  -webkit-transform: rotate(90deg);\\n  -ms-transform: rotate(90deg);\\n  transform: rotate(90deg);\\n}\\n.fa-rotate-180 {\\n  -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\\\";\\n  -webkit-transform: rotate(180deg);\\n  -ms-transform: rotate(180deg);\\n  transform: rotate(180deg);\\n}\\n.fa-rotate-270 {\\n  -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\\\";\\n  -webkit-transform: rotate(270deg);\\n  -ms-transform: rotate(270deg);\\n  transform: rotate(270deg);\\n}\\n.fa-flip-horizontal {\\n  -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\\\";\\n  -webkit-transform: scale(-1, 1);\\n  -ms-transform: scale(-1, 1);\\n  transform: scale(-1, 1);\\n}\\n.fa-flip-vertical {\\n  -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\\\";\\n  -webkit-transform: scale(1, -1);\\n  -ms-transform: scale(1, -1);\\n  transform: scale(1, -1);\\n}\\n:root .fa-rotate-90,\\n:root .fa-rotate-180,\\n:root .fa-rotate-270,\\n:root .fa-flip-horizontal,\\n:root .fa-flip-vertical {\\n  filter: none;\\n}\\n.fa-stack {\\n  position: relative;\\n  display: inline-block;\\n  width: 2em;\\n  height: 2em;\\n  line-height: 2em;\\n  vertical-align: middle;\\n}\\n.fa-stack-1x,\\n.fa-stack-2x {\\n  position: absolute;\\n  left: 0;\\n  width: 100%;\\n  text-align: center;\\n}\\n.fa-stack-1x {\\n  line-height: inherit;\\n}\\n.fa-stack-2x {\\n  font-size: 2em;\\n}\\n.fa-inverse {\\n  color: #ffffff;\\n}\\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\\n   readers do not read off random characters that represent icons */\\n.fa-glass:before {\\n  content: \\\"\\\\f000\\\";\\n}\\n.fa-music:before {\\n  content: \\\"\\\\f001\\\";\\n}\\n.fa-search:before {\\n  content: \\\"\\\\f002\\\";\\n}\\n.fa-envelope-o:before {\\n  content: \\\"\\\\f003\\\";\\n}\\n.fa-heart:before {\\n  content: \\\"\\\\f004\\\";\\n}\\n.fa-star:before {\\n  content: \\\"\\\\f005\\\";\\n}\\n.fa-star-o:before {\\n  content: \\\"\\\\f006\\\";\\n}\\n.fa-user:before {\\n  content: \\\"\\\\f007\\\";\\n}\\n.fa-film:before {\\n  content: \\\"\\\\f008\\\";\\n}\\n.fa-th-large:before {\\n  content: \\\"\\\\f009\\\";\\n}\\n.fa-th:before {\\n  content: \\\"\\\\f00a\\\";\\n}\\n.fa-th-list:before {\\n  content: \\\"\\\\f00b\\\";\\n}\\n.fa-check:before {\\n  content: \\\"\\\\f00c\\\";\\n}\\n.fa-remove:before,\\n.fa-close:before,\\n.fa-times:before {\\n  content: \\\"\\\\f00d\\\";\\n}\\n.fa-search-plus:before {\\n  content: \\\"\\\\f00e\\\";\\n}\\n.fa-search-minus:before {\\n  content: \\\"\\\\f010\\\";\\n}\\n.fa-power-off:before {\\n  content: \\\"\\\\f011\\\";\\n}\\n.fa-signal:before {\\n  content: \\\"\\\\f012\\\";\\n}\\n.fa-gear:before,\\n.fa-cog:before {\\n  content: \\\"\\\\f013\\\";\\n}\\n.fa-trash-o:before {\\n  content: \\\"\\\\f014\\\";\\n}\\n.fa-home:before {\\n  content: \\\"\\\\f015\\\";\\n}\\n.fa-file-o:before {\\n  content: \\\"\\\\f016\\\";\\n}\\n.fa-clock-o:before {\\n  content: \\\"\\\\f017\\\";\\n}\\n.fa-road:before {\\n  content: \\\"\\\\f018\\\";\\n}\\n.fa-download:before {\\n  content: \\\"\\\\f019\\\";\\n}\\n.fa-arrow-circle-o-down:before {\\n  content: \\\"\\\\f01a\\\";\\n}\\n.fa-arrow-circle-o-up:before {\\n  content: \\\"\\\\f01b\\\";\\n}\\n.fa-inbox:before {\\n  content: \\\"\\\\f01c\\\";\\n}\\n.fa-play-circle-o:before {\\n  content: \\\"\\\\f01d\\\";\\n}\\n.fa-rotate-right:before,\\n.fa-repeat:before {\\n  content: \\\"\\\\f01e\\\";\\n}\\n.fa-refresh:before {\\n  content: \\\"\\\\f021\\\";\\n}\\n.fa-list-alt:before {\\n  content: \\\"\\\\f022\\\";\\n}\\n.fa-lock:before {\\n  content: \\\"\\\\f023\\\";\\n}\\n.fa-flag:before {\\n  content: \\\"\\\\f024\\\";\\n}\\n.fa-headphones:before {\\n  content: \\\"\\\\f025\\\";\\n}\\n.fa-volume-off:before {\\n  content: \\\"\\\\f026\\\";\\n}\\n.fa-volume-down:before {\\n  content: \\\"\\\\f027\\\";\\n}\\n.fa-volume-up:before {\\n  content: \\\"\\\\f028\\\";\\n}\\n.fa-qrcode:before {\\n  content: \\\"\\\\f029\\\";\\n}\\n.fa-barcode:before {\\n  content: \\\"\\\\f02a\\\";\\n}\\n.fa-tag:before {\\n  content: \\\"\\\\f02b\\\";\\n}\\n.fa-tags:before {\\n  content: \\\"\\\\f02c\\\";\\n}\\n.fa-book:before {\\n  content: \\\"\\\\f02d\\\";\\n}\\n.fa-bookmark:before {\\n  content: \\\"\\\\f02e\\\";\\n}\\n.fa-print:before {\\n  content: \\\"\\\\f02f\\\";\\n}\\n.fa-camera:before {\\n  content: \\\"\\\\f030\\\";\\n}\\n.fa-font:before {\\n  content: \\\"\\\\f031\\\";\\n}\\n.fa-bold:before {\\n  content: \\\"\\\\f032\\\";\\n}\\n.fa-italic:before {\\n  content: \\\"\\\\f033\\\";\\n}\\n.fa-text-height:before {\\n  content: \\\"\\\\f034\\\";\\n}\\n.fa-text-width:before {\\n  content: \\\"\\\\f035\\\";\\n}\\n.fa-align-left:before {\\n  content: \\\"\\\\f036\\\";\\n}\\n.fa-align-center:before {\\n  content: \\\"\\\\f037\\\";\\n}\\n.fa-align-right:before {\\n  content: \\\"\\\\f038\\\";\\n}\\n.fa-align-justify:before {\\n  content: \\\"\\\\f039\\\";\\n}\\n.fa-list:before {\\n  content: \\\"\\\\f03a\\\";\\n}\\n.fa-dedent:before,\\n.fa-outdent:before {\\n  content: \\\"\\\\f03b\\\";\\n}\\n.fa-indent:before {\\n  content: \\\"\\\\f03c\\\";\\n}\\n.fa-video-camera:before {\\n  content: \\\"\\\\f03d\\\";\\n}\\n.fa-photo:before,\\n.fa-image:before,\\n.fa-picture-o:before {\\n  content: \\\"\\\\f03e\\\";\\n}\\n.fa-pencil:before {\\n  content: \\\"\\\\f040\\\";\\n}\\n.fa-map-marker:before {\\n  content: \\\"\\\\f041\\\";\\n}\\n.fa-adjust:before {\\n  content: \\\"\\\\f042\\\";\\n}\\n.fa-tint:before {\\n  content: \\\"\\\\f043\\\";\\n}\\n.fa-edit:before,\\n.fa-pencil-square-o:before {\\n  content: \\\"\\\\f044\\\";\\n}\\n.fa-share-square-o:before {\\n  content: \\\"\\\\f045\\\";\\n}\\n.fa-check-square-o:before {\\n  content: \\\"\\\\f046\\\";\\n}\\n.fa-arrows:before {\\n  content: \\\"\\\\f047\\\";\\n}\\n.fa-step-backward:before {\\n  content: \\\"\\\\f048\\\";\\n}\\n.fa-fast-backward:before {\\n  content: \\\"\\\\f049\\\";\\n}\\n.fa-backward:before {\\n  content: \\\"\\\\f04a\\\";\\n}\\n.fa-play:before {\\n  content: \\\"\\\\f04b\\\";\\n}\\n.fa-pause:before {\\n  content: \\\"\\\\f04c\\\";\\n}\\n.fa-stop:before {\\n  content: \\\"\\\\f04d\\\";\\n}\\n.fa-forward:before {\\n  content: \\\"\\\\f04e\\\";\\n}\\n.fa-fast-forward:before {\\n  content: \\\"\\\\f050\\\";\\n}\\n.fa-step-forward:before {\\n  content: \\\"\\\\f051\\\";\\n}\\n.fa-eject:before {\\n  content: \\\"\\\\f052\\\";\\n}\\n.fa-chevron-left:before {\\n  content: \\\"\\\\f053\\\";\\n}\\n.fa-chevron-right:before {\\n  content: \\\"\\\\f054\\\";\\n}\\n.fa-plus-circle:before {\\n  content: \\\"\\\\f055\\\";\\n}\\n.fa-minus-circle:before {\\n  content: \\\"\\\\f056\\\";\\n}\\n.fa-times-circle:before {\\n  content: \\\"\\\\f057\\\";\\n}\\n.fa-check-circle:before {\\n  content: \\\"\\\\f058\\\";\\n}\\n.fa-question-circle:before {\\n  content: \\\"\\\\f059\\\";\\n}\\n.fa-info-circle:before {\\n  content: \\\"\\\\f05a\\\";\\n}\\n.fa-crosshairs:before {\\n  content: \\\"\\\\f05b\\\";\\n}\\n.fa-times-circle-o:before {\\n  content: \\\"\\\\f05c\\\";\\n}\\n.fa-check-circle-o:before {\\n  content: \\\"\\\\f05d\\\";\\n}\\n.fa-ban:before {\\n  content: \\\"\\\\f05e\\\";\\n}\\n.fa-arrow-left:before {\\n  content: \\\"\\\\f060\\\";\\n}\\n.fa-arrow-right:before {\\n  content: \\\"\\\\f061\\\";\\n}\\n.fa-arrow-up:before {\\n  content: \\\"\\\\f062\\\";\\n}\\n.fa-arrow-down:before {\\n  content: \\\"\\\\f063\\\";\\n}\\n.fa-mail-forward:before,\\n.fa-share:before {\\n  content: \\\"\\\\f064\\\";\\n}\\n.fa-expand:before {\\n  content: \\\"\\\\f065\\\";\\n}\\n.fa-compress:before {\\n  content: \\\"\\\\f066\\\";\\n}\\n.fa-plus:before {\\n  content: \\\"\\\\f067\\\";\\n}\\n.fa-minus:before {\\n  content: \\\"\\\\f068\\\";\\n}\\n.fa-asterisk:before {\\n  content: \\\"\\\\f069\\\";\\n}\\n.fa-exclamation-circle:before {\\n  content: \\\"\\\\f06a\\\";\\n}\\n.fa-gift:before {\\n  content: \\\"\\\\f06b\\\";\\n}\\n.fa-leaf:before {\\n  content: \\\"\\\\f06c\\\";\\n}\\n.fa-fire:before {\\n  content: \\\"\\\\f06d\\\";\\n}\\n.fa-eye:before {\\n  content: \\\"\\\\f06e\\\";\\n}\\n.fa-eye-slash:before {\\n  content: \\\"\\\\f070\\\";\\n}\\n.fa-warning:before,\\n.fa-exclamation-triangle:before {\\n  content: \\\"\\\\f071\\\";\\n}\\n.fa-plane:before {\\n  content: \\\"\\\\f072\\\";\\n}\\n.fa-calendar:before {\\n  content: \\\"\\\\f073\\\";\\n}\\n.fa-random:before {\\n  content: \\\"\\\\f074\\\";\\n}\\n.fa-comment:before {\\n  content: \\\"\\\\f075\\\";\\n}\\n.fa-magnet:before {\\n  content: \\\"\\\\f076\\\";\\n}\\n.fa-chevron-up:before {\\n  content: \\\"\\\\f077\\\";\\n}\\n.fa-chevron-down:before {\\n  content: \\\"\\\\f078\\\";\\n}\\n.fa-retweet:before {\\n  content: \\\"\\\\f079\\\";\\n}\\n.fa-shopping-cart:before {\\n  content: \\\"\\\\f07a\\\";\\n}\\n.fa-folder:before {\\n  content: \\\"\\\\f07b\\\";\\n}\\n.fa-folder-open:before {\\n  content: \\\"\\\\f07c\\\";\\n}\\n.fa-arrows-v:before {\\n  content: \\\"\\\\f07d\\\";\\n}\\n.fa-arrows-h:before {\\n  content: \\\"\\\\f07e\\\";\\n}\\n.fa-bar-chart-o:before,\\n.fa-bar-chart:before {\\n  content: \\\"\\\\f080\\\";\\n}\\n.fa-twitter-square:before {\\n  content: \\\"\\\\f081\\\";\\n}\\n.fa-facebook-square:before {\\n  content: \\\"\\\\f082\\\";\\n}\\n.fa-camera-retro:before {\\n  content: \\\"\\\\f083\\\";\\n}\\n.fa-key:before {\\n  content: \\\"\\\\f084\\\";\\n}\\n.fa-gears:before,\\n.fa-cogs:before {\\n  content: \\\"\\\\f085\\\";\\n}\\n.fa-comments:before {\\n  content: \\\"\\\\f086\\\";\\n}\\n.fa-thumbs-o-up:before {\\n  content: \\\"\\\\f087\\\";\\n}\\n.fa-thumbs-o-down:before {\\n  content: \\\"\\\\f088\\\";\\n}\\n.fa-star-half:before {\\n  content: \\\"\\\\f089\\\";\\n}\\n.fa-heart-o:before {\\n  content: \\\"\\\\f08a\\\";\\n}\\n.fa-sign-out:before {\\n  content: \\\"\\\\f08b\\\";\\n}\\n.fa-linkedin-square:before {\\n  content: \\\"\\\\f08c\\\";\\n}\\n.fa-thumb-tack:before {\\n  content: \\\"\\\\f08d\\\";\\n}\\n.fa-external-link:before {\\n  content: \\\"\\\\f08e\\\";\\n}\\n.fa-sign-in:before {\\n  content: \\\"\\\\f090\\\";\\n}\\n.fa-trophy:before {\\n  content: \\\"\\\\f091\\\";\\n}\\n.fa-github-square:before {\\n  content: \\\"\\\\f092\\\";\\n}\\n.fa-upload:before {\\n  content: \\\"\\\\f093\\\";\\n}\\n.fa-lemon-o:before {\\n  content: \\\"\\\\f094\\\";\\n}\\n.fa-phone:before {\\n  content: \\\"\\\\f095\\\";\\n}\\n.fa-square-o:before {\\n  content: \\\"\\\\f096\\\";\\n}\\n.fa-bookmark-o:before {\\n  content: \\\"\\\\f097\\\";\\n}\\n.fa-phone-square:before {\\n  content: \\\"\\\\f098\\\";\\n}\\n.fa-twitter:before {\\n  content: \\\"\\\\f099\\\";\\n}\\n.fa-facebook-f:before,\\n.fa-facebook:before {\\n  content: \\\"\\\\f09a\\\";\\n}\\n.fa-github:before {\\n  content: \\\"\\\\f09b\\\";\\n}\\n.fa-unlock:before {\\n  content: \\\"\\\\f09c\\\";\\n}\\n.fa-credit-card:before {\\n  content: \\\"\\\\f09d\\\";\\n}\\n.fa-feed:before,\\n.fa-rss:before {\\n  content: \\\"\\\\f09e\\\";\\n}\\n.fa-hdd-o:before {\\n  content: \\\"\\\\f0a0\\\";\\n}\\n.fa-bullhorn:before {\\n  content: \\\"\\\\f0a1\\\";\\n}\\n.fa-bell:before {\\n  content: \\\"\\\\f0f3\\\";\\n}\\n.fa-certificate:before {\\n  content: \\\"\\\\f0a3\\\";\\n}\\n.fa-hand-o-right:before {\\n  content: \\\"\\\\f0a4\\\";\\n}\\n.fa-hand-o-left:before {\\n  content: \\\"\\\\f0a5\\\";\\n}\\n.fa-hand-o-up:before {\\n  content: \\\"\\\\f0a6\\\";\\n}\\n.fa-hand-o-down:before {\\n  content: \\\"\\\\f0a7\\\";\\n}\\n.fa-arrow-circle-left:before {\\n  content: \\\"\\\\f0a8\\\";\\n}\\n.fa-arrow-circle-right:before {\\n  content: \\\"\\\\f0a9\\\";\\n}\\n.fa-arrow-circle-up:before {\\n  content: \\\"\\\\f0aa\\\";\\n}\\n.fa-arrow-circle-down:before {\\n  content: \\\"\\\\f0ab\\\";\\n}\\n.fa-globe:before {\\n  content: \\\"\\\\f0ac\\\";\\n}\\n.fa-wrench:before {\\n  content: \\\"\\\\f0ad\\\";\\n}\\n.fa-tasks:before {\\n  content: \\\"\\\\f0ae\\\";\\n}\\n.fa-filter:before {\\n  content: \\\"\\\\f0b0\\\";\\n}\\n.fa-briefcase:before {\\n  content: \\\"\\\\f0b1\\\";\\n}\\n.fa-arrows-alt:before {\\n  content: \\\"\\\\f0b2\\\";\\n}\\n.fa-group:before,\\n.fa-users:before {\\n  content: \\\"\\\\f0c0\\\";\\n}\\n.fa-chain:before,\\n.fa-link:before {\\n  content: \\\"\\\\f0c1\\\";\\n}\\n.fa-cloud:before {\\n  content: \\\"\\\\f0c2\\\";\\n}\\n.fa-flask:before {\\n  content: \\\"\\\\f0c3\\\";\\n}\\n.fa-cut:before,\\n.fa-scissors:before {\\n  content: \\\"\\\\f0c4\\\";\\n}\\n.fa-copy:before,\\n.fa-files-o:before {\\n  content: \\\"\\\\f0c5\\\";\\n}\\n.fa-paperclip:before {\\n  content: \\\"\\\\f0c6\\\";\\n}\\n.fa-save:before,\\n.fa-floppy-o:before {\\n  content: \\\"\\\\f0c7\\\";\\n}\\n.fa-square:before {\\n  content: \\\"\\\\f0c8\\\";\\n}\\n.fa-navicon:before,\\n.fa-reorder:before,\\n.fa-bars:before {\\n  content: \\\"\\\\f0c9\\\";\\n}\\n.fa-list-ul:before {\\n  content: \\\"\\\\f0ca\\\";\\n}\\n.fa-list-ol:before {\\n  content: \\\"\\\\f0cb\\\";\\n}\\n.fa-strikethrough:before {\\n  content: \\\"\\\\f0cc\\\";\\n}\\n.fa-underline:before {\\n  content: \\\"\\\\f0cd\\\";\\n}\\n.fa-table:before {\\n  content: \\\"\\\\f0ce\\\";\\n}\\n.fa-magic:before {\\n  content: \\\"\\\\f0d0\\\";\\n}\\n.fa-truck:before {\\n  content: \\\"\\\\f0d1\\\";\\n}\\n.fa-pinterest:before {\\n  content: \\\"\\\\f0d2\\\";\\n}\\n.fa-pinterest-square:before {\\n  content: \\\"\\\\f0d3\\\";\\n}\\n.fa-google-plus-square:before {\\n  content: \\\"\\\\f0d4\\\";\\n}\\n.fa-google-plus:before {\\n  content: \\\"\\\\f0d5\\\";\\n}\\n.fa-money:before {\\n  content: \\\"\\\\f0d6\\\";\\n}\\n.fa-caret-down:before {\\n  content: \\\"\\\\f0d7\\\";\\n}\\n.fa-caret-up:before {\\n  content: \\\"\\\\f0d8\\\";\\n}\\n.fa-caret-left:before {\\n  content: \\\"\\\\f0d9\\\";\\n}\\n.fa-caret-right:before {\\n  content: \\\"\\\\f0da\\\";\\n}\\n.fa-columns:before {\\n  content: \\\"\\\\f0db\\\";\\n}\\n.fa-unsorted:before,\\n.fa-sort:before {\\n  content: \\\"\\\\f0dc\\\";\\n}\\n.fa-sort-down:before,\\n.fa-sort-desc:before {\\n  content: \\\"\\\\f0dd\\\";\\n}\\n.fa-sort-up:before,\\n.fa-sort-asc:before {\\n  content: \\\"\\\\f0de\\\";\\n}\\n.fa-envelope:before {\\n  content: \\\"\\\\f0e0\\\";\\n}\\n.fa-linkedin:before {\\n  content: \\\"\\\\f0e1\\\";\\n}\\n.fa-rotate-left:before,\\n.fa-undo:before {\\n  content: \\\"\\\\f0e2\\\";\\n}\\n.fa-legal:before,\\n.fa-gavel:before {\\n  content: \\\"\\\\f0e3\\\";\\n}\\n.fa-dashboard:before,\\n.fa-tachometer:before {\\n  content: \\\"\\\\f0e4\\\";\\n}\\n.fa-comment-o:before {\\n  content: \\\"\\\\f0e5\\\";\\n}\\n.fa-comments-o:before {\\n  content: \\\"\\\\f0e6\\\";\\n}\\n.fa-flash:before,\\n.fa-bolt:before {\\n  content: \\\"\\\\f0e7\\\";\\n}\\n.fa-sitemap:before {\\n  content: \\\"\\\\f0e8\\\";\\n}\\n.fa-umbrella:before {\\n  content: \\\"\\\\f0e9\\\";\\n}\\n.fa-paste:before,\\n.fa-clipboard:before {\\n  content: \\\"\\\\f0ea\\\";\\n}\\n.fa-lightbulb-o:before {\\n  content: \\\"\\\\f0eb\\\";\\n}\\n.fa-exchange:before {\\n  content: \\\"\\\\f0ec\\\";\\n}\\n.fa-cloud-download:before {\\n  content: \\\"\\\\f0ed\\\";\\n}\\n.fa-cloud-upload:before {\\n  content: \\\"\\\\f0ee\\\";\\n}\\n.fa-user-md:before {\\n  content: \\\"\\\\f0f0\\\";\\n}\\n.fa-stethoscope:before {\\n  content: \\\"\\\\f0f1\\\";\\n}\\n.fa-suitcase:before {\\n  content: \\\"\\\\f0f2\\\";\\n}\\n.fa-bell-o:before {\\n  content: \\\"\\\\f0a2\\\";\\n}\\n.fa-coffee:before {\\n  content: \\\"\\\\f0f4\\\";\\n}\\n.fa-cutlery:before {\\n  content: \\\"\\\\f0f5\\\";\\n}\\n.fa-file-text-o:before {\\n  content: \\\"\\\\f0f6\\\";\\n}\\n.fa-building-o:before {\\n  content: \\\"\\\\f0f7\\\";\\n}\\n.fa-hospital-o:before {\\n  content: \\\"\\\\f0f8\\\";\\n}\\n.fa-ambulance:before {\\n  content: \\\"\\\\f0f9\\\";\\n}\\n.fa-medkit:before {\\n  content: \\\"\\\\f0fa\\\";\\n}\\n.fa-fighter-jet:before {\\n  content: \\\"\\\\f0fb\\\";\\n}\\n.fa-beer:before {\\n  content: \\\"\\\\f0fc\\\";\\n}\\n.fa-h-square:before {\\n  content: \\\"\\\\f0fd\\\";\\n}\\n.fa-plus-square:before {\\n  content: \\\"\\\\f0fe\\\";\\n}\\n.fa-angle-double-left:before {\\n  content: \\\"\\\\f100\\\";\\n}\\n.fa-angle-double-right:before {\\n  content: \\\"\\\\f101\\\";\\n}\\n.fa-angle-double-up:before {\\n  content: \\\"\\\\f102\\\";\\n}\\n.fa-angle-double-down:before {\\n  content: \\\"\\\\f103\\\";\\n}\\n.fa-angle-left:before {\\n  content: \\\"\\\\f104\\\";\\n}\\n.fa-angle-right:before {\\n  content: \\\"\\\\f105\\\";\\n}\\n.fa-angle-up:before {\\n  content: \\\"\\\\f106\\\";\\n}\\n.fa-angle-down:before {\\n  content: \\\"\\\\f107\\\";\\n}\\n.fa-desktop:before {\\n  content: \\\"\\\\f108\\\";\\n}\\n.fa-laptop:before {\\n  content: \\\"\\\\f109\\\";\\n}\\n.fa-tablet:before {\\n  content: \\\"\\\\f10a\\\";\\n}\\n.fa-mobile-phone:before,\\n.fa-mobile:before {\\n  content: \\\"\\\\f10b\\\";\\n}\\n.fa-circle-o:before {\\n  content: \\\"\\\\f10c\\\";\\n}\\n.fa-quote-left:before {\\n  content: \\\"\\\\f10d\\\";\\n}\\n.fa-quote-right:before {\\n  content: \\\"\\\\f10e\\\";\\n}\\n.fa-spinner:before {\\n  content: \\\"\\\\f110\\\";\\n}\\n.fa-circle:before {\\n  content: \\\"\\\\f111\\\";\\n}\\n.fa-mail-reply:before,\\n.fa-reply:before {\\n  content: \\\"\\\\f112\\\";\\n}\\n.fa-github-alt:before {\\n  content: \\\"\\\\f113\\\";\\n}\\n.fa-folder-o:before {\\n  content: \\\"\\\\f114\\\";\\n}\\n.fa-folder-open-o:before {\\n  content: \\\"\\\\f115\\\";\\n}\\n.fa-smile-o:before {\\n  content: \\\"\\\\f118\\\";\\n}\\n.fa-frown-o:before {\\n  content: \\\"\\\\f119\\\";\\n}\\n.fa-meh-o:before {\\n  content: \\\"\\\\f11a\\\";\\n}\\n.fa-gamepad:before {\\n  content: \\\"\\\\f11b\\\";\\n}\\n.fa-keyboard-o:before {\\n  content: \\\"\\\\f11c\\\";\\n}\\n.fa-flag-o:before {\\n  content: \\\"\\\\f11d\\\";\\n}\\n.fa-flag-checkered:before {\\n  content: \\\"\\\\f11e\\\";\\n}\\n.fa-terminal:before {\\n  content: \\\"\\\\f120\\\";\\n}\\n.fa-code:before {\\n  content: \\\"\\\\f121\\\";\\n}\\n.fa-mail-reply-all:before,\\n.fa-reply-all:before {\\n  content: \\\"\\\\f122\\\";\\n}\\n.fa-star-half-empty:before,\\n.fa-star-half-full:before,\\n.fa-star-half-o:before {\\n  content: \\\"\\\\f123\\\";\\n}\\n.fa-location-arrow:before {\\n  content: \\\"\\\\f124\\\";\\n}\\n.fa-crop:before {\\n  content: \\\"\\\\f125\\\";\\n}\\n.fa-code-fork:before {\\n  content: \\\"\\\\f126\\\";\\n}\\n.fa-unlink:before,\\n.fa-chain-broken:before {\\n  content: \\\"\\\\f127\\\";\\n}\\n.fa-question:before {\\n  content: \\\"\\\\f128\\\";\\n}\\n.fa-info:before {\\n  content: \\\"\\\\f129\\\";\\n}\\n.fa-exclamation:before {\\n  content: \\\"\\\\f12a\\\";\\n}\\n.fa-superscript:before {\\n  content: \\\"\\\\f12b\\\";\\n}\\n.fa-subscript:before {\\n  content: \\\"\\\\f12c\\\";\\n}\\n.fa-eraser:before {\\n  content: \\\"\\\\f12d\\\";\\n}\\n.fa-puzzle-piece:before {\\n  content: \\\"\\\\f12e\\\";\\n}\\n.fa-microphone:before {\\n  content: \\\"\\\\f130\\\";\\n}\\n.fa-microphone-slash:before {\\n  content: \\\"\\\\f131\\\";\\n}\\n.fa-shield:before {\\n  content: \\\"\\\\f132\\\";\\n}\\n.fa-calendar-o:before {\\n  content: \\\"\\\\f133\\\";\\n}\\n.fa-fire-extinguisher:before {\\n  content: \\\"\\\\f134\\\";\\n}\\n.fa-rocket:before {\\n  content: \\\"\\\\f135\\\";\\n}\\n.fa-maxcdn:before {\\n  content: \\\"\\\\f136\\\";\\n}\\n.fa-chevron-circle-left:before {\\n  content: \\\"\\\\f137\\\";\\n}\\n.fa-chevron-circle-right:before {\\n  content: \\\"\\\\f138\\\";\\n}\\n.fa-chevron-circle-up:before {\\n  content: \\\"\\\\f139\\\";\\n}\\n.fa-chevron-circle-down:before {\\n  content: \\\"\\\\f13a\\\";\\n}\\n.fa-html5:before {\\n  content: \\\"\\\\f13b\\\";\\n}\\n.fa-css3:before {\\n  content: \\\"\\\\f13c\\\";\\n}\\n.fa-anchor:before {\\n  content: \\\"\\\\f13d\\\";\\n}\\n.fa-unlock-alt:before {\\n  content: \\\"\\\\f13e\\\";\\n}\\n.fa-bullseye:before {\\n  content: \\\"\\\\f140\\\";\\n}\\n.fa-ellipsis-h:before {\\n  content: \\\"\\\\f141\\\";\\n}\\n.fa-ellipsis-v:before {\\n  content: \\\"\\\\f142\\\";\\n}\\n.fa-rss-square:before {\\n  content: \\\"\\\\f143\\\";\\n}\\n.fa-play-circle:before {\\n  content: \\\"\\\\f144\\\";\\n}\\n.fa-ticket:before {\\n  content: \\\"\\\\f145\\\";\\n}\\n.fa-minus-square:before {\\n  content: \\\"\\\\f146\\\";\\n}\\n.fa-minus-square-o:before {\\n  content: \\\"\\\\f147\\\";\\n}\\n.fa-level-up:before {\\n  content: \\\"\\\\f148\\\";\\n}\\n.fa-level-down:before {\\n  content: \\\"\\\\f149\\\";\\n}\\n.fa-check-square:before {\\n  content: \\\"\\\\f14a\\\";\\n}\\n.fa-pencil-square:before {\\n  content: \\\"\\\\f14b\\\";\\n}\\n.fa-external-link-square:before {\\n  content: \\\"\\\\f14c\\\";\\n}\\n.fa-share-square:before {\\n  content: \\\"\\\\f14d\\\";\\n}\\n.fa-compass:before {\\n  content: \\\"\\\\f14e\\\";\\n}\\n.fa-toggle-down:before,\\n.fa-caret-square-o-down:before {\\n  content: \\\"\\\\f150\\\";\\n}\\n.fa-toggle-up:before,\\n.fa-caret-square-o-up:before {\\n  content: \\\"\\\\f151\\\";\\n}\\n.fa-toggle-right:before,\\n.fa-caret-square-o-right:before {\\n  content: \\\"\\\\f152\\\";\\n}\\n.fa-euro:before,\\n.fa-eur:before {\\n  content: \\\"\\\\f153\\\";\\n}\\n.fa-gbp:before {\\n  content: \\\"\\\\f154\\\";\\n}\\n.fa-dollar:before,\\n.fa-usd:before {\\n  content: \\\"\\\\f155\\\";\\n}\\n.fa-rupee:before,\\n.fa-inr:before {\\n  content: \\\"\\\\f156\\\";\\n}\\n.fa-cny:before,\\n.fa-rmb:before,\\n.fa-yen:before,\\n.fa-jpy:before {\\n  content: \\\"\\\\f157\\\";\\n}\\n.fa-ruble:before,\\n.fa-rouble:before,\\n.fa-rub:before {\\n  content: \\\"\\\\f158\\\";\\n}\\n.fa-won:before,\\n.fa-krw:before {\\n  content: \\\"\\\\f159\\\";\\n}\\n.fa-bitcoin:before,\\n.fa-btc:before {\\n  content: \\\"\\\\f15a\\\";\\n}\\n.fa-file:before {\\n  content: \\\"\\\\f15b\\\";\\n}\\n.fa-file-text:before {\\n  content: \\\"\\\\f15c\\\";\\n}\\n.fa-sort-alpha-asc:before {\\n  content: \\\"\\\\f15d\\\";\\n}\\n.fa-sort-alpha-desc:before {\\n  content: \\\"\\\\f15e\\\";\\n}\\n.fa-sort-amount-asc:before {\\n  content: \\\"\\\\f160\\\";\\n}\\n.fa-sort-amount-desc:before {\\n  content: \\\"\\\\f161\\\";\\n}\\n.fa-sort-numeric-asc:before {\\n  content: \\\"\\\\f162\\\";\\n}\\n.fa-sort-numeric-desc:before {\\n  content: \\\"\\\\f163\\\";\\n}\\n.fa-thumbs-up:before {\\n  content: \\\"\\\\f164\\\";\\n}\\n.fa-thumbs-down:before {\\n  content: \\\"\\\\f165\\\";\\n}\\n.fa-youtube-square:before {\\n  content: \\\"\\\\f166\\\";\\n}\\n.fa-youtube:before {\\n  content: \\\"\\\\f167\\\";\\n}\\n.fa-xing:before {\\n  content: \\\"\\\\f168\\\";\\n}\\n.fa-xing-square:before {\\n  content: \\\"\\\\f169\\\";\\n}\\n.fa-youtube-play:before {\\n  content: \\\"\\\\f16a\\\";\\n}\\n.fa-dropbox:before {\\n  content: \\\"\\\\f16b\\\";\\n}\\n.fa-stack-overflow:before {\\n  content: \\\"\\\\f16c\\\";\\n}\\n.fa-instagram:before {\\n  content: \\\"\\\\f16d\\\";\\n}\\n.fa-flickr:before {\\n  content: \\\"\\\\f16e\\\";\\n}\\n.fa-adn:before {\\n  content: \\\"\\\\f170\\\";\\n}\\n.fa-bitbucket:before {\\n  content: \\\"\\\\f171\\\";\\n}\\n.fa-bitbucket-square:before {\\n  content: \\\"\\\\f172\\\";\\n}\\n.fa-tumblr:before {\\n  content: \\\"\\\\f173\\\";\\n}\\n.fa-tumblr-square:before {\\n  content: \\\"\\\\f174\\\";\\n}\\n.fa-long-arrow-down:before {\\n  content: \\\"\\\\f175\\\";\\n}\\n.fa-long-arrow-up:before {\\n  content: \\\"\\\\f176\\\";\\n}\\n.fa-long-arrow-left:before {\\n  content: \\\"\\\\f177\\\";\\n}\\n.fa-long-arrow-right:before {\\n  content: \\\"\\\\f178\\\";\\n}\\n.fa-apple:before {\\n  content: \\\"\\\\f179\\\";\\n}\\n.fa-windows:before {\\n  content: \\\"\\\\f17a\\\";\\n}\\n.fa-android:before {\\n  content: \\\"\\\\f17b\\\";\\n}\\n.fa-linux:before {\\n  content: \\\"\\\\f17c\\\";\\n}\\n.fa-dribbble:before {\\n  content: \\\"\\\\f17d\\\";\\n}\\n.fa-skype:before {\\n  content: \\\"\\\\f17e\\\";\\n}\\n.fa-foursquare:before {\\n  content: \\\"\\\\f180\\\";\\n}\\n.fa-trello:before {\\n  content: \\\"\\\\f181\\\";\\n}\\n.fa-female:before {\\n  content: \\\"\\\\f182\\\";\\n}\\n.fa-male:before {\\n  content: \\\"\\\\f183\\\";\\n}\\n.fa-gittip:before,\\n.fa-gratipay:before {\\n  content: \\\"\\\\f184\\\";\\n}\\n.fa-sun-o:before {\\n  content: \\\"\\\\f185\\\";\\n}\\n.fa-moon-o:before {\\n  content: \\\"\\\\f186\\\";\\n}\\n.fa-archive:before {\\n  content: \\\"\\\\f187\\\";\\n}\\n.fa-bug:before {\\n  content: \\\"\\\\f188\\\";\\n}\\n.fa-vk:before {\\n  content: \\\"\\\\f189\\\";\\n}\\n.fa-weibo:before {\\n  content: \\\"\\\\f18a\\\";\\n}\\n.fa-renren:before {\\n  content: \\\"\\\\f18b\\\";\\n}\\n.fa-pagelines:before {\\n  content: \\\"\\\\f18c\\\";\\n}\\n.fa-stack-exchange:before {\\n  content: \\\"\\\\f18d\\\";\\n}\\n.fa-arrow-circle-o-right:before {\\n  content: \\\"\\\\f18e\\\";\\n}\\n.fa-arrow-circle-o-left:before {\\n  content: \\\"\\\\f190\\\";\\n}\\n.fa-toggle-left:before,\\n.fa-caret-square-o-left:before {\\n  content: \\\"\\\\f191\\\";\\n}\\n.fa-dot-circle-o:before {\\n  content: \\\"\\\\f192\\\";\\n}\\n.fa-wheelchair:before {\\n  content: \\\"\\\\f193\\\";\\n}\\n.fa-vimeo-square:before {\\n  content: \\\"\\\\f194\\\";\\n}\\n.fa-turkish-lira:before,\\n.fa-try:before {\\n  content: \\\"\\\\f195\\\";\\n}\\n.fa-plus-square-o:before {\\n  content: \\\"\\\\f196\\\";\\n}\\n.fa-space-shuttle:before {\\n  content: \\\"\\\\f197\\\";\\n}\\n.fa-slack:before {\\n  content: \\\"\\\\f198\\\";\\n}\\n.fa-envelope-square:before {\\n  content: \\\"\\\\f199\\\";\\n}\\n.fa-wordpress:before {\\n  content: \\\"\\\\f19a\\\";\\n}\\n.fa-openid:before {\\n  content: \\\"\\\\f19b\\\";\\n}\\n.fa-institution:before,\\n.fa-bank:before,\\n.fa-university:before {\\n  content: \\\"\\\\f19c\\\";\\n}\\n.fa-mortar-board:before,\\n.fa-graduation-cap:before {\\n  content: \\\"\\\\f19d\\\";\\n}\\n.fa-yahoo:before {\\n  content: \\\"\\\\f19e\\\";\\n}\\n.fa-google:before {\\n  content: \\\"\\\\f1a0\\\";\\n}\\n.fa-reddit:before {\\n  content: \\\"\\\\f1a1\\\";\\n}\\n.fa-reddit-square:before {\\n  content: \\\"\\\\f1a2\\\";\\n}\\n.fa-stumbleupon-circle:before {\\n  content: \\\"\\\\f1a3\\\";\\n}\\n.fa-stumbleupon:before {\\n  content: \\\"\\\\f1a4\\\";\\n}\\n.fa-delicious:before {\\n  content: \\\"\\\\f1a5\\\";\\n}\\n.fa-digg:before {\\n  content: \\\"\\\\f1a6\\\";\\n}\\n.fa-pied-piper-pp:before {\\n  content: \\\"\\\\f1a7\\\";\\n}\\n.fa-pied-piper-alt:before {\\n  content: \\\"\\\\f1a8\\\";\\n}\\n.fa-drupal:before {\\n  content: \\\"\\\\f1a9\\\";\\n}\\n.fa-joomla:before {\\n  content: \\\"\\\\f1aa\\\";\\n}\\n.fa-language:before {\\n  content: \\\"\\\\f1ab\\\";\\n}\\n.fa-fax:before {\\n  content: \\\"\\\\f1ac\\\";\\n}\\n.fa-building:before {\\n  content: \\\"\\\\f1ad\\\";\\n}\\n.fa-child:before {\\n  content: \\\"\\\\f1ae\\\";\\n}\\n.fa-paw:before {\\n  content: \\\"\\\\f1b0\\\";\\n}\\n.fa-spoon:before {\\n  content: \\\"\\\\f1b1\\\";\\n}\\n.fa-cube:before {\\n  content: \\\"\\\\f1b2\\\";\\n}\\n.fa-cubes:before {\\n  content: \\\"\\\\f1b3\\\";\\n}\\n.fa-behance:before {\\n  content: \\\"\\\\f1b4\\\";\\n}\\n.fa-behance-square:before {\\n  content: \\\"\\\\f1b5\\\";\\n}\\n.fa-steam:before {\\n  content: \\\"\\\\f1b6\\\";\\n}\\n.fa-steam-square:before {\\n  content: \\\"\\\\f1b7\\\";\\n}\\n.fa-recycle:before {\\n  content: \\\"\\\\f1b8\\\";\\n}\\n.fa-automobile:before,\\n.fa-car:before {\\n  content: \\\"\\\\f1b9\\\";\\n}\\n.fa-cab:before,\\n.fa-taxi:before {\\n  content: \\\"\\\\f1ba\\\";\\n}\\n.fa-tree:before {\\n  content: \\\"\\\\f1bb\\\";\\n}\\n.fa-spotify:before {\\n  content: \\\"\\\\f1bc\\\";\\n}\\n.fa-deviantart:before {\\n  content: \\\"\\\\f1bd\\\";\\n}\\n.fa-soundcloud:before {\\n  content: \\\"\\\\f1be\\\";\\n}\\n.fa-database:before {\\n  content: \\\"\\\\f1c0\\\";\\n}\\n.fa-file-pdf-o:before {\\n  content: \\\"\\\\f1c1\\\";\\n}\\n.fa-file-word-o:before {\\n  content: \\\"\\\\f1c2\\\";\\n}\\n.fa-file-excel-o:before {\\n  content: \\\"\\\\f1c3\\\";\\n}\\n.fa-file-powerpoint-o:before {\\n  content: \\\"\\\\f1c4\\\";\\n}\\n.fa-file-photo-o:before,\\n.fa-file-picture-o:before,\\n.fa-file-image-o:before {\\n  content: \\\"\\\\f1c5\\\";\\n}\\n.fa-file-zip-o:before,\\n.fa-file-archive-o:before {\\n  content: \\\"\\\\f1c6\\\";\\n}\\n.fa-file-sound-o:before,\\n.fa-file-audio-o:before {\\n  content: \\\"\\\\f1c7\\\";\\n}\\n.fa-file-movie-o:before,\\n.fa-file-video-o:before {\\n  content: \\\"\\\\f1c8\\\";\\n}\\n.fa-file-code-o:before {\\n  content: \\\"\\\\f1c9\\\";\\n}\\n.fa-vine:before {\\n  content: \\\"\\\\f1ca\\\";\\n}\\n.fa-codepen:before {\\n  content: \\\"\\\\f1cb\\\";\\n}\\n.fa-jsfiddle:before {\\n  content: \\\"\\\\f1cc\\\";\\n}\\n.fa-life-bouy:before,\\n.fa-life-buoy:before,\\n.fa-life-saver:before,\\n.fa-support:before,\\n.fa-life-ring:before {\\n  content: \\\"\\\\f1cd\\\";\\n}\\n.fa-circle-o-notch:before {\\n  content: \\\"\\\\f1ce\\\";\\n}\\n.fa-ra:before,\\n.fa-resistance:before,\\n.fa-rebel:before {\\n  content: \\\"\\\\f1d0\\\";\\n}\\n.fa-ge:before,\\n.fa-empire:before {\\n  content: \\\"\\\\f1d1\\\";\\n}\\n.fa-git-square:before {\\n  content: \\\"\\\\f1d2\\\";\\n}\\n.fa-git:before {\\n  content: \\\"\\\\f1d3\\\";\\n}\\n.fa-y-combinator-square:before,\\n.fa-yc-square:before,\\n.fa-hacker-news:before {\\n  content: \\\"\\\\f1d4\\\";\\n}\\n.fa-tencent-weibo:before {\\n  content: \\\"\\\\f1d5\\\";\\n}\\n.fa-qq:before {\\n  content: \\\"\\\\f1d6\\\";\\n}\\n.fa-wechat:before,\\n.fa-weixin:before {\\n  content: \\\"\\\\f1d7\\\";\\n}\\n.fa-send:before,\\n.fa-paper-plane:before {\\n  content: \\\"\\\\f1d8\\\";\\n}\\n.fa-send-o:before,\\n.fa-paper-plane-o:before {\\n  content: \\\"\\\\f1d9\\\";\\n}\\n.fa-history:before {\\n  content: \\\"\\\\f1da\\\";\\n}\\n.fa-circle-thin:before {\\n  content: \\\"\\\\f1db\\\";\\n}\\n.fa-header:before {\\n  content: \\\"\\\\f1dc\\\";\\n}\\n.fa-paragraph:before {\\n  content: \\\"\\\\f1dd\\\";\\n}\\n.fa-sliders:before {\\n  content: \\\"\\\\f1de\\\";\\n}\\n.fa-share-alt:before {\\n  content: \\\"\\\\f1e0\\\";\\n}\\n.fa-share-alt-square:before {\\n  content: \\\"\\\\f1e1\\\";\\n}\\n.fa-bomb:before {\\n  content: \\\"\\\\f1e2\\\";\\n}\\n.fa-soccer-ball-o:before,\\n.fa-futbol-o:before {\\n  content: \\\"\\\\f1e3\\\";\\n}\\n.fa-tty:before {\\n  content: \\\"\\\\f1e4\\\";\\n}\\n.fa-binoculars:before {\\n  content: \\\"\\\\f1e5\\\";\\n}\\n.fa-plug:before {\\n  content: \\\"\\\\f1e6\\\";\\n}\\n.fa-slideshare:before {\\n  content: \\\"\\\\f1e7\\\";\\n}\\n.fa-twitch:before {\\n  content: \\\"\\\\f1e8\\\";\\n}\\n.fa-yelp:before {\\n  content: \\\"\\\\f1e9\\\";\\n}\\n.fa-newspaper-o:before {\\n  content: \\\"\\\\f1ea\\\";\\n}\\n.fa-wifi:before {\\n  content: \\\"\\\\f1eb\\\";\\n}\\n.fa-calculator:before {\\n  content: \\\"\\\\f1ec\\\";\\n}\\n.fa-paypal:before {\\n  content: \\\"\\\\f1ed\\\";\\n}\\n.fa-google-wallet:before {\\n  content: \\\"\\\\f1ee\\\";\\n}\\n.fa-cc-visa:before {\\n  content: \\\"\\\\f1f0\\\";\\n}\\n.fa-cc-mastercard:before {\\n  content: \\\"\\\\f1f1\\\";\\n}\\n.fa-cc-discover:before {\\n  content: \\\"\\\\f1f2\\\";\\n}\\n.fa-cc-amex:before {\\n  content: \\\"\\\\f1f3\\\";\\n}\\n.fa-cc-paypal:before {\\n  content: \\\"\\\\f1f4\\\";\\n}\\n.fa-cc-stripe:before {\\n  content: \\\"\\\\f1f5\\\";\\n}\\n.fa-bell-slash:before {\\n  content: \\\"\\\\f1f6\\\";\\n}\\n.fa-bell-slash-o:before {\\n  content: \\\"\\\\f1f7\\\";\\n}\\n.fa-trash:before {\\n  content: \\\"\\\\f1f8\\\";\\n}\\n.fa-copyright:before {\\n  content: \\\"\\\\f1f9\\\";\\n}\\n.fa-at:before {\\n  content: \\\"\\\\f1fa\\\";\\n}\\n.fa-eyedropper:before {\\n  content: \\\"\\\\f1fb\\\";\\n}\\n.fa-paint-brush:before {\\n  content: \\\"\\\\f1fc\\\";\\n}\\n.fa-birthday-cake:before {\\n  content: \\\"\\\\f1fd\\\";\\n}\\n.fa-area-chart:before {\\n  content: \\\"\\\\f1fe\\\";\\n}\\n.fa-pie-chart:before {\\n  content: \\\"\\\\f200\\\";\\n}\\n.fa-line-chart:before {\\n  content: \\\"\\\\f201\\\";\\n}\\n.fa-lastfm:before {\\n  content: \\\"\\\\f202\\\";\\n}\\n.fa-lastfm-square:before {\\n  content: \\\"\\\\f203\\\";\\n}\\n.fa-toggle-off:before {\\n  content: \\\"\\\\f204\\\";\\n}\\n.fa-toggle-on:before {\\n  content: \\\"\\\\f205\\\";\\n}\\n.fa-bicycle:before {\\n  content: \\\"\\\\f206\\\";\\n}\\n.fa-bus:before {\\n  content: \\\"\\\\f207\\\";\\n}\\n.fa-ioxhost:before {\\n  content: \\\"\\\\f208\\\";\\n}\\n.fa-angellist:before {\\n  content: \\\"\\\\f209\\\";\\n}\\n.fa-cc:before {\\n  content: \\\"\\\\f20a\\\";\\n}\\n.fa-shekel:before,\\n.fa-sheqel:before,\\n.fa-ils:before {\\n  content: \\\"\\\\f20b\\\";\\n}\\n.fa-meanpath:before {\\n  content: \\\"\\\\f20c\\\";\\n}\\n.fa-buysellads:before {\\n  content: \\\"\\\\f20d\\\";\\n}\\n.fa-connectdevelop:before {\\n  content: \\\"\\\\f20e\\\";\\n}\\n.fa-dashcube:before {\\n  content: \\\"\\\\f210\\\";\\n}\\n.fa-forumbee:before {\\n  content: \\\"\\\\f211\\\";\\n}\\n.fa-leanpub:before {\\n  content: \\\"\\\\f212\\\";\\n}\\n.fa-sellsy:before {\\n  content: \\\"\\\\f213\\\";\\n}\\n.fa-shirtsinbulk:before {\\n  content: \\\"\\\\f214\\\";\\n}\\n.fa-simplybuilt:before {\\n  content: \\\"\\\\f215\\\";\\n}\\n.fa-skyatlas:before {\\n  content: \\\"\\\\f216\\\";\\n}\\n.fa-cart-plus:before {\\n  content: \\\"\\\\f217\\\";\\n}\\n.fa-cart-arrow-down:before {\\n  content: \\\"\\\\f218\\\";\\n}\\n.fa-diamond:before {\\n  content: \\\"\\\\f219\\\";\\n}\\n.fa-ship:before {\\n  content: \\\"\\\\f21a\\\";\\n}\\n.fa-user-secret:before {\\n  content: \\\"\\\\f21b\\\";\\n}\\n.fa-motorcycle:before {\\n  content: \\\"\\\\f21c\\\";\\n}\\n.fa-street-view:before {\\n  content: \\\"\\\\f21d\\\";\\n}\\n.fa-heartbeat:before {\\n  content: \\\"\\\\f21e\\\";\\n}\\n.fa-venus:before {\\n  content: \\\"\\\\f221\\\";\\n}\\n.fa-mars:before {\\n  content: \\\"\\\\f222\\\";\\n}\\n.fa-mercury:before {\\n  content: \\\"\\\\f223\\\";\\n}\\n.fa-intersex:before,\\n.fa-transgender:before {\\n  content: \\\"\\\\f224\\\";\\n}\\n.fa-transgender-alt:before {\\n  content: \\\"\\\\f225\\\";\\n}\\n.fa-venus-double:before {\\n  content: \\\"\\\\f226\\\";\\n}\\n.fa-mars-double:before {\\n  content: \\\"\\\\f227\\\";\\n}\\n.fa-venus-mars:before {\\n  content: \\\"\\\\f228\\\";\\n}\\n.fa-mars-stroke:before {\\n  content: \\\"\\\\f229\\\";\\n}\\n.fa-mars-stroke-v:before {\\n  content: \\\"\\\\f22a\\\";\\n}\\n.fa-mars-stroke-h:before {\\n  content: \\\"\\\\f22b\\\";\\n}\\n.fa-neuter:before {\\n  content: \\\"\\\\f22c\\\";\\n}\\n.fa-genderless:before {\\n  content: \\\"\\\\f22d\\\";\\n}\\n.fa-facebook-official:before {\\n  content: \\\"\\\\f230\\\";\\n}\\n.fa-pinterest-p:before {\\n  content: \\\"\\\\f231\\\";\\n}\\n.fa-whatsapp:before {\\n  content: \\\"\\\\f232\\\";\\n}\\n.fa-server:before {\\n  content: \\\"\\\\f233\\\";\\n}\\n.fa-user-plus:before {\\n  content: \\\"\\\\f234\\\";\\n}\\n.fa-user-times:before {\\n  content: \\\"\\\\f235\\\";\\n}\\n.fa-hotel:before,\\n.fa-bed:before {\\n  content: \\\"\\\\f236\\\";\\n}\\n.fa-viacoin:before {\\n  content: \\\"\\\\f237\\\";\\n}\\n.fa-train:before {\\n  content: \\\"\\\\f238\\\";\\n}\\n.fa-subway:before {\\n  content: \\\"\\\\f239\\\";\\n}\\n.fa-medium:before {\\n  content: \\\"\\\\f23a\\\";\\n}\\n.fa-yc:before,\\n.fa-y-combinator:before {\\n  content: \\\"\\\\f23b\\\";\\n}\\n.fa-optin-monster:before {\\n  content: \\\"\\\\f23c\\\";\\n}\\n.fa-opencart:before {\\n  content: \\\"\\\\f23d\\\";\\n}\\n.fa-expeditedssl:before {\\n  content: \\\"\\\\f23e\\\";\\n}\\n.fa-battery-4:before,\\n.fa-battery-full:before {\\n  content: \\\"\\\\f240\\\";\\n}\\n.fa-battery-3:before,\\n.fa-battery-three-quarters:before {\\n  content: \\\"\\\\f241\\\";\\n}\\n.fa-battery-2:before,\\n.fa-battery-half:before {\\n  content: \\\"\\\\f242\\\";\\n}\\n.fa-battery-1:before,\\n.fa-battery-quarter:before {\\n  content: \\\"\\\\f243\\\";\\n}\\n.fa-battery-0:before,\\n.fa-battery-empty:before {\\n  content: \\\"\\\\f244\\\";\\n}\\n.fa-mouse-pointer:before {\\n  content: \\\"\\\\f245\\\";\\n}\\n.fa-i-cursor:before {\\n  content: \\\"\\\\f246\\\";\\n}\\n.fa-object-group:before {\\n  content: \\\"\\\\f247\\\";\\n}\\n.fa-object-ungroup:before {\\n  content: \\\"\\\\f248\\\";\\n}\\n.fa-sticky-note:before {\\n  content: \\\"\\\\f249\\\";\\n}\\n.fa-sticky-note-o:before {\\n  content: \\\"\\\\f24a\\\";\\n}\\n.fa-cc-jcb:before {\\n  content: \\\"\\\\f24b\\\";\\n}\\n.fa-cc-diners-club:before {\\n  content: \\\"\\\\f24c\\\";\\n}\\n.fa-clone:before {\\n  content: \\\"\\\\f24d\\\";\\n}\\n.fa-balance-scale:before {\\n  content: \\\"\\\\f24e\\\";\\n}\\n.fa-hourglass-o:before {\\n  content: \\\"\\\\f250\\\";\\n}\\n.fa-hourglass-1:before,\\n.fa-hourglass-start:before {\\n  content: \\\"\\\\f251\\\";\\n}\\n.fa-hourglass-2:before,\\n.fa-hourglass-half:before {\\n  content: \\\"\\\\f252\\\";\\n}\\n.fa-hourglass-3:before,\\n.fa-hourglass-end:before {\\n  content: \\\"\\\\f253\\\";\\n}\\n.fa-hourglass:before {\\n  content: \\\"\\\\f254\\\";\\n}\\n.fa-hand-grab-o:before,\\n.fa-hand-rock-o:before {\\n  content: \\\"\\\\f255\\\";\\n}\\n.fa-hand-stop-o:before,\\n.fa-hand-paper-o:before {\\n  content: \\\"\\\\f256\\\";\\n}\\n.fa-hand-scissors-o:before {\\n  content: \\\"\\\\f257\\\";\\n}\\n.fa-hand-lizard-o:before {\\n  content: \\\"\\\\f258\\\";\\n}\\n.fa-hand-spock-o:before {\\n  content: \\\"\\\\f259\\\";\\n}\\n.fa-hand-pointer-o:before {\\n  content: \\\"\\\\f25a\\\";\\n}\\n.fa-hand-peace-o:before {\\n  content: \\\"\\\\f25b\\\";\\n}\\n.fa-trademark:before {\\n  content: \\\"\\\\f25c\\\";\\n}\\n.fa-registered:before {\\n  content: \\\"\\\\f25d\\\";\\n}\\n.fa-creative-commons:before {\\n  content: \\\"\\\\f25e\\\";\\n}\\n.fa-gg:before {\\n  content: \\\"\\\\f260\\\";\\n}\\n.fa-gg-circle:before {\\n  content: \\\"\\\\f261\\\";\\n}\\n.fa-tripadvisor:before {\\n  content: \\\"\\\\f262\\\";\\n}\\n.fa-odnoklassniki:before {\\n  content: \\\"\\\\f263\\\";\\n}\\n.fa-odnoklassniki-square:before {\\n  content: \\\"\\\\f264\\\";\\n}\\n.fa-get-pocket:before {\\n  content: \\\"\\\\f265\\\";\\n}\\n.fa-wikipedia-w:before {\\n  content: \\\"\\\\f266\\\";\\n}\\n.fa-safari:before {\\n  content: \\\"\\\\f267\\\";\\n}\\n.fa-chrome:before {\\n  content: \\\"\\\\f268\\\";\\n}\\n.fa-firefox:before {\\n  content: \\\"\\\\f269\\\";\\n}\\n.fa-opera:before {\\n  content: \\\"\\\\f26a\\\";\\n}\\n.fa-internet-explorer:before {\\n  content: \\\"\\\\f26b\\\";\\n}\\n.fa-tv:before,\\n.fa-television:before {\\n  content: \\\"\\\\f26c\\\";\\n}\\n.fa-contao:before {\\n  content: \\\"\\\\f26d\\\";\\n}\\n.fa-500px:before {\\n  content: \\\"\\\\f26e\\\";\\n}\\n.fa-amazon:before {\\n  content: \\\"\\\\f270\\\";\\n}\\n.fa-calendar-plus-o:before {\\n  content: \\\"\\\\f271\\\";\\n}\\n.fa-calendar-minus-o:before {\\n  content: \\\"\\\\f272\\\";\\n}\\n.fa-calendar-times-o:before {\\n  content: \\\"\\\\f273\\\";\\n}\\n.fa-calendar-check-o:before {\\n  content: \\\"\\\\f274\\\";\\n}\\n.fa-industry:before {\\n  content: \\\"\\\\f275\\\";\\n}\\n.fa-map-pin:before {\\n  content: \\\"\\\\f276\\\";\\n}\\n.fa-map-signs:before {\\n  content: \\\"\\\\f277\\\";\\n}\\n.fa-map-o:before {\\n  content: \\\"\\\\f278\\\";\\n}\\n.fa-map:before {\\n  content: \\\"\\\\f279\\\";\\n}\\n.fa-commenting:before {\\n  content: \\\"\\\\f27a\\\";\\n}\\n.fa-commenting-o:before {\\n  content: \\\"\\\\f27b\\\";\\n}\\n.fa-houzz:before {\\n  content: \\\"\\\\f27c\\\";\\n}\\n.fa-vimeo:before {\\n  content: \\\"\\\\f27d\\\";\\n}\\n.fa-black-tie:before {\\n  content: \\\"\\\\f27e\\\";\\n}\\n.fa-fonticons:before {\\n  content: \\\"\\\\f280\\\";\\n}\\n.fa-reddit-alien:before {\\n  content: \\\"\\\\f281\\\";\\n}\\n.fa-edge:before {\\n  content: \\\"\\\\f282\\\";\\n}\\n.fa-credit-card-alt:before {\\n  content: \\\"\\\\f283\\\";\\n}\\n.fa-codiepie:before {\\n  content: \\\"\\\\f284\\\";\\n}\\n.fa-modx:before {\\n  content: \\\"\\\\f285\\\";\\n}\\n.fa-fort-awesome:before {\\n  content: \\\"\\\\f286\\\";\\n}\\n.fa-usb:before {\\n  content: \\\"\\\\f287\\\";\\n}\\n.fa-product-hunt:before {\\n  content: \\\"\\\\f288\\\";\\n}\\n.fa-mixcloud:before {\\n  content: \\\"\\\\f289\\\";\\n}\\n.fa-scribd:before {\\n  content: \\\"\\\\f28a\\\";\\n}\\n.fa-pause-circle:before {\\n  content: \\\"\\\\f28b\\\";\\n}\\n.fa-pause-circle-o:before {\\n  content: \\\"\\\\f28c\\\";\\n}\\n.fa-stop-circle:before {\\n  content: \\\"\\\\f28d\\\";\\n}\\n.fa-stop-circle-o:before {\\n  content: \\\"\\\\f28e\\\";\\n}\\n.fa-shopping-bag:before {\\n  content: \\\"\\\\f290\\\";\\n}\\n.fa-shopping-basket:before {\\n  content: \\\"\\\\f291\\\";\\n}\\n.fa-hashtag:before {\\n  content: \\\"\\\\f292\\\";\\n}\\n.fa-bluetooth:before {\\n  content: \\\"\\\\f293\\\";\\n}\\n.fa-bluetooth-b:before {\\n  content: \\\"\\\\f294\\\";\\n}\\n.fa-percent:before {\\n  content: \\\"\\\\f295\\\";\\n}\\n.fa-gitlab:before {\\n  content: \\\"\\\\f296\\\";\\n}\\n.fa-wpbeginner:before {\\n  content: \\\"\\\\f297\\\";\\n}\\n.fa-wpforms:before {\\n  content: \\\"\\\\f298\\\";\\n}\\n.fa-envira:before {\\n  content: \\\"\\\\f299\\\";\\n}\\n.fa-universal-access:before {\\n  content: \\\"\\\\f29a\\\";\\n}\\n.fa-wheelchair-alt:before {\\n  content: \\\"\\\\f29b\\\";\\n}\\n.fa-question-circle-o:before {\\n  content: \\\"\\\\f29c\\\";\\n}\\n.fa-blind:before {\\n  content: \\\"\\\\f29d\\\";\\n}\\n.fa-audio-description:before {\\n  content: \\\"\\\\f29e\\\";\\n}\\n.fa-volume-control-phone:before {\\n  content: \\\"\\\\f2a0\\\";\\n}\\n.fa-braille:before {\\n  content: \\\"\\\\f2a1\\\";\\n}\\n.fa-assistive-listening-systems:before {\\n  content: \\\"\\\\f2a2\\\";\\n}\\n.fa-asl-interpreting:before,\\n.fa-american-sign-language-interpreting:before {\\n  content: \\\"\\\\f2a3\\\";\\n}\\n.fa-deafness:before,\\n.fa-hard-of-hearing:before,\\n.fa-deaf:before {\\n  content: \\\"\\\\f2a4\\\";\\n}\\n.fa-glide:before {\\n  content: \\\"\\\\f2a5\\\";\\n}\\n.fa-glide-g:before {\\n  content: \\\"\\\\f2a6\\\";\\n}\\n.fa-signing:before,\\n.fa-sign-language:before {\\n  content: \\\"\\\\f2a7\\\";\\n}\\n.fa-low-vision:before {\\n  content: \\\"\\\\f2a8\\\";\\n}\\n.fa-viadeo:before {\\n  content: \\\"\\\\f2a9\\\";\\n}\\n.fa-viadeo-square:before {\\n  content: \\\"\\\\f2aa\\\";\\n}\\n.fa-snapchat:before {\\n  content: \\\"\\\\f2ab\\\";\\n}\\n.fa-snapchat-ghost:before {\\n  content: \\\"\\\\f2ac\\\";\\n}\\n.fa-snapchat-square:before {\\n  content: \\\"\\\\f2ad\\\";\\n}\\n.fa-pied-piper:before {\\n  content: \\\"\\\\f2ae\\\";\\n}\\n.fa-first-order:before {\\n  content: \\\"\\\\f2b0\\\";\\n}\\n.fa-yoast:before {\\n  content: \\\"\\\\f2b1\\\";\\n}\\n.fa-themeisle:before {\\n  content: \\\"\\\\f2b2\\\";\\n}\\n.fa-google-plus-circle:before,\\n.fa-google-plus-official:before {\\n  content: \\\"\\\\f2b3\\\";\\n}\\n.fa-fa:before,\\n.fa-font-awesome:before {\\n  content: \\\"\\\\f2b4\\\";\\n}\\n.sr-only {\\n  position: absolute;\\n  width: 1px;\\n  height: 1px;\\n  padding: 0;\\n  margin: -1px;\\n  overflow: hidden;\\n  clip: rect(0, 0, 0, 0);\\n  border: 0;\\n}\\n.sr-only-focusable:active,\\n.sr-only-focusable:focus {\\n  position: static;\\n  width: auto;\\n  height: auto;\\n  margin: 0;\\n  overflow: visible;\\n  clip: auto;\\n}\\n\"; (require(\"browserify-css\").createStyle(css, { \"href\": \"css/font-awesome.css\"})); module.exports = css;","var css = \"/**\\r\\n * SoundManager 2: \\\"Bar UI\\\" player - CSS\\r\\n * Copyright (c) 2014, Scott Schiller. All rights reserved.\\r\\n * http://www.schillmania.com/projects/soundmanager2/\\r\\n * Code provided under BSD license.\\r\\n * http://schillmania.com/projects/soundmanager2/license.txt\\r\\n */\\n.sm2-bar-ui a {\\n  border-bottom: 0 !important;\\n}\\n.sm2-bar-ui {\\n  position: relative;\\n  display: inline-block;\\n  width: 100%;\\n  font-family: helvetica, arial, verdana, sans-serif;\\n  font-weight: normal;\\n  /* prevent background border bleed */\\n  -webkit-background-clip: padding-box;\\n  background-clip: padding-box;\\n  /* because indeed, fonts do look pretty \\\"fat\\\" otherwise in this case. */\\n  -moz-osx-font-smoothing: grayscale;\\n  -webkit-font-smoothing: antialiased;\\n  /* general font niceness? */\\n  font-smoothing: antialiased;\\n  text-rendering: optimizeLegibility;\\n  min-width: 20em;\\n  max-width: 30em;\\n  /* take out overflow if you want an absolutely-positioned playlist dropdown. */\\n  border-radius: 2px;\\n  overflow: hidden;\\n  /* just for fun (animate normal / full-width) */\\n  transition: max-width 0.2s ease-in-out;\\n}\\n.sm2-bar-ui .sm2-playlist li {\\n  text-align: center;\\n  margin-top: -2px;\\n  font-size: 95%;\\n  line-height: 1em;\\n}\\n.sm2-bar-ui.compact {\\n  min-width: 1em;\\n  max-width: 15em;\\n}\\n.sm2-bar-ui ul {\\n  line-height: 1em;\\n}\\n/* want things left-aligned? */\\n.sm2-bar-ui.left .sm2-playlist li {\\n  text-align: left;\\n}\\n.sm2-bar-ui .sm2-playlist li .load-error {\\n  cursor: help;\\n}\\n.sm2-bar-ui.full-width {\\n  max-width: 100%;\\n  z-index: 5;\\n}\\n.sm2-bar-ui.fixed {\\n  position: fixed;\\n  top: auto;\\n  bottom: 0px;\\n  left: 0px;\\n  border-radius: 0px;\\n  /* so the absolutely-positioned playlist can show... */\\n  overflow: visible;\\n  /* and this should probably have a high z-index. tweak as needed. */\\n  z-index: 999;\\n}\\n.sm2-bar-ui.fixed .bd,\\n.sm2-bar-ui.bottom .bd {\\n  /* display: table; */\\n  border-radius: 0px;\\n  border-bottom: none;\\n}\\n.sm2-bar-ui.bottom {\\n  /* absolute bottom-aligned UI */\\n  top: auto;\\n  bottom: 0px;\\n  left: 0px;\\n  border-radius: 0px;\\n  /* so the absolutely-positioned playlist can show... */\\n  overflow: visible;\\n}\\n.sm2-bar-ui.playlist-open .bd {\\n  border-bottom-left-radius: 0px;\\n  border-bottom-right-radius: 0px;\\n  border-bottom-color: transparent;\\n}\\n.sm2-bar-ui .bd,\\n.sm2-bar-ui .sm2-extra-controls {\\n  position: relative;\\n  background-color: #2288cc;\\n  /*\\r\\n transition: background 0.2s ease-in-out;\\r\\n */\\n}\\n.sm2-bar-ui .sm2-inline-gradient {\\n  /* gradient */\\n  position: absolute;\\n  left: 0px;\\n  top: 0px;\\n  width: 100%;\\n  height: 100%;\\n  background-image: -moz-linear-gradient(to bottom, rgba(255,255,255,0.125) 5%, rgba(255,255,255,0.125) 45%, rgba(255,255,255,0.15) 52%, rgba(0,0,0,0.01) 51%, rgba(0,0,0,0.1) 95%);\\n  /* W3C */\\n  background-image: linear-gradient(to bottom, rgba(255,255,255,0.125) 5%, rgba(255,255,255,0.125) 45%, rgba(255,255,255,0.15) 50%, rgba(0,0,0,0.1) 51%, rgba(0,0,0,0.1) 95%);\\n  /* W3C */\\n}\\n.sm2-bar-ui.flat .sm2-inline-gradient {\\n  background-image: none;\\n}\\n.sm2-bar-ui.flat .sm2-box-shadow {\\n  display: none;\\n  box-shadow: none;\\n}\\n.sm2-bar-ui.no-volume .sm2-volume {\\n  /* mobile devices (android + iOS) ignore attempts to set volume. */\\n  display: none;\\n}\\n.sm2-bar-ui.textured .sm2-inline-texture {\\n  position: absolute;\\n  top: 0px;\\n  left: 0px;\\n  width: 100%;\\n  height: 100%;\\n  /* for example */\\n  /* background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/wood_pattern_dark.png); */\\n  /* additional opacity effects can be applied here. */\\n  opacity: 0.75;\\n}\\n.sm2-bar-ui.textured.dark-text .sm2-inline-texture {\\n  /* dark text + textured case: use light wood background (for example.) */\\n  /* background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/patterns/wood_pattern.png); */\\n}\\n.sm2-bar-ui.textured.dark-text .sm2-playlist-wrapper {\\n  /* dark text + textured case: ditch 10% dark on playlist body. */\\n  background-color: transparent;\\n}\\n.sm2-bar-ui.textured.dark-text .sm2-playlist-wrapper ul li:hover a,\\n.sm2-bar-ui.textured.dark-text .sm2-playlist-wrapper ul li.selected a {\\n  /* dark + textured case: dark highlights */\\n  background-color: rgba(0,0,0,0.1);\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/black-10.png);\\n  /* modern browsers don't neeed the image */\\n  background-image: none, none;\\n}\\n.sm2-bar-ui .bd {\\n  display: table;\\n  border-bottom: none;\\n}\\n.sm2-bar-ui .sm2-playlist-wrapper {\\n  background-color: rgba(0,0,0,0.1);\\n}\\n.sm2-bar-ui .sm2-extra-controls .bd {\\n  background-color: rgba(0,0,0,0.2);\\n}\\n.sm2-bar-ui.textured .sm2-extra-controls .bd {\\n  /* lighten extra color overlays */\\n  background-color: rgba(0,0,0,0.05);\\n}\\n.sm2-bar-ui .sm2-extra-controls {\\n  background-color: transparent;\\n  border: none;\\n}\\n.sm2-bar-ui .sm2-extra-controls .bd {\\n  /* override full-width table behaviour */\\n  display: block;\\n  border: none;\\n}\\n.sm2-bar-ui .sm2-extra-controls .sm2-inline-element {\\n  display: inline-block;\\n}\\n.sm2-bar-ui,\\n.sm2-bar-ui .bd a {\\n  color: #fff;\\n}\\n.sm2-bar-ui.dark-text,\\n.sm2-bar-ui.dark-text .bd a {\\n  color: #000;\\n}\\n.sm2-bar-ui.dark-text .sm2-inline-button {\\n  /* Warning/disclaimer: SVG might be fuzzy when inverted on Chrome, losing resolution on hi-DPI displays. */\\n  -webkit-filter: invert(1);\\n  /* SVG-based invert filter for Firefox */\\n  filter: url(\\\"data:image/svg+xml;utf8,<svg xmlns=\\\\'http://www.w3.org/2000/svg\\\\'><filter id=\\\\'invert\\\\'><feColorMatrix in='SourceGraphic' type='matrix' values='-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0'/></filter></svg>#invert\\\");\\n  /* IE 8 inverse filter, may only match pure black/white */\\n  /* filter: xray; */\\n  /* pending W3 standard */\\n  filter: invert(1);\\n  /* not you, IE < 10. */\\n  filter: none\\\\9;\\n}\\n.sm2-bar-ui .bd a {\\n  text-decoration: none;\\n}\\n.sm2-bar-ui .bd .sm2-button-element:hover {\\n  background-color: rgba(0,0,0,0.1);\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/black-10.png);\\n  background-image: none, none;\\n}\\n.sm2-bar-ui .bd .sm2-button-element:active {\\n  background-color: rgba(0,0,0,0.25);\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/black-25.png);\\n  background-image: none, none;\\n}\\n.sm2-bar-ui .bd .sm2-extra-controls .sm2-button-element:active .sm2-inline-button,\\n.sm2-bar-ui .bd .active .sm2-inline-button/*,\\n.sm2-bar-ui.playlist-open .sm2-menu a */ {\\n  -ms-transform: scale(0.9);\\n  -webkit-transform: scale(0.9);\\n  -webkit-transform-origin: 50% 50%;\\n  /* firefox doesn't scale quite right. */\\n  transform: scale(0.9);\\n  transform-origin: 50% 50%;\\n  /* firefox doesn't scale quite right. */\\n  -moz-transform: none;\\n}\\n.sm2-bar-ui .bd .sm2-extra-controls .sm2-button-element:hover,\\n.sm2-bar-ui .bd .sm2-extra-controls .sm2-button-element:active,\\n.sm2-bar-ui .bd .active {\\n  background-color: rgba(0,0,0,0.1);\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/black-10.png);\\n  background-image: none, none;\\n}\\n.sm2-bar-ui .bd .sm2-extra-controls .sm2-button-element:active {\\n  /* box shadow is excessive on smaller elements. */\\n  box-shadow: none;\\n}\\n.sm2-bar-ui {\\n  /* base font size */\\n  font-size: 15px;\\n  text-shadow: none;\\n}\\n.sm2-bar-ui .sm2-inline-element {\\n  position: relative;\\n  display: inline-block;\\n  vertical-align: middle;\\n  padding: 0px;\\n  overflow: hidden;\\n}\\n.sm2-bar-ui .sm2-inline-element,\\n.sm2-bar-ui .sm2-button-element .sm2-button-bd {\\n  position: relative;\\n  /**\\r\\n  * .sm2-button-bd exists because of a Firefox bug from 2000\\r\\n  * re: nested relative / absolute elements inside table cells.\\r\\n  * https://bugzilla.mozilla.org/show_bug.cgi?id=63895\\r\\n  */\\n}\\n.sm2-bar-ui .sm2-inline-element,\\n.sm2-bar-ui .sm2-button-element .sm2-button-bd {\\n  /**\\r\\n  * if you play with UI width/height, these are the important ones.\\r\\n  * NOTE: match these values if you want square UI buttons.\\r\\n  */\\n  min-width: 2.8em;\\n  min-height: 2.8em;\\n}\\n.sm2-bar-ui .sm2-inline-button {\\n  position: absolute;\\n  top: 0px;\\n  left: 0px;\\n  width: 100%;\\n  height: 100%;\\n}\\n.sm2-bar-ui .sm2-extra-controls .bd {\\n  /* don't double-layer. */\\n  background-image: none;\\n  background-color: rgba(0,0,0,0.15);\\n}\\n.sm2-bar-ui .sm2-extra-controls .sm2-inline-element {\\n  width: 25px;\\n  /* bare minimum */\\n  min-height: 1.75em;\\n  min-width: 2.5em;\\n}\\n.sm2-bar-ui .sm2-inline-status {\\n  line-height: 100%;\\n  /* how much to allow before truncating song artist / title with ellipsis */\\n  display: inline-block;\\n  min-width: 200px;\\n  max-width: 20em;\\n  /* a little more spacing */\\n  padding-left: 0.75em;\\n  padding-right: 0.75em;\\n}\\n.sm2-bar-ui .sm2-inline-element {\\n  /* extra-small em scales up nicely, vs. 1px which gets fat */\\n  border-right: 0.075em dotted #666;\\n  /* legacy */\\n  border-right: 0.075em solid rgba(0,0,0,0.1);\\n}\\n.sm2-bar-ui .sm2-inline-element.noborder {\\n  border-right: none;\\n}\\n.sm2-bar-ui .sm2-inline-element.compact {\\n  min-width: 2em;\\n  padding: 0px 0.25em;\\n}\\n.sm2-bar-ui .sm2-inline-element:first-of-type {\\n  border-top-left-radius: 3px;\\n  border-bottom-left-radius: 3px;\\n  overflow: hidden;\\n}\\n.sm2-bar-ui .sm2-inline-element:last-of-type {\\n  border-right: none;\\n  border-top-right-radius: 3px;\\n  border-bottom-right-radius: 3px;\\n}\\n.sm2-bar-ui .sm2-inline-status a:hover {\\n  background-color: transparent;\\n  text-decoration: underline;\\n}\\n.sm2-inline-time,\\n.sm2-inline-duration {\\n  display: table-cell;\\n  width: 1%;\\n  font-size: 75%;\\n  line-height: 0.9em;\\n  min-width: 2em;\\n  /* if you have sounds > 10:00 in length, make this bigger. */\\n  vertical-align: middle;\\n}\\n.sm2-bar-ui .sm2-playlist {\\n  position: relative;\\n  height: 1.45em;\\n}\\n.sm2-bar-ui .sm2-playlist-target {\\n  /* initial render / empty case */\\n  position: relative;\\n  min-height: 1em;\\n}\\n.sm2-bar-ui .sm2-playlist ul {\\n  position: absolute;\\n  left: 0px;\\n  top: 0px;\\n  width: 100%;\\n  list-style-type: none;\\n  overflow: hidden;\\n  white-space: nowrap;\\n  text-overflow: ellipsis;\\n}\\n.sm2-bar-ui p,\\n.sm2-bar-ui .sm2-playlist ul,\\n.sm2-bar-ui .sm2-playlist ul li {\\n  margin: 0px;\\n  padding: 0px;\\n}\\n.sm2-bar-ui .sm2-playlist ul li {\\n  position: relative;\\n}\\n.sm2-bar-ui .sm2-playlist ul li,\\n.sm2-bar-ui .sm2-playlist ul li a {\\n  position: relative;\\n  display: block;\\n  /* prevent clipping of characters like \\\"g\\\" */\\n  height: 1.5em;\\n  white-space: nowrap;\\n  overflow: hidden;\\n  text-overflow: ellipsis;\\n  text-align: center;\\n}\\n.sm2-row {\\n  position: relative;\\n  display: table-row;\\n}\\n.sm2-progress-bd {\\n  /* spacing between progress track/ball and time (position) */\\n  padding: 0px 0.8em;\\n}\\n.sm2-progress .sm2-progress-track,\\n.sm2-progress .sm2-progress-ball,\\n.sm2-progress .sm2-progress-bar {\\n  position: relative;\\n  width: 100%;\\n  height: 0.65em;\\n  border-radius: 0.65em;\\n}\\n.sm2-progress .sm2-progress-bar {\\n  /* element which follows the progres \\\"ball\\\" as it moves */\\n  position: absolute;\\n  left: 0px;\\n  top: 0px;\\n  width: 0px;\\n  background-color: rgba(0,0,0,0.33);\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/black-33.png);\\n  background-image: none, none;\\n}\\n.volume-shade,\\n.playing .sm2-progress .sm2-progress-track,\\n.paused .sm2-progress .sm2-progress-track {\\n  cursor: pointer;\\n}\\n.playing .sm2-progress .sm2-progress-ball {\\n  cursor: -moz-grab;\\n  cursor: -webkit-grab;\\n  cursor: grab;\\n}\\n.sm2-progress .sm2-progress-ball {\\n  position: absolute;\\n  top: 0px;\\n  left: 0px;\\n  width: 1em;\\n  height: 1em;\\n  margin: -0.2em 0px 0px -0.5em;\\n  width: 14px;\\n  height: 14px;\\n  margin: -2px 0px 0px -7px;\\n  width: 0.9333em;\\n  height: 0.9333em;\\n  margin: -0.175em 0px 0px -0.466em;\\n  background-color: #fff;\\n  padding: 0px;\\n  /*\\r\\n z-index: 1;\\r\\n*/\\n  -webkit-transition: -webkit-transform 0.15s ease-in-out;\\n  transition: transform 0.15s ease-in-out;\\n}\\n/*\\r\\n.sm2-bar-ui.dark-text .sm2-progress .sm2-progress-ball {\\r\\n background-color: #000;\\r\\n}\\r\\n*/\\n.sm2-progress .sm2-progress-track {\\n  background-color: rgba(0,0,0,0.4);\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/black-33.png);\\n  /* legacy */\\n  background-image: none, none;\\n  /* modern browsers */\\n}\\n/* scrollbar rules have to be separate, browsers not supporting this syntax will skip them when combined. */\\n.sm2-playlist-wrapper ul::-webkit-scrollbar-track {\\n  background-color: rgba(0,0,0,0.4);\\n}\\n.playing.grabbing .sm2-progress .sm2-progress-track,\\n.playing.grabbing .sm2-progress .sm2-progress-ball {\\n  cursor: -moz-grabbing;\\n  cursor: -webkit-grabbing;\\n  cursor: grabbing;\\n}\\n.sm2-bar-ui.grabbing .sm2-progress .sm2-progress-ball {\\n  -webkit-transform: scale(1.15);\\n  transform: scale(1.15);\\n}\\n.sm2-inline-button {\\n  background-position: 50% 50%;\\n  background-repeat: no-repeat;\\n  /* hide inner text */\\n  line-height: 10em;\\n  /**\\r\\n  * image-rendering seems to apply mostly to Firefox in this case. Use with caution.\\r\\n  * https://developer.mozilla.org/en-US/docs/Web/CSS/image-rendering#Browser_compatibility\\r\\n  */\\n  image-rendering: -moz-crisp-edges;\\n  image-rendering: -webkit-optimize-contrast;\\n  image-rendering: crisp-edges;\\n  -ms-interpolation-mode: nearest-neighbor;\\n  -ms-interpolation-mode: bicubic;\\n}\\n.play-pause,\\n.play-pause:hover,\\n.paused .play-pause:hover {\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/PNG/play.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/SVG/play.svg);\\n  background-size: 67.5%;\\n  background-position: 40% 53%;\\n}\\n.playing .play-pause {\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/PNG/pause.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/SVG/pause.svg);\\n  background-size: 57.6%;\\n  background-position: 50% 53%;\\n}\\n.sm2-volume-control {\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/PNG/volume.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/SVG/volume.svg);\\n}\\n.sm2-volume-control,\\n.sm2-volume-shade {\\n  background-position: 42% 50%;\\n  background-size: 56%;\\n}\\n.volume-shade {\\n  filter: alpha(opacity=33);\\n  /* <= IE 8 */\\n  opacity: 0.33;\\n  /* -webkit-filter: invert(1);*/\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-000000/PNG/volume.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-000000/SVG/volume.svg);\\n}\\n.menu {\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/PNG/list2.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/SVG/list2.svg);\\n  background-size: 58%;\\n  background-position: 54% 51%;\\n}\\n.previous {\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/PNG/first.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/SVG/first.svg);\\n}\\n.next {\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/PNG/last.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/SVG/last.svg);\\n}\\n.previous,\\n.next {\\n  background-size: 49.5%;\\n  background-position: 50% 50%;\\n}\\n.sm2-extra-controls .previous,\\n.sm2-extra-controls .next {\\n  backgound-size: 53%;\\n}\\n.shuffle {\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/PNG/shuffle.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/SVG/shuffle.svg);\\n  background-size: 45%;\\n  background-position: 50% 50%;\\n}\\n.repeat {\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/PNG/loop.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/SVG/loop.svg);\\n  background-position: 50% 43%;\\n  background-size: 54%;\\n}\\n.sm2-extra-controls .repeat {\\n  background-position: 50% 45%;\\n}\\n.sm2-playlist-wrapper ul li .sm2-row {\\n  display: table;\\n  width: 100%;\\n}\\n.sm2-playlist-wrapper ul li .sm2-col {\\n  display: table-cell;\\n  vertical-align: top;\\n  /* by default, collapse. */\\n  width: 0%;\\n}\\n.sm2-playlist-wrapper ul li .sm2-col.sm2-wide {\\n  /* take 100% width. */\\n  width: 100%;\\n}\\n.sm2-playlist-wrapper ul li .sm2-icon {\\n  display: inline-block;\\n  overflow: hidden;\\n  width: 2em;\\n  color: transparent !important;\\n  /* hide text */\\n  white-space: nowrap;\\n  /* don't let text affect height */\\n  padding-left: 0px;\\n  padding-right: 0px;\\n  text-indent: 2em;\\n  /* IE 8, mostly */\\n}\\n.sm2-playlist-wrapper ul li .sm2-icon,\\n.sm2-playlist-wrapper ul li:hover .sm2-icon,\\n.sm2-playlist-wrapper ul li.selected .sm2-icon {\\n  background-size: 55%;\\n  background-position: 50% 50%;\\n  background-repeat: no-repeat;\\n}\\n.sm2-playlist-wrapper ul li .sm2-col {\\n  /* sibling table cells get borders. */\\n  border-right: 1px solid rgba(0,0,0,0.075);\\n}\\n.sm2-playlist-wrapper ul li.selected .sm2-col {\\n  border-color: rgba(255,255,255,0.075);\\n}\\n.sm2-playlist-wrapper ul li .sm2-col:last-of-type {\\n  border-right: none;\\n}\\n.sm2-playlist-wrapper ul li .sm2-cart,\\n.sm2-playlist-wrapper ul li:hover .sm2-cart,\\n.sm2-playlist-wrapper ul li.selected .sm2-cart {\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/PNG/cart.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/SVG/cart.svg);\\n  /* slight alignment tweak */\\n  background-position: 48% 50%;\\n}\\n.sm2-playlist-wrapper ul li .sm2-music,\\n.sm2-playlist-wrapper ul li:hover .sm2-music,\\n.sm2-playlist-wrapper ul li.selected .sm2-music {\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/PNG/music.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-ffffff/SVG/music.svg);\\n}\\n.sm2-bar-ui.dark-text .sm2-playlist-wrapper ul li .sm2-cart,\\n.sm2-bar-ui.dark-text .sm2-playlist-wrapper ul li:hover .sm2-cart,\\n.sm2-bar-ui.dark-text .sm2-playlist-wrapper ul li.selected .sm2-cart {\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-000000/PNG/cart.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-000000/SVG/cart.svg);\\n}\\n.sm2-bar-ui.dark-text .sm2-playlist-wrapper ul li .sm2-music,\\n.sm2-bar-ui.dark-text .sm2-playlist-wrapper ul li:hover .sm2-music,\\n.sm2-bar-ui.dark-text .sm2-playlist-wrapper ul li.selected .sm2-music {\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-000000/PNG/music.png);\\n  background-image: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/entypo-25px-000000/SVG/music.svg);\\n}\\n.sm2-bar-ui.dark-text .sm2-playlist-wrapper ul li .sm2-col {\\n  border-left-color: rgba(0,0,0,0.15);\\n}\\n.sm2-playlist-wrapper ul li .sm2-icon:hover {\\n  background-color: rgba(0,0,0,0.33);\\n}\\n.sm2-bar-ui .sm2-playlist-wrapper ul li .sm2-icon:hover {\\n  background-color: rgba(0,0,0,0.45);\\n}\\n.sm2-bar-ui.dark-text .sm2-playlist-wrapper ul li.selected .sm2-icon:hover {\\n  background-color: rgba(255,255,255,0.25);\\n  border-color: rgba(0,0,0,0.125);\\n}\\n.sm2-progress-ball .icon-overlay {\\n  position: absolute;\\n  width: 100%;\\n  height: 100%;\\n  top: 0px;\\n  left: 0px;\\n  background: none, url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/icomoon/free-25px-000000/SVG/spinner.svg);\\n  background-size: 72%;\\n  background-position: 50%;\\n  background-repeat: no-repeat;\\n  display: none;\\n}\\n.playing.buffering .sm2-progress-ball .icon-overlay {\\n  display: block;\\n  -webkit-animation: spin 0.6s linear infinite;\\n  animation: spin 0.6s linear infinite;\\n}\\n@-webkit-keyframes spin {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n  }\\n\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n  }\\n}\\n@-moz-keyframes spin {\\n  0% {\\n    transform: rotate(0deg);\\n  }\\n\\n  100% {\\n    transform: rotate(360deg);\\n  }\\n}\\n@keyframes spin {\\n  0% {\\n    transform: rotate(0deg);\\n  }\\n\\n  100% {\\n    transform: rotate(360deg);\\n  }\\n}\\n.sm2-element ul {\\n  font-size: 95%;\\n  list-style-type: none;\\n}\\n.sm2-element ul,\\n.sm2-element ul li {\\n  margin: 0px;\\n  padding: 0px;\\n}\\n.bd.sm2-playlist-drawer {\\n  /* optional: absolute positioning */\\n  /* position: absolute; */\\n  z-index: 3;\\n  border-radius: 0px;\\n  width: 100%;\\n  height: 0px;\\n  border: none;\\n  background-image: none;\\n  display: block;\\n  overflow: hidden;\\n  transition: height 0.2s ease-in-out;\\n}\\n.sm2-bar-ui.fixed .bd.sm2-playlist-drawer,\\n.sm2-bar-ui.bottom .bd.sm2-playlist-drawer {\\n  position: absolute;\\n}\\n.sm2-bar-ui.fixed .sm2-playlist-wrapper,\\n.sm2-bar-ui.bottom .sm2-playlist-wrapper {\\n  padding-bottom: 0px;\\n}\\n.sm2-bar-ui.fixed .bd.sm2-playlist-drawer,\\n.sm2-bar-ui.bottom .bd.sm2-playlist-drawer {\\n  /* show playlist on top */\\n  bottom: 2.8em;\\n}\\n.sm2-bar-ui .bd.sm2-playlist-drawer {\\n  opacity: 0.5;\\n  /* redraw fix for Chrome, background color doesn't always draw when playlist drawer open. */\\n  transform: translateZ(0);\\n}\\n/* experimental, may not perform well. */\\n/*\\r\\n.sm2-bar-ui .bd.sm2-playlist-drawer a {\\r\\n -webkit-filter: blur(5px);\\r\\n}\\r\\n*/\\n.sm2-bar-ui.playlist-open .bd.sm2-playlist-drawer {\\n  height: auto;\\n  opacity: 1;\\n}\\n.sm2-bar-ui.playlist-open .bd.sm2-playlist-drawer a {\\n  -webkit-filter: none;\\n  /* blur(0px) was still blurred on retina displays, as of 07/2014 */\\n}\\n.sm2-bar-ui.fixed.playlist-open .bd.sm2-playlist-drawer .sm2-playlist-wrapper,\\n.sm2-bar-ui.bottom.playlist-open .bd.sm2-playlist-drawer .sm2-playlist-wrapper {\\n  /* extra padding when open */\\n  padding-bottom: 0.5em;\\n  box-shadow: none;\\n}\\n.sm2-bar-ui .bd.sm2-playlist-drawer {\\n  transition: all 0.2s ease-in-out;\\n  transition-property: transform, height, opacity, background-color, -webkit-filter;\\n}\\n.sm2-bar-ui .bd.sm2-playlist-drawer a {\\n  transition: -webkit-filter 0.2s ease-in-out;\\n}\\n.sm2-bar-ui .bd.sm2-playlist-drawer .sm2-inline-texture {\\n  /* negative offset for height of top bar, so background is seamless. */\\n  background-position: 0px -2.8em;\\n}\\n.sm2-box-shadow {\\n  position: absolute;\\n  left: 0px;\\n  top: 0px;\\n  width: 100%;\\n  height: 100%;\\n  box-shadow: inset 0px 1px 6px rgba(0,0,0,0.15);\\n}\\n.sm2-playlist-wrapper {\\n  position: relative;\\n  padding: 0.5em 0.5em 0.5em 0.25em;\\n  background-image: none, none;\\n}\\n.sm2-playlist-wrapper ul {\\n  max-height: 9.25em;\\n  overflow: auto;\\n}\\n.sm2-playlist-wrapper ul li {\\n  border-bottom: 1px solid rgba(0,0,0,0.05);\\n}\\n.sm2-playlist-wrapper ul li:nth-child(odd) {\\n  background-color: rgba(255,255,255,0.03);\\n}\\n.sm2-playlist-wrapper ul li a {\\n  display: block;\\n  padding: 0.5em 0.25em 0.5em 0.75em;\\n  margin-right: 0px;\\n  font-size: 90%;\\n  vertical-align: middle;\\n}\\n.sm2-playlist-wrapper ul li a.sm2-exclude {\\n  display: inline-block;\\n}\\n.sm2-playlist-wrapper ul li a.sm2-exclude .label {\\n  font-size: 95%;\\n  line-height: 1em;\\n  margin-left: 0px;\\n  padding: 2px 4px;\\n}\\n.sm2-playlist-wrapper ul li:hover a {\\n  background-color: rgba(0,0,0,0.20);\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/black-20.png);\\n  background-image: none, none;\\n}\\n.sm2-bar-ui.dark-text .sm2-playlist-wrapper ul li:hover a {\\n  background-color: rgba(255,255,255,0.1);\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/black-10.png);\\n  background-image: none, none;\\n}\\n.sm2-playlist-wrapper ul li.selected a {\\n  background-color: rgba(0,0,0,0.25);\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/black-20.png);\\n  background-image: none, none;\\n}\\n.sm2-bar-ui.dark-text ul li.selected a {\\n  background-color: rgba(255,255,255,0.1);\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/black-10.png);\\n  background-image: none, none;\\n}\\n.sm2-bar-ui .disabled {\\n  filter: alpha(opacity=33);\\n  /* <= IE 8 */\\n  opacity: 0.33;\\n}\\n.sm2-bar-ui .bd .sm2-button-element.disabled:hover {\\n  background-color: transparent;\\n}\\n.sm2-bar-ui .active,\\n/*.sm2-bar-ui.playlist-open .sm2-menu,\\n*/\\r\\n.sm2-bar-ui.playlist-open .sm2-menu:hover {\\n  /* depressed / \\\"on\\\" state */\\n  box-shadow: inset 0px 0px 2px rgba(0,0,0,0.1);\\n  background-image: none;\\n}\\n.firefox-fix {\\n  /**\\r\\n  * This exists because of a Firefox bug from 2000\\r\\n  * re: nested relative / absolute elements inside table cells.\\r\\n  * https://bugzilla.mozilla.org/show_bug.cgi?id=63895\\r\\n  */\\n  position: relative;\\n  display: inline-block;\\n  width: 100%;\\n  height: 100%;\\n}\\n/* some custom scrollbar trickery, where supported */\\n.sm2-playlist-wrapper ul::-webkit-scrollbar {\\n  width: 10px;\\n}\\n.sm2-playlist-wrapper ul::-webkit-scrollbar-track {\\n  background: rgba(0,0,0,0.33);\\n  border-radius: 10px;\\n}\\n.sm2-playlist-wrapper ul::-webkit-scrollbar-thumb {\\n  border-radius: 10px;\\n  background: #fff;\\n}\\n.sm2-extra-controls {\\n  font-size: 0px;\\n  text-align: center;\\n}\\n.sm2-bar-ui .label {\\n  position: relative;\\n  display: inline-block;\\n  font-size: 0.7em;\\n  margin-left: 0.25em;\\n  vertical-align: top;\\n  background-color: rgba(0,0,0,0.25);\\n  border-radius: 3px;\\n  padding: 0px 3px;\\n  box-sizing: padding-box;\\n}\\n.sm2-bar-ui.dark-text .label {\\n  background-color: rgba(0,0,0,0.1);\\n  background-image: url(https://cdn.creek.fm/embed/0.7.4-alpha/lib/sm2/bar-ui/image/black-10.png);\\n  background-image: none, none;\\n}\\n.sm2-bar-ui .sm2-playlist-drawer .label {\\n  font-size: 0.8em;\\n  padding: 0px 3px;\\n}\\n/* --- full width stuff --- */\\n.sm2-bar-ui .sm2-inline-element {\\n  display: table-cell;\\n}\\n.sm2-bar-ui .sm2-inline-element {\\n  /* collapse */\\n  width: 1%;\\n}\\n.sm2-bar-ui .sm2-inline-status {\\n  /* full width */\\n  width: 100%;\\n  min-width: 100%;\\n  max-width: 100%;\\n}\\n.sm2-bar-ui > .bd {\\n  width: 100%;\\n}\\n.sm2-bar-ui .sm2-playlist-drawer {\\n  /* re-hide playlist */\\n  display: block;\\n  overflow: hidden;\\n}\\n\"; (require(\"browserify-css\").createStyle(css, { \"href\": \"lib/sm2/bar-ui/css/bar-ui.css\"})); module.exports = css;","/*\n\n  Creek: Initialize, with modules.\n\n*/\n\nvar Creek = {};\n\n//jQuery, for the element selector, and for grabbing remote JSONP content.\nvar $ = require('jquery');\nvar jQuery = $;\n\n/*\n Vue, moment, and vue-moment are only included in:\n - creek-schedule.js\n*/\n\n/* ------------------------------------\n Include CSS\n*/\n\nvar css = require('./css/creek.css');\n\n//FontAwesome\n// Modified CSS with Absolute-URLs\n// !!! This should be replaced with individual icons.\nvar css_fontawesome = require('./css/font-awesome.css');\n\n//SM2 Bar UI\n// Modified CSS with Absolute-URLs\nvar css_sm2_bar_ui = require('./lib/sm2/bar-ui/css/bar-ui.css');\n\n\n/* ------------------------------------\n\n  Initiate JavaScript objects for Creek\n\n*/\n\n/*\n\n  TODO:\n  - Remove jQuery dependency somehow?\n  - Handle the option to enable/disable stream toolbar\n\n*/\n\n\n//----------------------\n// Create init function\n//----------------------\n\nCreek.init = function(config){\n\n  //Prepare data based on incoming config data\n  Creek.data = require('./js/creek-data.js').init(config);\n\n  Creek.page = {\n    reset: function(){ },\n  }\n\n  Creek.debug = require('./js/creek-debug.js').init(config, Creek);\n\n  Creek.util = require('./js/creek-util.js').init(Creek);\n\n  Creek.content = require('./js/creek-content.js').init(Creek);\n\n  //Audio Part 1:\n  // Set up shared objects.\n  Creek.audio = require('./js/creek-audio-lib.js').init(Creek);\n\n  //Audio Part 2:\n  // Requires functions from creek-audio-lib.js\n  Creek.audio = require('./js/creek-audio.js').init(Creek);\n\n  //Audio Part 3:\n  // Requires Creek.audio\n  Creek.sm2_bar = require('./js/sm2-bar-ui-creek.js').init(Creek);\n\n  //The Socket.io-based API interface that delivers /api/broadcasting and other events.\n  Creek.liveApi = require('./js/creek-live-api.js').init(Creek);\n\n  // Requires Creek.audio and sm2_bar\n  if(Creek.data.persist.enable){\n    if(!Creek.data.persist.type){\n      console.error(\"Creek: Since persistence is enabled, you must specify a persistence type.\")\n    }\n    if(Creek.data.persist.type == \"iframe\"){\n      Creek.data.persist.instance = require('./js/creek-persist-iframe.js').init(Creek);\n    }\n    if(Creek.data.persist.type == \"singlepage\"){\n      Creek.data.persist.instance = require('./js/creek-persist-singlepage.js').init(Creek);\n    }\n  }else{\n    Creek.data.persist.instance = null;\n  }\n\n  //Share functions for social media.\n  Creek.share = require('./js/creek-share.js').init(Creek); //No \"Creek\" needed.\n\n  //Shows, schedule, broadcasts, hosts + JS Router\n  Creek.shows = require('./js/creek-shows.js').init(Creek);\n\n  // The archives browser:\n  // !!! Disabled until it works.\n  // Creek.archives = require('./js/creek-archives.js').init(Creek);\n\n  return true;\n\n}\n\n/* ------------------------------------------------------\n\n  Expose Creek to global scope:\n\n  Allows you to access Creek from outside of this Browserify bundle.\n\n*/\nwindow.Creek = Creek;\n","/*\n\nUtilities for optional functions.\n\n*/\n\n\nvar $ = require('jquery');\nvar jQuery = $;\n\n\nmodule.exports.init = function(Creek){\n\n  //!!! TODO: this should be somewhere else.\n  //Add the loading bar container to the page...\n  $(function(){\n    $('body').append('<div class=\"creek-loading-bar\">&nbsp;</div>');\n  });\n\n  var util = {};\n\n  util.fixLinks = function(html){\n\n    // console.log(html);\n\n    //If not enabled, then return HTML unedited\n    if(!Creek.data.router.enable){\n      return html;\n    }\n\n    var replace = function(str, find, replace){\n\n      //Replace all occurrences of this link prefix\n      var str = str.replace(new RegExp('href=\"'+find, 'g'), 'href=\"'+replace);\n\n      //Replace all the ones with single quotes in Vue template inline JS\n      var str = str.replace(new RegExp('href=\"\\''+find, 'g'), 'href=\"\\''+replace);\n\n      return str;\n    }\n\n    for(find in Creek.data.router.linkReplacements){\n      html = replace(html, find, Creek.data.router.linkReplacements[find]);\n    }\n\n    return html;\n\n  }\n\n\n  //Cookie functions for the preroll\n  // These are used to make sure the preroll only fires\n  // once every 7 minutes.\n  util.cookies = {};\n  util.cookies.create = function(name,value,seconds) {\n    if (seconds) {\n      var date = new Date();\n      date.setTime(date.getTime()+(seconds));\n      var expires = \"; expires=\"+date.toGMTString();\n    }\n    else var expires = \"\";\n    document.cookie = name+\"=\"+value+expires+\"; path=/\";\n  };\n  util.cookies.read = function(name) {\n    var nameEQ = name + \"=\";\n    var ca = document.cookie.split(';');\n    for(var i=0;i < ca.length;i++) {\n      var c = ca[i];\n      while (c.charAt(0)==' ') c = c.substring(1,c.length);\n      if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);\n    }\n    return null;\n  };\n  util.cookies.delete = function(name) {\n    Cookies.create(name,\"\",-1);\n  };\n\n  //Images\n  util.images = {\n\n    imageExists: function(image_url){\n\n      var http = new XMLHttpRequest();\n\n      http.open('HEAD', image_url, false);\n      http.send();\n\n      return http.status != 404;\n\n    }\n\n  }\n\n  util.capitalizeFirstLetter = function(string) {\n    return string.charAt(0).toUpperCase() + string.slice(1);\n  }\n\n  return util;\n\n}\n","var jQuery = require('jquery');\n\nmodule.exports.defaults = {\n\n  //Demo mode displays demo data for:\n  // - Track\n  // ...when there isn't any.\n  demo: false,\n\n  debug: false,\n\n  //Information about the station\n  station: {\n\n    //Uses document's domain by default.\n    domain: document.domain,\n\n    //!!! id should be unnecessary since Live API should use domain\n    id: null,\n\n    title: \"\",\n\n    //Enable HTTPS by default\n    ssl: true\n\n  },\n\n  //The currently-broadcasting audio content\n  broadcasting: {\n    now: null,\n    next: null,\n    upcoming: null,\n    Track: null\n  },\n\n  streams: {\n\n  },\n\n  liveApi: {\n\n    //Connect to the Live API with Socket.IO\n    enable: true\n\n  },\n\n  audio: {\n    toolbar: {\n\n      //Whether enable the toolbar and its functions\n      enable: true,\n\n      showImageSize: \"sm\",\n\n      //Custom HTML for the toolbar.\n      // html: null  //Nevermind, just allow them to use their own things.\n\n      //Allows you to inject the toolbar into a container.\n      // (Might only be useful for the Creek demo, though!)\n      container: \"body\"\n      // container: \".creek-audio-toolbar-container\"\n\n    },\n    players: {\n      backgroundColor: \"rgba(0,0,0,.2)\",\n      textLightOrDark: \"dark\"\n    }\n  },\n\n  //Options for the Creek Shows framework\n  shows: {\n\n    data: null,\n\n    container: \"#Creek-Shows\",\n\n    //Prefix for links:\n\n    //What about /broadcasts ?\n\n    //With JS router (injects shows/broadcast page content into container box)\n    // prefix: \"#!/shows/\",\n\n    //Replaced by JS router if not WordPress or custom-defined.\n    prefix: \"/shows/\",\n\n    //Cache for API data\n    schedule: {\n      data: null\n    },\n    all: {\n      data: null\n    },\n\n  },\n\n  //The built-in router that creates a dedicated Shows page by injecting page content for shows, broadcasts, and hosts directly into the same container box as the schedule.\n  router: {\n\n    enable: true,\n\n    //Enables or disables updating page titles\n    enableTitles: true,\n\n    //Not usually necessary since all paths are\n    //relative and start with !#/\n    baseUrlOrPath: \"/shows.html\",\n    // baseUrlOrPath: \"/\",  // <------------------- WordPress\n\n    loadingHtml: '<i class=\"creek-loading-icon fa fa-spinner fa-spin fa-2x\"></i>',\n\n    //Allows you to call them \"programs\" or\n    // \"shows\" or \"content\" or whatever.\n    showsName: \"shows\",\n\n    prefix: \"#!/\",\n    // prefix: \"/shows/\" // <------------------- WordPress\n\n    linkReplacements: {\n      \"/shows/\": \"#!/shows/\",\n      \"/broadcasts/view/\": \"#!/broadcasts/\",\n      \"/broadcasts/\": \"#!/broadcasts/\",\n      \"/profiles/\": \"#!/profiles/\",\n      // \"#play\": \"javascript:\",\n      // \"#volume\": \"javascript:\"\n    }\n\n  },\n\n  persist: {\n\n    /*\n    Documentation notes:\n    - Use .creek-persist-link to make links target the iframe rather than the window.\n    - Use .creek-persist to make that element get persisted, rather than deleted when the page loads.\n    */\n\n    type: \"singlepage\",\n\n    enable: false,\n\n    settings: {\n\n      //Persistence through Magic Iframe:\n      // Places everything into an iframe, except for the main audio toolbar, <head>, <body>, and a few user-defined elements.\n      iframe: {\n\n        mainElement: \"#creek-audio-toolbar\"\n\n      },\n\n      //Persistence through Content Injection:\n      // This persistence technique intercepts link clicks, and injects the intended page content into the main page container. This, rather than refreshing the page and breaking any active audio players.\n      singlepage: {\n\n        //domain:\n        // The domain of the website. If a link contains this domain, then follow normal content injection behavior, rather than treating it like an external link that should send the browser entirely to the URL. (Example: if a link href has a full URL like \"http://station-name.org/about\" rather than just \"/about\")\n        domain: document.domain,\n\n        //EXPERIMENTAL FEATURE\n        //loadNewAssets:\n        // Load new CSS / JS: Iterate over the JS and CSS objects in the intended page, find ones that aren't already on the page, and add them to the <head> or <body> of the document.\n        loadNewAssets: false,\n\n        //container:\n        // ID of container element. Leave out the: #\n        container: \"#creek-persist-container\",\n\n        // Loading indicator settings:\n        // How long to wait before showing the loading indicator.\n        loadingIndicatorDelay: 800,\n        // Whether or not the loading indicator is currently active.\n        loadingStatus: false,\n\n        //onLoading: useful for doing things while hte page is loading, especially displaying a loading bar.\n        onLoading: function(){ },\n\n        //onLoading: useful for doing things when the page is done loading, especially for hiding a loading bar.\n        onLoaded: function(){ },\n\n        //Ran when the page is done loading.\n        onComplete: function(){ },\n\n        //onCompleteArray:\n        // An array of functions that are all called when the page is done loading, allowing you to push() functions to this array. Useful in cases where there are multiple callbacks that must be fired, and these callbacks are located in different scripts loaded at different times in the page's lifetime.\n        onCompleteArray: [],\n\n        //ignorePaths:\n        // If these strings are found in the link's 'href' attribute, then clicking on them will fully refresh the page, bypassing the persistence function (where otherwise the intended page content is injected into the DOM).\n        ignorePaths: [\n          'wp-admin'\n          // '/programmer-portal/',\n          // '/programmer-portal',\n          // '/quarterly-issues/',\n          // '/quarterly-issues'\n        ]\n\n      }\n    }\n  }\n\n}\n\n\n//Combine defaults with any options provided in Creek.init({...})\nmodule.exports.init = function(config){\n\n  var defaults = module.exports.defaults;\n\n  //----------------------------------\n  // Set up shortcut variables:\n  //----------------------------------\n  if(typeof config.domain != 'undefined'){\n    // config = jQuery.extend(true, {}, unfilteredData, {data: { station: { domain { config.domain } } });\n    defaults.station.domain = config.domain;\n  }\n  if(typeof config.id != 'undefined'){\n    // config = jQuery.extend(true, {}, unfilteredData, {data: { station: config.id } });\n    defaults.station.id = config.id;\n  }\n  if(typeof config.stream != 'undefined'){\n    // config = jQuery.extend(true, {}, unfilteredData, {data: { station: config.id } });\n    defaults.streams.main = { url: config.stream.url };\n  }\n  if(typeof config.ssl != 'undefined'){\n    // config = jQuery.extend(true, {}, unfilteredData, {data: { station: { domain { config.domain } } });\n    defaults.station.ssl = config.ssl;\n  }\n\n  //----------------------------------\n  // Combine data:\n  //----------------------------------\n  var newDataPlusDefaults = jQuery.extend(true, {}, defaults, config);\n\n  //----------------------------------\n  // Set up default fixes:\n  //----------------------------------\n  if(newDataPlusDefaults.router.enable){\n\n    newDataPlusDefaults.shows.prefix = newDataPlusDefaults.router.prefix;\n\n  }\n\n  //Set up URL prefix for schedule and the archives\n  newDataPlusDefaults.schema = newDataPlusDefaults.station.ssl ? \"https\" : \"http\";\n  newDataPlusDefaults.url_prefix = newDataPlusDefaults.schema+\"://\"+newDataPlusDefaults.station.domain;\n\n  // Debug output:\n  // console.log(newDataPlusDefaults);\n  // console.log(config);\n\n  return newDataPlusDefaults;\n\n}\n","module.exports.init = function(config, Creek){\n\n  var active = typeof config.debug != 'undefined' && config.debug;\n\n  return {\n    active: active,\n    log: function(message){\n      if(active){\n        console.log(message);\n      }\n    }\n  }\n\n}\n","\nvar $ = require('jquery');\n\nmodule.exports.init = function(Creek){\n\n  return {\n\n    refresh: function(Creek){\n\n      Creek.debug.log(\"Refreshing content.\");\n\n      //Send Google Analytics pageview\n      if(typeof ga != 'undefined'){ ga('send', 'pageview', window.location); }\n\n      //Reset Facebook plugins\n      if(typeof FB != 'undefined') FB.XFBML.parse();\n\n      //Reset SoundManager2\n      if(typeof Creek.sm2_bar != 'undefined'){\n        Creek.sm2_bar.replaceAudioTags();\n        Creek.sm2_bar.build();\n        Creek.sm2_bar.initiate(window);\n      }\n\n      //Reset inline image popup\n      $(function(){\n        //Check if it exists\n        if($('.image-popup-vertical-fit').length)\n          $('.image-popup-vertical-fit').magnificPopup({\n            type: 'image'\n            // other options\n          });\n      });\n\n    }\n\n  }\n\n}\n","\nvar $ = require('jquery');\nvar jQuery = $;\nvar soundManager = require('../node_modules/soundmanager2/script/soundmanager2-nodebug-jsmin.js').soundManager;\n\n\nmodule.exports.init = function(Creek){\n\n  return {\n\n    // current: {\n    // selected: {\n    //   title: \"Show title / audio file title\",\n    //   // type: \"live\",\n    //   type: \"file\",\n    //   Show: null,\n    //   Track: null //normally null\n    //   // Track: { ... }\n    // },\n    soundManager2_url: '',\n    player: {}, //placeholder for SM2 object\n    selected: null,\n    state: null,\n    current_player_id: null, //!!!! TODO: make this work\n    html: {\n      toolbar: {}\n    },\n    util: {},\n    streamUrl: '',\n    update: function(data){\n\n      if(data.type == 'live'){\n\n        //Set up the selected audio\n        data.Show = Creek.data.broadcasting.now;\n        data.Track = Creek.data.broadcasting.Track;\n        Creek.audio.selected = data;\n\n        Creek.debug.log('Updating live.');\n\n        //\n        //!!!!! JUST USE \"AUDIO\" INSTEAD? DECIDE ON THIS. !!!!!!\n        //\n        // //Update HTML elements\n        // $('.creek-live-data .creek-show-title').html(data.title);\n        // $('.creek-live-data a.creek-show-link').attr(\"href\", data.originURL);\n\n      }\n      else if(data.type == 'file'){\n\n        Creek.debug.log('Updating file.');\n\n        //Set up the selected audio\n        data.Show = null;\n        data.Track = null;\n        Creek.audio.selected = data;\n\n      }\n\n      //Update HTML elements\n      $('.creek-live-data .creek-audio-title').html(data.title);\n      $('.creek-live-data a.creek-audio-link').attr('href', data.originURL);\n\n      //Display the image for the show.\n      if(data.Show && data.Show.Image){\n        var img_size = Creek.data.audio.toolbar.showImageSize;\n        var show_url = Creek.data.shows.prefix+data.Show.short_name;\n        $('.creek-audio-show-image img').attr(\"src\", data.Show.Image[\"url_\"+img_size]);\n        $('.creek-audio-show-image').attr(\"href\", show_url);\n        $('body').addClass(\"creek-audio-has-show-image\");\n      }\n      else{\n        $('body').removeClass(\"creek-audio-has-show-image\");\n      }\n\n      //Show the audio toolbar\n      var tbv = \"creek-audio-toolbar-visible\";\n      if(Creek.data.audio.toolbar.enable && !$('body').hasClass(tbv)){\n        Creek.debug.log(\"Toolbar enabled.\")\n        $(function(){\n          $('body').addClass(tbv);\n        });\n      }\n\n      Creek.audio.updateTrack(data);\n\n    },\n    updateTrack: function(data){\n\n      if(typeof data.Track != 'undefined' && data.Track && typeof data.Track.id != 'undefined'){\n\n        $('.creek-live-data .creek-track-none').fadeOut(function(){\n\n          $('.creek-live-data .creek-track-artist').html(data.Track.artist);\n          $('.creek-live-data .creek-track-title').html(data.Track.title);\n\n          //!!!!!!!!!!!!!!!!!!!!\n          // !!! NOPE THIS AIN'T WERKING UNTIL I GET\n          //     MY CDN DOWN IN THESE PARTS YO\n          // ALBUM-ART !!!!!!!!!\n          //\n          // TODO:\n          // - data.Track.lastfm_art >> data.Track.album_art\n          // - remove PRP from buy button link below\n          //\n          // // $('.creek-buy-track-button').attr('href', 'http://prpfm.creek.fm/tracks/buy/'+data.Track.id);\n          // // alert(data.Track.lastfm_art);\n          // var image_url = lastfm_art_url + data.Track.lastfm_art;\n\n          // //Show album art if available\n          // if(data.Track.lastfm_art && (album_art_previous != data.Track.lastfm_art || !album_art_previous ))\n          //   $('.creek-live-data .creek-album-art').html('<img src=\"'+image_url+'\" />');\n          // // else\n\n          // //Hide image if not provided, or if it's missing/404\n          // // if(!data.Track.lastfm_art || !Creek.util.images.imageExists(image_url)) $('.creek-live-data .creek-album-art').html('');\n          // if(!data.Track.lastfm_art)\n          //   $('.creek-live-data .creek-album-art').html('');\n\n          //Last, make sure it's faded in, once data in is place.\n          $('.creek-live-data .creek-track, .creek-live-data .creek-track-album-art').fadeIn(function(){})\n\n          // album_art_previous = data.Track.lastfm_art;\n          //\n          // ALBUM-ART !!!!!!!!!\n          //!!!!!!!!!!!!!!!!!!!!\n\n\n          // Creek.debug.log(data.Track.artist);\n\n        });\n\n      }\n      else{\n        $('.creek-live-data .creek-track, .creek-live-data .creek-track-album-art').fadeOut(500, function(){\n          $('.creek-live-data .creek-track-none').fadeIn()\n        });\n      }\n\n    },\n\n    setState: {\n\n      playing: function(){\n\n        Creek.audio.state = \"playing\";\n\n        $(\"body\").addClass('creek-audio-playing');\n        $(\"body\").removeClass('creek-audio-loading');\n        $(\"body\").removeClass('creek-audio-error');\n\n        //Switch classes on the button\n        $(\".creek-audio-main-button\")\n          .removeClass('creek-audio-play-button')\n          .addClass('creek-audio-pause-button');\n\n      },\n      paused: function(){\n\n        Creek.audio.state = \"paused\";\n\n        $(\"body\").removeClass('creek-audio-playing');\n        $(\"body\").removeClass('creek-audio-loading');\n        $(\"body\").removeClass('creek-audio-error');\n\n        //Switch classes on the button\n        $(\".creek-audio-main-button\")\n          .addClass('creek-audio-play-button')\n          .removeClass('creek-audio-pause-button');\n\n      },\n      stopped: function(){\n\n        //Just use the paused state again.\n        //TODO: actually have a stop state?\n        Creek.audio.setState.paused();\n\n        //!!! Put here since pause updates state as well:\n        Creek.audio.state = \"playing\";\n\n      },\n      error: function(){\n\n        $(\"body\").removeClass('creek-audio-playing');\n        $(\"body\").removeClass('creek-audio-loading');\n        $(\"body\").addClass('creek-audio-error');\n\n        Creek.audio.state = \"playing\";\n\n      },\n\n    },\n\n    switchToLive: function(data){\n\n      Creek.debug.log('Switching to live.');\n\n      //Set up broadcasting-based data\n      if(Creek.data.broadcasting.now){\n        var stream_title = Creek.data.broadcasting.now.title;\n        var show_url = Creek.data.shows.prefix + Creek.data.broadcasting.now.short_name || \"#\"\n      }\n      else{\n        var stream_title = Creek.data.station.station_name;\n      }\n\n      //Set up title\n      var title = data.title || stream_title;\n      var originURL = data.originURL || show_url;\n\n      // console.log(\"BOINK\");\n      // console.log(originURL);\n      // console.log(showURL);\n      // console.log(originURL);\n\n      soundManager.stopAll();\n\n      var data_selected = {\n        type: \"live\",\n        title: title,\n        originURL: originURL,\n        Show: Creek.data.broadcasting.now,\n        Track: Creek.data.broadcasting.Track\n      }\n\n      //Update classes on body\n      $(\"body\").addClass('creek-audio-mode-live');\n      $(\"body\").removeClass('creek-audio-mode-file');\n\n      Creek.audio.selected = data_selected;\n\n      Creek.debug.log(Creek.audio.selected);\n\n      Creek.audio.update(data_selected);\n\n      Creek.audio.setState.stopped();\n\n      $('.creek-audio-switch-to-live').addClass('creek-hide');\n\n    },\n\n    switchToFile: function(data){\n\n      var title = data.title || Creek.data.station.title;\n      var originURL = data.originURL || \"#\";\n\n      Creek.audio.update({\n        type:\"file\",\n        title: title,\n        originURL: originURL\n      });\n\n      //Update classes on body\n      $(\"body\").addClass('creek-audio-mode-file');\n      $(\"body\").removeClass('creek-audio-mode-live');\n\n      Creek.audio.setState.stopped();\n\n      $('.creek-audio-switch-to-live').removeClass('creek-hide');\n\n    },\n\n    util: {\n\n      resetSpacerHeight: function(){\n        var h = $('#creek-audio-toolbar').outerHeight() + \"px\";\n        $(\"#creek-audio-toolbar-spacer\").css('height', h);\n        $(\".creek-audio-toolbar-spacer\").css('height', h);\n      }\n\n    },\n\n    analytics: {\n\n      startListening: function(){\n\n        //Send Google Analytics event (start)\n        if(typeof ga != 'undefined'){\n          ga('send', 'event', 'button', 'play', 'stream player');\n        }\n\n        //Start Google Analytics event for listening\n        Creek.listenTimer = setInterval(function(){\n          if(typeof ga != 'undefined'){\n            ga('send', 'event', 'listen', Creek.audio.selected.type, Creek.audio.selected.title, 1);\n          }\n        }, 60000);\n\n        // Creek.debug.log(\"logging!\")\n        // console.log(Creek.audio.selected);\n\n      },\n\n      stopListening: function(){\n\n        //Send Google Analytics event (start)\n        if(typeof ga != 'undefined'){\n          ga('send', 'event', 'button', 'play', 'stream player');\n        }\n\n        //Start Google Analytics event for listening\n        clearInterval(Creek.listenTimer);\n\n      }\n\n\n    }\n\n  }\n\n}\n","/*\n\nA special modification of the SM2 bar-ui for Creek.\n\n\nTODO:\n\n- Document all the changes to the bar-ui js in case of version change.\n\n- find way to make sure that the real bar-ui ID is selected, not just [0]\n\n- going to another page and then coming back while the bar-ui is playing will prevent it from starting again.\n\n*/\n\nvar soundManager = require('../node_modules/soundmanager2/script/soundmanager2-nodebug-jsmin.js').soundManager;\nvar $ = require('jquery');\n\nvar bar_ui_html = require('./templates/audio-player.js');\n\n\n\nmodule.exports.init = function(Creek){\n\n  Creek.debug.log(\"Initialize SM2 audio library.\")\n\n  /*\n\n  ------------------------------------------------------------------\n\n  SoundManager2 - bar-ui.js\n\n  Manual changes:\n  - moved .build to a function that can be called by persist.singlepage, etc.\n  - added all of the events: play, pause, error\n  - added the \"on.resume\" event\n\n  */\n\n  /*jslint plusplus: true, white: true, nomen: true */\n  /* global soundManager, document, console, window */\n\n\n  //Disable this if Creek object is not available\n  // if(typeof Creek != \"undefined\"){\n\n  sm2_bar = {};\n\n  $.fn.outerHTML = function() {\n    return jQuery('<div />').append(this.eq(0).clone()).html();\n  };\n\n  //Replace all of the audio tags with the bar UI.\n  sm2_bar.replaceAudioTags = function(){\n\n    $('.creek-audio-player').replaceWith(function(){\n\n      var audio_files = [];\n\n      $(this).find('source').map(function(){\n        audio_files.push({\n          url: $(this).attr('src'),\n          title: $(this).html() ? $(this).html() : $(this).attr('data-title')\n        })\n      })\n\n      // Creek.debug.log($(this).outerHTML());\n      // Creek.debug.log($(this).attr('data-text-color'));\n\n      //Option: Dark text\n      var dark_text = false;\n      if($(this).attr('data-text-color') == \"#000000\"){\n        Creek.debug.log(\"Dark text!\");\n        dark_text = true;\n      }\n\n      Creek.debug.log(\"Replacing audio player.\");\n      Creek.debug.log(\"Adding files to audio player:\");\n      Creek.debug.log(audio_files);\n\n      //TODO: Make this into an {} object of settings\n      var html = bar_ui_html(audio_files, dark_text);\n\n      // console.log(html);\n\n      return html;\n\n    });\n\n  }\n  //Replace audio tags on page load:\n  $(function(){\n    sm2_bar.replaceAudioTags();\n  });\n\n  sm2_bar.initiate = function(window) {\n  // sm2_bar = function(window) {\n\n    /**\n     * SoundManager 2: \"Bar UI\" player\n     * Copyright (c) 2014, Scott Schiller. All rights reserved.\n     * http://www.schillmania.com/projects/soundmanager2/\n     * Code provided under BSD license.\n     * http://schillmania.com/projects/soundmanager2/license.txt\n     */\n\n    \"use strict\";\n\n    var Player,\n        players = [],\n        // CSS selector that will get us the top-level DOM node for the player UI.\n        playerSelector = '.sm2-bar-ui',\n        playerOptions,\n        utils;\n\n    /**\n     * Slightly hackish: event callbacks.\n     * Override globally by setting window.sm2BarPlayers.on = {}, or individually by window.sm2BarPlayers[0].on = {} etc.\n     */\n    players.on = {\n      //*\n      play: function(player) {\n\n        // Creek.debug.log(\"PLAYINGS!!!!!\");\n\n        // console.log('playing', player);\n        // console.log(player.dom.playlistTarget.innerText);\n\n        //Use innerText or textContent for Firefox\n        var title = player.dom.playlistTarget.innerText || player.dom.playlistTarget.textContent;\n\n        title = title.replace(/(\\r\\n|\\n|\\r)/gm,\"\");\n\n        var originURL = window.location.href;\n\n        Creek.audio.switchToFile({title: title, originURL: originURL});\n\n        Creek.audio.setState.playing();\n\n        // console.log(\"switching to file\");\n        // console.log(Creek.audio);\n\n      },\n      // unpause: function(player) {\n      //   console.log('aiuhfiauhfe', player);\n      // },\n      resume: function(player) {\n\n        players.on.play(player);\n\n        Creek.audio.setState.playing();\n\n      },\n      //Each sound:\n      finish: function(player) {\n\n        Creek.audio.setState.stopped();\n\n      },\n      pause: function(player) {\n\n        //Set playing state of audio player\n        Creek.audio.setState.paused();\n\n      },\n      error: function(player) {\n\n        Creek.audio.setState.error();\n\n      },\n      // End of playlist:\n      end: function(player) {\n\n        Creek.audio.setState.stopped();\n\n      }\n      //*/\n    };\n\n    playerOptions = {\n      // useful when multiple players are in use, or other SM2 sounds are active etc.\n      stopOtherSounds: true,\n      // CSS class to let the browser load the URL directly e.g., <a href=\"foo.mp3\" class=\"sm2-exclude\">download foo.mp3</a>\n      excludeClass: 'sm2-exclude'\n    };\n\n    soundManager.setup({\n      // trade-off: higher UI responsiveness (play/progress bar), but may use more CPU.\n      html5PollingInterval: 50,\n      flashVersion: 9\n    });\n\n    // soundManager.onready(function() {\n\n    //   var nodes, i, j;\n\n    //   nodes = utils.dom.getAll(playerSelector);\n\n    //   if (nodes && nodes.length) {\n    //     for (i=0, j=nodes.length; i<j; i++) {\n    //       players.push(new Player(nodes[i]));\n    //     }\n    //   }\n\n    // });\n\n    /**\n     * player bits\n     */\n\n    Player = function(playerNode) {\n\n      var css, dom, extras, playlistController, soundObject, actions, actionData, defaultItem, defaultVolume, firstOpen, exports;\n\n      css = {\n        disabled: 'disabled',\n        selected: 'selected',\n        active: 'active',\n        legacy: 'legacy',\n        noVolume: 'no-volume',\n        playlistOpen: 'playlist-open'\n      };\n\n      dom = {\n        o: null,\n        playlist: null,\n        playlistTarget: null,\n        playlistContainer: null,\n        time: null,\n        player: null,\n        progress: null,\n        progressTrack: null,\n        progressBar: null,\n        duration: null,\n        volume: null\n      };\n\n      // prepended to tracks when a sound fails to load/play\n      extras = {\n        loadFailedCharacter: '<span title=\"Failed to load/play.\" class=\"load-error\">✖</span>'\n      };\n\n      function stopOtherSounds() {\n\n        if (playerOptions.stopOtherSounds) {\n          soundManager.stopAll();\n        }\n\n      }\n\n      function callback(method) {\n        if (method) {\n          // fire callback, passing current turntable object\n          if (exports.on && exports.on[method]) {\n            exports.on[method](exports);\n          } else if (players.on[method]) {\n            players.on[method](exports);\n          }\n        }\n      }\n\n      function getTime(msec, useString) {\n\n        // convert milliseconds to hh:mm:ss, return as object literal or string\n\n        var nSec = Math.floor(msec/1000),\n            hh = Math.floor(nSec/3600),\n            min = Math.floor(nSec/60) - Math.floor(hh * 60),\n            sec = Math.floor(nSec -(hh*3600) -(min*60));\n\n        // if (min === 0 && sec === 0) return null; // return 0:00 as null\n\n        return (useString ? ((hh ? hh + ':' : '') + (hh && min < 10 ? '0' + min : min) + ':' + ( sec < 10 ? '0' + sec : sec ) ) : { 'min': min, 'sec': sec });\n\n      }\n\n      function setTitle(item) {\n\n        // given a link, update the \"now playing\" UI.\n\n        // if this is an <li> with an inner link, grab and use the text from that.\n        var links = item.getElementsByTagName('a');\n\n        if (links.length) {\n          item = links[0];\n        }\n\n        // remove any failed character sequence, also\n        dom.playlistTarget.innerHTML = '<ul class=\"sm2-playlist-bd\"><li>' + item.innerHTML.replace(extras.loadFailedCharacter, '') + '</li></ul>';\n\n        if (dom.playlistTarget.getElementsByTagName('li')[0].scrollWidth > dom.playlistTarget.offsetWidth) {\n          // this item can use <marquee>, in fact.\n          dom.playlistTarget.innerHTML = '<ul class=\"sm2-playlist-bd\"><li><marquee>' + item.innerHTML + '</marquee></li></ul>';\n        }\n\n      }\n\n      function makeSound(url) {\n\n        var sound = soundManager.createSound({\n\n          url: url,\n\n          volume: defaultVolume,\n\n          whileplaying: function() {\n\n            var progressMaxLeft = 100,\n                left,\n                width;\n\n            left = Math.min(progressMaxLeft, Math.max(0, (progressMaxLeft * (this.position / this.durationEstimate)))) + '%';\n            width = Math.min(100, Math.max(0, (100 * this.position / this.durationEstimate))) + '%';\n\n            if (this.duration) {\n\n              dom.progress.style.left = left;\n              dom.progressBar.style.width = width;\n\n              // TODO: only write changes\n              dom.time.innerHTML = getTime(this.position, true);\n\n            }\n\n          },\n\n          onbufferchange: function(isBuffering) {\n\n            if (isBuffering) {\n              utils.css.add(dom.o, 'buffering');\n            } else {\n              utils.css.remove(dom.o, 'buffering');\n            }\n\n          },\n\n          onplay: function() {\n            utils.css.swap(dom.o, 'paused', 'playing');\n            callback('play');\n          },\n\n          onpause: function() {\n            utils.css.swap(dom.o, 'playing', 'paused');\n            callback('pause');\n          },\n\n          onresume: function() {\n            utils.css.swap(dom.o, 'paused', 'playing');\n            callback('resume');\n          },\n\n          whileloading: function() {\n\n            if (!this.isHTML5) {\n              dom.duration.innerHTML = getTime(this.durationEstimate, true);\n            }\n\n          },\n\n          onload: function(ok) {\n\n            if (ok) {\n\n              dom.duration.innerHTML = getTime(this.duration, true);\n\n            } else if (this._iO && this._iO.onerror) {\n\n              this._iO.onerror();\n\n            }\n\n          },\n\n          onerror: function() {\n\n            // sound failed to load.\n            var item, element, html;\n\n            item = playlistController.getItem();\n\n            if (item) {\n\n              // note error, delay 2 seconds and advance?\n              // playlistTarget.innerHTML = '<ul class=\"sm2-playlist-bd\"><li>' + item.innerHTML + '</li></ul>';\n\n              if (extras.loadFailedCharacter) {\n                dom.playlistTarget.innerHTML = dom.playlistTarget.innerHTML.replace('<li>' ,'<li>' + extras.loadFailedCharacter + ' ');\n                if (playlistController.data.playlist && playlistController.data.playlist[playlistController.data.selectedIndex]) {\n                  element = playlistController.data.playlist[playlistController.data.selectedIndex].getElementsByTagName('a')[0];\n                  html = element.innerHTML;\n                  if (html.indexOf(extras.loadFailedCharacter) === -1) {\n                    element.innerHTML = extras.loadFailedCharacter + ' ' + html;\n                  }\n                }\n              }\n\n            }\n\n            callback('error');\n\n            // load next, possibly with delay.\n\n            if (navigator.userAgent.match(/mobile/i)) {\n              // mobile will likely block the next play() call if there is a setTimeout() - so don't use one here.\n              actions.next();\n            } else {\n              if (playlistController.data.timer) {\n                window.clearTimeout(playlistController.data.timer);\n              }\n              playlistController.data.timer = window.setTimeout(actions.next, 2000);\n            }\n\n          },\n\n          onstop: function() {\n\n            utils.css.remove(dom.o, 'playing');\n\n          },\n\n          onfinish: function() {\n\n            var lastIndex, item;\n\n            utils.css.remove(dom.o, 'playing');\n\n            dom.progress.style.left = '0%';\n\n            lastIndex = playlistController.data.selectedIndex;\n\n            callback('finish');\n\n            // next track?\n            item = playlistController.getNext();\n\n            // don't play the same item over and over again, if at end of playlist etc.\n            if (item && playlistController.data.selectedIndex !== lastIndex) {\n\n              playlistController.select(item);\n\n              setTitle(item);\n\n              stopOtherSounds();\n\n              // play next\n              this.play({\n                url: playlistController.getURL()\n              });\n\n            } else {\n\n              // end of playlist case\n\n              // explicitly stop?\n              // this.stop();\n\n              callback('end');\n\n            }\n\n          }\n\n        });\n\n        return sound;\n\n      }\n\n      function playLink(link) {\n\n        // if a link is OK, play it.\n\n        if (soundManager.canPlayURL(link.href)) {\n\n          // if there's a timer due to failure to play one track, cancel it.\n          // catches case when user may use previous/next after an error.\n          if (playlistController.data.timer) {\n            window.clearTimeout(playlistController.data.timer);\n            playlistController.data.timer = null;\n          }\n\n          if (!soundObject) {\n            soundObject = makeSound(link.href);\n          }\n\n          // required to reset pause/play state on iOS so whileplaying() works? odd.\n          soundObject.stop();\n\n          playlistController.select(link.parentNode);\n\n          setTitle(link.parentNode);\n\n          // reset the UI\n          // TODO: function that also resets/hides timing info.\n          dom.progress.style.left = '0px';\n          dom.progressBar.style.width = '0px';\n\n          stopOtherSounds();\n\n          soundObject.play({\n            url: link.href,\n            position: 0\n          });\n\n        }\n\n      }\n\n      function PlaylistController() {\n\n        var data;\n\n        data = {\n\n          // list of nodes?\n          playlist: [],\n\n          // NOTE: not implemented yet.\n          // shuffledIndex: [],\n          // shuffleMode: false,\n\n          // selection\n          selectedIndex: 0,\n\n          loopMode: false,\n\n          timer: null\n\n        };\n\n        function getPlaylist() {\n\n          return data.playlist;\n\n        }\n\n        function getItem(offset) {\n\n          var list,\n              item;\n\n          // given the current selection (or an offset), return the current item.\n\n          // if currently null, may be end of list case. bail.\n          if (data.selectedIndex === null) {\n            return offset;\n          }\n\n          list = getPlaylist();\n\n          // use offset if provided, otherwise take default selected.\n          offset = (offset !== undefined ? offset : data.selectedIndex);\n\n          // safety check - limit to between 0 and list length\n          offset = Math.max(0, Math.min(offset, list.length));\n\n          item = list[offset];\n\n          return item;\n\n        }\n\n        function findOffsetFromItem(item) {\n\n          // given an <li> item, find it in the playlist array and return the index.\n          var list,\n              i,\n              j,\n              offset;\n\n          offset = -1;\n\n          list = getPlaylist();\n\n          if (list) {\n\n            for (i=0, j=list.length; i<j; i++) {\n              if (list[i] === item) {\n                offset = i;\n                break;\n              }\n            }\n\n          }\n\n          return offset;\n\n        }\n\n        function getNext() {\n\n          // don't increment if null.\n          if (data.selectedIndex !== null) {\n            data.selectedIndex++;\n          }\n\n          if (data.playlist.length > 1) {\n\n            if (data.selectedIndex >= data.playlist.length) {\n\n              if (data.loopMode) {\n\n                // loop to beginning\n                data.selectedIndex = 0;\n\n              } else {\n\n                // no change\n                data.selectedIndex--;\n\n                // end playback\n                // data.selectedIndex = null;\n\n              }\n\n            }\n\n          } else {\n\n            data.selectedIndex = null;\n\n          }\n\n          return getItem();\n\n        }\n\n        function getPrevious() {\n\n          data.selectedIndex--;\n\n          if (data.selectedIndex < 0) {\n            // wrapping around beginning of list? loop or exit.\n            if (data.loopMode) {\n              data.selectedIndex = data.playlist.length - 1;\n            } else {\n              // undo\n              data.selectedIndex++;\n            }\n          }\n\n          return getItem();\n\n        }\n\n        function resetLastSelected() {\n\n          // remove UI highlight(s) on selected items.\n          var items,\n              i, j;\n\n          items = utils.dom.getAll(dom.playlist, '.' + css.selected);\n\n          for (i=0, j=items.length; i<j; i++) {\n            utils.css.remove(items[i], css.selected);\n          }\n\n        }\n\n        function select(item) {\n\n          var offset,\n              itemTop,\n              itemBottom,\n              containerHeight,\n              scrollTop,\n              itemPadding,\n              liElement;\n\n          // remove last selected, if any\n          resetLastSelected();\n\n          if (item) {\n\n            liElement = utils.dom.ancestor('li', item);\n\n            utils.css.add(liElement, css.selected);\n\n            itemTop = item.offsetTop;\n            itemBottom = itemTop + item.offsetHeight;\n            containerHeight = dom.playlistContainer.offsetHeight;\n            scrollTop = dom.playlist.scrollTop;\n            itemPadding = 8;\n\n            if (itemBottom > containerHeight + scrollTop) {\n              // bottom-align\n              dom.playlist.scrollTop = itemBottom - containerHeight + itemPadding;\n            } else if (itemTop < scrollTop) {\n              // top-align\n              dom.playlist.scrollTop = item.offsetTop - itemPadding;\n            }\n\n          }\n\n          // update selected offset, too.\n          offset = findOffsetFromItem(item);\n\n          data.selectedIndex = offset;\n\n        }\n\n        function playItemByOffset(offset) {\n\n          var item;\n\n          offset = (offset || 0);\n\n          item = getItem(offset);\n\n          if (item) {\n            playLink(item.getElementsByTagName('a')[0]);\n          }\n\n        }\n\n        function getURL() {\n\n          // return URL of currently-selected item\n          var item, url;\n\n          item = getItem();\n\n          if (item) {\n            url = item.getElementsByTagName('a')[0].href;\n          }\n\n          return url;\n\n        }\n\n        function refreshDOM() {\n\n          // get / update playlist from DOM\n\n          if (!dom.playlist) {\n            if (window.console && console.warn) {\n              console.warn('refreshDOM(): playlist node not found?');\n            }\n            return false;\n          }\n\n          data.playlist = dom.playlist.getElementsByTagName('li');\n\n        }\n\n        function initDOM() {\n\n          dom.playlistTarget = utils.dom.get(dom.o, '.sm2-playlist-target');\n          dom.playlistContainer = utils.dom.get(dom.o, '.sm2-playlist-drawer');\n          dom.playlist = utils.dom.get(dom.o, '.sm2-playlist-bd');\n\n        }\n\n        function init() {\n\n          // inherit the default SM2 volume\n          defaultVolume = soundManager.defaultOptions.volume;\n\n          initDOM();\n          refreshDOM();\n\n          // animate playlist open, if HTML classname indicates so.\n          if (utils.css.has(dom.o, css.playlistOpen)) {\n            // hackish: run this after API has returned\n            window.setTimeout(function() {\n              actions.menu(true);\n            }, 1);\n          }\n\n        }\n\n        init();\n\n        return {\n          data: data,\n          refresh: refreshDOM,\n          getNext: getNext,\n          getPrevious: getPrevious,\n          getItem: getItem,\n          getURL: getURL,\n          playItemByOffset: playItemByOffset,\n          select: select\n        };\n\n      }\n\n      function isRightClick(e) {\n\n        // only pay attention to left clicks. old IE differs where there's no e.which, but e.button is 1 on left click.\n        if (e && ((e.which && e.which === 2) || (e.which === undefined && e.button !== 1))) {\n          // http://www.quirksmode.org/js/events_properties.html#button\n          return true;\n        }\n\n      }\n\n      function getActionData(target) {\n\n        // DOM measurements for volume slider\n\n        if (!target) {\n          return false;\n        }\n\n        actionData.volume.x = utils.position.getOffX(target);\n        actionData.volume.y = utils.position.getOffY(target);\n\n        actionData.volume.width = target.offsetWidth;\n        actionData.volume.height = target.offsetHeight;\n\n        // potentially dangerous: this should, but may not be a percentage-based value.\n        actionData.volume.backgroundSize = parseInt(utils.style.get(target, 'background-size'), 10);\n\n        // IE gives pixels even if background-size specified as % in CSS. Boourns.\n        if (window.navigator.userAgent.match(/msie|trident/i)) {\n          actionData.volume.backgroundSize = (actionData.volume.backgroundSize / actionData.volume.width) * 100;\n        }\n\n      }\n\n      function handleMouseDown(e) {\n\n        var links,\n            target;\n\n        target = e.target || e.srcElement;\n\n        if (isRightClick(e)) {\n          return true;\n        }\n\n        // normalize to <a>, if applicable.\n        if (target.nodeName.toLowerCase() !== 'a') {\n\n          links = target.getElementsByTagName('a');\n          if (links && links.length) {\n            target = target.getElementsByTagName('a')[0];\n          }\n\n        }\n\n        if (utils.css.has(target, 'sm2-volume-control')) {\n\n          // drag case for volume\n\n          getActionData(target);\n\n          utils.events.add(document, 'mousemove', actions.adjustVolume);\n          utils.events.add(document, 'mouseup', actions.releaseVolume);\n\n          // and apply right away\n          return actions.adjustVolume(e);\n\n        }\n\n      }\n\n      function handleClick(e) {\n\n        var evt,\n            target,\n            offset,\n            targetNodeName,\n            methodName,\n            href,\n            handled;\n\n        evt = (e || window.event);\n\n        target = evt.target || evt.srcElement;\n\n        if (target && target.nodeName) {\n\n          targetNodeName = target.nodeName.toLowerCase();\n\n          if (targetNodeName !== 'a') {\n\n            // old IE (IE 8) might return nested elements inside the <a>, eg., <b> etc. Try to find the parent <a>.\n\n            if (target.parentNode) {\n\n              do {\n                target = target.parentNode;\n                targetNodeName = target.nodeName.toLowerCase();\n              } while (targetNodeName !== 'a' && target.parentNode);\n\n              if (!target) {\n                // something went wrong. bail.\n                return false;\n              }\n\n            }\n\n          }\n\n          if (targetNodeName === 'a') {\n\n            // yep, it's a link.\n\n            href = target.href;\n\n            if (soundManager.canPlayURL(href)) {\n\n              // not excluded\n              if (!utils.css.has(target, playerOptions.excludeClass)) {\n\n                // find this in the playlist\n\n                playLink(target);\n\n                handled = true;\n\n              }\n\n            } else {\n\n              // is this one of the action buttons, eg., play/pause, volume, etc.?\n              offset = target.href.lastIndexOf('#');\n\n              if (offset !== -1) {\n\n                methodName = target.href.substr(offset+1);\n\n                if (methodName && actions[methodName]) {\n                  handled = true;\n                  actions[methodName](e);\n                }\n\n              }\n\n            }\n\n            // fall-through case\n\n            if (handled) {\n              // prevent browser fall-through\n              return utils.events.preventDefault(evt);\n            }\n\n          }\n\n        }\n\n      }\n\n      function handleMouse(e) {\n\n        var target, barX, barWidth, x, newPosition, sound;\n\n        target = dom.progressTrack;\n\n        barX = utils.position.getOffX(target);\n        barWidth = target.offsetWidth;\n\n        x = (e.clientX - barX);\n\n        newPosition = (x / barWidth);\n\n        sound = soundObject;\n\n        if (sound && sound.duration) {\n\n          sound.setPosition(sound.duration * newPosition);\n\n          // a little hackish: ensure UI updates immediately with current position, even if audio is buffering and hasn't moved there yet.\n          if (sound._iO && sound._iO.whileplaying) {\n            sound._iO.whileplaying.apply(sound);\n          }\n\n        }\n\n        if (e.preventDefault) {\n          e.preventDefault();\n        }\n\n        return false;\n\n      }\n\n      function releaseMouse(e) {\n\n        utils.events.remove(document, 'mousemove', handleMouse);\n\n        utils.css.remove(dom.o, 'grabbing');\n\n        utils.events.remove(document, 'mouseup', releaseMouse);\n\n        utils.events.preventDefault(e);\n\n        return false;\n\n      }\n\n      function init() {\n\n        // init DOM?\n\n        if (!playerNode) {\n          console.warn('init(): No playerNode element?');\n        }\n\n        dom.o = playerNode;\n\n        // are we dealing with a crap browser? apply legacy CSS if so.\n        if (window.navigator.userAgent.match(/msie [678]/i)) {\n          utils.css.add(dom.o, css.legacy);\n        }\n\n        if (window.navigator.userAgent.match(/mobile/i)) {\n          // majority of mobile devices don't let HTML5 audio set volume.\n          utils.css.add(dom.o, css.noVolume);\n        }\n\n        dom.progress = utils.dom.get(dom.o, '.sm2-progress-ball');\n\n        dom.progressTrack = utils.dom.get(dom.o, '.sm2-progress-track');\n\n        dom.progressBar = utils.dom.get(dom.o, '.sm2-progress-bar');\n\n        dom.volume = utils.dom.get(dom.o, 'a.sm2-volume-control');\n\n        // measure volume control dimensions\n        if (dom.volume) {\n          getActionData(dom.volume);\n        }\n\n        dom.duration = utils.dom.get(dom.o, '.sm2-inline-duration');\n\n        dom.time = utils.dom.get(dom.o, '.sm2-inline-time');\n\n        playlistController = new PlaylistController();\n\n        defaultItem = playlistController.getItem(0);\n\n        playlistController.select(defaultItem);\n\n        if (defaultItem) {\n          setTitle(defaultItem);\n        }\n\n        utils.events.add(dom.o, 'mousedown', handleMouseDown);\n\n        utils.events.add(dom.o, 'click', handleClick);\n\n        utils.events.add(dom.progressTrack, 'mousedown', function(e) {\n\n          if (isRightClick(e)) {\n            return true;\n          }\n\n          utils.css.add(dom.o, 'grabbing');\n          utils.events.add(document, 'mousemove', handleMouse);\n          utils.events.add(document, 'mouseup', releaseMouse);\n\n          return handleMouse(e);\n\n        });\n\n      }\n\n      // ---\n\n      actionData = {\n\n        volume: {\n          x: 0,\n          y: 0,\n          width: 0,\n          height: 0,\n          backgroundSize: 0\n        }\n\n      };\n\n      actions = {\n\n        play: function(offsetOrEvent) {\n\n          /**\n           * This is an overloaded function that takes mouse/touch events or offset-based item indices.\n           * Remember, \"auto-play\" will not work on mobile devices unless this function is called immediately from a touch or click event.\n           * If you have the link but not the offset, you can also pass a fake event object with a target of an <a> inside the playlist - e.g. { target: someMP3Link }\n           */\n\n          var target,\n              href,\n              e;\n\n          if (offsetOrEvent !== undefined && !isNaN(offsetOrEvent)) {\n            // smells like a number.\n            return playlistController.playItemByOffset(offsetOrEvent);\n          }\n\n          // DRY things a bit\n          e = offsetOrEvent;\n\n          if (e && e.target) {\n\n            target = e.target || e.srcElement;\n\n            href = target.href;\n\n          }\n\n          // haaaack - if null due to no event, OR '#' due to play/pause link, get first link from playlist\n          if (!href || href.indexOf('#') !== -1) {\n            href = dom.playlist.getElementsByTagName('a')[0].href;\n          }\n\n          if (!soundObject) {\n            soundObject = makeSound(href);\n          }\n\n          // edge case: if the current sound is not playing, stop all others.\n          if (!soundObject.playState) {\n            stopOtherSounds();\n          }\n\n          // TODO: if user pauses + unpauses a sound that had an error, try to play next?\n          soundObject.togglePause();\n\n          // special case: clear \"play next\" timeout, if one exists.\n          // edge case: user pauses after a song failed to load.\n          if (soundObject.paused && playlistController.data.timer) {\n            window.clearTimeout(playlistController.data.timer);\n            playlistController.data.timer = null;\n          }\n\n        },\n\n        pause: function() {\n\n          if (soundObject && soundObject.readyState) {\n            soundObject.pause();\n          }\n\n        },\n\n        resume: function() {\n\n          if (soundObject && soundObject.readyState) {\n            soundObject.resume();\n          }\n\n        },\n\n        stop: function() {\n\n          // just an alias for pause, really.\n          // don't actually stop because that will mess up some UI state, i.e., dragging the slider.\n          return actions.pause();\n\n        },\n\n        next: function(/* e */) {\n\n          var item, lastIndex;\n\n          // special case: clear \"play next\" timeout, if one exists.\n          if (playlistController.data.timer) {\n            window.clearTimeout(playlistController.data.timer);\n            playlistController.data.timer = null;\n          }\n\n          lastIndex = playlistController.data.selectedIndex;\n\n          item = playlistController.getNext(true);\n\n          // don't play the same item again\n          if (item && playlistController.data.selectedIndex !== lastIndex) {\n            playLink(item.getElementsByTagName('a')[0]);\n          }\n\n        },\n\n        prev: function(/* e */) {\n\n          var item, lastIndex;\n\n          lastIndex = playlistController.data.selectedIndex;\n\n          item = playlistController.getPrevious();\n\n          // don't play the same item again\n          if (item && playlistController.data.selectedIndex !== lastIndex) {\n            playLink(item.getElementsByTagName('a')[0]);\n          }\n\n        },\n\n        shuffle: function(e) {\n\n          // NOTE: not implemented yet.\n\n          var target = (e ? e.target || e.srcElement : utils.dom.get(dom.o, '.shuffle'));\n\n          if (target && !utils.css.has(target, css.disabled)) {\n            utils.css.toggle(target.parentNode, css.active);\n            playlistController.data.shuffleMode = !playlistController.data.shuffleMode;\n          }\n\n        },\n\n        repeat: function(e) {\n\n          var target = (e ? e.target || e.srcElement : utils.dom.get(dom.o, '.repeat'));\n\n          if (target && !utils.css.has(target, css.disabled)) {\n            utils.css.toggle(target.parentNode, css.active);\n            playlistController.data.loopMode = !playlistController.data.loopMode;\n          }\n\n        },\n\n        menu: function(ignoreToggle) {\n\n          var isOpen;\n\n          isOpen = utils.css.has(dom.o, css.playlistOpen);\n\n          // hackish: reset scrollTop in default first open case. odd, but some browsers have a non-zero scroll offset the first time the playlist opens.\n          if (playlistController && !playlistController.data.selectedIndex && !firstOpen) {\n            dom.playlist.scrollTop = 0;\n            firstOpen = true;\n          }\n\n          // sniff out booleans from mouse events, as this is referenced directly by event handlers.\n          if (typeof ignoreToggle !== 'boolean' || !ignoreToggle) {\n\n            if (!isOpen) {\n              // explicitly set height:0, so the first closed -> open animation runs properly\n              dom.playlistContainer.style.height = '0px';\n            }\n\n            isOpen = utils.css.toggle(dom.o, css.playlistOpen);\n\n          }\n\n          // playlist\n          dom.playlistContainer.style.height = (isOpen ? dom.playlistContainer.scrollHeight : 0) + 'px';\n\n        },\n\n        adjustVolume: function(e) {\n\n          /**\n           * NOTE: this is the mousemove() event handler version.\n           * Use setVolume(50), etc., to assign volume directly.\n           */\n\n          var backgroundMargin,\n              pixelMargin,\n              target,\n              value,\n              volume;\n\n          value = 0;\n\n          target = dom.volume;\n\n          // safety net\n          if (e === undefined) {\n            return false;\n          }\n\n          if (!e || e.clientX === undefined) {\n            // called directly or with a non-mouseEvent object, etc.\n            // proxy to the proper method.\n            if (arguments.length && window.console && window.console.warn) {\n              console.warn('Bar UI: call setVolume(' + e + ') instead of adjustVolume(' + e + ').');\n            }\n            return actions.setVolume.apply(this, arguments);\n          }\n\n          // based on getStyle() result\n          // figure out spacing around background image based on background size, eg. 60% background size.\n          // 60% wide means 20% margin on each side.\n          backgroundMargin = (100 - actionData.volume.backgroundSize) / 2;\n\n          // relative position of mouse over element\n          value = Math.max(0, Math.min(1, (e.clientX - actionData.volume.x) / actionData.volume.width));\n\n          target.style.clip = 'rect(0px, ' + (actionData.volume.width * value) + 'px, ' + actionData.volume.height + 'px, ' + (actionData.volume.width * (backgroundMargin/100)) + 'px)';\n\n          // determine logical volume, including background margin\n          pixelMargin = ((backgroundMargin/100) * actionData.volume.width);\n\n          volume = Math.max(0, Math.min(1, ((e.clientX - actionData.volume.x) - pixelMargin) / (actionData.volume.width - (pixelMargin*2)))) * 100;\n\n          // set volume\n          if (soundObject) {\n            soundObject.setVolume(volume);\n          }\n\n          defaultVolume = volume;\n\n          return utils.events.preventDefault(e);\n\n        },\n\n        releaseVolume: function(/* e */) {\n\n          utils.events.remove(document, 'mousemove', actions.adjustVolume);\n          utils.events.remove(document, 'mouseup', actions.releaseVolume);\n\n        },\n\n        setVolume: function(volume) {\n\n          // set volume (0-100) and update volume slider UI.\n\n          var backgroundSize,\n              backgroundMargin,\n              backgroundOffset,\n              target,\n              from,\n              to;\n\n          if (volume === undefined || isNaN(volume)) {\n            return;\n          }\n\n          if (dom.volume) {\n\n            target = dom.volume;\n\n            // based on getStyle() result\n            backgroundSize = actionData.volume.backgroundSize;\n\n            // figure out spacing around background image based on background size, eg. 60% background size.\n            // 60% wide means 20% margin on each side.\n            backgroundMargin = (100 - backgroundSize) / 2;\n\n            // margin as pixel value relative to width\n            backgroundOffset = actionData.volume.width * (backgroundMargin/100);\n\n            from = backgroundOffset;\n            to = from + ((actionData.volume.width - (backgroundOffset*2)) * (volume/100));\n\n            target.style.clip = 'rect(0px, ' + to + 'px, ' + actionData.volume.height + 'px, ' + from + 'px)';\n\n          }\n\n          // apply volume to sound, as applicable\n          if (soundObject) {\n            soundObject.setVolume(volume);\n          }\n\n          defaultVolume = volume;\n\n        }\n\n      };\n\n      init();\n\n      // TODO: mixin actions -> exports\n\n      exports = {\n        // Per-instance events: window.sm2BarPlayers[0].on = { ... } etc. See global players.on example above for reference.\n        on: null,\n        actions: actions,\n        dom: dom,\n        playlistController: playlistController\n      };\n\n      return exports;\n\n    };\n\n    // barebones utilities for logic, CSS, DOM, events etc.\n\n    utils = {\n\n      array: (function() {\n\n        function compare(property) {\n\n          var result;\n\n          return function(a, b) {\n\n            if (a[property] < b[property]) {\n              result = -1;\n            } else if (a[property] > b[property]) {\n              result = 1;\n            } else {\n              result = 0;\n            }\n            return result;\n          };\n\n        }\n\n        function shuffle(array) {\n\n          // Fisher-Yates shuffle algo\n\n          var i, j, temp;\n\n          for (i = array.length - 1; i > 0; i--) {\n            j = Math.floor(Math.random() * (i+1));\n            temp = array[i];\n            array[i] = array[j];\n            array[j] = temp;\n          }\n\n          return array;\n\n        }\n\n        return {\n          compare: compare,\n          shuffle: shuffle\n        };\n\n      }()),\n\n      css: (function() {\n\n        function hasClass(o, cStr) {\n\n          return (o.className !== undefined ? new RegExp('(^|\\\\s)' + cStr + '(\\\\s|$)').test(o.className) : false);\n\n        }\n\n        function addClass(o, cStr) {\n\n          if (!o || !cStr || hasClass(o, cStr)) {\n            return false; // safety net\n          }\n          o.className = (o.className ? o.className + ' ' : '') + cStr;\n\n        }\n\n        function removeClass(o, cStr) {\n\n          if (!o || !cStr || !hasClass(o, cStr)) {\n            return false;\n          }\n          o.className = o.className.replace(new RegExp('( ' + cStr + ')|(' + cStr + ')', 'g'), '');\n\n        }\n\n        function swapClass(o, cStr1, cStr2) {\n\n          var tmpClass = {\n            className: o.className\n          };\n\n          removeClass(tmpClass, cStr1);\n          addClass(tmpClass, cStr2);\n\n          o.className = tmpClass.className;\n\n        }\n\n        function toggleClass(o, cStr) {\n\n          var found,\n              method;\n\n          found = hasClass(o, cStr);\n\n          method = (found ? removeClass : addClass);\n\n          method(o, cStr);\n\n          // indicate the new state...\n          return !found;\n\n        }\n\n        return {\n          has: hasClass,\n          add: addClass,\n          remove: removeClass,\n          swap: swapClass,\n          toggle: toggleClass\n        };\n\n      }()),\n\n      dom: (function() {\n\n        function getAll(param1, param2) {\n\n          var node,\n              selector,\n              results;\n\n          if (arguments.length === 1) {\n\n            // .selector case\n            node = document.documentElement;\n            // first param is actually the selector\n            selector = param1;\n\n          } else {\n\n            // node, .selector\n            node = param1;\n            selector = param2;\n\n          }\n\n          // sorry, IE 7 users; IE 8+ required.\n          if (node && node.querySelectorAll) {\n\n            results = node.querySelectorAll(selector);\n\n          }\n\n          return results;\n\n        }\n\n        function get(/* parentNode, selector */) {\n\n          var results = getAll.apply(this, arguments);\n\n          // hackish: if an array, return the last item.\n          if (results && results.length) {\n            return results[results.length-1];\n          }\n\n          // handle \"not found\" case\n          return results && results.length === 0 ? null : results;\n\n        }\n\n        function ancestor(nodeName, element, checkCurrent) {\n\n          var result;\n\n          if (!element || !nodeName) {\n            return element;\n          }\n\n          nodeName = nodeName.toUpperCase();\n\n          // return if current node matches.\n          if (checkCurrent && element && element.nodeName === nodeName) {\n            return element;\n          }\n\n          while (element && element.nodeName !== nodeName && element.parentNode) {\n            element = element.parentNode;\n          }\n\n          return (element && element.nodeName === nodeName ? element : null);\n\n        }\n\n        return {\n          ancestor: ancestor,\n          get: get,\n          getAll: getAll\n        };\n\n      }()),\n\n      position: (function() {\n\n        function getOffX(o) {\n\n          // http://www.xs4all.nl/~ppk/js/findpos.html\n          var curleft = 0;\n\n          if (o.offsetParent) {\n\n            while (o.offsetParent) {\n\n              curleft += o.offsetLeft;\n\n              o = o.offsetParent;\n\n            }\n\n          } else if (o.x) {\n\n              curleft += o.x;\n\n          }\n\n          return curleft;\n\n        }\n\n        function getOffY(o) {\n\n          // http://www.xs4all.nl/~ppk/js/findpos.html\n          var curtop = 0;\n\n          if (o.offsetParent) {\n\n            while (o.offsetParent) {\n\n              curtop += o.offsetTop;\n\n              o = o.offsetParent;\n\n            }\n\n          } else if (o.y) {\n\n              curtop += o.y;\n\n          }\n\n          return curtop;\n\n        }\n\n        return {\n          getOffX: getOffX,\n          getOffY: getOffY\n        };\n\n      }()),\n\n      style: (function() {\n\n        function get(node, styleProp) {\n\n          // http://www.quirksmode.org/dom/getstyles.html\n          var value;\n\n          if (node.currentStyle) {\n\n            value = node.currentStyle[styleProp];\n\n          } else if (window.getComputedStyle) {\n\n            value = document.defaultView.getComputedStyle(node, null).getPropertyValue(styleProp);\n\n          }\n\n          return value;\n\n        }\n\n        return {\n          get: get\n        };\n\n      }()),\n\n      events: (function() {\n\n        var add, remove, preventDefault;\n\n        add = function(o, evtName, evtHandler) {\n          // return an object with a convenient detach method.\n          var eventObject = {\n            detach: function() {\n              return remove(o, evtName, evtHandler);\n            }\n          };\n          if (window.addEventListener) {\n            o.addEventListener(evtName, evtHandler, false);\n          } else {\n            o.attachEvent('on' + evtName, evtHandler);\n          }\n          return eventObject;\n        };\n\n        remove = (window.removeEventListener !== undefined ? function(o, evtName, evtHandler) {\n          return o.removeEventListener(evtName, evtHandler, false);\n        } : function(o, evtName, evtHandler) {\n          return o.detachEvent('on' + evtName, evtHandler);\n        });\n\n        preventDefault = function(e) {\n          if (e.preventDefault) {\n            e.preventDefault();\n          } else {\n            e.returnValue = false;\n            e.cancelBubble = true;\n          }\n          return false;\n        };\n\n        return {\n          add: add,\n          preventDefault: preventDefault,\n          remove: remove\n        };\n\n      }()),\n\n      features: (function() {\n\n        var getAnimationFrame,\n            localAnimationFrame,\n              localFeatures,\n              prop,\n              styles,\n            testDiv,\n            transform;\n\n          testDiv = document.createElement('div');\n\n        /**\n         * hat tip: paul irish\n         * http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n         * https://gist.github.com/838785\n         */\n\n        localAnimationFrame = (window.requestAnimationFrame\n          || window.webkitRequestAnimationFrame\n          || window.mozRequestAnimationFrame\n          || window.oRequestAnimationFrame\n          || window.msRequestAnimationFrame\n          || null);\n\n        // apply to window, avoid \"illegal invocation\" errors in Chrome\n        getAnimationFrame = localAnimationFrame ? function() {\n          return localAnimationFrame.apply(window, arguments);\n        } : null;\n\n        function has(prop) {\n\n          // test for feature support\n          var result = testDiv.style[prop];\n\n          return (result !== undefined ? prop : null);\n\n        }\n\n        // note local scope.\n        localFeatures = {\n\n          transform: {\n            ie: has('-ms-transform'),\n            moz: has('MozTransform'),\n            opera: has('OTransform'),\n            webkit: has('webkitTransform'),\n            w3: has('transform'),\n            prop: null // the normalized property value\n          },\n\n          rotate: {\n            has3D: false,\n            prop: null\n          },\n\n          getAnimationFrame: getAnimationFrame\n\n        };\n\n        localFeatures.transform.prop = (\n          localFeatures.transform.w3 ||\n          localFeatures.transform.moz ||\n          localFeatures.transform.webkit ||\n          localFeatures.transform.ie ||\n          localFeatures.transform.opera\n        );\n\n        function attempt(style) {\n\n          try {\n            testDiv.style[transform] = style;\n          } catch(e) {\n            // that *definitely* didn't work.\n            return false;\n          }\n          // if we can read back the style, it should be cool.\n          return !!testDiv.style[transform];\n\n        }\n\n        if (localFeatures.transform.prop) {\n\n          // try to derive the rotate/3D support.\n          transform = localFeatures.transform.prop;\n          styles = {\n            css_2d: 'rotate(0deg)',\n            css_3d: 'rotate3d(0,0,0,0deg)'\n          };\n\n          if (attempt(styles.css_3d)) {\n            localFeatures.rotate.has3D = true;\n            prop = 'rotate3d';\n          } else if (attempt(styles.css_2d)) {\n            prop = 'rotate';\n          }\n\n          localFeatures.rotate.prop = prop;\n\n        }\n\n        testDiv = null;\n\n        return localFeatures;\n\n      }())\n\n    };\n\n    // ---\n\n\n    sm2_bar.build = function(){\n\n      var nodes,\n        i, j;\n\n      nodes = utils.dom.getAll(playerSelector);\n\n      console.log(nodes);\n\n      if (nodes && nodes.length) {\n        for (i=0, j=nodes.length; i<j; i++) {\n\n          // console.log(\"FUCK YOU \"+nodes[i].id);\n\n          players.push(new Player(nodes[i]));\n        }\n      }\n\n    }\n\n    // expose to global\n    window.sm2BarPlayers = players;\n    window.sm2BarPlayerOptions = playerOptions;\n    window.SM2BarPlayer = Player;\n    // ---\n\n  }\n  // }(window);\n\n  sm2_bar.initiate(window);\n\n\n  soundManager.setup({\n    // trade-off: higher UI responsiveness (play/progress bar), but may use more CPU.\n    html5PollingInterval: 50,\n    flashVersion: 9\n  });\n\n\n  soundManager.onready(function() {\n\n\n    // console.log(Creek);\n    // console.log(sm2_bar);\n\n    // sm2_bar.initiate(window);\n\n    Creek.debug.log(\"SoundManager2 loaded.\")\n\n\n    sm2_bar.build();\n\n\n  });\n\n\n  //Uhh, add soundManager to exports...\n  // Does this even work?\n  sm2_bar.soundManager;\n\n  return sm2_bar;\n\n\n}\n","/*\n\nSee Creek theme documentation for how to use this player:\nhttp://help.creek.fm/\n\nTODO:\n\n- Call pre-rolls \"Ads\" or \"messages\" and give them more metadata, esp. option to be preroll or something else:\n  { ads: [ {type: \"preroll\", id: \"safe-driving-intro2\", url: \"http://...\"}, ... ] }\n\n- Change Last.fm art URL to Creek's album art CDN.\n\n- Only add the player elements if this is enabled. Otherwise station has its own player HTML.\n\n- Fix all the vars related to album art.\n\n*/\n\nvar $ = require('jquery');\nvar jQuery = $;\nvar soundManager = require('../node_modules/soundmanager2/script/soundmanager2-nodebug-jsmin.js').soundManager;\n\n\nmodule.exports.init = function(Creek){\n\n  Creek.audio.stream = {};\n\n  //Initialize SoundManager2\n  soundManager.url = Creek.audio.soundManager2_url || \"/\";\n  soundManager.flashVersion = 9;\n  soundManager.preferFlash = false; // for visualization effects\n  soundManager.useHighPerformance = true; // keep flash on screen, boost performance\n  soundManager.wmode = 'transparent'; // transparent SWF, if possible\n  soundManager.useFastPolling = true; // increased JS callback frequency\n\n  //!!! Album art\n  // var lastfm_art_url = \"http://userserve-ak.last.fm/serve/64s/\";\n  // var album_art_previous = \"\";\n\n  //!!! TODO: selective-async:\n  // Selectively include this template only if toolbar is enabled.\n  Creek.audio.toolbar = {\n\n    html: Creek.util.fixLinks(require('./templates/audio-toolbar.js')),\n\n    buildHtml: function(){\n\n      //Create mobile audio player toolbar\n      $(Creek.data.audio.toolbar.container).append(Creek.audio.toolbar.html);\n\n      //Add spacer to make sure that the bottom of the page\n      $(\"#content\").append('<div id=\"creek-audio-toolbar-spacer\">&nbsp;</div>');\n\n      Creek.audio.util.resetSpacerHeight();\n\n    }\n\n  }\n\n\n  Creek.audio.stream.setUrl = function(streamUrl, restart){\n\n    //Set stream data\n    // if(stream.url){\n    //   Creek.debug.log('Setting stream URL to: '+Creek.audio.stream.currentUrl);\n    // }\n\n    var restart = restart || false;\n\n    Creek.audio.stream.currentUrl = streamUrl;\n\n    console.log(Creek.audio.stream.currentUrl);\n\n    if(restart){\n      Creek.audio.stop();\n      Creek.audio.play();\n    }\n\n  }\n\n  Creek.audio.stream.setUrlFromStationApi = function(data){\n\n    var stream = {url: ''}\n    if(typeof data.streams != 'undefined' && typeof Creek.data.stream == 'undefined'){\n      //Get stream address from streams API data: either \"website\" or \"main\"\n      stream = data.streams.website || data.streams.main;\n      Creek.audio.stream.currentUrl = stream.url;\n    }\n    //Allow init shortcut: \"Creek.init({ ... stream: { url: \"http://...\" } })\"\n    else if(typeof Creek.data.stream != 'undefined') {\n      stream.url = Creek.data.stream.url;\n      Creek.debug.log(\"Custom stream: \"+Creek.data.stream.url);\n    }\n\n    //Add stream to the default object as well\n    Creek.audio.stream.setUrl(stream.url);\n    // Creek.data.streams.url = stream.url;\n\n  }\n\n  Creek.audio.play = function(e){\n\n    //Stop all previous sounds (like bar-ui)\n    // soundManager.stopAll();\n\n    /*\n\n    Google Analytics\n\n    */\n\n\n    Creek.debug.log('Playing...');\n\n    //Play file if file is selected\n    if(Creek.audio.selected.type == 'file'){\n\n      soundManager.resumeAll();\n\n      // !!! TODO: Need a better way of getting the actual bar-ui ID\n      // if(typeof window.sm2BarPlayers[0] != \"undefined\"){\n      //   window.sm2BarPlayers[0].actions.play()\n      // }\n\n      // window.sm2BarPlayer.actions.play()\n\n      Creek.debug.log('Playing file again.');\n\n    }\n    else{\n\n      Creek.debug.log('Playing live stream again.');\n\n      console.log(Creek.audio.stream.currentUrl);\n\n      Creek.audio.player = soundManager.createSound({\n       // optional id, for getSoundById() look-ups etc. If omitted, an id will be generated.\n       id: 'creek-audio-player-live',\n       url: Creek.audio.stream.currentUrl,\n       volume: 100,\n       // autoPlay: true,\n      //  whileloading: function() { console.log(this.id + ' is loading'); }\n      });\n\n      Creek.audio.player.play({\n        onplay: function() {\n          Creek.audio.setState.playing();\n        },\n        onpause: function() {\n          Creek.audio.setState.paused();\n        },\n        onstop: function() {\n          Creek.audio.setState.stopped();\n        },\n        onerror: function() {\n          Creek.audio.setState.error();\n        }\n      });\n\n    }\n\n    // Creek.debug.log('Initializing stream: '+ Creek.streamPlayer.streamUrl);\n\n    // Set up audio\n    //\n    // If preroll enabled, then play preroll first:\n    // if(typeof Creek.streamPlayer.prerolls.enable != 'undefined' && Creek.streamPlayer.prerolls.enable && !Creek.util.cookies.read('preroll')){\n\n    //   Creek.debug.log(getRandomPreroll());\n\n    //   Creek.debug.log('Starting stream (with pre-roll).')\n\n    //   Creek.util.cookies.create('preroll', 1, Creek.streamPlayer.preroll.timeBeforeNext);\n\n    // }\n    // else{\n\n      // Creek.debug.log('Starting stream.')\n\n      // Creek.util.cookies.delete('preroll');\n\n    // }\n\n    //Add loading class to document body (removed when sound starts)\n    // $(\"body\").addClass('creek-audio-loading');\n\n    Creek.audio.setState.playing();\n\n    Creek.audio.analytics.startListening();\n\n  }\n\n\n  Creek.audio.pause = function(e){\n\n    soundManager.pauseAll();\n    // Creek.audio.player.stop();\n\n    //Only unload if it's the live stream\n    if(Creek.audio.selected.type == 'live'){\n      if(Creek.audio.player.loaded){\n        Creek.audio.player.unload();\n      }\n    }\n\n    // Creek.audio.setState.paused();\n\n    //Send Google Analytics event (stop)\n    if(typeof ga != 'undefined'){\n      ga('send', 'event', 'button', 'stop', 'stream player');\n    }\n\n  }\n\n  Creek.audio.stop = function(e){\n\n    soundManager.pauseAll();\n    // Creek.audio.player.stop();\n\n    //Destroy if it's the live stream\n    if(Creek.audio.selected.type == 'live'){\n      if(Creek.audio.player.loaded){\n        Creek.audio.player.destruct();\n      }\n    }\n\n    //!!! This is already called by SM2 events...\n    // Creek.audio.setState.stopped();\n\n  }\n\n\n  Creek.audio.toggle = function(){\n\n    var before = Creek.audio.state+\"\"; //add empty string for cloning\n\n    //If playing, then pause audio\n    if(Creek.audio.state == \"playing\"){\n      Creek.audio.pause();\n    }\n    //For all other states (paused, stopped, errored) play audio\n    else {\n      Creek.audio.play();\n    }\n\n    var after = Creek.audio.state+\"\"; //add  empty string for cloning\n\n    Creek.debug.log(\"Toggling audio from \"+before+\" to \"+after+\".\");\n\n  }\n\n  //Do functions that should happen after page is loaded.\n  $(function(){\n\n    //!!!Only add the player elements if this is indeed enabled.\n    //\n    // !!! TODO: make sure that this is actually working and NECESSARY too\n    //\n    // console.log(Creek.audio)\n\n    if(Creek.data.audio.toolbar.enable){\n      Creek.audio.toolbar.buildHtml();\n    }\n\n    //Switch back to stream when creek-switch-to-live is clicked\n    $('body').on('click', '.creek-audio-switch-to-live', function(e){\n      Creek.debug.log('Clicked switch-to-live.');\n      Creek.audio.switchToLive({originURL:null, title: null});\n    })\n\n    //Play audio when play button is pressed\n    $('body').on('click', '.creek-audio-play-button', function(e){\n      Creek.audio.play(e);\n    });\n\n    // TODO: This should be pause, since it's actually pausing.\n    //Stop stream when stop button is pressed\n    $('body').on('click', '.creek-audio-pause-button', function(e){\n      Creek.audio.pause(e);\n    });\n\n    // //Handle post-pre-roll and post-whatever:\n    // // Play stream after first audio file ends (if it does end at all)\n    // $(\"#creek-audio-jp\").bind($.jPlayer.event.ended, function(event) {\n    //   $(this)\n    //     .jPlayer(\"clearMedia\")\n    //     .jPlayer(\"setMedia\", { mp3: Creek.streamPlayer.streamUrl })\n    //     // .jPlayer(\"play\")\n    // });\n\n  });\n\n\n\n  // Preroll advertisement functionality\n  function checkPrerollEnabled(){\n    if(typeof Creek.audio.prerolls.enable != 'undefined' && Creek.audio.prerolls.enable && !Cookies.read('preroll')){\n      return true;\n    }else{\n      return false;\n    }\n  }\n  function getRandomPreroll(){\n    var pr_count = Creek.audio.prerolls.urls.length;\n    var pr_index = Math.floor(Math.random() * (pr_count - 0)) + 0;\n    return Creek.audio.prerolls.urls[pr_index];\n  }\n\n\n  //Initialize Volume tool\n  $(function(){\n    var volume_init = require('./creek-audio-volume.js').init(Creek);\n  })\n\n\n  // Creek.sm2_bar.build();\n\n  return Creek.audio;\n\n  // } // end check for whether Creek is defined at all\n\n} //End global function container\n","/*\n\n  Persistence: iframe\n\n  - Keeps audio playing when users explore the website and move between pages.\n  - Loads page content dynamically, without actually changing the page.\n  - Has a few callback options for different stage in the request lifecycle.\n\n*/\n\nvar $ = require('jquery');\nvar jQuery = $;\n\n//persistInstance.historyData = [];\n\n\nmodule.exports.init = function(Creek){\n\n  //Return null early if not enabled or this is the wrong type\n  if(!Creek.data.persist.enable || Creek.data.persist.type != \"iframe\"){\n    return null;\n  }\n\n  //Use settings for the selected type of persistence\n  var persistSettings = Creek.data.persist.settings[Creek.data.persist.type];\n\n  Creek.debug.log(\"Persistence domain: \"+persistSettings.domain, 3);\n\n  persistInstance = {};\n\n  //prepare request var\n  //(to prevent race condition if links are clicked quickly)\n  //!!! wait, where is this code? what was this?\n\n  /*\n\n  iFrame-based persistence\n\n  Docs:\n\n  Use the `.creek-persist` class to make elements stay in the same (parent) scope, rather than only inside the `<iframe>`.\n\n  Submit forms to parent frame by adding `target=\"_parent\"` to your `<form>` opening tag. As a fallback, this will submit to the current frame if it's not inside an iframe.\n\n\n  */\n\n  /*\n\n  - Vue methods for channel selector should access the methods of the parent frame.\n  - If channel changed, then start playing audio for that channel.\n\n  */\n\n  persistInstance.url = function(url){\n    window.location = url;\n  }\n\n  persistInstance.checkFirefox = function(){\n    return navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n  }\n\n  persistInstance.checkInternetExplorer = function() {\n\n    var ua = window.navigator.userAgent;\n\n    var msie = ua.indexOf('MSIE ');\n    if (msie > 0) {\n        // IE 10 or older => return version number\n        return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);\n    }\n\n    var trident = ua.indexOf('Trident/');\n    if (trident > 0) {\n        // IE 11 => return version number\n        var rv = ua.indexOf('rv:');\n        return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);\n    }\n\n    var edge = ua.indexOf('Edge/');\n    if (edge > 0) {\n       // Edge (IE 12+) => return version number\n       return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);\n    }\n\n    // other browser\n    return false;\n\n  }\n\n\n  persistInstance.checkIfBrowserSupport = function(){\n\n    if(\n      //Not Firefox\n      !persistInstance.checkFirefox()\n      //Not IE\n      && !persistInstance.checkInternetExplorer()\n    ){\n      return true;\n    }\n    else{\n      return false;\n    }\n\n  }\n  persistInstance.insideIframe = function(){\n\n    if(\n      //Not already inside an iframe\n      window.frameElement\n    ){\n      Creek.debug.log(\"Persistence: Yep, already inside an iframe.\", 3);\n      return true;\n    }\n    else{\n      Creek.debug.log(\"Persistence: Not already inside iframe.\", 3);\n      return false;\n    }\n\n  }\n\n  persistInstance.createMagicIframe = function(){\n\n    //Create iframe with the current URL\n    // ...but only if it's not already inside an iframe,\n    //    and other important conditions (see above).\n    if (\n      persistInstance.checkIfBrowserSupport()\n    ) {\n\n      if(!persistInstance.insideIframe()){\n\n        $(\"body\").addClass(\"creek-persist-reset-body-css\");\n\n        Creek.debug.log(\"Persistence: Conjuring up magic frame.\", 3);\n\n        //Hide everything on the page, in the body, except for a few special elements.\n        $(\"body *\").not('#creek-audio-toolbar, #creek-audio-toolbar *, .creek-persist, .creek-persist *').remove();\n\n        /*\n        Add the magic iframe to the body that contains the current page without modification.\n\n        Notice that it includes a few special attributes:\n\n        - It's 100% width and height, with no border, so that it fills the entire window and isn't discernable as anything but a regular, non-iframed page.\n\n        - Whenever its page URL/location changes (the \"onLoad\" event) it calls a function that updates the parent URL of the window. Otherwise the browser's URL bar look \"stuck\" when you change pages.\n\n        */\n        $(\"body\").prepend('<iframe id=\"creek-persist-audio-iframe\" src=\"'+window.location+'\" style=\"position:absolute; height:100%; width: 100%; z-index: -1; border:0; height: 1px; top:0; left:0; min-height: 100%; -webkit-overflow-scrolling: touch;\" onLoad=\"Creek.data.persist.instance.updateCurrentURLFromIframe(this.contentWindow.location);\"></iframe>')\n\n        Creek.debug.log(\"Persistence: Showing audio toolbar.\");\n\n        //Display the audio toolbar:\n        $('#creek-audio-toolbar')\n          .css(\"display\", \"block\")\n          .removeClass(\"creek-hide\");\n\n      }\n      //Otherwise, don't initiate magic iframe and just hide the audio toolbar.\n      else{\n\n        Creek.debug.log(\"Persistence: Hiding audio toolbar.\");\n        $('#creek-audio-toolbar')\n          .css(\"display\", \"none\")\n          .addClass(\"creek-hide\")\n          .addClass(\"yeahdude\");\n\n      }\n\n    }else{\n\n      Creek.debug.log(\"Persistence: Browser doesn't support iframe persistence!\", 3);\n\n      //Show the audio toolbar, but only if it's not already inside an iframe\n      if(persistInstance.insideIframe()){\n        Creek.debug.log(\"Hiding audio toolbar.\");\n        $('#creek-audio-toolbar')\n          .css(\"display\", \"none\")\n          .addClass(\"creek-hide\");\n      }\n      else{\n        $('#creek-audio-toolbar')\n          .css(\"display\", \"block\")\n          .removeClass(\"creek-hide\");\n      }\n\n    }\n\n  }\n\n  //Updates the parent window's URL so that it matches the iframe\n  persistInstance.updateCurrentURLFromIframe = function(url){\n\n    //Update page title\n    var title = document.getElementById(\"creek-persist-audio-iframe\").contentDocument.title;\n    document.title = title;\n\n    //Update URL\n    // window.history.pushState(\"yeah\", title, url);\n    window.history.replaceState(\"Page\", title, url);\n\n  }\n\n  //Change the iframe's URL\n  persistInstance.updateIframeURL = function(url){\n    document.getElementById(\"creek-persist-audio-iframe\").src = url;\n  }\n\n  // Creek.togglePlayFromIFrame = function(url){\n\n  //   //Update page title\n  //   var title = document.getElementById(\"creek-persist-audio-iframe\").contentDocument.title;\n  //   document.title = title;\n\n  //   //Update URL\n  //   // window.history.pushState(\"yeah\", title, url);\n  //   window.history.replaceState(\"Page\", title, url);\n\n  // }\n\n  //Make all of the links that point to other domains change the parent window URL.\n\n  //...\n\n\n  //Do things that should happen after page load.\n  $(function(){\n\n    Creek.debug.log(\"hello\", 3);\n\n    //Create the magic iframe that contains the actual website content.\n    persistInstance.createMagicIframe();\n\n    //Links inside audio toolbar and creek-persist eleemnts should update the iframe\n    // These links have the \".creek-persist-link\" class\n    $(document).on(\"click\", \".creek-persist-link\", function(event){\n      console.log(\"Persist link clicked.\")\n      var url = $(this).attr(\"href\");\n      Creek.updateIframeURL(url);\n      event.preventDefault();\n      return false;\n    })\n\n  })\n\n\n  return persistInstance;\n\n} //end export function container\n","\nvar io = require('socket.io-client');\n\n\nvar activateStation = function(Creek, data){\n\n  Creek.debug.log(\"Stream address ready:\")\n  Creek.debug.log(data, 1);\n\n  //!!! TODO: why was I doing this?\n  //Move streams to the station\n  // Creek.data.station.streams = data.streams;\n  // Creek.data.station.prerolls = data.prerolls;\n\n  Creek.audio.stream.setUrlFromStationApi(data);\n\n  //Set preroll data\n  // if(typeof Creek.data.station.prerolls != 'undefined'){\n  //   Creek.audio.prerolls = Creek.data.station.prerolls;\n  // }\n\n\n}\n\nvar updateBroadcasting = function(Creek, data){\n\n  Creek.debug.log(data);\n\n  if(!data){\n    data = { now: { title: \"\", short_name: \"\" }, next: {}, Track: {} };\n  }\n\n  Creek.data.broadcasting = data;\n\n  //Don't update UI or Creek.audio.selected if playing an audio file.\n  if(Creek.audio.selected && Creek.audio.selected.type == 'file'){\n    return;\n  }\n\n  var audio_data = data;\n  audio_data.now = data.now || { title:\"\", short_name: \"\" };\n  // audio_data.now = data.now || { title:Creek.data.station.title };\n  audio_data.next = data.next || {};\n\n  //Set up data for current show\n  audio_data.type = \"live\";\n  audio_data.title = audio_data.now.title || null;\n  audio_data.originURL = Creek.data.shows.prefix + audio_data.now.short_name;\n\n  console.log(\"XXXXCXCXCXZVCXVCZXVCX\");\n  console.log(Creek.data.shows.prefix);\n  console.log(audio_data);\n\n  if(Creek.data.demo && !audio_data.Track)\n    audio_data.Track = {\n      artist: \"Dr. Demo\",\n      title: \"Demo Song\",\n      album: \"The Demo Album\",\n      label: \"Demos, Inc.\"\n    }\n\n  // console.log(Creek.audio);\n  Creek.audio.update(audio_data);\n\n  Creek.audio.util.resetSpacerHeight();\n\n}\n\n\nmodule.exports.init = function(Creek){\n\n  //Set up URL based on HTTPS / HTTP\n  // if(Creek.data.station.ssl){\n  //   var socket_url = 'https://'+Creek.data.station.domain+':3443/';\n  // }\n  // else{\n  //   var socket_url = 'http://'+Creek.data.station.domain+':3305/';\n  // }\n\n  //Always use HTTPS for Socket.io\n  var socket_url = 'https://'+Creek.data.station.domain+':3443/';\n\n\n  var socket = io(socket_url);\n\n  Creek.debug.log(\"Connecting to Live API at: \"+socket_url);\n\n\n  //Handle when the station connects with socket.io\n  socket.on('api connection', function(data){\n\n    Creek.debug.log('Connected to Live API.');\n\n    //Select the station, based on ID supplied in Creek.init({...})\n    socket.emit('station select', Creek.data.station.domain, function(){\n\n      Creek.debug.log(\"Selected station: \"+Creek.data.station.domain);\n\n    });\n\n  })\n\n  //Initialize stream player after it's connected.\n  socket.on('api station', function(data){\n    if(Creek.data.liveApi.enable){\n      activateStation(Creek, data);\n    }\n  })\n\n  //Update Creek data and UI when broadcasting data is updated.\n  socket.on('api broadcasting', function(data){\n    if(Creek.data.liveApi.enable){\n      updateBroadcasting(Creek, data);\n    }\n  })\n\n\n}\n","/*\n\n  Persistence: iframe\n\n  - Keeps audio playing when users explore the website and move between pages.\n  - Loads intended page content into a container element without changing the page.\n  - Has a few callbacks for different stages in the request lifecycle.\n\n*/\n\nvar $ = require('jquery');\nvar jQuery = $;\nvar htmldocFix = require('./jquery-htmldoc-fixer.js')(jQuery);\n\n//persistInstance.historyData = [];\n\n\nmodule.exports.init = function(Creek){\n\n  //Return null early if not enabled or this is the wrong type\n  if(!Creek.data.persist.enable || Creek.data.persist.type != \"singlepage\"){\n    return null;\n  }\n\n  //Use settings for the selected type of persistence\n  var persistSettings = Creek.data.persist.settings[Creek.data.persist.type];\n\n  //HACK: Set up the \"page changed\" thing to fix the broken initial change\n  // in history popstate.\n  persistSettings.pageEverChanged = false;\n\n  persistInstance = {};\n\n  Creek.debug.log(\"Persistence domain: \"+persistSettings.domain);\n  Creek.debug.log(\"Persistence container: \"+persistSettings.container);\n\n  //prepare request var\n  //(to prevent race condition if links are clicked quickly)\n  //!!! wait, where is this code? what was this?\n\n  persistInstance.loading = function(){\n\n    persistInstance.onLoading();\n\n    //Add loading class to body, to show a general \"page loading\" element\n    //but add a timer so that the loading thing is only shown if slow, and check if it's already been loaded\n    persistInstance.loadingStatus = true;\n    setTimeout(function(){\n      if(persistInstance.loadingStatus === true)\n        $('body').addClass('creek-persistence-loading');\n    }, persistInstance.loadingIndicatorDelay);\n\n  }\n\n  persistInstance.loaded = function(){\n\n    persistInstance.onLoaded();\n\n    persistInstance.loadingStatus = false;\n\n    $('body').removeClass('creek-persistence-loading');\n\n  }\n\n  persistInstance.loadElementsWithClass = function(data){\n    $('.creek-sp-load').map(function(){\n      var id = $(this).attr('id')\n      Creek.debug.log('id');\n      var new_HTML_for_element = $(data).find('#'+id).html();\n      $('#'+id).html( new_HTML_for_element );\n    })\n  }\n\n  persistInstance.methods = {\n\n    request_page: {\n      abort: function(){}\n    },\n\n    handleContentData: function(x){\n\n      persistInstance.loaded();\n\n      var title = $(x.data).filter('title').text();\n\n      Creek.debug.log(persistSettings.container);\n\n      // var content = $(x.data).find(Creek.data.persistInstance.container).html();\n      var content = $(x.data).find(persistSettings.container).html();\n      // var content = $(x.data).filter(persistSettings.container).html();\n\n      // console.log($(x.data).filter(persistSettings.container));\n      // console.log($(x.data).filter('title'));\n      // console.log($(x.data).filter('body'));\n      // console.log($(x.data).find('body'));\n      // console.log($(x.data).find('.navbar-wrapper'));\n      // console.log($(x.data).find(persistSettings.container));\n      // console.log($(x.data).find(persistSettings.container).html());\n\n      // console.log(html.find('head').html());\n      // console.log(html.find('head link').attr('href'));\n      // console.log(html.find('head script').html());\n      // console.log(html.find('head script').attr('src'));\n      // console.log($(x.data).find('script').attr('src'));\n      // console.log($(x.data).find('script'));\n      // console.log(x.data)\n      // console.log(x.data.indexOf(\"Creek_Main\"))\n      // console.log(x.data.indexOf(\"Creek_Main\"))\n      // console.log(x.data.indexOf(\"Creek_Main\"))\n      // console.log(htmlll)\n      // console.log(scripts_in_head)\n\n      Creek.debug.log(\"Content:\");\n      Creek.debug.log(content);\n      Creek.debug.log(\"Title: \"+title);\n\n      // Apply all the new CSS/JS\n      doTheNew = function(current_elements, new_elements, attr, tag){\n\n        if(!persistSettings.loadNewAssets){\n          return false;\n        }\n\n        /*\n        console.log('NEW')\n        new_elements.each(function(){  console.log($(this).attr(attr))  })\n\n        console.log('OLD')\n        current_elements.each(function(){  console.log($(this).attr(attr))  })\n\n        */\n\n        new_elements.each(function(){\n\n          var its_new = true;\n\n          var attr_new = $(this).attr(attr);\n          // console.log(attr_new)\n\n\n          if(!attr_new){\n            // console.log('Not new.');\n            return true;\n          }\n\n\n          //Go over current elements to find out if this new one already exists\n          current_elements.each(function(key_n, v_n){\n\n            var attr_current = $(v_n).attr(attr);\n\n            //If it doesn't have an src or href, then skip it\n            if(!attr_current) return true;\n\n              // console.log(attr_current)\n              // console.log(key_n)\n              // console.log(v_n)\n\n              // console.log('cccc: '+attr_current)\n              // console.log('cccc: '+attr_new)\n\n            if(attr_new == attr_current){\n              its_new = false;\n              // console.log('New.')\n            }\n\n          })\n\n          if(its_new){\n\n            if(tag == 'link')\n              $('head').append('<link rel=\"stylesheet\" href=\"'+attr_new+'\" type=\"text/css\" />');\n\n            if(tag == 'script'){\n              // $.getScript( attr_new );\n              // $.getScript( attr_new, function( data, textStatus, jqxhr ) {\n                // console.log( data ); // Data returned\n                // console.log( textStatus ); // Success\n                // console.log( jqxhr.status ); // 200\n                // console.log( \"Load was performed.\" );\n              // });\n              // $('head').append('<script type=\"text/javascript\" src=\"'+attr+'\"></script>');\n\n              var js_html = '<script src=\"'+attr_new+'\" type=\"text/javascript\"></script>';\n\n              // console.log(js_html)\n\n              $('head').append(js_html);\n              // $('head').append('<script src=\"'+attr+'\" type=\"text/javascript\"></script>');\n              // console.log('woooff');\n            }\n\n            console.log('new: '+attr_new)\n\n          }else{\n            // console.log('old: '+attr_new)\n          }\n\n\n        })\n\n      }\n\n\n      // var htmll = x.data;\n      var new_html = $.htmlDoc(x.data);\n\n\n      //Apply new JS in head\n      doTheNew($('head script'), new_html.find('head script'), 'src', 'script');\n\n      //Apply new CSS in head\n      doTheNew($('head link[type=\"text/css\"]'), new_html.find('head link[type=\"text/css\"]'), 'href', 'link');\n\n\n      //Get scripts and execute them in order\n      // var scripts_in_current_head = $('head script');\n      // var scripts_in_new_head = new_html.find('head script');\n      // var css_in_current_head = $('head link[type=\"text/css\"]');\n      // var css_in_new_head = new_html.find('head link[type=\"text/css\"]');\n\n\n      // console.log($(x.data).find('head').html());\n      // console.log($(x.data).find('body').html());\n\n      // console.log($('head').html())\n\n\n      //Update window title with new page title\n      window.document.title = title;\n\n      //only push if link clicked\n      if(x.push_state){\n        window.history.pushState('', title, x.url);\n        //persistInstance.historyData.push(x.data);\n      }\n\n      //Reset JS for:\n      // Magnific Popup\n      if(typeof $.magnificPopup != 'undefined') $.magnificPopup.close();\n\n      //Scroll to top or scroll to scrollPos if defined (by pagination, maybe others later)\n      if(persistInstance.scrollPos)\n        $('html, body').scrollTop(persistInstance.scrollPos);\n      else{\n        //clear out content before scrolling up\n        $(persistSettings.container).html(' ');\n        $('html, body').scrollTop(0);\n      }\n\n      //Replace contents of #creek-sp-container\n      $(persistSettings.container).html(content);\n\n      //Also, replace contents of elements that are marked with .creek-sp-load class\n      persistInstance.loadElementsWithClass(x.data);\n\n      Creek.content.refresh(Creek);\n\n      persistSettings.onComplete()\n\n      //Run all of the functions in here\n      if(typeof persistSettings.onCompleteArray !== \"undefined\"){\n        for (var c = 0; c < persistSettings.onCompleteArray.length; c++) {\n          persistSettings.onCompleteArray[c]();\n        }\n      }\n\n      //alert(persistInstance.historyData[0]);\n\n    },\n\n    loadContent: function(x){\n\n      console.log(x.url);\n\n      //cancel previous request\n      persistInstance.methods.request_page.abort();\n\n      //alert(1);\n\n      //Cover this in case it's not defined,\n      // like when this method is called outside of this script.\n      x.event = x.event || null;\n      x.push_state = x.push_state || true;\n      x.data = x.data || false;\n      x.initial_history_action = x.initial_history_action || false;\n\n      //prevent loading on page load\n      if(x.event == null || x.event.state !== null || x.initial_history_action ){\n\n        persistInstance.loading();\n\n        //   ( v--- history handling)\n        //If data not provided, then load it from URL\n        // if(x.data == false)\n\n          persistInstance.methods.request_page = $.get(x.url, function(data){\n\n            x.data = data;\n\n            persistInstance.methods.handleContentData(x);\n\n          });\n\n  /*\n        //Else, use data (from history state pop)\n        else{\n          //alert(x.data);\n\n          handleContentData(x);\n        }\n  */\n\n      }\n\n    },\n\n    //Check if this URL points to a file (ex. PDF)\n    checkIfFileUrl: function (url) {\n\n      var ext = url.split('.').pop();\n      var end_of_path = url.split('/').pop();\n\n      Creek.debug.log(\"Extension: \"+ext);\n      Creek.debug.log(\"End of path: \"+end_of_path);\n\n      return (\n        end_of_path.indexOf('.') !== -1\n        && ext.length > 1\n        && ext.length < 5\n      );\n\n    },\n\n    //Check if this URL points to a file (ex. PDF)\n    checkIfIgnorePaths: function (url) {\n\n      var url_without_path = url.replace(url, window.location.pathname);\n\n      Creek.debug.log(\"Checking ignore list: \"+url);\n\n      if(typeof persistInstance.ignorePaths != \"undefined\"){\n        if(persistInstance.ignorePaths.indexOf(url_without_path) !== -1){\n          Creek.debug.log(\"Ignoring: \"+url_without_path);\n          return true;\n        }else {\n          Creek.debug.log(\"Not ignoring: \"+url_without_path);\n          return false;\n        }\n      }else{\n        return 0;\n      }\n\n    },\n\n    checkLink: function (link, url) {\n\n      // Creek.debug.log(url.indexOf(\"javascript:\"))\n      Creek.debug.log(\"Checking link's URL: \"+url)\n\n      if(\n\n        url //has URL at all\n        && (url.charAt(0) == '/' || url.indexOf(persistInstance.domain) != -1 ) //not external link\n        && url.indexOf('/admin') !== 0 //not to admin\n        && url.indexOf('/users/oauth_') !== 0 //not to oauth links (facebook sign-in)\n\n        && !persistInstance.methods.checkIfFileUrl(url)\n\n        && !persistInstance.methods.checkIfIgnorePaths(url)\n\n        && !link.hasClass('logout-link') //not logout\n        && !link.hasClass('no-js') //not no-js\n        // url.indexOf('.') === -1 && //no dot (not a file)\n\n        //WordPress\n        && url.indexOf('wp-admin') == -1\n        // && url.indexOf('/wp-admin') == -1\n        && url.indexOf('/feed/') == -1\n        // && url.indexOf('/comments/feed/') == -1\n        && !link.closest(\"#wpadminbar\").length\n        && !link.closest(\".ab-top-menu\").length\n\n      ){\n        Creek.debug.log('Navigating to: '+url);\n        return true;\n\n      //Else, if an external link\n      }else if(\n        url.indexOf(\"javascript:\") != -1 && //not javascript link\n        url.charAt(0) != '#' //not within-page / anchor link\n      ){\n        // Creek.debug.log('Exiting to: '+url);\n        Creek.debug.log('Letting link do its thing: '+url);\n        return false;\n      }\n      //Otherwise do nothing\n      // }else {\n        // Creek.debug.log('Doing nothing with this link.');\n      // }\n    }\n\n  }\n\n\n\n  persistInstance.loadingBar = {\n    start: function(){\n\n      //wait for delay\n      // var delay_timeout = setTimeout( function(){\n        persistInstance.loadingBar.startAnimation();\n      // }, 300);\n\n      // persistInstance.loading.onStart(id);\n\n    },\n    end: function(){\n      persistInstance.loadingBar.endAnimation();\n      // persistInstance.loading.onDone(id);\n    },\n    startAnimation: function(){\n      $('.creek-loading-bar')\n        .addClass('creek-loading-bar-visible')\n        .animate({'width': '50%'}, 300)\n        .animate({'width': '80%'}, 300)\n    },\n    endAnimation: function(){\n      $('.creek-loading-bar')\n        .animate({'width': '100%'}, 150, function(){\n          $(this)\n            .removeClass('creek-loading-bar-visible')\n            .css('width', '1%')\n        })\n\n    }\n  }\n\n  persistInstance.onLoading = function(){\n\n    persistInstance.loadingBar.start()\n\n  }\n  persistInstance.onLoaded = function(){\n\n    persistInstance.loadingBar.end()\n\n  }\n\n  //-----------------------------------------------\n  // Actions to perform after page is loaded:\n  //\n  $(function(){\n  // ^^^ (jQuery shorthand to wait for fully loaded DOM.)\n\n    $(document).on('click', 'a', function(event){\n\n      Creek.debug.log('Click!');\n\n      persistSettings.pageEverChanged = true;\n\n      //if (history.pushState) {\n\n        var url = $(this).attr('href');\n\n        //disable for: remote links, empty links, control panel links\n        if(persistInstance.methods.checkLink($(this), url)){\n\n          event.preventDefault();\n\n          persistInstance.methods.loadContent({\n            url:url, event:event,\n            push_state:true,\n            data: false\n          });\n          //loadContent({url:url, event:event, data: false});\n\n        }\n\n      //}\n\n      /*\n      */\n      //Scroll to top of pagination element if pagination defined\n      var scrollOffset = {};\n      if($(this).closest('.pagination-container').length > 0 && $('.creek-pagination-scrollToHere').length > 0){\n        scrollOffset = $('.creek-pagination-scrollToHere').offset();\n        persistInstance.scrollPos = scrollOffset.top\n      }\n\n    });\n\n\n    $(window).bind(\"popstate\", function(event) {\n\n      //var data = persistInstance.historyData.pop();\n      //loadContent({url:window.location.pathname, event:event.originalEvent, push_state:false, data: data});\n\n      Creek.debug.log(\"History event.\");\n\n      //HACK: Only invoke history if a page has been loaded\n      //      during the user's session so far.\n      if(persistSettings.pageEverChanged){\n\n        Creek.debug.log(\"Travelling through history.\");\n\n        Creek.debug.log(\"Original event:\");\n        Creek.debug.log(event.originalEvent);\n\n        persistInstance.methods.loadContent({\n          url:window.location.pathname,\n          event:event.originalEvent,\n          push_state:false,\n          initial_history_action:true,\n          data: false\n        });\n\n      }\n      else{\n        Creek.debug.log(\"Not changing history. User hasn't changed pages yet.\");\n      }\n\n    });\n\n  });\n\n  persistInstance.url = function(url){\n    persistInstance.methods.loadContent({ url: url });\n  }\n\n  return persistInstance;\n\n} //end export function container\n","/*\n\nRoutes:\n\nLoads Creek station content with a front-end JS router.\n\n*/\n\nmodule.exports.init = function(Creek){\n\n  var $ = require('jquery');\n\n  var moment = require('moment');\n\n  //---------------------------\n  // Vue, for rendering the templates.\n  //---------------------------\n  var Vue = require('vue');\n\n  if(Creek.debug.active){\n    Vue.config.debug = true;\n  }\n\n  var url_prefix = \"https://\"+Creek.data.station.domain;\n  // var url_prefix = Creek.data.schema+\"://\"+Creek.data.station.domain;\n\n  //Add Vue Moment filter\n  Vue = require('./vue-moment.js')(Vue, moment);\n\n\n  var VueRouter = require('vue-router')\n\n  Vue.use(VueRouter)\n\n  //For the search bar on Archives page.\n  Vue.filter('notEmpty', function (value, input) {\n    // here `input` === `this.userInput`\n    return value + input\n  })\n\n  /* ------------------------------------------------------\n\n  Set up routing for the schedule.\n\n  */\n\n  // Define some components\n  var components = {};\n\n  var setTitle = function(title){\n\n    //Disable if disabled.\n    if(!Creek.data.router.enableTitles){\n      return;\n    }\n\n    if(Creek.data.station.title){\n      var append = \" - \"+Creek.data.station.title;\n    }\n    else{\n      var append = \"\";\n    }\n\n    $(\"head title\").html(title+append);\n\n  }\n\n  var swapPageClass = function(page){\n\n    $(\"body\").removeClass (function (index, css) {\n      return (css.match (/(^|\\s)creek-page-\\S+/g) || []).join(' ');\n    });\n    $(\"body\").addClass(\"creek-page-\"+page)\n\n  }\n\n  components.Show = Vue.component('creek-show', {\n    template: Creek.util.fixLinks(require('./templates/show')),\n    data: function(){ return { html: '', title: ''} },\n    route: {\n      data: function (transition) {\n        Creek.debug.log(\"Received data for Show.\");\n        $.getJSON(url_prefix+\"/shows/\"+transition.to.params.short_name+\"?external=1&external_complete=1&callback=?\", function(data){\n          data.html = Creek.util.fixLinks(data.html);\n          // Creek.debug.log(data);\n          setTitle(data.title);\n          transition.next(data)\n        })\n        swapPageClass(\"show creek-page-show-\"+transition.to.params.short_name)\n      }\n    }\n  })\n\n  //Called by route: /shows/*\n  var getShows = function(weekday_number, data){\n\n    // console.log(data);\n\n    var filteredData = {\n      shows: data[weekday_number].programs\n    }\n\n    $(\".creek-weekday\").removeClass(\"selected\");\n    $(\".creek-weekday-\"+weekday_number).addClass(\"selected\");\n\n    // Creek.debug.log(\"Filtered data for schedule:\");\n    // Creek.debug.log(filteredData);\n\n    return filteredData;\n\n  }\n\n\n  components.Shows = Vue.component('creek-shows', {\n    template:  Creek.util.fixLinks(require('./templates/shows')(Creek)),\n    data: function(){\n      return {\n        shows: []\n      }\n    },\n    route: {\n      data: function (transition) {\n\n        //Get weekday\n        if(typeof transition.to.params.weekday_number != 'undefined'){\n          var weekday_number = transition.to.params.weekday_number\n        }\n        else{\n          var weekday_number = moment().format('E');\n        }\n\n        //Get data from schedule if it's already been retrieved\n        if(Creek.data.shows.data !== null){\n          var data = getShows(weekday_number, Creek.data.shows.data);\n          transition.next(data);\n        }\n        else {\n          $.getJSON(url_prefix+\"/api/schedule?callback=?\", function(data){\n            Creek.data.shows.data = data;\n            transition.next(getShows(weekday_number, data));\n          });\n        }\n\n        setTitle(Creek.util.capitalizeFirstLetter(Creek.data.router.showsName));\n        // setTitle(Creek.data.shows.showsName);\n\n        swapPageClass(\"shows\");\n      }\n    }\n  })\n\n  components.Broadcast = Vue.component('creek-broadcast', {\n    template: Creek.util.fixLinks(require('./templates/content-page')(Creek)),\n    data: function(){ return { html: '', title: ''} },\n    route: {\n      data: function (transition) {\n        $.getJSON(url_prefix+\"/broadcasts/\"+ transition.to.params.broadcast_id+\"?json_wrap=1&external=1&external_complete=1&callback=?\", function(data){\n\n          data.html = Creek.util.fixLinks(data.html, \"broadcast\");\n          // Creek.debug.log(data);\n          setTitle(data.title);\n          swapPageClass(\"broadcast\");\n          transition.next(data);\n\n          Creek.content.refresh(Creek);\n\n          // //!!! This is not reliable since it relies on time.\n          // setTimeout(function(){\n          //   Creek.content.refresh(Creek);\n          // }, 100);\n\n          //!!! This is not reliable since it relies on time.\n          setTimeout(function(){\n            Creek.content.refresh(Creek);\n          }, 500);\n\n          // //!!! This is not reliable since it relies on time.\n          // setTimeout(function(){\n          //   Creek.content.refresh(Creek);\n          // }, 1000);\n\n        })\n      },\n      activate: function(transition){\n\n        transition.next();\n\n        // Creek.content.refresh(Creek);\n\n      }\n    }\n  })\n\n  components.Profile = Vue.component('creek-profile', {\n    template: Creek.util.fixLinks(require('./templates/content-page')(Creek)),\n    data: function(){ return { html: '', title: ''} },\n    route: {\n      data: function (transition) {\n        $.getJSON(url_prefix+\"/profiles/\"+transition.to.params.username+\"?json_wrap=1&external=1&external_complete=1&callback=?\", function(data){\n          data.html = Creek.util.fixLinks(data.html, \"profile\");\n          // Creek.debug.log(data);\n          setTitle(data.title);\n          swapPageClass(\"profile\");\n          transition.next(data);\n        })\n      }\n    }\n  })\n\n  components.Schedule = Vue.component('creek-schedule', {\n    template: Creek.util.fixLinks(require('./templates/content-page')(Creek)),\n    data: function(){ return { html: '', title: ''} },\n    route: {\n      data: function (transition) {\n        //Get data from schedule if it's already been retrieved\n        if(Creek.data.shows.schedule.data !== null){\n          transition.next(Creek.data.shows.schedule.data);\n        }\n        else {\n          $.getJSON(url_prefix+\"/shows/schedule?json_wrap=1&external=1&external_complete=1&callback=?\", function(data){\n            data.html = Creek.util.fixLinks(data.html)\n            Creek.data.shows.schedule.data = data;\n            transition.next(data);\n          });\n        }\n        setTitle(\"Schedule\");\n        swapPageClass(\"schedule\");\n      }\n    }\n  })\n\n  components.ShowsAll = Vue.component('creek-shows-all', {\n    template: Creek.util.fixLinks(require('./templates/shows-all')),\n    data: function(){\n      return {\n        shows: [],\n        findTerm: ''\n      }\n    },\n    route: {\n      data: function (transition) {\n        //Get data from schedule if it's already been retrieved\n        if(Creek.data.shows.all.data !== null){\n          transition.next({shows: Creek.data.shows.all.data});\n        }\n        else {\n          $.getJSON(url_prefix+\"/api/shows?callback=?\", function(data){\n            Creek.data.shows.all.data = data;\n            transition.next({shows: Creek.data.shows.all.data});\n          });\n        }\n        setTitle(\"Schedule\");\n        swapPageClass(\"schedule\");\n      }\n    }\n  })\n\n  var App = Vue.extend({})\n  // var router = new VueRouter()\n  var router = new VueRouter({saveScrollPosition: true})\n  // var router = new VueRouter({saveScrollPosition: true, history: true})\n\n  router.map({\n    '/': {\n      component: components.Shows\n    },\n    '/weekday/:weekday_number': {\n      component: components.Shows\n    },\n    '/profiles/:username': {\n      component: components.Profile\n    },\n    '/broadcasts/:broadcast_id': {\n      component: components.Broadcast\n    },\n    '/schedule': {\n      component: components.Schedule\n    },\n    '/all': {\n      component: components.ShowsAll\n    },\n    '/shows/:short_name': {\n      component: components.Show\n    },\n    '/archives': {\n      component: require('./creek-archives').init(Creek, Vue)\n    },\n    '/play': { },\n    // '/:whatever': {\n    //   component: null\n    // },\n    '/:short_name': {\n      component: components.Show\n    },\n  })\n\n\n  var render = function(){\n\n    var container = Creek.data.shows.container;\n\n    //Check for container on the page.\n    if($(container).length < 1){\n      return;\n      Creek.debug.log(\"No container element for shows.\");\n    }\n\n    //Add the router view outlet/container for Vue Router\n    $(container).html(\"<router-view></router-view>\");\n\n    router.start(App, container);\n\n  }\n\n  //When hovering on grouped show titles, move their respective images to be the first element in the image group container, so that CSS can show them\n  $(document).on(\"hover\", \".creek-show-group-title-link\", function(){\n\n    //Set up vars\n    var show_id = $(this).attr(\"data-show-id\");\n    var show_element = $(this).closest(\".creek-show\")\n    var image_group = show_element.find(\".creek-grouped-image-container\")\n    var grouped_image_element = image_group.find(\".creek-grouped-image-\"+show_id);\n\n    //Move the element\n    image_group.prepend(grouped_image_element);\n\n  })\n\n  //Handle running this when page loads, in either Creek basicPersistence or regular page load\n\n  if(typeof Creek.data.persist.settings.singlepage.onCompleteArray){\n    Creek.data.persist.settings.singlepage.onCompleteArray.push(render);\n  }\n\n  //Run on first page load\n  $(function(){\n    render();\n  })\n\n}\n","\nvar $ = require('jquery');\n\nmodule.exports.handlers = {\n  fb: function(url) {\n    var url = url || window.location;\n    var winWidth = 520;\n    var winHeight = 350;\n    var winTop = (screen.height / 2) - (winWidth / 2);\n    var winLeft = (screen.width / 2) - (winHeight / 2);\n    window.open('http://www.facebook.com/sharer.php?s=100&p[url]=' + url, 'sharer', 'top=' + winTop + ',left=' + winLeft + ',toolbar=0,status=0,width=' + winWidth + ',height=' + winHeight);\n  },\n  tw: function(url) {\n    var url = url || window.location,\n        width  = 575,\n        height = 400,\n        left   = ($(window).width()  - width)  / 2,\n        top    = ($(window).height() - height) / 2,\n        opts   = 'status=1' +\n                 ',width='  + width  +\n                 ',height=' + height +\n                 ',top='    + top    +\n                 ',left='   + left;\n    url_encoded = encodeURIComponent(url);\n    window.open('http://twitter.com/share?url='+url_encoded, 'Twitter', opts);\n  }\n}\n\nmodule.exports.init = function(Creek){\n\n  /*---------------------\n\n  Share buttons\n\n  ... and setting them up.\n\n  */\n\n  var share_clicked = function(type, element){\n    var url = element.attr(\"data-url\") || window.location;\n    // console.log(element.attr(\"data-url\"));\n    module.exports.handlers[type](url);\n  }\n\n  //Broadcast button\n  $(document).on(\"click\", \"#Broadcasts .broadcast\", function(){\n    var url = $(this).attr(\"data-url\");\n    // Creek.singlePage.methods.loadContent({url: url});\n  })\n\n  //Activate social buttons\n  $(document).on(\"click\", \".creek-social-button-facebook\", function(){\n    share_clicked(\"fb\", $(this));\n  })\n  $(document).on(\"click\", \".creek-social-button-twitter\", function(){\n    share_clicked(\"tw\", $(this));\n  })\n\n\n  //Email share box\n\n  var html_email_box =\n  '<div class=\"creek-social-email-box creek-hide\">'+\n    '<p>Copy and paste this link into an email:</p>'+\n    '<input type=\"text\" id=\"creek-email-link\" value=\"\" onclick=\"this.select()\" />'+\n    '<span class=\"creek-close\">Close</span>'+\n  '</div>'\n\n  function email_button_render(){\n    $('body').append(html_email_box);\n    // console.log(html_email_box);\n  }\n\n  function email_button_show(element){\n\n    var top = element.offset().top - 3 + \"px\";\n    var left = element.offset().left -3 + \"px\";\n    // console.log(element.offset())\n\n    if(element.attr(\"data-url\")){\n      $(\"#creek-email-link\").val(element.attr(\"data-url\")).focus();\n    }else{\n      $(\"#creek-email-link\").val(window.location).focus();\n    }\n\n    $(\".creek-social-email-box\")\n      .css(\"top\", top)\n      .css(\"left\", left)\n      .removeClass(\"creek-hide\");\n\n  }\n\n  function email_button_hide(element){\n    $(\".creek-social-email-box\").addClass(\"creek-hide\");\n  }\n\n  $(document).on('click', '.creek-social-button-email', function() {\n    // console.log(\"hey\");\n    email_button_show($(this));\n  })\n  $(document).on('click', '.creek-social-email-box .creek-close', function() {\n    email_button_hide($(this));\n  })\n  $(document).on(\"focus\", '#creek-email-link', function(){\n    $(this).focus();\n  });\n\n  $(function(){\n    email_button_render();\n  })\n\n  return module.exports.handlers;\n\n}\n","/*!\n * jQuery JavaScript Library v2.2.0\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2016-01-08T20:02Z\n */\n\n(function( global, factory ) {\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n}(typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Support: Firefox 18+\n// Can't be in strict mode, several libs including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through \"use strict\" call chains. (#13335)\n//\"use strict\";\nvar arr = [];\n\nvar document = window.document;\n\nvar slice = arr.slice;\n\nvar concat = arr.concat;\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar support = {};\n\n\n\nvar\n\tversion = \"2.2.0\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android<4.1\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num != null ?\n\n\t\t\t// Return just the one element from the set\n\t\t\t( num < 0 ? this[ num + this.length ] : this[ num ] ) :\n\n\t\t\t// Return all the elements in a clean array\n\t\t\tslice.call( this );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = jQuery.isArray( copy ) ) ) ) {\n\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray( src ) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject( src ) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type( obj ) === \"function\";\n\t},\n\n\tisArray: Array.isArray,\n\n\tisWindow: function( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\n\t\t// parseFloat NaNs numeric-cast false positives (null|true|false|\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t// adding 1 corrects loss of precision from parseFloat (#15100)\n\t\tvar realStringObj = obj && obj.toString();\n\t\treturn !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;\n\t},\n\n\tisPlainObject: function( obj ) {\n\n\t\t// Not plain objects:\n\t\t// - Any object or value whose internal [[Class]] property is not \"[object Object]\"\n\t\t// - DOM nodes\n\t\t// - window\n\t\tif ( jQuery.type( obj ) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( obj.constructor &&\n\t\t\t\t!hasOwn.call( obj.constructor.prototype, \"isPrototypeOf\" ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// If the function hasn't returned already, we're confident that\n\t\t// |obj| is a plain object, created by {} or constructed with new Object\n\t\treturn true;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn obj + \"\";\n\t\t}\n\n\t\t// Support: Android<4.0, iOS<6 (functionish RegExp)\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code ) {\n\t\tvar script,\n\t\t\tindirect = eval;\n\n\t\tcode = jQuery.trim( code );\n\n\t\tif ( code ) {\n\n\t\t\t// If the code includes a valid, prologue position\n\t\t\t// strict mode pragma, execute code by injecting a\n\t\t\t// script tag into the document.\n\t\t\tif ( code.indexOf( \"use strict\" ) === 1 ) {\n\t\t\t\tscript = document.createElement( \"script\" );\n\t\t\t\tscript.text = code;\n\t\t\t\tdocument.head.appendChild( script ).parentNode.removeChild( script );\n\t\t\t} else {\n\n\t\t\t\t// Otherwise, avoid the DOM node creation, insertion\n\t\t\t\t// and removal by using an indirect global eval\n\n\t\t\t\tindirect( code );\n\t\t\t}\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Support: IE9-11+\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android<4.1\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar tmp, args, proxy;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\tnow: Date.now,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\n// JSHint would error on this code due to the Symbol not being defined in ES5.\n// Defining this global in .jshintrc would create a danger of using the global\n// unguarded in another place, it seems safer to just disable JSHint for these\n// three lines.\n/* jshint ignore: start */\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n/* jshint ignore: end */\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: iOS 8.2 (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( type === \"function\" || jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.2.1\n * http://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2015-10-17\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// General-purpose constants\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// http://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\trescape = /'|\\\\/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, nidselect, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\n\t\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\t\tsetDocument( context );\n\t\t}\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( (m = match[1]) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( (elem = context.getElementById( m )) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && (elem = newContext.getElementById( m )) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[2] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!compilerCache[ selector + \" \" ] &&\n\t\t\t\t(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\n\t\t\t\tif ( nodeType !== 1 ) {\n\t\t\t\t\tnewContext = context;\n\t\t\t\t\tnewSelector = selector;\n\n\t\t\t\t// qSA looks outside Element context, which is not what we want\n\t\t\t\t// Thanks to Andrew Dupont for this workaround technique\n\t\t\t\t// Support: IE <=8\n\t\t\t\t// Exclude object elements\n\t\t\t\t} else if ( context.nodeName.toLowerCase() !== \"object\" ) {\n\n\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\tif ( (nid = context.getAttribute( \"id\" )) ) {\n\t\t\t\t\t\tnid = nid.replace( rescape, \"\\\\$&\" );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", (nid = expando) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\tnidselect = ridentifier.test( nid ) ? \"#\" + nid : \"[id='\" + nid + \"']\";\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[i] = nidselect + \" \" + toSelector( groups[i] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\t\t\t\t}\n\n\t\t\t\tif ( newSelector ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\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\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( div.parentNode ) {\n\t\t\tdiv.parentNode.removeChild( div );\n\t\t}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\t( ~b.sourceIndex || MAX_NEGATIVE ) -\n\t\t\t( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, parent,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9-11, Edge\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\tif ( (parent = document.defaultView) && parent.top !== parent ) {\n\t\t// Support: IE 11\n\t\tif ( parent.addEventListener ) {\n\t\t\tparent.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( parent.attachEvent ) {\n\t\t\tparent.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.className = \"i\";\n\t\treturn !div.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( document.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( div ) {\n\t\tdocElem.appendChild( div ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t});\n\n\t// ID find and filter\n\tif ( support.getById ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\treturn m ? [ m ] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\t// Support: IE6/7\n\t\t// getElementById is not reliable as a find shortcut\n\t\tdelete Expr.find[\"ID\"];\n\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See http://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( document.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( div ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( div.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !div.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibing-combinator selector` fails\n\t\t\tif ( !div.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tdiv.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( div.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === document ? -1 :\n\t\t\t\tb === document ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!compilerCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});\n\n\t\t\t\t\t\tif ( (oldCache = uniqueCache[ dir ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ dir ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\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}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context === document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\tif ( !context && elem.ownerDocument !== document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\n\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( div1 ) {\n\t// Should return 1, but returns 4 (following)\n\treturn div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( div ) {\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\treturn div.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( div ) {\n\tdiv.innerHTML = \"<input/>\";\n\tdiv.firstChild.setAttribute( \"value\", \"\" );\n\treturn div.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( div ) {\n\treturn div.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\nvar rsingleTag = ( /^<([\\w-]+)\\s*\\/?>(?:<\\/\\1>|)$/ );\n\n\n\nvar risSimple = /^.[^:#\\[\\.,]*$/;\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\t/* jshint -W018 */\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\n\t}\n\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\n\t}\n\n\tif ( typeof qualifier === \"string\" ) {\n\t\tif ( risSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter( qualifier, elements, not );\n\t\t}\n\n\t\tqualifier = jQuery.filter( qualifier, elements );\n\t}\n\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t} );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\treturn elems.length === 1 && elem.nodeType === 1 ?\n\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i,\n\t\t\tlen = this.length,\n\t\t\tret = [],\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\t\tret.selector = this.selector ? this.selector + \" \" + selector : selector;\n\t\treturn ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\t// Support: Blackberry 4.6\n\t\t\t\t\t// gEBID returns nodes no longer in the document (#6963)\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t// Always skip document fragments\n\t\t\t\tif ( cur.nodeType < 11 && ( pos ?\n\t\t\t\t\tpos.index( cur ) > -1 :\n\n\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn elem.contentDocument || jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnotwhite = ( /\\S+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( jQuery.isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && jQuery.type( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ) ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis === promise ? newDefer.promise() : this,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add( function() {\n\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 ||\n\t\t\t\t( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred.\n\t\t\t// If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// Add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) )\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n} );\n\n\n// The deferred used on DOM ready\nvar readyList;\n\njQuery.fn.ready = function( fn ) {\n\n\t// Add the callback\n\tjQuery.ready.promise().done( fn );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.triggerHandler ) {\n\t\t\tjQuery( document ).triggerHandler( \"ready\" );\n\t\t\tjQuery( document ).off( \"ready\" );\n\t\t}\n\t}\n} );\n\n/**\n * The ready event handler and self cleanup method\n */\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called\n\t\t// after the browser event has already occurred.\n\t\t// Support: IE9-10 only\n\t\t// Older IE sometimes signals \"interactive\" too soon\n\t\tif ( document.readyState === \"complete\" ||\n\t\t\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\twindow.setTimeout( jQuery.ready );\n\n\t\t} else {\n\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", completed );\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Kick off the DOM ready check even if the user does not\njQuery.ready.promise();\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( jQuery.type( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn chainable ?\n\t\telems :\n\n\t\t// Gets\n\t\tbulk ?\n\t\t\tfn.call( elems ) :\n\t\t\tlen ? fn( elems[ 0 ], key ) : emptyGet;\n};\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\t/* jshint -W018 */\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tregister: function( owner, initial ) {\n\t\tvar value = initial || {};\n\n\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t// use plain assignment\n\t\tif ( owner.nodeType ) {\n\t\t\towner[ this.expando ] = value;\n\n\t\t// Otherwise secure it in a non-enumerable, non-writable property\n\t\t// configurability must be true to allow the property to be\n\t\t// deleted with the delete operator\n\t\t} else {\n\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\tvalue: value,\n\t\t\t\twritable: true,\n\t\t\t\tconfigurable: true\n\t\t\t} );\n\t\t}\n\t\treturn owner[ this.expando ];\n\t},\n\tcache: function( owner ) {\n\n\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t// but we should not, see #8335.\n\t\t// Always return an empty object.\n\t\tif ( !acceptData( owner ) ) {\n\t\t\treturn {};\n\t\t}\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ data ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ prop ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\t\t\towner[ this.expando ] && owner[ this.expando ][ key ];\n\t},\n\taccess: function( owner, key, value ) {\n\t\tvar stored;\n\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\tstored = this.get( owner, key );\n\n\t\t\treturn stored !== undefined ?\n\t\t\t\tstored : this.get( owner, jQuery.camelCase( key ) );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i, name, camel,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key === undefined ) {\n\t\t\tthis.register( owner );\n\n\t\t} else {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( jQuery.isArray( key ) ) {\n\n\t\t\t\t// If \"name\" is an array of keys...\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = key.concat( key.map( jQuery.camelCase ) );\n\t\t\t} else {\n\t\t\t\tcamel = jQuery.camelCase( key );\n\n\t\t\t\t// Try the string as a key before any manipulation\n\t\t\t\tif ( key in cache ) {\n\t\t\t\t\tname = [ key, camel ];\n\t\t\t\t} else {\n\n\t\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\t\tname = camel;\n\t\t\t\t\tname = name in cache ?\n\t\t\t\t\t\t[ name ] : ( name.match( rnotwhite ) || [] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ti = name.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ name[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <= 35-45+\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://code.google.com/p/chromium/issues/detail?id=378607\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\t\tdata === \"false\" ? false :\n\t\t\t\t\tdata === \"null\" ? null :\n\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE11+\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\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\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data, camelKey;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// with the key as-is\n\t\t\t\tdata = dataUser.get( elem, key ) ||\n\n\t\t\t\t\t// Try to find dashed key if it exists (gh-2779)\n\t\t\t\t\t// This is for 2.2.x only\n\t\t\t\t\tdataUser.get( elem, key.replace( rmultiDash, \"-$&\" ).toLowerCase() );\n\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\tcamelKey = jQuery.camelCase( key );\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// with the key camelized\n\t\t\t\tdata = dataUser.get( elem, camelKey );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, camelKey, undefined );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tcamelKey = jQuery.camelCase( key );\n\t\t\tthis.each( function() {\n\n\t\t\t\t// First, attempt to store a copy or reference of any\n\t\t\t\t// data that might've been store with a camelCased key.\n\t\t\t\tvar data = dataUser.get( this, camelKey );\n\n\t\t\t\t// For HTML5 data-* attribute interop, we have to\n\t\t\t\t// store property names with dashes in a camelCase form.\n\t\t\t\t// This might not apply to all properties...*\n\t\t\t\tdataUser.set( this, camelKey, value );\n\n\t\t\t\t// *... In the case of properties that might _actually_\n\t\t\t\t// have dashes, we need to also store a copy of that\n\t\t\t\t// unchanged property.\n\t\t\t\tif ( key.indexOf( \"-\" ) > -1 && data !== undefined ) {\n\t\t\t\t\tdataUser.set( this, key, value );\n\t\t\t\t}\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar isHidden = function( elem, el ) {\n\n\t\t// isHidden might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\t\treturn jQuery.css( elem, \"display\" ) === \"none\" ||\n\t\t\t!jQuery.contains( elem.ownerDocument, elem );\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted,\n\t\tscale = 1,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() { return tween.cur(); } :\n\t\t\tfunction() { return jQuery.css( elem, prop, \"\" ); },\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\tdo {\n\n\t\t\t// If previous iteration zeroed out, double until we get *something*.\n\t\t\t// Use string for doubling so we don't accidentally see scale as unchanged below\n\t\t\tscale = scale || \".5\";\n\n\t\t\t// Adjust and apply\n\t\t\tinitialInUnit = initialInUnit / scale;\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\t\t// Break the loop if scale is unchanged or perfect, or if we've just had enough.\n\t\t} while (\n\t\t\tscale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations\n\t\t);\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([\\w:-]+)/ );\n\nvar rscriptType = ( /^$|\\/(?:java|ecma)script/i );\n\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// Support: IE9\n\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\n// Support: IE9\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE9-11+\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret = typeof context.getElementsByTagName !== \"undefined\" ?\n\t\t\tcontext.getElementsByTagName( tag || \"*\" ) :\n\t\t\ttypeof context.querySelectorAll !== \"undefined\" ?\n\t\t\t\tcontext.querySelectorAll( tag || \"*\" ) :\n\t\t\t[];\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], ret ) :\n\t\tret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, contains, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android<4.1, PhantomJS<2\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android<4.1, PhantomJS<2\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( contains ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0-4.3, Safari<=5.1\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Safari<=5.1, Android<4.2\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE<=11+\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n} )();\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE9\n// See #13393 for more info\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn this;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, j, ret, matched, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\targs = slice.call( arguments ),\n\t\t\thandlers = ( dataPriv.get( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\n\t\t\t\t// a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\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\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, matches, sel, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Support (at least): Chrome, IE9\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG <use> instance trees (#13180)\n\t\t//\n\t\t// Support: Firefox<=42+\n\t\t// Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)\n\t\tif ( delegateCount && cur.nodeType &&\n\t\t\t( event.type !== \"click\" || isNaN( event.button ) || event.button < 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== \"click\" ) ) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matches } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: ( \"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase \" +\n\t\t\"metaKey relatedTarget shiftKey target timeStamp view which\" ).split( \" \" ),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split( \" \" ),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: ( \"button buttons clientX clientY offsetX offsetY pageX pageY \" +\n\t\t\t\"screenX screenY toElement\" ).split( \" \" ),\n\t\tfilter: function( event, original ) {\n\t\t\tvar eventDoc, doc, body,\n\t\t\t\tbutton = original.button;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX +\n\t\t\t\t\t( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -\n\t\t\t\t\t( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY +\n\t\t\t\t\t( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) -\n\t\t\t\t\t( doc && doc.clientTop  || body && body.clientTop  || 0 );\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop, copy,\n\t\t\ttype = event.type,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = this.fixHooks[ type ];\n\n\t\tif ( !fixHook ) {\n\t\t\tthis.fixHooks[ type ] = fixHook =\n\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\t\t\t\t{};\n\t\t}\n\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = new jQuery.Event( originalEvent );\n\n\t\ti = copy.length;\n\t\twhile ( i-- ) {\n\t\t\tprop = copy[ i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Support: Cordova 2.5 (WebKit) (#13255)\n\t\t// All events should have a target; Cordova deviceready doesn't\n\t\tif ( !event.target ) {\n\t\t\tevent.target = document;\n\t\t}\n\n\t\t// Support: Safari 6.0+, Chrome<28\n\t\t// Target should not be a text node (#504, #13143)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\tthis.focus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this.type === \"checkbox\" && this.click && jQuery.nodeName( this, \"input\" ) ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android<4.0\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://code.google.com/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:-]+)[^>]*)\\/>/gi,\n\n\t// Support: IE 10-11, Edge 10240+\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\nfunction manipulationTarget( elem, content ) {\n\tif ( jQuery.nodeName( elem, \"table\" ) &&\n\t\tjQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn elem.getElementsByTagName( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\n\tif ( match ) {\n\t\telem.type = match[ 1 ];\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.access( src );\n\t\tpdataCur = dataPriv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = concat.apply( [], args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tisFunction = jQuery.isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( isFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( isFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android<4.1, PhantomJS<2\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tjQuery.globalEval( node.textContent.replace( rcleanScript, \"\" ) );\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\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && jQuery.contains( node.ownerDocument, node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html.replace( rxhtmlTag, \"<$1></$2>\" );\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <= 35-45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <= 35-45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\n\t// Keep domManip exposed until 3.0 (gh-2225)\n\tdomManip: domManip,\n\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: QtWebKit\n\t\t\t// .get() because push.apply(_, arraylike) throws\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\n\n\nvar iframe,\n\telemdisplay = {\n\n\t\t// Support: Firefox\n\t\t// We have to pre-define these values for FF (#10227)\n\t\tHTML: \"block\",\n\t\tBODY: \"block\"\n\t};\n\n/**\n * Retrieve the actual display of a element\n * @param {String} name nodeName of the element\n * @param {Object} doc Document object\n */\n\n// Called only from within defaultDisplay\nfunction actualDisplay( name, doc ) {\n\tvar elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\n\t\tdisplay = jQuery.css( elem[ 0 ], \"display\" );\n\n\t// We don't have any data stored on the element,\n\t// so use \"detach\" method as fast way to get rid of the element\n\telem.detach();\n\n\treturn display;\n}\n\n/**\n * Try to determine the default display value of an element\n * @param {String} nodeName\n */\nfunction defaultDisplay( nodeName ) {\n\tvar doc = document,\n\t\tdisplay = elemdisplay[ nodeName ];\n\n\tif ( !display ) {\n\t\tdisplay = actualDisplay( nodeName, doc );\n\n\t\t// If the simple way fails, read from inside an iframe\n\t\tif ( display === \"none\" || !display ) {\n\n\t\t\t// Use the already-created iframe if possible\n\t\t\tiframe = ( iframe || jQuery( \"<iframe frameborder='0' width='0' height='0'/>\" ) )\n\t\t\t\t.appendTo( doc.documentElement );\n\n\t\t\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\n\t\t\tdoc = iframe[ 0 ].contentDocument;\n\n\t\t\t// Support: IE\n\t\t\tdoc.write();\n\t\t\tdoc.close();\n\n\t\t\tdisplay = actualDisplay( nodeName, doc );\n\t\t\tiframe.detach();\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn display;\n}\nvar rmargin = ( /^margin/ );\n\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE<=11+, Firefox<=30+ (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback, args ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.apply( elem, args || [] );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar documentElement = document.documentElement;\n\n\n\n( function() {\n\tvar pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE9-11+\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tcontainer.style.cssText = \"border:0;width:8px;height:0;top:0;left:-9999px;\" +\n\t\t\"padding:0;margin-top:1px;position:absolute\";\n\tcontainer.appendChild( div );\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\t\tdiv.style.cssText =\n\n\t\t\t// Support: Firefox<29, Android 2.3\n\t\t\t// Vendor-prefix box-sizing\n\t\t\t\"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;\" +\n\t\t\t\"position:relative;display:block;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"top:1%;width:50%\";\n\t\tdiv.innerHTML = \"\";\n\t\tdocumentElement.appendChild( container );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\t\treliableMarginLeftVal = divStyle.marginLeft === \"2px\";\n\t\tboxSizingReliableVal = divStyle.width === \"4px\";\n\n\t\t// Support: Android 4.0 - 4.3 only\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.marginRight = \"50%\";\n\t\tpixelMarginRightVal = divStyle.marginRight === \"4px\";\n\n\t\tdocumentElement.removeChild( container );\n\t}\n\n\tjQuery.extend( support, {\n\t\tpixelPosition: function() {\n\n\t\t\t// This test is executed only once but we still do memoizing\n\t\t\t// since we can use the boxSizingReliable pre-computing.\n\t\t\t// No need to check if the test was already performed, though.\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\tboxSizingReliable: function() {\n\t\t\tif ( boxSizingReliableVal == null ) {\n\t\t\t\tcomputeStyleTests();\n\t\t\t}\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelMarginRight: function() {\n\n\t\t\t// Support: Android 4.0-4.3\n\t\t\t// We're checking for boxSizingReliableVal here instead of pixelMarginRightVal\n\t\t\t// since that compresses better and they're computed together anyway.\n\t\t\tif ( boxSizingReliableVal == null ) {\n\t\t\t\tcomputeStyleTests();\n\t\t\t}\n\t\t\treturn pixelMarginRightVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\n\t\t\t// Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37\n\t\t\tif ( boxSizingReliableVal == null ) {\n\t\t\t\tcomputeStyleTests();\n\t\t\t}\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\treliableMarginRight: function() {\n\n\t\t\t// Support: Android 2.3\n\t\t\t// Check if div with explicit width and no margin-right incorrectly\n\t\t\t// gets computed margin-right based on width of container. (#3333)\n\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t// This support function is only executed once so no memoizing is needed.\n\t\t\tvar ret,\n\t\t\t\tmarginDiv = div.appendChild( document.createElement( \"div\" ) );\n\n\t\t\t// Reset CSS: box-sizing; display; margin; border; padding\n\t\t\tmarginDiv.style.cssText = div.style.cssText =\n\n\t\t\t\t// Support: Android 2.3\n\t\t\t\t// Vendor-prefix box-sizing\n\t\t\t\t\"-webkit-box-sizing:content-box;box-sizing:content-box;\" +\n\t\t\t\t\"display:block;margin:0;border:0;padding:0\";\n\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\n\t\t\tdiv.style.width = \"1px\";\n\t\t\tdocumentElement.appendChild( container );\n\n\t\t\tret = !parseFloat( window.getComputedStyle( marginDiv ).marginRight );\n\n\t\t\tdocumentElement.removeChild( container );\n\t\t\tdiv.removeChild( marginDiv );\n\n\t\t\treturn ret;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// Support: IE9\n\t// getPropertyValue is only needed for .css('filter') (#12537)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// http://dev.w3.org/csswg/cssom/#resolved-values\n\t\tif ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE9-11+\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t},\n\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style;\n\n// Return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( name ) {\n\n\t// Shortcut for names that are not vendor prefixed\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\n\n\t\t// If we already have the right measurement, avoid augmentation\n\t\t4 :\n\n\t\t// Otherwise initialize for horizontal or vertical properties\n\t\tname === \"width\" ? 1 : 0,\n\n\t\tval = 0;\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// At this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// At this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// At this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar valueIsBorderBox = true,\n\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\tstyles = getStyles( elem ),\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// Support: IE11 only\n\t// In IE 11 fullscreen elements inside of an iframe have\n\t// 100x too small dimensions (gh-1764).\n\tif ( document.msFullscreenElement && window.top !== window ) {\n\n\t\t// Support: IE11 only\n\t\t// Running getBoundingClientRect on a disconnected node\n\t\t// in IE throws an error.\n\t\tif ( elem.getClientRects().length ) {\n\t\t\tval = Math.round( elem.getBoundingClientRect()[ name ] * 100 );\n\t\t}\n\t}\n\n\t// Some non-html elements return undefined for offsetWidth, so check for null/undefined\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\tif ( val <= 0 || val == null ) {\n\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name, styles );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test( val ) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// Check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox &&\n\t\t\t( support.boxSizingReliable() || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// Use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem, hidden,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalues[ index ] = dataPriv.get( elem, \"olddisplay\" );\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t// being hidden by cascaded rules or not\n\t\t\tif ( !values[ index ] && display === \"none\" ) {\n\t\t\t\telem.style.display = \"\";\n\t\t\t}\n\n\t\t\t// Set elements which have been overridden with display: none\n\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t// for such an element\n\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\n\t\t\t\tvalues[ index ] = dataPriv.access(\n\t\t\t\t\telem,\n\t\t\t\t\t\"olddisplay\",\n\t\t\t\t\tdefaultDisplay( elem.nodeName )\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\thidden = isHidden( elem );\n\n\t\t\tif ( display !== \"none\" || !hidden ) {\n\t\t\t\tdataPriv.set(\n\t\t\t\t\telem,\n\t\t\t\t\t\"olddisplay\",\n\t\t\t\t\thidden ? display : jQuery.css( elem, \"display\" )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of most of the elements in a second loop\n\t// to avoid the constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t\"float\": \"cssFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] ||\n\t\t\t( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\tif ( type === \"number\" ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tstyle[ name ] = value;\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] ||\n\t\t\t( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\t\t\t\t\telem.offsetWidth === 0 ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = extra && getStyles( elem ),\n\t\t\t\tsubtract = extra && augmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t);\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ name ] = value;\n\t\t\t\tvalue = jQuery.css( elem, name );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// Support: Android 2.3\njQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn swap( elem, { \"display\": \"inline-block\" },\n\t\t\t\tcurCSS, [ elem, \"marginRight\" ] );\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( jQuery.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t},\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHidden( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 &&\n\t\t\t\t( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||\n\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE9\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = jQuery.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4 ; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\t/* jshint validthis: true */\n\tvar prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHidden( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Handle queue: false promises\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Height/width overflow pass\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\n\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE9-10 do not\n\t\t// change the overflow attribute when overflowX and\n\t\t// overflowY are set to the same value\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Set display property to inline-block for height/width\n\t\t// animations on inline elements that are having width/height animated\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\n\t\t// Test default display if display is currently \"none\"\n\t\tcheckDisplay = display === \"none\" ?\n\t\t\tdataPriv.get( elem, \"olddisplay\" ) || defaultDisplay( elem.nodeName ) : display;\n\n\t\tif ( checkDisplay === \"inline\" && jQuery.css( elem, \"float\" ) === \"none\" ) {\n\t\t\tstyle.display = \"inline-block\";\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// show/hide pass\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.exec( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// If there is dataShow left over from a stopped hide or show\n\t\t\t\t// and we are going to proceed with show, we should pretend to be hidden\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\n\t\t// Any non-fx value stops us from restoring the original display value\n\t\t} else {\n\t\t\tdisplay = undefined;\n\t\t}\n\t}\n\n\tif ( !jQuery.isEmptyObject( orig ) ) {\n\t\tif ( dataShow ) {\n\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\thidden = dataShow.hidden;\n\t\t\t}\n\t\t} else {\n\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", {} );\n\t\t}\n\n\t\t// Store state if its toggle - enables .stop().toggle() to \"reverse\"\n\t\tif ( toggle ) {\n\t\t\tdataShow.hidden = !hidden;\n\t\t}\n\t\tif ( hidden ) {\n\t\t\tjQuery( elem ).show();\n\t\t} else {\n\t\t\tanim.done( function() {\n\t\t\t\tjQuery( elem ).hide();\n\t\t\t} );\n\t\t}\n\t\tanim.done( function() {\n\t\t\tvar prop;\n\n\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t}\n\t\t} );\n\t\tfor ( prop in orig ) {\n\t\t\ttween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\n\t\t\tif ( !( prop in dataShow ) ) {\n\t\t\t\tdataShow[ prop ] = tween.start;\n\t\t\t\tif ( hidden ) {\n\t\t\t\t\ttween.end = tween.start;\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t// If this is a noop like .hide().hide(), restore an overwritten display value\n\t} else if ( ( display === \"none\" ? defaultDisplay( elem.nodeName ) : display ) === \"inline\" ) {\n\t\tstyle.display = display;\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length ; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( jQuery.isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tjQuery.proxy( result.stop, result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnotwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length ; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ?\n\t\topt.duration : opt.duration in jQuery.fx.speeds ?\n\t\t\tjQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tif ( timer() ) {\n\t\tjQuery.fx.start();\n\t} else {\n\t\tjQuery.timers.pop();\n\t}\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( !timerId ) {\n\t\ttimerId = window.setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.stop = function() {\n\twindow.clearInterval( timerId );\n\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: iOS<=5.1, Android<=4.2+\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE<=11+\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: Android<=2.3\n\t// Options inside disabled selects are incorrectly marked as disabled\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Support: IE<=11+\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tjQuery.nodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name, propName,\n\t\t\ti = 0,\n\t\t\tattrNames = value && value.match( rnotwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\n\t\t\t\t// Boolean attributes get special treatment (#10870)\n\t\t\t\tif ( jQuery.expr.match.bool.test( name ) ) {\n\n\t\t\t\t\t// Set corresponding property to false\n\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t}\n\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle;\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ name ];\n\t\t\tattrHandle[ name ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tname.toLowerCase() :\n\t\t\t\tnull;\n\t\t\tattrHandle[ name ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\treturn tabindex ?\n\t\t\t\t\tparseInt( tabindex, 10 ) :\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\t\trclickable.test( elem.nodeName ) && elem.href ?\n\t\t\t\t\t\t\t0 :\n\t\t\t\t\t\t\t-1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\nvar rclass = /[\\t\\r\\n\\f]/g;\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( typeof value === \"string\" && value ) {\n\t\t\tclasses = value.match( rnotwhite ) || [];\n\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 &&\n\t\t\t\t\t( \" \" + curValue + \" \" ).replace( rclass, \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = jQuery.trim( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tif ( typeof value === \"string\" && value ) {\n\t\t\tclasses = value.match( rnotwhite ) || [];\n\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 &&\n\t\t\t\t\t( \" \" + curValue + \" \" ).replace( rclass, \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = jQuery.trim( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value;\n\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( type === \"string\" ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = value.match( rnotwhite ) || [];\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + getClass( elem ) + \" \" ).replace( rclass, \" \" )\n\t\t\t\t\t.indexOf( className ) > -1\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, isFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\n\t\t\t\t\t// Handle most common string cases\n\t\t\t\t\tret.replace( rreturn, \"\" ) :\n\n\t\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE<11\n\t\t\t\t// option.value not trimmed (#14858)\n\t\t\t\treturn jQuery.trim( elem.value );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\" || index < 0,\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length,\n\t\t\t\t\ti = index < 0 ?\n\t\t\t\t\t\tmax :\n\t\t\t\t\t\tone ? index : 0;\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t( support.optDisabled ?\n\t\t\t\t\t\t\t\t!option.disabled : option.getAttribute( \"disabled\" ) === null ) &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || {} )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\telem[ type ]();\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\n\t\t\t\t// Previously, `originalEvent: {}` was set here, so stopPropagation call\n\t\t\t\t// would not be triggered on donor event, since in our own\n\t\t\t\t// jQuery.event.stopPropagation function we had a check for existence of\n\t\t\t\t// originalEvent.stopPropagation method, so, consequently it would be a noop.\n\t\t\t\t//\n\t\t\t\t// But now, this \"simulate\" function is used only for events\n\t\t\t\t// for which stopPropagation() is noop, so there is no need for that anymore.\n\t\t\t\t//\n\t\t\t\t// For the compat branch though, guard for \"click\" and \"submit\"\n\t\t\t\t// events is still used, but was moved to jQuery.event.stopPropagation function\n\t\t\t\t// because `originalEvent` should point to the original event for the constancy\n\t\t\t\t// with other events and for more focused logic\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\njQuery.each( ( \"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\" ).split( \" \" ),\n\tfunction( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n} );\n\njQuery.fn.extend( {\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\n\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\n// Support: Firefox\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome, Safari\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = jQuery.now();\n\nvar rquery = ( /\\?/ );\n\n\n\n// Support: Android 2.3\n// Workaround failure to string-cast null input\njQuery.parseJSON = function( data ) {\n\treturn JSON.parse( data + \"\" );\n};\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE9\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trhash = /#.*$/,\n\trts = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\toriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\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\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\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\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\t\t\tfor ( code in map ) {\n\n\t\t\t\t\t\t\t\t// Lazy-add the new callback in a way that preserves old ones\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" ).replace( rhash, \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().match( rnotwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE8-11+\n\t\t\t// IE throws exception if url is malformed, e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE8-11+\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\tcacheURL = s.url;\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL = ( s.url += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\ts.url = rts.test( cacheURL ) ?\n\n\t\t\t\t\t// If there is already a '_' parameter, set its value\n\t\t\t\t\tcacheURL.replace( rts, \"$1_=\" + nonce++ ) :\n\n\t\t\t\t\t// Otherwise add one to the end\n\t\t\t\t\tcacheURL + ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + nonce++;\n\t\t\t}\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\n\njQuery._evalUrl = function( url ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tasync: false,\n\t\tglobal: false,\n\t\t\"throws\": true\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapAll( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( this[ 0 ] ) {\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each( function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t} ).end();\n\t}\n} );\n\n\njQuery.expr.filters.hidden = function( elem ) {\n\treturn !jQuery.expr.filters.visible( elem );\n};\njQuery.expr.filters.visible = function( elem ) {\n\n\t// Support: Opera <= 12.12\n\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\n\t// Use OR instead of AND as the element is not visible if either is true\n\t// See tickets #10406 and #13132\n\treturn elem.offsetWidth > 0 || elem.offsetHeight > 0 || elem.getClientRects().length > 0;\n};\n\n\n\n\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, value ) {\n\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t};\n\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\tif ( traditional === undefined ) {\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val ) {\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t} ) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE9\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE9\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\"  ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\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\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = callback( \"error\" );\n\n\t\t\t\t// Support: IE9\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\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\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" ).prop( {\n\t\t\t\t\tcharset: s.scriptCharset,\n\t\t\t\t\tsrc: s.url\n\t\t\t\t} ).on(\n\t\t\t\t\t\"load error\",\n\t\t\t\t\tcallback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8+\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\t// Stop scripts or inline event handlers from being executed immediately\n\t// by using document.implementation\n\tcontext = context || ( support.createHTMLDocument ?\n\t\tdocument.implementation.createHTMLDocument( \"\" ) :\n\t\tdocument );\n\n\tvar parsed = rsingleTag.exec( data ),\n\t\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n// Keep a copy of the old load method\nvar _load = jQuery.fn.load;\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tif ( typeof url !== \"string\" && _load ) {\n\t\treturn _load.apply( this, arguments );\n\t}\n\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = jQuery.trim( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( self, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.expr.filters.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\n/**\n * Gets a window from an element\n */\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;\n}\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\toffset: function( options ) {\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar docElem, win,\n\t\t\telem = this[ 0 ],\n\t\t\tbox = { top: 0, left: 0 },\n\t\t\tdoc = elem && elem.ownerDocument;\n\n\t\tif ( !doc ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdocElem = doc.documentElement;\n\n\t\t// Make sure it's not a disconnected DOM node\n\t\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\t\treturn box;\n\t\t}\n\n\t\tbox = elem.getBoundingClientRect();\n\t\twin = getWindow( doc );\n\t\treturn {\n\t\t\ttop: box.top + win.pageYOffset - docElem.clientTop,\n\t\t\tleft: box.left + win.pageXOffset - docElem.clientLeft\n\t\t};\n\t},\n\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// Fixed elements are offset from window (parentOffset = {top:0, left: 0},\n\t\t// because it is its only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume getBoundingClientRect is there when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\n\t\t\t// Get *real* offsetParent\n\t\t\toffsetParent = this.offsetParent();\n\n\t\t\t// Get correct offsets\n\t\t\toffset = this.offset();\n\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\t\t\t\tparentOffset = offsetParent.offset();\n\t\t\t}\n\n\t\t\t// Add offsetParent borders\n\t\t\t// Subtract offsetParent scroll positions\n\t\t\tparentOffset.top += jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true ) -\n\t\t\t\toffsetParent.scrollTop();\n\t\t\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true ) -\n\t\t\t\toffsetParent.scrollLeft();\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t//    documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari<7-8+, Chrome<37-44+\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n\t\tfunction( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable, null );\n\t\t};\n\t} );\n} );\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t},\n\tsize: function() {\n\t\treturn this.length;\n\t}\n} );\n\njQuery.fn.andSelf = jQuery.fn.addBack;\n\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( !noGlobal ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\nreturn jQuery;\n}));\n","/** @license\r\n *\r\n * SoundManager 2: JavaScript Sound for the Web\r\n * ----------------------------------------------\r\n * http://schillmania.com/projects/soundmanager2/\r\n *\r\n * Copyright (c) 2007, Scott Schiller. All rights reserved.\r\n * Code provided under the BSD License:\r\n * http://schillmania.com/projects/soundmanager2/license.txt\r\n *\r\n * V2.97a.20150601\r\n */\r\n(function(h,g){function w(gb,w){function Z(b){return c.preferFlash&&A&&!c.ignoreFlash&&c.flash[b]!==g&&c.flash[b]}function r(b){return function(c){var d=this._s;return d&&d._a?b.call(this,c):null}}this.setupOptions={url:gb||null,flashVersion:8,debugMode:!0,debugFlash:!1,useConsole:!0,consoleOnly:!0,waitForWindowLoad:!1,bgColor:\"#ffffff\",useHighPerformance:!1,flashPollingInterval:null,html5PollingInterval:null,flashLoadTimeout:1E3,wmode:null,allowScriptAccess:\"always\",useFlashBlock:!1,useHTML5Audio:!0,\nforceUseGlobalHTML5Audio:!1,ignoreMobileRestrictions:!1,html5Test:/^(probably|maybe)$/i,preferFlash:!1,noSWFCache:!1,idPrefix:\"sound\"};this.defaultOptions={autoLoad:!1,autoPlay:!1,from:null,loops:1,onid3:null,onload:null,whileloading:null,onplay:null,onpause:null,onresume:null,whileplaying:null,onposition:null,onstop:null,onfailure:null,onfinish:null,multiShot:!0,multiShotEvents:!1,position:null,pan:0,stream:!0,to:null,type:null,usePolicyFile:!1,volume:100};this.flash9Options={isMovieStar:null,usePeakData:!1,\nuseWaveformData:!1,useEQData:!1,onbufferchange:null,ondataerror:null};this.movieStarOptions={bufferTime:3,serverURL:null,onconnect:null,duration:null};this.audioFormats={mp3:{type:['audio/mpeg; codecs=\"mp3\"',\"audio/mpeg\",\"audio/mp3\",\"audio/MPA\",\"audio/mpa-robust\"],required:!0},mp4:{related:[\"aac\",\"m4a\",\"m4b\"],type:['audio/mp4; codecs=\"mp4a.40.2\"',\"audio/aac\",\"audio/x-m4a\",\"audio/MP4A-LATM\",\"audio/mpeg4-generic\"],required:!1},ogg:{type:[\"audio/ogg; codecs=vorbis\"],required:!1},opus:{type:[\"audio/ogg; codecs=opus\",\n\"audio/opus\"],required:!1},wav:{type:['audio/wav; codecs=\"1\"',\"audio/wav\",\"audio/wave\",\"audio/x-wav\"],required:!1}};this.movieID=\"sm2-container\";this.id=w||\"sm2movie\";this.debugID=\"soundmanager-debug\";this.debugURLParam=/([#?&])debug=1/i;this.versionNumber=\"V2.97a.20150601\";this.altURL=this.movieURL=this.version=null;this.enabled=this.swfLoaded=!1;this.oMC=null;this.sounds={};this.soundIDs=[];this.didFlashBlock=this.muted=!1;this.filePattern=null;this.filePatterns={flash8:/\\.mp3(\\?.*)?$/i,flash9:/\\.mp3(\\?.*)?$/i};\nthis.features={buffering:!1,peakData:!1,waveformData:!1,eqData:!1,movieStar:!1};this.sandbox={};this.html5={usingFlash:null};this.flash={};this.ignoreFlash=this.html5Only=!1;var N,c=this,Oa=null,k=null,aa,u=navigator.userAgent,Pa=h.location.href.toString(),p=document,pa,Qa,qa,m,y=[],O=!1,P=!1,l=!1,B=!1,ra=!1,Q,x,sa,ba,ta,F,H,I,Ra,ua,va,ca,J,da,G,wa,R,xa,ea,K,Sa,ya,Ta,za,Ua,S=null,Aa=null,T,Ba,L,fa,ga,q,U=!1,Ca=!1,Va,Wa,Xa,ha=0,V=null,ia,W=[],X,v=null,Ya,ja,Y,D,ka,Da,Za,t,hb=Array.prototype.slice,\nz=!1,Ea,A,Fa,$a,C,la,ab=0,Ga,Ha=u.match(/(ipad|iphone|ipod)/i),Ia=u.match(/android/i),E=u.match(/msie/i),ib=u.match(/webkit/i),ma=u.match(/safari/i)&&!u.match(/chrome/i),Ja=u.match(/opera/i),na=u.match(/(mobile|pre\\/|xoom)/i)||Ha||Ia,bb=!Pa.match(/usehtml5audio/i)&&!Pa.match(/sm2\\-ignorebadua/i)&&ma&&!u.match(/silk/i)&&u.match(/OS X 10_6_([3-7])/i),Ka=p.hasFocus!==g?p.hasFocus():null,oa=ma&&(p.hasFocus===g||!p.hasFocus()),cb=!oa,db=/(mp3|mp4|mpa|m4a|m4b)/i,La=p.location?p.location.protocol.match(/http/i):\nnull,jb=La?\"\":\"http://\",eb=/^\\s*audio\\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|m4b|mp4v|3gp|3g2)\\s*(?:$|;)/i,fb=\"mpeg4 aac flv mov mp4 m4v f4v m4a m4b mp4v 3gp 3g2\".split(\" \"),kb=new RegExp(\"\\\\.(\"+fb.join(\"|\")+\")(\\\\?.*)?$\",\"i\");this.mimePattern=/^\\s*audio\\/(?:x-)?(?:mp(?:eg|3))\\s*(?:$|;)/i;this.useAltURL=!La;var Ma;try{Ma=Audio!==g&&(Ja&&opera!==g&&10>opera.version()?new Audio(null):new Audio).canPlayType!==g}catch(lb){Ma=!1}this.hasHTML5=Ma;this.setup=function(b){var e=!c.url;b!==g&&l&&v&&c.ok();\nsa(b);if(!z)if(na){if(!c.setupOptions.ignoreMobileRestrictions||c.setupOptions.forceUseGlobalHTML5Audio)W.push(J.globalHTML5),z=!0}else c.setupOptions.forceUseGlobalHTML5Audio&&(W.push(J.globalHTML5),z=!0);if(!Ga&&na)if(c.setupOptions.ignoreMobileRestrictions)W.push(J.ignoreMobile);else if(c.setupOptions.useHTML5Audio=!0,c.setupOptions.preferFlash=!1,Ha)c.ignoreFlash=!0;else if(Ia&&!u.match(/android\\s2\\.3/i)||!Ia)z=!0;b&&(e&&R&&b.url!==g&&c.beginDelayedInit(),R||b.url===g||\"complete\"!==p.readyState||\nsetTimeout(G,1));Ga=!0;return c};this.supported=this.ok=function(){return v?l&&!B:c.useHTML5Audio&&c.hasHTML5};this.getMovie=function(b){return aa(b)||p[b]||h[b]};this.createSound=function(b,e){function d(){a=fa(a);c.sounds[a.id]=new N(a);c.soundIDs.push(a.id);return c.sounds[a.id]}var a,f=null;if(!l||!c.ok())return!1;e!==g&&(b={id:b,url:e});a=x(b);a.url=ia(a.url);a.id===g&&(a.id=c.setupOptions.idPrefix+ab++);if(q(a.id,!0))return c.sounds[a.id];if(ja(a))f=d(),f._setup_html5(a);else{if(c.html5Only||\nc.html5.usingFlash&&a.url&&a.url.match(/data\\:/i))return d();8<m&&null===a.isMovieStar&&(a.isMovieStar=!!(a.serverURL||a.type&&a.type.match(eb)||a.url&&a.url.match(kb)));a=ga(a,void 0);f=d();8===m?k._createSound(a.id,a.loops||1,a.usePolicyFile):(k._createSound(a.id,a.url,a.usePeakData,a.useWaveformData,a.useEQData,a.isMovieStar,a.isMovieStar?a.bufferTime:!1,a.loops||1,a.serverURL,a.duration||null,a.autoPlay,!0,a.autoLoad,a.usePolicyFile),a.serverURL||(f.connected=!0,a.onconnect&&a.onconnect.apply(f)));\na.serverURL||!a.autoLoad&&!a.autoPlay||f.load(a)}!a.serverURL&&a.autoPlay&&f.play();return f};this.destroySound=function(b,e){if(!q(b))return!1;var d=c.sounds[b],a;d.stop();d._iO={};d.unload();for(a=0;a<c.soundIDs.length;a++)if(c.soundIDs[a]===b){c.soundIDs.splice(a,1);break}e||d.destruct(!0);delete c.sounds[b];return!0};this.load=function(b,e){return q(b)?c.sounds[b].load(e):!1};this.unload=function(b){return q(b)?c.sounds[b].unload():!1};this.onposition=this.onPosition=function(b,e,d,a){return q(b)?\nc.sounds[b].onposition(e,d,a):!1};this.clearOnPosition=function(b,e,d){return q(b)?c.sounds[b].clearOnPosition(e,d):!1};this.start=this.play=function(b,e){var d=null,a=e&&!(e instanceof Object);if(!l||!c.ok())return!1;if(q(b,a))a&&(e={url:e});else{if(!a)return!1;a&&(e={url:e});e&&e.url&&(e.id=b,d=c.createSound(e).play())}null===d&&(d=c.sounds[b].play(e));return d};this.setPosition=function(b,e){return q(b)?c.sounds[b].setPosition(e):!1};this.stop=function(b){return q(b)?c.sounds[b].stop():!1};this.stopAll=\nfunction(){for(var b in c.sounds)c.sounds.hasOwnProperty(b)&&c.sounds[b].stop()};this.pause=function(b){return q(b)?c.sounds[b].pause():!1};this.pauseAll=function(){var b;for(b=c.soundIDs.length-1;0<=b;b--)c.sounds[c.soundIDs[b]].pause()};this.resume=function(b){return q(b)?c.sounds[b].resume():!1};this.resumeAll=function(){var b;for(b=c.soundIDs.length-1;0<=b;b--)c.sounds[c.soundIDs[b]].resume()};this.togglePause=function(b){return q(b)?c.sounds[b].togglePause():!1};this.setPan=function(b,e){return q(b)?\nc.sounds[b].setPan(e):!1};this.setVolume=function(b,e){var d,a;if(b===g||isNaN(b)||e!==g)return q(b)?c.sounds[b].setVolume(e):!1;d=0;for(a=c.soundIDs.length;d<a;d++)c.sounds[c.soundIDs[d]].setVolume(b)};this.mute=function(b){var e=0;b instanceof String&&(b=null);if(b)return q(b)?c.sounds[b].mute():!1;for(e=c.soundIDs.length-1;0<=e;e--)c.sounds[c.soundIDs[e]].mute();return c.muted=!0};this.muteAll=function(){c.mute()};this.unmute=function(b){b instanceof String&&(b=null);if(b)return q(b)?c.sounds[b].unmute():\n!1;for(b=c.soundIDs.length-1;0<=b;b--)c.sounds[c.soundIDs[b]].unmute();c.muted=!1;return!0};this.unmuteAll=function(){c.unmute()};this.toggleMute=function(b){return q(b)?c.sounds[b].toggleMute():!1};this.getMemoryUse=function(){var b=0;k&&8!==m&&(b=parseInt(k._getMemoryUse(),10));return b};this.disable=function(b){var e;b===g&&(b=!1);if(B)return!1;B=!0;for(e=c.soundIDs.length-1;0<=e;e--)Ta(c.sounds[c.soundIDs[e]]);Q(b);t.remove(h,\"load\",H);return!0};this.canPlayMIME=function(b){var e;c.hasHTML5&&\n(e=Y({type:b}));!e&&v&&(e=b&&c.ok()?!!(8<m&&b.match(eb)||b.match(c.mimePattern)):null);return e};this.canPlayURL=function(b){var e;c.hasHTML5&&(e=Y({url:b}));!e&&v&&(e=b&&c.ok()?!!b.match(c.filePattern):null);return e};this.canPlayLink=function(b){return b.type!==g&&b.type&&c.canPlayMIME(b.type)?!0:c.canPlayURL(b.href)};this.getSoundById=function(b,e){return b?c.sounds[b]:null};this.onready=function(b,c){if(\"function\"===typeof b)c||(c=h),ta(\"onready\",b,c),F();else throw T(\"needFunction\",\"onready\");\nreturn!0};this.ontimeout=function(b,c){if(\"function\"===typeof b)c||(c=h),ta(\"ontimeout\",b,c),F({type:\"ontimeout\"});else throw T(\"needFunction\",\"ontimeout\");return!0};this._wD=this._writeDebug=function(b,c){return!0};this._debug=function(){};this.reboot=function(b,e){var d,a,f;for(d=c.soundIDs.length-1;0<=d;d--)c.sounds[c.soundIDs[d]].destruct();if(k)try{E&&(Aa=k.innerHTML),S=k.parentNode.removeChild(k)}catch(g){}Aa=S=v=k=null;c.enabled=R=l=U=Ca=O=P=B=z=c.swfLoaded=!1;c.soundIDs=[];c.sounds={};ab=\n0;Ga=!1;if(b)y=[];else for(d in y)if(y.hasOwnProperty(d))for(a=0,f=y[d].length;a<f;a++)y[d][a].fired=!1;c.html5={usingFlash:null};c.flash={};c.html5Only=!1;c.ignoreFlash=!1;h.setTimeout(function(){e||c.beginDelayedInit()},20);return c};this.reset=function(){return c.reboot(!0,!0)};this.getMoviePercent=function(){return k&&\"PercentLoaded\"in k?k.PercentLoaded():null};this.beginDelayedInit=function(){ra=!0;G();setTimeout(function(){if(Ca)return!1;ea();da();return Ca=!0},20);I()};this.destruct=function(){c.disable(!0)};\nN=function(b){var e,d,a=this,f,n,h,M,p,r,u=!1,l=[],v=0,y,B,w=null,A;d=e=null;this.sID=this.id=b.id;this.url=b.url;this._iO=this.instanceOptions=this.options=x(b);this.pan=this.options.pan;this.volume=this.options.volume;this.isHTML5=!1;this._a=null;A=this.url?!1:!0;this.id3={};this._debug=function(){};this.load=function(b){var e=null,d;b!==g?a._iO=x(b,a.options):(b=a.options,a._iO=b,w&&w!==a.url&&(a._iO.url=a.url,a.url=null));a._iO.url||(a._iO.url=a.url);a._iO.url=ia(a._iO.url);d=a.instanceOptions=\na._iO;if(!d.url&&!a.url)return a;if(d.url===a.url&&0!==a.readyState&&2!==a.readyState)return 3===a.readyState&&d.onload&&la(a,function(){d.onload.apply(a,[!!a.duration])}),a;a.loaded=!1;a.readyState=1;a.playState=0;a.id3={};if(ja(d))e=a._setup_html5(d),e._called_load||(a._html5_canplay=!1,a.url!==d.url&&(a._a.src=d.url,a.setPosition(0)),a._a.autobuffer=\"auto\",a._a.preload=\"auto\",a._a._called_load=!0);else{if(c.html5Only||a._iO.url&&a._iO.url.match(/data\\:/i))return a;try{a.isHTML5=!1,a._iO=ga(fa(d)),\na._iO.autoPlay&&(a._iO.position||a._iO.from)&&(a._iO.autoPlay=!1),d=a._iO,8===m?k._load(a.id,d.url,d.stream,d.autoPlay,d.usePolicyFile):k._load(a.id,d.url,!!d.stream,!!d.autoPlay,d.loops||1,!!d.autoLoad,d.usePolicyFile)}catch(f){K({type:\"SMSOUND_LOAD_JS_EXCEPTION\",fatal:!0})}}a.url=d.url;return a};this.unload=function(){0!==a.readyState&&(a.isHTML5?(M(),a._a&&(a._a.pause(),w=ka(a._a))):8===m?k._unload(a.id,\"about:blank\"):k._unload(a.id),f());return a};this.destruct=function(b){a.isHTML5?(M(),a._a&&\n(a._a.pause(),ka(a._a),z||h(),a._a._s=null,a._a=null)):(a._iO.onfailure=null,k._destroySound(a.id));b||c.destroySound(a.id,!0)};this.start=this.play=function(b,e){var d,f,n,h,Na;f=!0;f=null;e=e===g?!0:e;b||(b={});a.url&&(a._iO.url=a.url);a._iO=x(a._iO,a.options);a._iO=x(b,a._iO);a._iO.url=ia(a._iO.url);a.instanceOptions=a._iO;if(!a.isHTML5&&a._iO.serverURL&&!a.connected)return a.getAutoPlay()||a.setAutoPlay(!0),a;ja(a._iO)&&(a._setup_html5(a._iO),p());1!==a.playState||a.paused||(d=a._iO.multiShot,\nd||(a.isHTML5&&a.setPosition(a._iO.position),f=a));if(null!==f)return f;b.url&&b.url!==a.url&&(a.readyState||a.isHTML5||8!==m||!A?a.load(a._iO):A=!1);a.loaded||(0===a.readyState?(a.isHTML5||c.html5Only?a.isHTML5?a.load(a._iO):f=a:(a._iO.autoPlay=!0,a.load(a._iO)),a.instanceOptions=a._iO):2===a.readyState&&(f=a));if(null!==f)return f;!a.isHTML5&&9===m&&0<a.position&&a.position===a.duration&&(b.position=0);if(a.paused&&0<=a.position&&(!a._iO.serverURL||0<a.position))a.resume();else{a._iO=x(b,a._iO);\nif((!a.isHTML5&&null!==a._iO.position&&0<a._iO.position||null!==a._iO.from&&0<a._iO.from||null!==a._iO.to)&&0===a.instanceCount&&0===a.playState&&!a._iO.serverURL){d=function(){a._iO=x(b,a._iO);a.play(a._iO)};a.isHTML5&&!a._html5_canplay?(a.load({_oncanplay:d}),f=!1):a.isHTML5||a.loaded||a.readyState&&2===a.readyState||(a.load({onload:d}),f=!1);if(null!==f)return f;a._iO=B()}(!a.instanceCount||a._iO.multiShotEvents||a.isHTML5&&a._iO.multiShot&&!z||!a.isHTML5&&8<m&&!a.getAutoPlay())&&a.instanceCount++;\na._iO.onposition&&0===a.playState&&r(a);a.playState=1;a.paused=!1;a.position=a._iO.position===g||isNaN(a._iO.position)?0:a._iO.position;a.isHTML5||(a._iO=ga(fa(a._iO)));a._iO.onplay&&e&&(a._iO.onplay.apply(a),u=!0);a.setVolume(a._iO.volume,!0);a.setPan(a._iO.pan,!0);a.isHTML5?2>a.instanceCount?(p(),f=a._setup_html5(),a.setPosition(a._iO.position),f.play()):(n=new Audio(a._iO.url),h=function(){t.remove(n,\"ended\",h);a._onfinish(a);ka(n);n=null},Na=function(){t.remove(n,\"canplay\",Na);try{n.currentTime=\na._iO.position/1E3}catch(b){}n.play()},t.add(n,\"ended\",h),a._iO.volume!==g&&(n.volume=Math.max(0,Math.min(1,a._iO.volume/100))),a.muted&&(n.muted=!0),a._iO.position?t.add(n,\"canplay\",Na):n.play()):(f=k._start(a.id,a._iO.loops||1,9===m?a.position:a.position/1E3,a._iO.multiShot||!1),9!==m||f||a._iO.onplayerror&&a._iO.onplayerror.apply(a))}return a};this.stop=function(b){var c=a._iO;1===a.playState&&(a._onbufferchange(0),a._resetOnPosition(0),a.paused=!1,a.isHTML5||(a.playState=0),y(),c.to&&a.clearOnPosition(c.to),\na.isHTML5?a._a&&(b=a.position,a.setPosition(0),a.position=b,a._a.pause(),a.playState=0,a._onTimer(),M()):(k._stop(a.id,b),c.serverURL&&a.unload()),a.instanceCount=0,a._iO={},c.onstop&&c.onstop.apply(a));return a};this.setAutoPlay=function(b){a._iO.autoPlay=b;a.isHTML5||(k._setAutoPlay(a.id,b),b&&(a.instanceCount||1!==a.readyState||a.instanceCount++))};this.getAutoPlay=function(){return a._iO.autoPlay};this.setPosition=function(b){b===g&&(b=0);var c=a.isHTML5?Math.max(b,0):Math.min(a.duration||a._iO.duration,\nMath.max(b,0));a.position=c;b=a.position/1E3;a._resetOnPosition(a.position);a._iO.position=c;if(!a.isHTML5)b=9===m?a.position:b,a.readyState&&2!==a.readyState&&k._setPosition(a.id,b,a.paused||!a.playState,a._iO.multiShot);else if(a._a){if(a._html5_canplay){if(a._a.currentTime!==b)try{a._a.currentTime=b,(0===a.playState||a.paused)&&a._a.pause()}catch(e){}}else if(b)return a;a.paused&&a._onTimer(!0)}return a};this.pause=function(b){if(a.paused||0===a.playState&&1!==a.readyState)return a;a.paused=!0;\na.isHTML5?(a._setup_html5().pause(),M()):(b||b===g)&&k._pause(a.id,a._iO.multiShot);a._iO.onpause&&a._iO.onpause.apply(a);return a};this.resume=function(){var b=a._iO;if(!a.paused)return a;a.paused=!1;a.playState=1;a.isHTML5?(a._setup_html5().play(),p()):(b.isMovieStar&&!b.serverURL&&a.setPosition(a.position),k._pause(a.id,b.multiShot));!u&&b.onplay?(b.onplay.apply(a),u=!0):b.onresume&&b.onresume.apply(a);return a};this.togglePause=function(){if(0===a.playState)return a.play({position:9!==m||a.isHTML5?\na.position/1E3:a.position}),a;a.paused?a.resume():a.pause();return a};this.setPan=function(b,c){b===g&&(b=0);c===g&&(c=!1);a.isHTML5||k._setPan(a.id,b);a._iO.pan=b;c||(a.pan=b,a.options.pan=b);return a};this.setVolume=function(b,e){b===g&&(b=100);e===g&&(e=!1);a.isHTML5?a._a&&(c.muted&&!a.muted&&(a.muted=!0,a._a.muted=!0),a._a.volume=Math.max(0,Math.min(1,b/100))):k._setVolume(a.id,c.muted&&!a.muted||a.muted?0:b);a._iO.volume=b;e||(a.volume=b,a.options.volume=b);return a};this.mute=function(){a.muted=\n!0;a.isHTML5?a._a&&(a._a.muted=!0):k._setVolume(a.id,0);return a};this.unmute=function(){a.muted=!1;var b=a._iO.volume!==g;a.isHTML5?a._a&&(a._a.muted=!1):k._setVolume(a.id,b?a._iO.volume:a.options.volume);return a};this.toggleMute=function(){return a.muted?a.unmute():a.mute()};this.onposition=this.onPosition=function(b,c,e){l.push({position:parseInt(b,10),method:c,scope:e!==g?e:a,fired:!1});return a};this.clearOnPosition=function(a,b){var c;a=parseInt(a,10);if(isNaN(a))return!1;for(c=0;c<l.length;c++)a!==\nl[c].position||b&&b!==l[c].method||(l[c].fired&&v--,l.splice(c,1))};this._processOnPosition=function(){var b,c;b=l.length;if(!b||!a.playState||v>=b)return!1;for(--b;0<=b;b--)c=l[b],!c.fired&&a.position>=c.position&&(c.fired=!0,v++,c.method.apply(c.scope,[c.position]));return!0};this._resetOnPosition=function(a){var b,c;b=l.length;if(!b)return!1;for(--b;0<=b;b--)c=l[b],c.fired&&a<=c.position&&(c.fired=!1,v--);return!0};B=function(){var b=a._iO,c=b.from,e=b.to,d,f;f=function(){a.clearOnPosition(e,f);\na.stop()};d=function(){if(null!==e&&!isNaN(e))a.onPosition(e,f)};null===c||isNaN(c)||(b.position=c,b.multiShot=!1,d());return b};r=function(){var b,c=a._iO.onposition;if(c)for(b in c)if(c.hasOwnProperty(b))a.onPosition(parseInt(b,10),c[b])};y=function(){var b,c=a._iO.onposition;if(c)for(b in c)c.hasOwnProperty(b)&&a.clearOnPosition(parseInt(b,10))};p=function(){a.isHTML5&&Va(a)};M=function(){a.isHTML5&&Wa(a)};f=function(b){b||(l=[],v=0);u=!1;a._hasTimer=null;a._a=null;a._html5_canplay=!1;a.bytesLoaded=\nnull;a.bytesTotal=null;a.duration=a._iO&&a._iO.duration?a._iO.duration:null;a.durationEstimate=null;a.buffered=[];a.eqData=[];a.eqData.left=[];a.eqData.right=[];a.failures=0;a.isBuffering=!1;a.instanceOptions={};a.instanceCount=0;a.loaded=!1;a.metadata={};a.readyState=0;a.muted=!1;a.paused=!1;a.peakData={left:0,right:0};a.waveformData={left:[],right:[]};a.playState=0;a.position=null;a.id3={}};f();this._onTimer=function(b){var c,f=!1,g={};if(a._hasTimer||b)return a._a&&(b||(0<a.playState||1===a.readyState)&&\n!a.paused)&&(c=a._get_html5_duration(),c!==e&&(e=c,a.duration=c,f=!0),a.durationEstimate=a.duration,c=1E3*a._a.currentTime||0,c!==d&&(d=c,f=!0),(f||b)&&a._whileplaying(c,g,g,g,g)),f};this._get_html5_duration=function(){var b=a._iO;return(b=a._a&&a._a.duration?1E3*a._a.duration:b&&b.duration?b.duration:null)&&!isNaN(b)&&Infinity!==b?b:null};this._apply_loop=function(a,b){a.loop=1<b?\"loop\":\"\"};this._setup_html5=function(b){b=x(a._iO,b);var c=z?Oa:a._a,e=decodeURI(b.url),d;z?e===decodeURI(Ea)&&(d=!0):\ne===decodeURI(w)&&(d=!0);if(c){if(c._s)if(z)c._s&&c._s.playState&&!d&&c._s.stop();else if(!z&&e===decodeURI(w))return a._apply_loop(c,b.loops),c;d||(w&&f(!1),c.src=b.url,Ea=w=a.url=b.url,c._called_load=!1)}else b.autoLoad||b.autoPlay?(a._a=new Audio(b.url),a._a.load()):a._a=Ja&&10>opera.version()?new Audio(null):new Audio,c=a._a,c._called_load=!1,z&&(Oa=c);a.isHTML5=!0;a._a=c;c._s=a;n();a._apply_loop(c,b.loops);b.autoLoad||b.autoPlay?a.load():(c.autobuffer=!1,c.preload=\"auto\");return c};n=function(){if(a._a._added_events)return!1;\nvar b;a._a._added_events=!0;for(b in C)C.hasOwnProperty(b)&&a._a&&a._a.addEventListener(b,C[b],!1);return!0};h=function(){var b;a._a._added_events=!1;for(b in C)C.hasOwnProperty(b)&&a._a&&a._a.removeEventListener(b,C[b],!1)};this._onload=function(b){var c=!!b||!a.isHTML5&&8===m&&a.duration;a.loaded=c;a.readyState=c?3:2;a._onbufferchange(0);a._iO.onload&&la(a,function(){a._iO.onload.apply(a,[c])});return!0};this._onbufferchange=function(b){if(0===a.playState||b&&a.isBuffering||!b&&!a.isBuffering)return!1;\na.isBuffering=1===b;a._iO.onbufferchange&&a._iO.onbufferchange.apply(a,[b]);return!0};this._onsuspend=function(){a._iO.onsuspend&&a._iO.onsuspend.apply(a);return!0};this._onfailure=function(b,c,e){a.failures++;if(a._iO.onfailure&&1===a.failures)a._iO.onfailure(b,c,e)};this._onwarning=function(b,c,e){if(a._iO.onwarning)a._iO.onwarning(b,c,e)};this._onfinish=function(){var b=a._iO.onfinish;a._onbufferchange(0);a._resetOnPosition(0);a.instanceCount&&(a.instanceCount--,a.instanceCount||(y(),a.playState=\n0,a.paused=!1,a.instanceCount=0,a.instanceOptions={},a._iO={},M(),a.isHTML5&&(a.position=0)),(!a.instanceCount||a._iO.multiShotEvents)&&b&&la(a,function(){b.apply(a)}))};this._whileloading=function(b,c,e,d){var f=a._iO;a.bytesLoaded=b;a.bytesTotal=c;a.duration=Math.floor(e);a.bufferLength=d;a.durationEstimate=a.isHTML5||f.isMovieStar?a.duration:f.duration?a.duration>f.duration?a.duration:f.duration:parseInt(a.bytesTotal/a.bytesLoaded*a.duration,10);a.isHTML5||(a.buffered=[{start:0,end:a.duration}]);\n(3!==a.readyState||a.isHTML5)&&f.whileloading&&f.whileloading.apply(a)};this._whileplaying=function(b,c,e,d,f){var n=a._iO;if(isNaN(b)||null===b)return!1;a.position=Math.max(0,b);a._processOnPosition();!a.isHTML5&&8<m&&(n.usePeakData&&c!==g&&c&&(a.peakData={left:c.leftPeak,right:c.rightPeak}),n.useWaveformData&&e!==g&&e&&(a.waveformData={left:e.split(\",\"),right:d.split(\",\")}),n.useEQData&&f!==g&&f&&f.leftEQ&&(b=f.leftEQ.split(\",\"),a.eqData=b,a.eqData.left=b,f.rightEQ!==g&&f.rightEQ&&(a.eqData.right=\nf.rightEQ.split(\",\"))));1===a.playState&&(a.isHTML5||8!==m||a.position||!a.isBuffering||a._onbufferchange(0),n.whileplaying&&n.whileplaying.apply(a));return!0};this._oncaptiondata=function(b){a.captiondata=b;a._iO.oncaptiondata&&a._iO.oncaptiondata.apply(a,[b])};this._onmetadata=function(b,c){var e={},d,f;d=0;for(f=b.length;d<f;d++)e[b[d]]=c[d];a.metadata=e;a._iO.onmetadata&&a._iO.onmetadata.call(a,a.metadata)};this._onid3=function(b,c){var e=[],d,f;d=0;for(f=b.length;d<f;d++)e[b[d]]=c[d];a.id3=x(a.id3,\ne);a._iO.onid3&&a._iO.onid3.apply(a)};this._onconnect=function(b){b=1===b;if(a.connected=b)a.failures=0,q(a.id)&&(a.getAutoPlay()?a.play(g,a.getAutoPlay()):a._iO.autoLoad&&a.load()),a._iO.onconnect&&a._iO.onconnect.apply(a,[b])};this._ondataerror=function(b){0<a.playState&&a._iO.ondataerror&&a._iO.ondataerror.apply(a)}};xa=function(){return p.body||p.getElementsByTagName(\"div\")[0]};aa=function(b){return p.getElementById(b)};x=function(b,e){var d=b||{},a,f;a=e===g?c.defaultOptions:e;for(f in a)a.hasOwnProperty(f)&&\nd[f]===g&&(d[f]=\"object\"!==typeof a[f]||null===a[f]?a[f]:x(d[f],a[f]));return d};la=function(b,c){b.isHTML5||8!==m?c():h.setTimeout(c,0)};ba={onready:1,ontimeout:1,defaultOptions:1,flash9Options:1,movieStarOptions:1};sa=function(b,e){var d,a=!0,f=e!==g,n=c.setupOptions;for(d in b)if(b.hasOwnProperty(d))if(\"object\"!==typeof b[d]||null===b[d]||b[d]instanceof Array||b[d]instanceof RegExp)f&&ba[e]!==g?c[e][d]=b[d]:n[d]!==g?(c.setupOptions[d]=b[d],c[d]=b[d]):ba[d]===g?a=!1:c[d]instanceof Function?c[d].apply(c,\nb[d]instanceof Array?b[d]:[b[d]]):c[d]=b[d];else if(ba[d]===g)a=!1;else return sa(b[d],d);return a};t=function(){function b(a){a=hb.call(a);var b=a.length;d?(a[1]=\"on\"+a[1],3<b&&a.pop()):3===b&&a.push(!1);return a}function c(b,e){var g=b.shift(),h=[a[e]];if(d)g[h](b[0],b[1]);else g[h].apply(g,b)}var d=h.attachEvent,a={add:d?\"attachEvent\":\"addEventListener\",remove:d?\"detachEvent\":\"removeEventListener\"};return{add:function(){c(b(arguments),\"add\")},remove:function(){c(b(arguments),\"remove\")}}}();C={abort:r(function(){}),\ncanplay:r(function(){var b=this._s,c;if(b._html5_canplay)return!0;b._html5_canplay=!0;b._onbufferchange(0);c=b._iO.position===g||isNaN(b._iO.position)?null:b._iO.position/1E3;if(this.currentTime!==c)try{this.currentTime=c}catch(d){}b._iO._oncanplay&&b._iO._oncanplay()}),canplaythrough:r(function(){var b=this._s;b.loaded||(b._onbufferchange(0),b._whileloading(b.bytesLoaded,b.bytesTotal,b._get_html5_duration()),b._onload(!0))}),durationchange:r(function(){var b=this._s,c;c=b._get_html5_duration();isNaN(c)||\nc===b.duration||(b.durationEstimate=b.duration=c)}),ended:r(function(){this._s._onfinish()}),error:r(function(){this._s._onload(!1)}),loadeddata:r(function(){var b=this._s;b._loaded||ma||(b.duration=b._get_html5_duration())}),loadedmetadata:r(function(){}),loadstart:r(function(){this._s._onbufferchange(1)}),play:r(function(){this._s._onbufferchange(0)}),playing:r(function(){this._s._onbufferchange(0)}),progress:r(function(b){var c=this._s,d,a,f=0,f=b.target.buffered;d=b.loaded||0;var g=b.total||1;\nc.buffered=[];if(f&&f.length){d=0;for(a=f.length;d<a;d++)c.buffered.push({start:1E3*f.start(d),end:1E3*f.end(d)});f=1E3*(f.end(0)-f.start(0));d=Math.min(1,f/(1E3*b.target.duration))}isNaN(d)||(c._whileloading(d,g,c._get_html5_duration()),d&&g&&d===g&&C.canplaythrough.call(this,b))}),ratechange:r(function(){}),suspend:r(function(b){var c=this._s;C.progress.call(this,b);c._onsuspend()}),stalled:r(function(){}),timeupdate:r(function(){this._s._onTimer()}),waiting:r(function(){this._s._onbufferchange(1)})};\nja=function(b){return b&&(b.type||b.url||b.serverURL)?b.serverURL||b.type&&Z(b.type)?!1:b.type?Y({type:b.type}):Y({url:b.url})||c.html5Only||b.url.match(/data\\:/i):!1};ka=function(b){var e;b&&(e=ma?\"about:blank\":c.html5.canPlayType(\"audio/wav\")?\"data:audio/wave;base64,/UklGRiYAAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQIAAAD//w==\":\"about:blank\",b.src=e,b._called_unload!==g&&(b._called_load=!1));z&&(Ea=null);return e};Y=function(b){if(!c.useHTML5Audio||!c.hasHTML5)return!1;var e=b.url||null;b=b.type||\nnull;var d=c.audioFormats,a;if(b&&c.html5[b]!==g)return c.html5[b]&&!Z(b);if(!D){D=[];for(a in d)d.hasOwnProperty(a)&&(D.push(a),d[a].related&&(D=D.concat(d[a].related)));D=new RegExp(\"\\\\.(\"+D.join(\"|\")+\")(\\\\?.*)?$\",\"i\")}(a=e?e.toLowerCase().match(D):null)&&a.length?a=a[1]:b&&(e=b.indexOf(\";\"),a=(-1!==e?b.substr(0,e):b).substr(6));a&&c.html5[a]!==g?e=c.html5[a]&&!Z(a):(b=\"audio/\"+a,e=c.html5.canPlayType({type:b}),e=(c.html5[a]=e)&&c.html5[b]&&!Z(b));return e};Za=function(){function b(a){var b,d=b=\n!1;if(!e||\"function\"!==typeof e.canPlayType)return b;if(a instanceof Array){h=0;for(b=a.length;h<b;h++)if(c.html5[a[h]]||e.canPlayType(a[h]).match(c.html5Test))d=!0,c.html5[a[h]]=!0,c.flash[a[h]]=!!a[h].match(db);b=d}else a=e&&\"function\"===typeof e.canPlayType?e.canPlayType(a):!1,b=!(!a||!a.match(c.html5Test));return b}if(!c.useHTML5Audio||!c.hasHTML5)return v=c.html5.usingFlash=!0,!1;var e=Audio!==g?Ja&&10>opera.version()?new Audio(null):new Audio:null,d,a,f={},n,h;n=c.audioFormats;for(d in n)if(n.hasOwnProperty(d)&&\n(a=\"audio/\"+d,f[d]=b(n[d].type),f[a]=f[d],d.match(db)?(c.flash[d]=!0,c.flash[a]=!0):(c.flash[d]=!1,c.flash[a]=!1),n[d]&&n[d].related))for(h=n[d].related.length-1;0<=h;h--)f[\"audio/\"+n[d].related[h]]=f[d],c.html5[n[d].related[h]]=f[d],c.flash[n[d].related[h]]=f[d];f.canPlayType=e?b:null;c.html5=x(c.html5,f);c.html5.usingFlash=Ya();v=c.html5.usingFlash;return!0};J={};T=function(){};fa=function(b){8===m&&1<b.loops&&b.stream&&(b.stream=!1);return b};ga=function(b,c){b&&!b.usePolicyFile&&(b.onid3||b.usePeakData||\nb.useWaveformData||b.useEQData)&&(b.usePolicyFile=!0);return b};pa=function(){return!1};Ta=function(b){for(var c in b)b.hasOwnProperty(c)&&\"function\"===typeof b[c]&&(b[c]=pa)};za=function(b){b===g&&(b=!1);(B||b)&&c.disable(b)};Ua=function(b){var e=null;if(b)if(b.match(/\\.swf(\\?.*)?$/i)){if(e=b.substr(b.toLowerCase().lastIndexOf(\".swf?\")+4))return b}else b.lastIndexOf(\"/\")!==b.length-1&&(b+=\"/\");b=(b&&-1!==b.lastIndexOf(\"/\")?b.substr(0,b.lastIndexOf(\"/\")+1):\"./\")+c.movieURL;c.noSWFCache&&(b+=\"?ts=\"+\n(new Date).getTime());return b};va=function(){m=parseInt(c.flashVersion,10);8!==m&&9!==m&&(c.flashVersion=m=8);var b=c.debugMode||c.debugFlash?\"_debug.swf\":\".swf\";c.useHTML5Audio&&!c.html5Only&&c.audioFormats.mp4.required&&9>m&&(c.flashVersion=m=9);c.version=c.versionNumber+(c.html5Only?\" (HTML5-only mode)\":9===m?\" (AS3/Flash 9)\":\" (AS2/Flash 8)\");8<m?(c.defaultOptions=x(c.defaultOptions,c.flash9Options),c.features.buffering=!0,c.defaultOptions=x(c.defaultOptions,c.movieStarOptions),c.filePatterns.flash9=\nnew RegExp(\"\\\\.(mp3|\"+fb.join(\"|\")+\")(\\\\?.*)?$\",\"i\"),c.features.movieStar=!0):c.features.movieStar=!1;c.filePattern=c.filePatterns[8!==m?\"flash9\":\"flash8\"];c.movieURL=(8===m?\"soundmanager2.swf\":\"soundmanager2_flash9.swf\").replace(\".swf\",b);c.features.peakData=c.features.waveformData=c.features.eqData=8<m};Sa=function(b,c){if(!k)return!1;k._setPolling(b,c)};ya=function(){};q=this.getSoundById;L=function(){var b=[];c.debugMode&&b.push(\"sm2_debug\");c.debugFlash&&b.push(\"flash_debug\");c.useHighPerformance&&\nb.push(\"high_performance\");return b.join(\" \")};Ba=function(){T(\"fbHandler\");var b=c.getMoviePercent(),e={type:\"FLASHBLOCK\"};if(c.html5Only)return!1;c.ok()?c.oMC&&(c.oMC.className=[L(),\"movieContainer\",\"swf_loaded\"+(c.didFlashBlock?\" swf_unblocked\":\"\")].join(\" \")):(v&&(c.oMC.className=L()+\" movieContainer \"+(null===b?\"swf_timedout\":\"swf_error\")),c.didFlashBlock=!0,F({type:\"ontimeout\",ignoreInit:!0,error:e}),K(e))};ta=function(b,c,d){y[b]===g&&(y[b]=[]);y[b].push({method:c,scope:d||null,fired:!1})};\nF=function(b){b||(b={type:c.ok()?\"onready\":\"ontimeout\"});if(!l&&b&&!b.ignoreInit||\"ontimeout\"===b.type&&(c.ok()||B&&!b.ignoreInit))return!1;var e={success:b&&b.ignoreInit?c.ok():!B},d=b&&b.type?y[b.type]||[]:[],a=[],f,e=[e],g=v&&!c.ok();b.error&&(e[0].error=b.error);b=0;for(f=d.length;b<f;b++)!0!==d[b].fired&&a.push(d[b]);if(a.length)for(b=0,f=a.length;b<f;b++)a[b].scope?a[b].method.apply(a[b].scope,e):a[b].method.apply(this,e),g||(a[b].fired=!0);return!0};H=function(){h.setTimeout(function(){c.useFlashBlock&&\nBa();F();\"function\"===typeof c.onload&&c.onload.apply(h);c.waitForWindowLoad&&t.add(h,\"load\",H)},1)};Fa=function(){if(A!==g)return A;var b=!1,c=navigator,d=c.plugins,a,f=h.ActiveXObject;if(d&&d.length)(c=c.mimeTypes)&&c[\"application/x-shockwave-flash\"]&&c[\"application/x-shockwave-flash\"].enabledPlugin&&c[\"application/x-shockwave-flash\"].enabledPlugin.description&&(b=!0);else if(f!==g&&!u.match(/MSAppHost/i)){try{a=new f(\"ShockwaveFlash.ShockwaveFlash\")}catch(n){a=null}b=!!a}return A=b};Ya=function(){var b,\ne,d=c.audioFormats;Ha&&u.match(/os (1|2|3_0|3_1)\\s/i)?(c.hasHTML5=!1,c.html5Only=!0,c.oMC&&(c.oMC.style.display=\"none\")):!c.useHTML5Audio||c.html5&&c.html5.canPlayType||(c.hasHTML5=!1);if(c.useHTML5Audio&&c.hasHTML5)for(e in X=!0,d)d.hasOwnProperty(e)&&d[e].required&&(c.html5.canPlayType(d[e].type)?c.preferFlash&&(c.flash[e]||c.flash[d[e].type])&&(b=!0):(X=!1,b=!0));c.ignoreFlash&&(b=!1,X=!0);c.html5Only=c.hasHTML5&&c.useHTML5Audio&&!b;return!c.html5Only};ia=function(b){var e,d,a=0;if(b instanceof\nArray){e=0;for(d=b.length;e<d;e++)if(b[e]instanceof Object){if(c.canPlayMIME(b[e].type)){a=e;break}}else if(c.canPlayURL(b[e])){a=e;break}b[a].url&&(b[a]=b[a].url);b=b[a]}return b};Va=function(b){b._hasTimer||(b._hasTimer=!0,!na&&c.html5PollingInterval&&(null===V&&0===ha&&(V=setInterval(Xa,c.html5PollingInterval)),ha++))};Wa=function(b){b._hasTimer&&(b._hasTimer=!1,!na&&c.html5PollingInterval&&ha--)};Xa=function(){var b;if(null!==V&&!ha)return clearInterval(V),V=null,!1;for(b=c.soundIDs.length-1;0<=\nb;b--)c.sounds[c.soundIDs[b]].isHTML5&&c.sounds[c.soundIDs[b]]._hasTimer&&c.sounds[c.soundIDs[b]]._onTimer()};K=function(b){b=b!==g?b:{};\"function\"===typeof c.onerror&&c.onerror.apply(h,[{type:b.type!==g?b.type:null}]);b.fatal!==g&&b.fatal&&c.disable()};$a=function(){if(!bb||!Fa())return!1;var b=c.audioFormats,e,d;for(d in b)if(b.hasOwnProperty(d)&&(\"mp3\"===d||\"mp4\"===d)&&(c.html5[d]=!1,b[d]&&b[d].related))for(e=b[d].related.length-1;0<=e;e--)c.html5[b[d].related[e]]=!1};this._setSandboxType=function(b){};\nthis._externalInterfaceOK=function(b){if(c.swfLoaded)return!1;c.swfLoaded=!0;oa=!1;bb&&$a();setTimeout(qa,E?100:1)};ea=function(b,e){function d(a,b){return'<param name=\"'+a+'\" value=\"'+b+'\" />'}if(O&&P)return!1;if(c.html5Only)return va(),c.oMC=aa(c.movieID),qa(),P=O=!0,!1;var a=e||c.url,f=c.altURL||a,h=xa(),k=L(),m=null,m=p.getElementsByTagName(\"html\")[0],l,r,q,m=m&&m.dir&&m.dir.match(/rtl/i);b=b===g?c.id:b;va();c.url=Ua(La?a:f);e=c.url;c.wmode=!c.wmode&&c.useHighPerformance?\"transparent\":c.wmode;\nnull!==c.wmode&&(u.match(/msie 8/i)||!E&&!c.useHighPerformance)&&navigator.platform.match(/win32|win64/i)&&(W.push(J.spcWmode),c.wmode=null);h={name:b,id:b,src:e,quality:\"high\",allowScriptAccess:c.allowScriptAccess,bgcolor:c.bgColor,pluginspage:jb+\"www.macromedia.com/go/getflashplayer\",title:\"JS/Flash audio component (SoundManager 2)\",type:\"application/x-shockwave-flash\",wmode:c.wmode,hasPriority:\"true\"};c.debugFlash&&(h.FlashVars=\"debug=1\");c.wmode||delete h.wmode;if(E)a=p.createElement(\"div\"),r=\n['<object id=\"'+b+'\" data=\"'+e+'\" type=\"'+h.type+'\" title=\"'+h.title+'\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\">',d(\"movie\",e),d(\"AllowScriptAccess\",c.allowScriptAccess),d(\"quality\",h.quality),c.wmode?d(\"wmode\",c.wmode):\"\",d(\"bgcolor\",c.bgColor),d(\"hasPriority\",\"true\"),c.debugFlash?d(\"FlashVars\",h.FlashVars):\"\",\"</object>\"].join(\"\");else for(l in a=p.createElement(\"embed\"),h)h.hasOwnProperty(l)&&\na.setAttribute(l,h[l]);ya();k=L();if(h=xa())if(c.oMC=aa(c.movieID)||p.createElement(\"div\"),c.oMC.id)q=c.oMC.className,c.oMC.className=(q?q+\" \":\"movieContainer\")+(k?\" \"+k:\"\"),c.oMC.appendChild(a),E&&(l=c.oMC.appendChild(p.createElement(\"div\")),l.className=\"sm2-object-box\",l.innerHTML=r),P=!0;else{c.oMC.id=c.movieID;c.oMC.className=\"movieContainer \"+k;l=k=null;c.useFlashBlock||(c.useHighPerformance?k={position:\"fixed\",width:\"8px\",height:\"8px\",bottom:\"0px\",left:\"0px\",overflow:\"hidden\"}:(k={position:\"absolute\",\nwidth:\"6px\",height:\"6px\",top:\"-9999px\",left:\"-9999px\"},m&&(k.left=Math.abs(parseInt(k.left,10))+\"px\")));ib&&(c.oMC.style.zIndex=1E4);if(!c.debugFlash)for(q in k)k.hasOwnProperty(q)&&(c.oMC.style[q]=k[q]);try{E||c.oMC.appendChild(a),h.appendChild(c.oMC),E&&(l=c.oMC.appendChild(p.createElement(\"div\")),l.className=\"sm2-object-box\",l.innerHTML=r),P=!0}catch(t){throw Error(T(\"domError\")+\" \\n\"+t.toString());}}return O=!0};da=function(){if(c.html5Only)return ea(),!1;if(k||!c.url)return!1;k=c.getMovie(c.id);\nk||(S?(E?c.oMC.innerHTML=Aa:c.oMC.appendChild(S),S=null,O=!0):ea(c.id,c.url),k=c.getMovie(c.id));\"function\"===typeof c.oninitmovie&&setTimeout(c.oninitmovie,1);return!0};I=function(){setTimeout(Ra,1E3)};ua=function(){h.setTimeout(function(){c.setup({preferFlash:!1}).reboot();c.didFlashBlock=!0;c.beginDelayedInit()},1)};Ra=function(){var b,e=!1;if(!c.url||U)return!1;U=!0;t.remove(h,\"load\",I);if(A&&oa&&!Ka)return!1;l||(b=c.getMoviePercent(),0<b&&100>b&&(e=!0));setTimeout(function(){b=c.getMoviePercent();\nif(e)return U=!1,h.setTimeout(I,1),!1;!l&&cb&&(null===b?c.useFlashBlock||0===c.flashLoadTimeout?c.useFlashBlock&&Ba():!c.useFlashBlock&&X?ua():F({type:\"ontimeout\",ignoreInit:!0,error:{type:\"INIT_FLASHBLOCK\"}}):0!==c.flashLoadTimeout&&(!c.useFlashBlock&&X?ua():za(!0)))},c.flashLoadTimeout)};ca=function(){if(Ka||!oa)return t.remove(h,\"focus\",ca),!0;Ka=cb=!0;U=!1;I();t.remove(h,\"focus\",ca);return!0};Q=function(b){if(l)return!1;if(c.html5Only)return l=!0,H(),!0;var e=!0,d;c.useFlashBlock&&c.flashLoadTimeout&&\n!c.getMoviePercent()||(l=!0);d={type:!A&&v?\"NO_FLASH\":\"INIT_TIMEOUT\"};if(B||b)c.useFlashBlock&&c.oMC&&(c.oMC.className=L()+\" \"+(null===c.getMoviePercent()?\"swf_timedout\":\"swf_error\")),F({type:\"ontimeout\",error:d,ignoreInit:!0}),K(d),e=!1;B||(c.waitForWindowLoad&&!ra?t.add(h,\"load\",H):H());return e};Qa=function(){var b,e=c.setupOptions;for(b in e)e.hasOwnProperty(b)&&(c[b]===g?c[b]=e[b]:c[b]!==e[b]&&(c.setupOptions[b]=c[b]))};qa=function(){if(l)return!1;if(c.html5Only)return l||(t.remove(h,\"load\",\nc.beginDelayedInit),c.enabled=!0,Q()),!0;da();try{k._externalInterfaceTest(!1),Sa(!0,c.flashPollingInterval||(c.useHighPerformance?10:50)),c.debugMode||k._disableDebug(),c.enabled=!0,c.html5Only||t.add(h,\"unload\",pa)}catch(b){return K({type:\"JS_TO_FLASH_EXCEPTION\",fatal:!0}),za(!0),Q(),!1}Q();t.remove(h,\"load\",c.beginDelayedInit);return!0};G=function(){if(R)return!1;R=!0;Qa();ya();!A&&c.hasHTML5&&c.setup({useHTML5Audio:!0,preferFlash:!1});Za();!A&&v&&(W.push(J.needFlash),c.setup({flashLoadTimeout:1}));\np.removeEventListener&&p.removeEventListener(\"DOMContentLoaded\",G,!1);da();return!0};Da=function(){\"complete\"===p.readyState&&(G(),p.detachEvent(\"onreadystatechange\",Da));return!0};wa=function(){ra=!0;G();t.remove(h,\"load\",wa)};Fa();t.add(h,\"focus\",ca);t.add(h,\"load\",I);t.add(h,\"load\",wa);p.addEventListener?p.addEventListener(\"DOMContentLoaded\",G,!1):p.attachEvent?p.attachEvent(\"onreadystatechange\",Da):K({type:\"NO_DOM2_EVENTS\",fatal:!0})}if(!h||!h.document)throw Error(\"SoundManager requires a browser with window and document objects.\");\nvar N=null;h.SM2_DEFER!==g&&SM2_DEFER||(N=new w);\"object\"===typeof module&&module&&\"object\"===typeof module.exports?(module.exports.SoundManager=w,module.exports.soundManager=N):\"function\"===typeof define&&define.amd&&define(function(){return{constructor:w,getInstance:function(g){!h.soundManager&&g instanceof Function&&(g=g(w),g instanceof w&&(h.soundManager=g));return h.soundManager}}});h.SoundManager=w;h.soundManager=N})(window);","$ = require('jquery');\n\nmodule.exports.init = function(Creek){\n\n  var volumeOpen = false;\n  var volumeDragging = false;\n\n  //Functions:\n\n  var hideVolume = function(){\n    Creek.debug.log(\"Closing volume tool.\")\n    volumeOpen = false;\n    // $(\".creek-volume-button\").addClass('creek-volume-open-button');\n    // $(\".creek-volume-button\").removeClass('creek-volume-close-button');\n    // $(\"#creek-audio-volume-tool\").removeClass('creek-audio-volume-visible');\n    $(\"body\").removeClass('creek-audio-volume-visible');\n  }\n\n  var showVolume = function(){\n    Creek.debug.log(\"Opening volume tool.\")\n    volumeOpen = true;\n    // $(\".creek-volume-button\").removeClass('creek-volume-open-button');\n    // $(\".creek-volume-button\").addClass('creek-volume-close-button');\n    // $(\"#creek-audio-volume-tool\").addClass('creek-audio-volume-visible');\n    $(\"body\").addClass('creek-audio-volume-visible');\n  }\n\n  var dragVolume = function(event, element){\n    var posY = $(element).offset().top;\n    var clickWhere = event.pageY - posY;\n\n    var theVolume = 1 - (clickWhere / 100);\n    var fillerHeight = (100 * theVolume) + 'px';\n\n    Creek.audio.volume = theVolume*100;\n\n    $('#creek-audio-volume-tool .bar .filler').css('height', fillerHeight);\n    soundManager.setVolume(Creek.audio.volume);\n  }\n\n  //Stuff to do after page loads:\n  $(function(){\n\n    //Handle clicking volume button (open or close volume)\n    $(document).on('click', '.creek-audio-volume-button-open', function(){\n      showVolume();\n    })\n\n    $('#creek-audio-volume-tool .bar').on('mousedown', function(e) {\n      volumeDragging = true;\n    });\n    $('#creek-audio-volume-tool .bar').on('mouseup', function(e) {\n      volumeDragging = false;\n    });\n    $('#creek-audio-volume-tool .bar').on('mousemove mousedown', function(e) {\n      if(volumeDragging){\n       dragVolume(event, $(this))\n      }\n    });\n\n    //Close volume if clicking outside.\n    $(document).mouseup(function (e)\n    {\n\n      // Creek.debug.log(\"Volume clicked: \"+$(e.target).outerHtml)\n\n      var container = $(\"#creek-audio-volume-tool\");\n\n      if(\n          volumeOpen // first, if volume is open\n          // && $(this).closest(\".creek-volume-button\").length < 1 // volume button is handled separately.\n          && !container.is(e.target) // if the target of the click isn't the container...\n          && container.has(e.target).length === 0) // ... nor a descendant of the container\n      {\n        Creek.debug.log(\"Volume: clicked outside.\")\n        hideVolume();\n      }\n\n    });\n\n  })\n\n}\n","/*!\n * jQuery htmlDoc \"fixer\" - v0.2pre - 8/8/2011\n * http://benalman.com/projects/jquery-misc-plugins/\n *\n * Copyright (c) 2010 \"Cowboy\" Ben Alman\n * Dual licensed under the MIT and GPL licenses.\n * http://benalman.com/about/license/\n */\n\nmodule.exports = function($) {\n  // RegExp that matches opening and closing browser-stripped tags.\n  // $1 = slash, $2 = tag name, $3 = attributes\n  var matchTag = /<(\\/?)(html|head|body|title|base|meta)(\\s+[^>]*)?>/ig;\n  // Unique id prefix for selecting placeholder elements.\n  var prefix = 'hd' + +new Date;\n  // A node under which a temporary DOM tree can be constructed.\n  var parent;\n\n  $.htmlDoc = function(html) {\n    // A collection of \"intended\" elements that can't be rendered cross-browser\n    // with .innerHTML, for which placeholders must be swapped.\n    var elems = $();\n    // Input HTML string, parsed to include placeholder DIVs. Replace HTML,\n    // HEAD, BODY tags with DIV placeholders.\n    var htmlParsed = html.replace(matchTag, function(tag, slash, name, attrs) {\n      // Temporary object in which to hold attributes.\n      var obj = {};\n      // If this is an opening tag...\n      if ( !slash ) {\n        // Add an element of this name into the collection of elements. Note\n        // that if a string of attributes is added at this point, it fails.\n        elems = elems.add('<' + name + '/>');\n        // If the original tag had attributes, create a temporary div with\n        // those attributes. Then, copy each attribute from the temporary div\n        // over to the temporary object.\n        if ( attrs ) {\n          $.each($('<div' + attrs + '/>')[0].attributes, function(i, attr) {\n            obj[attr.name] = attr.value;\n          });\n        }\n        // Set the attributes of the intended object based on the attributes\n        // copied in the previous step.\n        elems.eq(-1).attr(obj);\n      }\n      // A placeholder div with a unique id replaces the intended element's\n      // tag in the parsed HTML string.\n      return '<' + slash + 'div'\n        + (slash ? '' : ' id=\"' + prefix + (elems.length - 1) + '\"') + '>';\n    });\n\n    // If no placeholder elements were necessary, just return normal\n    // jQuery-parsed HTML.\n    if ( !elems.length ) {\n      return $(html);\n    }\n    // Create parent node if it hasn't been created yet.\n    if ( !parent ) {\n      parent = $('<div/>');\n    }\n    // Create the parent node and append the parsed, place-held HTML.\n    parent.html(htmlParsed);\n    // Replace each placeholder element with its intended element.\n    $.each(elems, function(i) {\n      var elem = parent.find('#' + prefix + i).before(elems[i]);\n      elems.eq(i).html(elem.contents());\n      elem.remove();\n    });\n    // Return the topmost intended element(s), sans text nodes, while removing\n    // them from the parent element with unwrap.\n    return parent.children().unwrap();\n  };\n\n}\n","\n//I've added the \"Creek\" object prefix. I don't understand how Browserify works.\n\nmodule.exports = function(Vue, moment) {\n\n\tVue.filter('moment', function() {\n\t\tvar args = Array.prototype.slice.call(arguments),\n\t\t\tvalue = args.shift(),\n\t\t\tdate = moment(value);\n\n\t\tif (!date.isValid()) return '';\n\n\t\tfunction parse() {\n\t\t\tvar args = Array.prototype.slice.call(arguments).map(function(str) { return str.replace(/^(\"|')|(\"|')$/g, ''); }),\n\t\t\t\tmethod = args.shift();\n\n\t\t\tswitch (method) {\n\t\t\t\tcase 'add':\n\n\t\t\t\t\t// Mutates the original moment by adding time.\n\t\t\t\t\t// http://momentjs.com/docs/#/manipulating/add/\n\n\t\t\t\t\tvar addends = args.shift()\n\t\t\t\t\t\t\t\t\t  .split(',')\n\t\t\t\t\t\t\t\t\t  .map(Function.prototype.call, String.prototype.trim);\n\t\t\t\t\tobj = {};\n\t\t\t\t\tfor (var n = 0; n < addends.length; n++) {\n\t\t\t\t\t\tvar addend = addends[n].split(' ');\n\t\t\t\t\t\tobj[addend[1]] = addend[0];\n\t\t\t\t\t}\n\t\t\t\t\tdate = date.add(obj);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'subtract':\n\n\t\t\t\t\t// Mutates the original moment by subtracting time.\n\t\t\t\t\t// http://momentjs.com/docs/#/manipulating/subtract/\n\n\t\t\t\t\tvar subtrahends = args.shift()\n\t\t\t\t\t\t\t\t\t  .split(',')\n\t\t\t\t\t\t\t\t\t  .map(Function.prototype.call, String.prototype.trim);\n\t\t\t\t\tobj = {};\n\t\t\t\t\tfor (var n = 0; n < subtrahends.length; n++) {\n\t\t\t\t\t\tvar subtrahend = subtrahends[n].split(' ');\n\t\t\t\t\t\tobj[subtrahend[1]] = subtrahend[0];\n\t\t\t\t\t}\n\t\t\t\t\tdate = date.subtract(obj);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'from':\n\n\t\t\t\t\t// Display a moment in relative time, either from now or from a specified date.\n\t\t\t\t\t// http://momentjs.com/docs/#/displaying/fromnow/\n\n\t\t\t\t\tvar from = 'now';\n\t\t\t\t\tif (args[0] == 'now') args.shift();\n\n\t\t\t\t\tif (moment(args[0]).isValid()) {\n\t\t\t\t\t\t// If valid, assume it is a date we want the output computed against.\n\t\t\t\t\t\tfrom = moment(args.shift());\n\t\t\t\t\t}\n\n\t\t\t\t\tvar removeSuffix = false;\n\t\t\t\t\tif (args[0] == 'true') {\n\t\t\t\t\t\targs.shift();\n\t\t\t\t\t\tvar removeSuffix = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (from != 'now') {\n\t\t\t\t\t\tdate = date.from(from, removeSuffix);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tdate = date.fromNow(removeSuffix);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'calendar':\n\n\t\t\t\t\t// Formats a date with different strings depending on how close to a certain date (today by default) the date is.\n\t\t\t\t\t// http://momentjs.com/docs/#/displaying/calendar-time/\n\n\t\t\t\t\tvar referenceTime = moment();\n\n\t\t\t\t\tif (moment(args[0]).isValid()) {\n\t\t\t\t\t\t// If valid, assume it is a date we want the output computed against.\n\t\t\t\t\t\treferenceTime = moment(args.shift());\n\t\t\t\t\t}\n\n\t\t\t\t\tdate = date.calendar(referenceTime);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t// Format\n\t\t\t\t\t// Formats a date by taking a string of tokens and replacing them with their corresponding values.\n\t\t\t\t\t// http://momentjs.com/docs/#/displaying/format/\n\n\t\t\t\t\tvar format = method;\n\t\t\t\t\tdate = date.format(format);\n\t\t\t}\n\n\t\t\tif (args.length) parse.apply(parse, args);\n\t\t}\n\n\t\tparse.apply(parse, args);\n\n\n\t\treturn date;\n\t});\n\n\treturn Vue;\n\n}\n","module.exports = function(audio_files, dark_text){\n\n  function build_audio_rows(audio_files){\n\n    var audio_files_html = '';\n\n    for (var i = 0; i < audio_files.length; i++) {\n      audio_files_html +=\n       '<li><a oncontextmenu=\"return false\" class=\"player\" href=\"'+audio_files[i].url+'\">'+audio_files[i].title+'</a></li>';\n    }\n\n    // console.log(audio_files_html);\n\n    return audio_files_html;\n\n  };\n\n  //Option: Dark text\n  dark_text_class = \"\";\n  if(dark_text){\n    dark_text_class = \" dark-text\";\n  }\n\n  //Only show the playlist if there is more than one audio file.\n  var playlist_open = audio_files.length > 1 ? \" playlist_open\" : \"\";\n\n  var html =\n   '<div class=\"sm2-bar-ui flat full-width'+playlist_open+dark_text_class+'\">'\n  +'  <div class=\"bd sm2-main-controls\">'\n  +'    <div class=\"sm2-inline-texture\"></div>'\n  +'    <div class=\"sm2-inline-gradient\"></div>'\n  +'    <div class=\"sm2-inline-element sm2-button-element\">'\n  +'      <div class=\"sm2-button-bd\">'\n  +'        <a href=\"#play\" class=\"sm2-inline-button play-pause\">Play / pause</a>'\n  +'      </div>'\n  +'    </div>'\n  +'    <div class=\"sm2-inline-element sm2-inline-status\">'\n  +'      <div class=\"sm2-playlist\">'\n  +'        <div class=\"sm2-playlist-target\">'\n  +'          <ul class=\"sm2-playlist-bd\">'\n  +'            <li></li>'\n  +'          </ul>'\n  +'        </div>'\n  +'      </div>'\n  +'      <div class=\"sm2-progress\">'\n  +'        <div class=\"sm2-row\">'\n  +'          <div class=\"sm2-inline-time\">0:00</div>'\n  +'          <div class=\"sm2-progress-bd\">'\n  +'            <div class=\"sm2-progress-track\">'\n  +'              <div class=\"sm2-progress-bar\" style=\"width: 0.0986938%;\"></div>'\n  +'              <div class=\"sm2-loading-bar\"></div>'\n  +'              <div class=\"sm2-progress-ball\" style=\"left: 0.0986938%;\">'\n  +'                <div class=\"icon-overlay\"></div>'\n  +'              </div>'\n  +'            </div>'\n  +'          </div>'\n  +'          <div class=\"sm2-inline-duration\"></div>'\n  +'        </div>'\n  +'      </div>'\n  +'    </div>'\n  +'    <div class=\"sm2-inline-element sm2-button-element sm2-volume\">'\n  +'      <div class=\"sm2-button-bd\">'\n  +'        <span class=\"sm2-inline-button sm2-volume-control volume-shade\"></span>'\n  // +'        <br>'\n  +'        <a href=\"#volume\" class=\"sm2-inline-button sm2-volume-control\">volume</a>'\n  +'      </div>'\n  +'    </div>'\n  +'  </div>'\n  +'  <div class=\"bd sm2-playlist-drawer sm2-element\">'\n  +'    <div class=\"sm2-inline-texture\">'\n  +'      <div class=\"sm2-box-shadow\"></div>'\n  +'    </div>'\n  +'    <div class=\"sm2-playlist-wrapper\">'\n  +'      <ul class=\"sm2-playlist-bd\">'\n\n  + build_audio_rows(audio_files)\n\n  +'      </ul>'\n  +'    </div>'\n  +'    <div class=\"sm2-extra-controls\">'\n  +'      <div class=\"bd\">'\n  +'        <div class=\"sm2-inline-element sm2-button-element\">'\n  +'          <a href=\"#prev\" title=\"Previous\" class=\"sm2-inline-button previous\">&lt; previous</a>'\n  +'        </div>'\n  +'        <div class=\"sm2-inline-element sm2-button-element\">'\n  +'          <a href=\"#next\" title=\"Next\" class=\"sm2-inline-button next\">&gt; next</a>'\n  +'        </div>'\n  +'      </div>'\n  +'    </div>'\n  +'  </div>'\n  +'</div>';\n\n  //Remove linebreaks from the output HTML\n  // WordPress: This specifically fixes the automatic \"<p></p>\" injection.\n  var html_filtered = html.replace(/(\\r\\n|\\n|\\r)/gm,\"\");\n\n  return html_filtered;\n\n}\n","module.exports = ''\n+ '<div id=\"creek-audio-toolbar\">'\n// '<div id=\"creek-audio-toolbar\" class=\"creek-audio-toolbar-container\">'\n+'  <div class=\"creek-audio-toolbar-inner\">'\n+'    <a class=\"creek-audio-main-button creek-audio-play-button\" href=\"javascript:\">'\n+'      <span class=\"fa-stack fa-lg\">'\n// +'        <i class=\"fa fa-circle fa-stack-2x\"></i>'\n+'        <i class=\"creek-audio-play-icon fa fa-play fa-stack-1x\"></i><i class=\"creek-audio-pause-icon fa fa-pause fa-stack-1x\"></i>'\n+'      </span>'\n+'    </a>'\n+'    <a class=\"creek-audio-show-image\"><img src=\"\" /></a>'\n+'    <a href=\"javascript:\" class=\"creek-audio-volume-button creek-audio-volume-button-open\"><i class=\"fa fa-volume-up\"></i></a>'\n+'    <a href=\"javascript:\" class=\"creek-audio-volume-button creek-audio-volume-button-close\"><i class=\"fa fa-volume-up\"></i></a>'\n+'    <div class=\"creek-live-data\">'\n+'      <a class=\"creek-audio-switch-to-live creek-hide\" href=\"javascript:\">Back to live</a>'\n+'      <div><a class=\"creek-show-title creek-show-link creek-audio-title creek-audio-link\" href=\"/shows/\"></a></div>'\n+'      <div class=\"creek-show-time\" style=\"display:none;\">'\n+'        <span class=\"start\"></span> - '\n+'        <span class=\"end\"></span>'\n+'      </div>'\n+'      <div class=\"creek-track\" style=\"display:none;\"><span class=\"creek-track-artist\"></span> - <span class=\"creek-track-title\"></span> &nbsp; </div>'\n+'      <div class=\"creek-track-none\">&nbsp;</div>'\n+'    </div>'\n+'    <div id=\"creek-audio-volume-tool\" style=\"-moz-user-select: none; -webkit-user-select: none; -ms-user-select:none; user-select:none;\" unselectable=\"on\" onselectstart=\"return false;\">'\n+'      <div class=\"bar\">'\n+'        <div class=\"filler\"></div>'\n+'      </div>'\n+'    </div>'\n+'  </div>'\n+'</div>'\n","\n// console.log(\"YEAHHHH\");\n\n//-------------------------------------------------------\n// ARCHIVES\n//-------------------------------------------------------\n\nvar $ = require('jquery');\n\nmodule.exports.init = function(Creek, Vue){\n\n  // var moment = require('moment');\n\n  //---------------------------\n  // Vue, for rendering the templates.\n  //---------------------------\n  // var Vue = require('vue');\n  //\n  // if(Creek.debug.active){\n  //   Vue.config.debug = true;\n  // }\n  //\n  // //Add Vue Moment filter\n  // Vue = require('./vue-moment.js')(Vue, moment);\n  //\n  // // var VueRouter = require('vue-router')\n  //\n  // Vue.use(VueRouter)\n\n  var initialLoad = function(callback){\n\n    Creek.debug.log(\"Opening archives pages.\");\n\n    getBroadcasts({}, function(data){\n    // $.getJSON(url, function(data){\n      console.log(data);\n      // Creek.debug.log(data);\n      // data.html = data;\n      // Creek.debug.log(data);\n      // setTitle(data.title);\n      return callback(data);\n    // })\n    })\n\n  }\n\n  function getBroadcasts(x, callback){\n\n    console.log(\"fuck\");\n    // console.log(url);\n\n    var callback = callback || function(){}\n\n    //Set up data for API request\n    var x = x || {};\n    var input_limit = x.limit || 20;\n    var input_offset = x.offset || 0;\n    var input_term = $(\"#creek-broadcasts-search-box\").val() || '';\n    var input_show = $(\"#creek-broadcasts-program\").val() || '';\n    var input_show_category = $(\"#creek-broadcasts-show-category\").val() || '';\n    var input_date_start = $(\"#creek-broadcasts-date-start\").val() || '';\n    var input_date_end = '';\n\n    if(input_date_start){\n      input_date_end = input_date_start;\n      // input_date_end = moment(input_date_start+' 00:00:00').add(25, 'hours').format('YYYY-MM-DD');\n    }\n\n    //Add the filters\n    var url = Creek.data.url_prefix+\"/api/broadcasts?x=1\";\n    url += \"&limit=\"+input_limit;\n    url += \"&offset=\"+input_offset;\n    url += \"&search=\"+input_term;\n    url += \"&show_category=\"+input_show_category;\n    url += \"&date_start=\"+input_date_start;\n    url += \"&date_end=\"+input_date_end;\n    url += \"&cr=hide_expired\" //hide copyright-expired broadcasts\n\n    if(input_show){\n      url += \"&show=\"+input_show;\n    }\n\n    //Add JSONP callback\n    url += \"&callback=?\";\n\n\n    $.getJSON(url, function(data){\n      // components.archives.broadcasts = data;\n      // console.log(data);\n      $(\"#creek-broadcasts\").removeClass(\"invisible\");\n      callback(data);\n    });\n\n  }\n\n\n  $Archives = Vue.component('creek-archives', {\n    // template: require('./templates/archives'),\n    template: Creek.util.fixLinks(require('./templates/archives')),\n    data: function(){\n      console.log(\"data worked\")\n      return {\n        broadcasts:{},\n        programs:{},\n        categories:{}\n      }\n    },\n    route: {\n      data: function(transition){\n\n\n        // var url = Creek.data.url_prefix+\"/shows/\"+transition.to.params.short_name+\"?external=1&external_complete=1&callback=?\";\n        // Creek.debug.log(url);\n\n        console.log(\"loading for archives\");\n\n        initialLoad(function(data){\n          console.log(\"yeps\");\n          var data2 = { broadcasts: data};\n          // $Archives.broadcasts = data;\n          transition.next(data2);\n          // swapPageClass(\"creek-page-archives\"); //!!! add this again\n        });\n\n        // $.getJSON(Creek.data.url_prefix+\"/api/shows?callback=?\", function(data){\n        //   console.log(data);\n        //   console.log(\"fuck\")\n        //   this.$data.programs = data;\n        // });\n        //\n        // $.getJSON(Creek.data.url_prefix+\"/api/program_categories?callback=?\", function(data){\n        //   console.log(data);\n        //   console.log(\"fuckk\")\n        //   this.$data.categories = data;\n        // });\n\n      }\n    }\n  })\n\n  // var App = Vue.extend({})\n  // var router = new VueRouter()\n  // var router = new VueRouter({saveScrollPosition: true})\n  // var router = new VueRouter({saveScrollPosition: true, history: true})\n\n  // router.map({\n  //   '/archives': {\n  //     component: components.Archives\n  //   }\n  // })\n\n\n  // var render = function(){\n  //\n  //   console.log(\"yess\")\n  //\n  //   var container = Creek.data.shows.container;\n  //\n  //   //Check for container on the page.\n  //   if($(container).length < 1){\n  //     return;\n  //     Creek.debug.log(\"Creek: No container element for content.\");\n  //   }\n  //\n  //   //Add the router view outlet/container for Vue Router\n  //   // $(container).html(\"<router-view></router-view>\");\n  //\n  //   // router.start(App, container);\n  //\n  // }\n\n  //\n  // var container = '#Creek-Archives';\n  //\n  // //If container is found, then use it.\n  // if($(container).length > 0){\n  //\n  //   $(container).html(html_archives);\n\n\n\n    // getBroadcasts();\n\n    $(\"body\").on(\"click\", \"#broadcasts-search-button\", function(){\n      getBroadcasts();\n    })\n\n    // $(\"#archives-search-form input, #archives-search-form select\").on(\"input\", function(){\n    //   getBroadcasts();\n    // })\n\n    // var pickadate_settings = {\n    //\n    //   // Editable input\n    //   // editable: true,\n    //\n    //   format: 'yyyy-mm-dd',\n    //\n    //   // Dropdown selectors\n    //   selectYears: true,\n    //   selectMonths: true,\n    //\n    //   weekdaysShort: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\n    //\n    //   onSet: function(context) {\n    //     // getBroadcasts();\n    //   }\n    //\n    // }\n    //\n    // var broadcasts_date_start = $('#broadcasts-date-start').pickadate(pickadate_settings)\n    // var broadcasts_date_end = $('#broadcasts-date-end').pickadate(pickadate_settings)\n\n  // }\n\n\n  //Run on first page load\n  // $(function(){\n  //   render();\n  // })\n\n  return $Archives;\n\n}\n","\n//Not used: using content-page instead.\n\nmodule.exports = ''\n+ '<div v-if=\"$loadingRouteData\"><i class=\"creek-loading-icon fa fa-spinner fa-spin fa-2x\"></i></div>'\n+ '<div v-if=\"!$loadingRouteData\" v-html=\"html\"></div>'\n","module.exports = function(Creek){\n\n  var html = ''\n  + '<div v-if=\"$loadingRouteData\">'+Creek.data.router.loadingHtml+'</div>'\n  + '<div v-if=\"!$loadingRouteData\" v-html=\"$data.html\"></div>'\n\n  // Creek.debug.log(html);\n  // Creek.debug.log(html);\n\n  return html;\n\n}\n","module.exports = ''\n+ '<div class=\"creek-shows-container\">'\n+ '<div class=\"creek-shows-container\">'\n+ '  <div class=\"creek-weekdays\">'\n+ '    <ul>'\n+ '      <li class=\"creek-weekday creek-weekday-1\"><a href=\"#!/weekday/1\" data-weekday=\"1\">Monday</a></li>'\n+ '      <li class=\"creek-weekday creek-weekday-2\"><a href=\"#!/weekday/2\" data-weekday=\"2\">Tuesday</a></li>'\n+ '      <li class=\"creek-weekday creek-weekday-3\"><a href=\"#!/weekday/3\" data-weekday=\"3\">Wednesday</a></li>'\n+ '      <li class=\"creek-weekday creek-weekday-4\"><a href=\"#!/weekday/4\" data-weekday=\"4\">Thursday</a></li>'\n+ '      <li class=\"creek-weekday creek-weekday-5\"><a href=\"#!/weekday/5\" data-weekday=\"5\">Friday</a></li>'\n+ '      <li class=\"creek-weekday creek-weekday-6\"><a href=\"#!/weekday/6\" data-weekday=\"6\">Saturday</a></li>'\n+ '      <li class=\"creek-weekday creek-weekday-7\"><a href=\"#!/weekday/7\" data-weekday=\"7\">Sunday</a></li>'\n+ '      <li class=\"creek-weekday creek-weekday-0 creek-shows-all\"><a href=\"#!/all\"><i class=\"fa fa-search\"></i> All Shows</a></li>'\n// + '    <a class=\"creek-shows-all creek-shows-all\"><a href=\"#!/all\">All Shows</a>'\n+ '    </ul>'\n+ '  </div>'\n+ '  <div class=\"creek-shows-find\">'\n+ '    <input type=\"text\" v-model=\"findTerm\" placeholder=\"Find a Show\" />'\n+ '  </div>'\n+ '  <div class=\"creek-shows\">'\n+ '    <div :class=\"\\'creek-show \\'+show.short_name\" v-for=\"show in shows | filterBy findTerm\">'\n+ '      <div class=\"creek-image-container\">'\n+ '        <a :href=\"\\'/shows/\\'+show.short_name\"><img v-if=\"show.Image\" :src=\"show.Image.url_sm\" /></a>'\n+ '      </div>'\n+ '      <div class=\"creek-info-container readmore-js-section readmore-js-collapsed\">'\n+ '        <h3 class=\"creek-title\"><a :href=\"\\'/shows/\\'+show.short_name\" v-text=\"show.title\"></a></h3>'\n+ '        <div class=\"creek-hosts-container\">'\n+ '          <ul>'\n+ '            <li v-for=\"host in show.hosts\"><a class=\"creek-host-link\" href=\"/profiles/\" :href=\"\\'/profiles/\\'+host.username\" v-text=\"host.display_name\"></a></li>'\n+ '          </ul>'\n+ '        </div>'\n+ '        <div class=\"creek-short-description\" v-text=\"show.short_description\"></div>'\n+ '        <!--'\n+ '        <div class=\"categories\">'\n+ '          <div class=\"categories-container\">'\n+ '            <ul>'\n+ '              <li><a href=\"#\" class=\"creek-category-link\" v-text=\"category.title\"></a></li>'\n+ '            </ul>'\n+ '          </div>'\n+ '        </div>'\n+ '        -->'\n+ '      </div>'\n+ '      <a href=\"#\" class=\"creek-readmore-js-toggle\"></a>'\n+ '    </div>'\n+ '  </div>'\n+ '</div>'\n","'use strict';\n// For more information about browser field, check out the browser field at https://github.com/substack/browserify-handbook#browser-field.\n\nmodule.exports = {\n    // Create a <link> tag with optional data attributes\n    createLink: function(href, attributes) {\n        var head = document.head || document.getElementsByTagName('head')[0];\n        var link = document.createElement('link');\n\n        link.href = href;\n        link.rel = 'stylesheet';\n\n        for (var key in attributes) {\n            if ( ! attributes.hasOwnProperty(key)) {\n                continue;\n            }\n            var value = attributes[key];\n            link.setAttribute('data-' + key, value);\n        }\n\n        head.appendChild(link);\n    },\n    // Create a <style> tag with optional data attributes\n    createStyle: function(cssText, attributes) {\n        var head = document.head || document.getElementsByTagName('head')[0],\n            style = document.createElement('style');\n\n        style.type = 'text/css';\n\n        for (var key in attributes) {\n            if ( ! attributes.hasOwnProperty(key)) {\n                continue;\n            }\n            var value = attributes[key];\n            style.setAttribute('data-' + key, value);\n        }\n        \n        if (style.sheet) { // for jsdom and IE9+\n            style.innerHTML = cssText;\n            style.sheet.cssText = cssText;\n            head.appendChild(style);\n        } else if (style.styleSheet) { // for IE8 and below\n            head.appendChild(style);\n            style.styleSheet.cssText = cssText;\n        } else { // for Chrome, Firefox, and Safari\n            style.appendChild(document.createTextNode(cssText));\n            head.appendChild(style);\n        }\n    }\n};\n","//! moment.js\n//! version : 2.11.1\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\n//! license : MIT\n//! momentjs.com\n\n;(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    global.moment = factory()\n}(this, function () { 'use strict';\n\n    var hookCallback;\n\n    function utils_hooks__hooks () {\n        return hookCallback.apply(null, arguments);\n    }\n\n    // This is done to register the method called with moment()\n    // without creating circular dependencies.\n    function setHookCallback (callback) {\n        hookCallback = callback;\n    }\n\n    function isArray(input) {\n        return Object.prototype.toString.call(input) === '[object Array]';\n    }\n\n    function isDate(input) {\n        return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n    }\n\n    function map(arr, fn) {\n        var res = [], i;\n        for (i = 0; i < arr.length; ++i) {\n            res.push(fn(arr[i], i));\n        }\n        return res;\n    }\n\n    function hasOwnProp(a, b) {\n        return Object.prototype.hasOwnProperty.call(a, b);\n    }\n\n    function extend(a, b) {\n        for (var i in b) {\n            if (hasOwnProp(b, i)) {\n                a[i] = b[i];\n            }\n        }\n\n        if (hasOwnProp(b, 'toString')) {\n            a.toString = b.toString;\n        }\n\n        if (hasOwnProp(b, 'valueOf')) {\n            a.valueOf = b.valueOf;\n        }\n\n        return a;\n    }\n\n    function create_utc__createUTC (input, format, locale, strict) {\n        return createLocalOrUTC(input, format, locale, strict, true).utc();\n    }\n\n    function defaultParsingFlags() {\n        // We need to deep clone this object.\n        return {\n            empty           : false,\n            unusedTokens    : [],\n            unusedInput     : [],\n            overflow        : -2,\n            charsLeftOver   : 0,\n            nullInput       : false,\n            invalidMonth    : null,\n            invalidFormat   : false,\n            userInvalidated : false,\n            iso             : false\n        };\n    }\n\n    function getParsingFlags(m) {\n        if (m._pf == null) {\n            m._pf = defaultParsingFlags();\n        }\n        return m._pf;\n    }\n\n    function valid__isValid(m) {\n        if (m._isValid == null) {\n            var flags = getParsingFlags(m);\n            m._isValid = !isNaN(m._d.getTime()) &&\n                flags.overflow < 0 &&\n                !flags.empty &&\n                !flags.invalidMonth &&\n                !flags.invalidWeekday &&\n                !flags.nullInput &&\n                !flags.invalidFormat &&\n                !flags.userInvalidated;\n\n            if (m._strict) {\n                m._isValid = m._isValid &&\n                    flags.charsLeftOver === 0 &&\n                    flags.unusedTokens.length === 0 &&\n                    flags.bigHour === undefined;\n            }\n        }\n        return m._isValid;\n    }\n\n    function valid__createInvalid (flags) {\n        var m = create_utc__createUTC(NaN);\n        if (flags != null) {\n            extend(getParsingFlags(m), flags);\n        }\n        else {\n            getParsingFlags(m).userInvalidated = true;\n        }\n\n        return m;\n    }\n\n    function isUndefined(input) {\n        return input === void 0;\n    }\n\n    // Plugins that add properties should also add the key here (null value),\n    // so we can properly clone ourselves.\n    var momentProperties = utils_hooks__hooks.momentProperties = [];\n\n    function copyConfig(to, from) {\n        var i, prop, val;\n\n        if (!isUndefined(from._isAMomentObject)) {\n            to._isAMomentObject = from._isAMomentObject;\n        }\n        if (!isUndefined(from._i)) {\n            to._i = from._i;\n        }\n        if (!isUndefined(from._f)) {\n            to._f = from._f;\n        }\n        if (!isUndefined(from._l)) {\n            to._l = from._l;\n        }\n        if (!isUndefined(from._strict)) {\n            to._strict = from._strict;\n        }\n        if (!isUndefined(from._tzm)) {\n            to._tzm = from._tzm;\n        }\n        if (!isUndefined(from._isUTC)) {\n            to._isUTC = from._isUTC;\n        }\n        if (!isUndefined(from._offset)) {\n            to._offset = from._offset;\n        }\n        if (!isUndefined(from._pf)) {\n            to._pf = getParsingFlags(from);\n        }\n        if (!isUndefined(from._locale)) {\n            to._locale = from._locale;\n        }\n\n        if (momentProperties.length > 0) {\n            for (i in momentProperties) {\n                prop = momentProperties[i];\n                val = from[prop];\n                if (!isUndefined(val)) {\n                    to[prop] = val;\n                }\n            }\n        }\n\n        return to;\n    }\n\n    var updateInProgress = false;\n\n    // Moment prototype object\n    function Moment(config) {\n        copyConfig(this, config);\n        this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n        // Prevent infinite loop in case updateOffset creates new moment\n        // objects.\n        if (updateInProgress === false) {\n            updateInProgress = true;\n            utils_hooks__hooks.updateOffset(this);\n            updateInProgress = false;\n        }\n    }\n\n    function isMoment (obj) {\n        return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\n    }\n\n    function absFloor (number) {\n        if (number < 0) {\n            return Math.ceil(number);\n        } else {\n            return Math.floor(number);\n        }\n    }\n\n    function toInt(argumentForCoercion) {\n        var coercedNumber = +argumentForCoercion,\n            value = 0;\n\n        if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n            value = absFloor(coercedNumber);\n        }\n\n        return value;\n    }\n\n    // compare two arrays, return the number of differences\n    function compareArrays(array1, array2, dontConvert) {\n        var len = Math.min(array1.length, array2.length),\n            lengthDiff = Math.abs(array1.length - array2.length),\n            diffs = 0,\n            i;\n        for (i = 0; i < len; i++) {\n            if ((dontConvert && array1[i] !== array2[i]) ||\n                (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {\n                diffs++;\n            }\n        }\n        return diffs + lengthDiff;\n    }\n\n    function Locale() {\n    }\n\n    // internal storage for locale config files\n    var locales = {};\n    var globalLocale;\n\n    function normalizeLocale(key) {\n        return key ? key.toLowerCase().replace('_', '-') : key;\n    }\n\n    // pick the locale from the array\n    // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n    // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\n    function chooseLocale(names) {\n        var i = 0, j, next, locale, split;\n\n        while (i < names.length) {\n            split = normalizeLocale(names[i]).split('-');\n            j = split.length;\n            next = normalizeLocale(names[i + 1]);\n            next = next ? next.split('-') : null;\n            while (j > 0) {\n                locale = loadLocale(split.slice(0, j).join('-'));\n                if (locale) {\n                    return locale;\n                }\n                if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {\n                    //the next array item is better than a shallower substring of this one\n                    break;\n                }\n                j--;\n            }\n            i++;\n        }\n        return null;\n    }\n\n    function loadLocale(name) {\n        var oldLocale = null;\n        // TODO: Find a better way to register and load all the locales in Node\n        if (!locales[name] && (typeof module !== 'undefined') &&\n                module && module.exports) {\n            try {\n                oldLocale = globalLocale._abbr;\n                require('./locale/' + name);\n                // because defineLocale currently also sets the global locale, we\n                // want to undo that for lazy loaded locales\n                locale_locales__getSetGlobalLocale(oldLocale);\n            } catch (e) { }\n        }\n        return locales[name];\n    }\n\n    // This function will load locale and then set the global locale.  If\n    // no arguments are passed in, it will simply return the current global\n    // locale key.\n    function locale_locales__getSetGlobalLocale (key, values) {\n        var data;\n        if (key) {\n            if (isUndefined(values)) {\n                data = locale_locales__getLocale(key);\n            }\n            else {\n                data = defineLocale(key, values);\n            }\n\n            if (data) {\n                // moment.duration._locale = moment._locale = data;\n                globalLocale = data;\n            }\n        }\n\n        return globalLocale._abbr;\n    }\n\n    function defineLocale (name, values) {\n        if (values !== null) {\n            values.abbr = name;\n            locales[name] = locales[name] || new Locale();\n            locales[name].set(values);\n\n            // backwards compat for now: also set the locale\n            locale_locales__getSetGlobalLocale(name);\n\n            return locales[name];\n        } else {\n            // useful for testing\n            delete locales[name];\n            return null;\n        }\n    }\n\n    // returns locale data\n    function locale_locales__getLocale (key) {\n        var locale;\n\n        if (key && key._locale && key._locale._abbr) {\n            key = key._locale._abbr;\n        }\n\n        if (!key) {\n            return globalLocale;\n        }\n\n        if (!isArray(key)) {\n            //short-circuit everything else\n            locale = loadLocale(key);\n            if (locale) {\n                return locale;\n            }\n            key = [key];\n        }\n\n        return chooseLocale(key);\n    }\n\n    var aliases = {};\n\n    function addUnitAlias (unit, shorthand) {\n        var lowerCase = unit.toLowerCase();\n        aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n    }\n\n    function normalizeUnits(units) {\n        return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n    }\n\n    function normalizeObjectUnits(inputObject) {\n        var normalizedInput = {},\n            normalizedProp,\n            prop;\n\n        for (prop in inputObject) {\n            if (hasOwnProp(inputObject, prop)) {\n                normalizedProp = normalizeUnits(prop);\n                if (normalizedProp) {\n                    normalizedInput[normalizedProp] = inputObject[prop];\n                }\n            }\n        }\n\n        return normalizedInput;\n    }\n\n    function isFunction(input) {\n        return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n    }\n\n    function makeGetSet (unit, keepTime) {\n        return function (value) {\n            if (value != null) {\n                get_set__set(this, unit, value);\n                utils_hooks__hooks.updateOffset(this, keepTime);\n                return this;\n            } else {\n                return get_set__get(this, unit);\n            }\n        };\n    }\n\n    function get_set__get (mom, unit) {\n        return mom.isValid() ?\n            mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n    }\n\n    function get_set__set (mom, unit, value) {\n        if (mom.isValid()) {\n            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n        }\n    }\n\n    // MOMENTS\n\n    function getSet (units, value) {\n        var unit;\n        if (typeof units === 'object') {\n            for (unit in units) {\n                this.set(unit, units[unit]);\n            }\n        } else {\n            units = normalizeUnits(units);\n            if (isFunction(this[units])) {\n                return this[units](value);\n            }\n        }\n        return this;\n    }\n\n    function zeroFill(number, targetLength, forceSign) {\n        var absNumber = '' + Math.abs(number),\n            zerosToFill = targetLength - absNumber.length,\n            sign = number >= 0;\n        return (sign ? (forceSign ? '+' : '') : '-') +\n            Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n    }\n\n    var formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;\n\n    var localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\n    var formatFunctions = {};\n\n    var formatTokenFunctions = {};\n\n    // token:    'M'\n    // padded:   ['MM', 2]\n    // ordinal:  'Mo'\n    // callback: function () { this.month() + 1 }\n    function addFormatToken (token, padded, ordinal, callback) {\n        var func = callback;\n        if (typeof callback === 'string') {\n            func = function () {\n                return this[callback]();\n            };\n        }\n        if (token) {\n            formatTokenFunctions[token] = func;\n        }\n        if (padded) {\n            formatTokenFunctions[padded[0]] = function () {\n                return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n            };\n        }\n        if (ordinal) {\n            formatTokenFunctions[ordinal] = function () {\n                return this.localeData().ordinal(func.apply(this, arguments), token);\n            };\n        }\n    }\n\n    function removeFormattingTokens(input) {\n        if (input.match(/\\[[\\s\\S]/)) {\n            return input.replace(/^\\[|\\]$/g, '');\n        }\n        return input.replace(/\\\\/g, '');\n    }\n\n    function makeFormatFunction(format) {\n        var array = format.match(formattingTokens), i, length;\n\n        for (i = 0, length = array.length; i < length; i++) {\n            if (formatTokenFunctions[array[i]]) {\n                array[i] = formatTokenFunctions[array[i]];\n            } else {\n                array[i] = removeFormattingTokens(array[i]);\n            }\n        }\n\n        return function (mom) {\n            var output = '';\n            for (i = 0; i < length; i++) {\n                output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];\n            }\n            return output;\n        };\n    }\n\n    // format date using native date object\n    function formatMoment(m, format) {\n        if (!m.isValid()) {\n            return m.localeData().invalidDate();\n        }\n\n        format = expandFormat(format, m.localeData());\n        formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);\n\n        return formatFunctions[format](m);\n    }\n\n    function expandFormat(format, locale) {\n        var i = 5;\n\n        function replaceLongDateFormatTokens(input) {\n            return locale.longDateFormat(input) || input;\n        }\n\n        localFormattingTokens.lastIndex = 0;\n        while (i >= 0 && localFormattingTokens.test(format)) {\n            format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);\n            localFormattingTokens.lastIndex = 0;\n            i -= 1;\n        }\n\n        return format;\n    }\n\n    var match1         = /\\d/;            //       0 - 9\n    var match2         = /\\d\\d/;          //      00 - 99\n    var match3         = /\\d{3}/;         //     000 - 999\n    var match4         = /\\d{4}/;         //    0000 - 9999\n    var match6         = /[+-]?\\d{6}/;    // -999999 - 999999\n    var match1to2      = /\\d\\d?/;         //       0 - 99\n    var match3to4      = /\\d\\d\\d\\d?/;     //     999 - 9999\n    var match5to6      = /\\d\\d\\d\\d\\d\\d?/; //   99999 - 999999\n    var match1to3      = /\\d{1,3}/;       //       0 - 999\n    var match1to4      = /\\d{1,4}/;       //       0 - 9999\n    var match1to6      = /[+-]?\\d{1,6}/;  // -999999 - 999999\n\n    var matchUnsigned  = /\\d+/;           //       0 - inf\n    var matchSigned    = /[+-]?\\d+/;      //    -inf - inf\n\n    var matchOffset    = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\n    var matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n\n    var matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/; // 123456789 123456789.123\n\n    // any word (or two) characters or numbers including two/three word month in arabic.\n    // includes scottish gaelic two word and hyphenated months\n    var matchWord = /[0-9]*['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+|[\\u0600-\\u06FF\\/]+(\\s*?[\\u0600-\\u06FF]+){1,2}/i;\n\n\n    var regexes = {};\n\n    function addRegexToken (token, regex, strictRegex) {\n        regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n            return (isStrict && strictRegex) ? strictRegex : regex;\n        };\n    }\n\n    function getParseRegexForToken (token, config) {\n        if (!hasOwnProp(regexes, token)) {\n            return new RegExp(unescapeFormat(token));\n        }\n\n        return regexes[token](config._strict, config._locale);\n    }\n\n    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\n    function unescapeFormat(s) {\n        return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n            return p1 || p2 || p3 || p4;\n        }));\n    }\n\n    function regexEscape(s) {\n        return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n    }\n\n    var tokens = {};\n\n    function addParseToken (token, callback) {\n        var i, func = callback;\n        if (typeof token === 'string') {\n            token = [token];\n        }\n        if (typeof callback === 'number') {\n            func = function (input, array) {\n                array[callback] = toInt(input);\n            };\n        }\n        for (i = 0; i < token.length; i++) {\n            tokens[token[i]] = func;\n        }\n    }\n\n    function addWeekParseToken (token, callback) {\n        addParseToken(token, function (input, array, config, token) {\n            config._w = config._w || {};\n            callback(input, config._w, config, token);\n        });\n    }\n\n    function addTimeToArrayFromToken(token, input, config) {\n        if (input != null && hasOwnProp(tokens, token)) {\n            tokens[token](input, config._a, config, token);\n        }\n    }\n\n    var YEAR = 0;\n    var MONTH = 1;\n    var DATE = 2;\n    var HOUR = 3;\n    var MINUTE = 4;\n    var SECOND = 5;\n    var MILLISECOND = 6;\n    var WEEK = 7;\n    var WEEKDAY = 8;\n\n    function daysInMonth(year, month) {\n        return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();\n    }\n\n    // FORMATTING\n\n    addFormatToken('M', ['MM', 2], 'Mo', function () {\n        return this.month() + 1;\n    });\n\n    addFormatToken('MMM', 0, 0, function (format) {\n        return this.localeData().monthsShort(this, format);\n    });\n\n    addFormatToken('MMMM', 0, 0, function (format) {\n        return this.localeData().months(this, format);\n    });\n\n    // ALIASES\n\n    addUnitAlias('month', 'M');\n\n    // PARSING\n\n    addRegexToken('M',    match1to2);\n    addRegexToken('MM',   match1to2, match2);\n    addRegexToken('MMM',  function (isStrict, locale) {\n        return locale.monthsShortRegex(isStrict);\n    });\n    addRegexToken('MMMM', function (isStrict, locale) {\n        return locale.monthsRegex(isStrict);\n    });\n\n    addParseToken(['M', 'MM'], function (input, array) {\n        array[MONTH] = toInt(input) - 1;\n    });\n\n    addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n        var month = config._locale.monthsParse(input, token, config._strict);\n        // if we didn't find a month name, mark the date as invalid.\n        if (month != null) {\n            array[MONTH] = month;\n        } else {\n            getParsingFlags(config).invalidMonth = input;\n        }\n    });\n\n    // LOCALES\n\n    var MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s+)+MMMM?/;\n    var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\n    function localeMonths (m, format) {\n        return isArray(this._months) ? this._months[m.month()] :\n            this._months[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n    }\n\n    var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\n    function localeMonthsShort (m, format) {\n        return isArray(this._monthsShort) ? this._monthsShort[m.month()] :\n            this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n    }\n\n    function localeMonthsParse (monthName, format, strict) {\n        var i, mom, regex;\n\n        if (!this._monthsParse) {\n            this._monthsParse = [];\n            this._longMonthsParse = [];\n            this._shortMonthsParse = [];\n        }\n\n        for (i = 0; i < 12; i++) {\n            // make the regex if we don't have it already\n            mom = create_utc__createUTC([2000, i]);\n            if (strict && !this._longMonthsParse[i]) {\n                this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n                this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n            }\n            if (!strict && !this._monthsParse[i]) {\n                regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n                this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n            }\n            // test the regex\n            if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n                return i;\n            } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\n                return i;\n            } else if (!strict && this._monthsParse[i].test(monthName)) {\n                return i;\n            }\n        }\n    }\n\n    // MOMENTS\n\n    function setMonth (mom, value) {\n        var dayOfMonth;\n\n        if (!mom.isValid()) {\n            // No op\n            return mom;\n        }\n\n        // TODO: Move this out of here!\n        if (typeof value === 'string') {\n            value = mom.localeData().monthsParse(value);\n            // TODO: Another silent failure?\n            if (typeof value !== 'number') {\n                return mom;\n            }\n        }\n\n        dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n        mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n        return mom;\n    }\n\n    function getSetMonth (value) {\n        if (value != null) {\n            setMonth(this, value);\n            utils_hooks__hooks.updateOffset(this, true);\n            return this;\n        } else {\n            return get_set__get(this, 'Month');\n        }\n    }\n\n    function getDaysInMonth () {\n        return daysInMonth(this.year(), this.month());\n    }\n\n    var defaultMonthsShortRegex = matchWord;\n    function monthsShortRegex (isStrict) {\n        if (this._monthsParseExact) {\n            if (!hasOwnProp(this, '_monthsRegex')) {\n                computeMonthsParse.call(this);\n            }\n            if (isStrict) {\n                return this._monthsShortStrictRegex;\n            } else {\n                return this._monthsShortRegex;\n            }\n        } else {\n            return this._monthsShortStrictRegex && isStrict ?\n                this._monthsShortStrictRegex : this._monthsShortRegex;\n        }\n    }\n\n    var defaultMonthsRegex = matchWord;\n    function monthsRegex (isStrict) {\n        if (this._monthsParseExact) {\n            if (!hasOwnProp(this, '_monthsRegex')) {\n                computeMonthsParse.call(this);\n            }\n            if (isStrict) {\n                return this._monthsStrictRegex;\n            } else {\n                return this._monthsRegex;\n            }\n        } else {\n            return this._monthsStrictRegex && isStrict ?\n                this._monthsStrictRegex : this._monthsRegex;\n        }\n    }\n\n    function computeMonthsParse () {\n        function cmpLenRev(a, b) {\n            return b.length - a.length;\n        }\n\n        var shortPieces = [], longPieces = [], mixedPieces = [],\n            i, mom;\n        for (i = 0; i < 12; i++) {\n            // make the regex if we don't have it already\n            mom = create_utc__createUTC([2000, i]);\n            shortPieces.push(this.monthsShort(mom, ''));\n            longPieces.push(this.months(mom, ''));\n            mixedPieces.push(this.months(mom, ''));\n            mixedPieces.push(this.monthsShort(mom, ''));\n        }\n        // Sorting makes sure if one month (or abbr) is a prefix of another it\n        // will match the longer piece.\n        shortPieces.sort(cmpLenRev);\n        longPieces.sort(cmpLenRev);\n        mixedPieces.sort(cmpLenRev);\n        for (i = 0; i < 12; i++) {\n            shortPieces[i] = regexEscape(shortPieces[i]);\n            longPieces[i] = regexEscape(longPieces[i]);\n            mixedPieces[i] = regexEscape(mixedPieces[i]);\n        }\n\n        this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n        this._monthsShortRegex = this._monthsRegex;\n        this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')$', 'i');\n        this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')$', 'i');\n    }\n\n    function checkOverflow (m) {\n        var overflow;\n        var a = m._a;\n\n        if (a && getParsingFlags(m).overflow === -2) {\n            overflow =\n                a[MONTH]       < 0 || a[MONTH]       > 11  ? MONTH :\n                a[DATE]        < 1 || a[DATE]        > daysInMonth(a[YEAR], a[MONTH]) ? DATE :\n                a[HOUR]        < 0 || a[HOUR]        > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :\n                a[MINUTE]      < 0 || a[MINUTE]      > 59  ? MINUTE :\n                a[SECOND]      < 0 || a[SECOND]      > 59  ? SECOND :\n                a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :\n                -1;\n\n            if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\n                overflow = DATE;\n            }\n            if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n                overflow = WEEK;\n            }\n            if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n                overflow = WEEKDAY;\n            }\n\n            getParsingFlags(m).overflow = overflow;\n        }\n\n        return m;\n    }\n\n    function warn(msg) {\n        if (utils_hooks__hooks.suppressDeprecationWarnings === false &&\n                (typeof console !==  'undefined') && console.warn) {\n            console.warn('Deprecation warning: ' + msg);\n        }\n    }\n\n    function deprecate(msg, fn) {\n        var firstTime = true;\n\n        return extend(function () {\n            if (firstTime) {\n                warn(msg + '\\nArguments: ' + Array.prototype.slice.call(arguments).join(', ') + '\\n' + (new Error()).stack);\n                firstTime = false;\n            }\n            return fn.apply(this, arguments);\n        }, fn);\n    }\n\n    var deprecations = {};\n\n    function deprecateSimple(name, msg) {\n        if (!deprecations[name]) {\n            warn(msg);\n            deprecations[name] = true;\n        }\n    }\n\n    utils_hooks__hooks.suppressDeprecationWarnings = false;\n\n    // iso 8601 regex\n    // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\n    var extendedIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?/;\n    var basicIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?/;\n\n    var tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/;\n\n    var isoDates = [\n        ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n        ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n        ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n        ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n        ['YYYY-DDD', /\\d{4}-\\d{3}/],\n        ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n        ['YYYYYYMMDD', /[+-]\\d{10}/],\n        ['YYYYMMDD', /\\d{8}/],\n        // YYYYMM is NOT allowed by the standard\n        ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n        ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n        ['YYYYDDD', /\\d{7}/]\n    ];\n\n    // iso time formats and regexes\n    var isoTimes = [\n        ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n        ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n        ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n        ['HH:mm', /\\d\\d:\\d\\d/],\n        ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n        ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n        ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n        ['HHmm', /\\d\\d\\d\\d/],\n        ['HH', /\\d\\d/]\n    ];\n\n    var aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n    // date from iso format\n    function configFromISO(config) {\n        var i, l,\n            string = config._i,\n            match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n            allowTime, dateFormat, timeFormat, tzFormat;\n\n        if (match) {\n            getParsingFlags(config).iso = true;\n\n            for (i = 0, l = isoDates.length; i < l; i++) {\n                if (isoDates[i][1].exec(match[1])) {\n                    dateFormat = isoDates[i][0];\n                    allowTime = isoDates[i][2] !== false;\n                    break;\n                }\n            }\n            if (dateFormat == null) {\n                config._isValid = false;\n                return;\n            }\n            if (match[3]) {\n                for (i = 0, l = isoTimes.length; i < l; i++) {\n                    if (isoTimes[i][1].exec(match[3])) {\n                        // match[2] should be 'T' or space\n                        timeFormat = (match[2] || ' ') + isoTimes[i][0];\n                        break;\n                    }\n                }\n                if (timeFormat == null) {\n                    config._isValid = false;\n                    return;\n                }\n            }\n            if (!allowTime && timeFormat != null) {\n                config._isValid = false;\n                return;\n            }\n            if (match[4]) {\n                if (tzRegex.exec(match[4])) {\n                    tzFormat = 'Z';\n                } else {\n                    config._isValid = false;\n                    return;\n                }\n            }\n            config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n            configFromStringAndFormat(config);\n        } else {\n            config._isValid = false;\n        }\n    }\n\n    // date from iso format or fallback\n    function configFromString(config) {\n        var matched = aspNetJsonRegex.exec(config._i);\n\n        if (matched !== null) {\n            config._d = new Date(+matched[1]);\n            return;\n        }\n\n        configFromISO(config);\n        if (config._isValid === false) {\n            delete config._isValid;\n            utils_hooks__hooks.createFromInputFallback(config);\n        }\n    }\n\n    utils_hooks__hooks.createFromInputFallback = deprecate(\n        'moment construction falls back to js Date. This is ' +\n        'discouraged and will be removed in upcoming major ' +\n        'release. Please refer to ' +\n        'https://github.com/moment/moment/issues/1407 for more info.',\n        function (config) {\n            config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n        }\n    );\n\n    function createDate (y, m, d, h, M, s, ms) {\n        //can't just apply() to create a date:\n        //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply\n        var date = new Date(y, m, d, h, M, s, ms);\n\n        //the date constructor remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {\n            date.setFullYear(y);\n        }\n        return date;\n    }\n\n    function createUTCDate (y) {\n        var date = new Date(Date.UTC.apply(null, arguments));\n\n        //the Date.UTC function remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {\n            date.setUTCFullYear(y);\n        }\n        return date;\n    }\n\n    // FORMATTING\n\n    addFormatToken('Y', 0, 0, function () {\n        var y = this.year();\n        return y <= 9999 ? '' + y : '+' + y;\n    });\n\n    addFormatToken(0, ['YY', 2], 0, function () {\n        return this.year() % 100;\n    });\n\n    addFormatToken(0, ['YYYY',   4],       0, 'year');\n    addFormatToken(0, ['YYYYY',  5],       0, 'year');\n    addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n    // ALIASES\n\n    addUnitAlias('year', 'y');\n\n    // PARSING\n\n    addRegexToken('Y',      matchSigned);\n    addRegexToken('YY',     match1to2, match2);\n    addRegexToken('YYYY',   match1to4, match4);\n    addRegexToken('YYYYY',  match1to6, match6);\n    addRegexToken('YYYYYY', match1to6, match6);\n\n    addParseToken(['YYYYY', 'YYYYYY'], YEAR);\n    addParseToken('YYYY', function (input, array) {\n        array[YEAR] = input.length === 2 ? utils_hooks__hooks.parseTwoDigitYear(input) : toInt(input);\n    });\n    addParseToken('YY', function (input, array) {\n        array[YEAR] = utils_hooks__hooks.parseTwoDigitYear(input);\n    });\n    addParseToken('Y', function (input, array) {\n        array[YEAR] = parseInt(input, 10);\n    });\n\n    // HELPERS\n\n    function daysInYear(year) {\n        return isLeapYear(year) ? 366 : 365;\n    }\n\n    function isLeapYear(year) {\n        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n    }\n\n    // HOOKS\n\n    utils_hooks__hooks.parseTwoDigitYear = function (input) {\n        return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n    };\n\n    // MOMENTS\n\n    var getSetYear = makeGetSet('FullYear', false);\n\n    function getIsLeapYear () {\n        return isLeapYear(this.year());\n    }\n\n    // start-of-first-week - start-of-year\n    function firstWeekOffset(year, dow, doy) {\n        var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n            fwd = 7 + dow - doy,\n            // first-week day local weekday -- which local weekday is fwd\n            fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n        return -fwdlw + fwd - 1;\n    }\n\n    //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\n    function dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n        var localWeekday = (7 + weekday - dow) % 7,\n            weekOffset = firstWeekOffset(year, dow, doy),\n            dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n            resYear, resDayOfYear;\n\n        if (dayOfYear <= 0) {\n            resYear = year - 1;\n            resDayOfYear = daysInYear(resYear) + dayOfYear;\n        } else if (dayOfYear > daysInYear(year)) {\n            resYear = year + 1;\n            resDayOfYear = dayOfYear - daysInYear(year);\n        } else {\n            resYear = year;\n            resDayOfYear = dayOfYear;\n        }\n\n        return {\n            year: resYear,\n            dayOfYear: resDayOfYear\n        };\n    }\n\n    function weekOfYear(mom, dow, doy) {\n        var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n            week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n            resWeek, resYear;\n\n        if (week < 1) {\n            resYear = mom.year() - 1;\n            resWeek = week + weeksInYear(resYear, dow, doy);\n        } else if (week > weeksInYear(mom.year(), dow, doy)) {\n            resWeek = week - weeksInYear(mom.year(), dow, doy);\n            resYear = mom.year() + 1;\n        } else {\n            resYear = mom.year();\n            resWeek = week;\n        }\n\n        return {\n            week: resWeek,\n            year: resYear\n        };\n    }\n\n    function weeksInYear(year, dow, doy) {\n        var weekOffset = firstWeekOffset(year, dow, doy),\n            weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n        return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n    }\n\n    // Pick the first defined of two or three arguments.\n    function defaults(a, b, c) {\n        if (a != null) {\n            return a;\n        }\n        if (b != null) {\n            return b;\n        }\n        return c;\n    }\n\n    function currentDateArray(config) {\n        // hooks is actually the exported moment object\n        var nowValue = new Date(utils_hooks__hooks.now());\n        if (config._useUTC) {\n            return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\n        }\n        return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n    }\n\n    // convert an array to a date.\n    // the array should mirror the parameters below\n    // note: all values past the year are optional and will default to the lowest possible value.\n    // [year, month, day , hour, minute, second, millisecond]\n    function configFromArray (config) {\n        var i, date, input = [], currentDate, yearToUse;\n\n        if (config._d) {\n            return;\n        }\n\n        currentDate = currentDateArray(config);\n\n        //compute day of the year from weeks and weekdays\n        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n            dayOfYearFromWeekInfo(config);\n        }\n\n        //if the day of the year is set, figure out what it is\n        if (config._dayOfYear) {\n            yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n            if (config._dayOfYear > daysInYear(yearToUse)) {\n                getParsingFlags(config)._overflowDayOfYear = true;\n            }\n\n            date = createUTCDate(yearToUse, 0, config._dayOfYear);\n            config._a[MONTH] = date.getUTCMonth();\n            config._a[DATE] = date.getUTCDate();\n        }\n\n        // Default to current date.\n        // * if no year, month, day of month are given, default to today\n        // * if day of month is given, default month and year\n        // * if month is given, default only year\n        // * if year is given, don't default anything\n        for (i = 0; i < 3 && config._a[i] == null; ++i) {\n            config._a[i] = input[i] = currentDate[i];\n        }\n\n        // Zero out whatever was not defaulted, including time\n        for (; i < 7; i++) {\n            config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];\n        }\n\n        // Check for 24:00:00.000\n        if (config._a[HOUR] === 24 &&\n                config._a[MINUTE] === 0 &&\n                config._a[SECOND] === 0 &&\n                config._a[MILLISECOND] === 0) {\n            config._nextDay = true;\n            config._a[HOUR] = 0;\n        }\n\n        config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n        // Apply timezone offset from input. The actual utcOffset can be changed\n        // with parseZone.\n        if (config._tzm != null) {\n            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n        }\n\n        if (config._nextDay) {\n            config._a[HOUR] = 24;\n        }\n    }\n\n    function dayOfYearFromWeekInfo(config) {\n        var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;\n\n        w = config._w;\n        if (w.GG != null || w.W != null || w.E != null) {\n            dow = 1;\n            doy = 4;\n\n            // TODO: We need to take the current isoWeekYear, but that depends on\n            // how we interpret now (local, utc, fixed offset). So create\n            // a now version of current config (take local/utc/offset flags, and\n            // create now).\n            weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(local__createLocal(), 1, 4).year);\n            week = defaults(w.W, 1);\n            weekday = defaults(w.E, 1);\n            if (weekday < 1 || weekday > 7) {\n                weekdayOverflow = true;\n            }\n        } else {\n            dow = config._locale._week.dow;\n            doy = config._locale._week.doy;\n\n            weekYear = defaults(w.gg, config._a[YEAR], weekOfYear(local__createLocal(), dow, doy).year);\n            week = defaults(w.w, 1);\n\n            if (w.d != null) {\n                // weekday -- low day numbers are considered next week\n                weekday = w.d;\n                if (weekday < 0 || weekday > 6) {\n                    weekdayOverflow = true;\n                }\n            } else if (w.e != null) {\n                // local weekday -- counting starts from begining of week\n                weekday = w.e + dow;\n                if (w.e < 0 || w.e > 6) {\n                    weekdayOverflow = true;\n                }\n            } else {\n                // default to begining of week\n                weekday = dow;\n            }\n        }\n        if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n            getParsingFlags(config)._overflowWeeks = true;\n        } else if (weekdayOverflow != null) {\n            getParsingFlags(config)._overflowWeekday = true;\n        } else {\n            temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n            config._a[YEAR] = temp.year;\n            config._dayOfYear = temp.dayOfYear;\n        }\n    }\n\n    // constant that refers to the ISO standard\n    utils_hooks__hooks.ISO_8601 = function () {};\n\n    // date from string and format string\n    function configFromStringAndFormat(config) {\n        // TODO: Move this to another part of the creation flow to prevent circular deps\n        if (config._f === utils_hooks__hooks.ISO_8601) {\n            configFromISO(config);\n            return;\n        }\n\n        config._a = [];\n        getParsingFlags(config).empty = true;\n\n        // This array is used to make a Date, either with `new Date` or `Date.UTC`\n        var string = '' + config._i,\n            i, parsedInput, tokens, token, skipped,\n            stringLength = string.length,\n            totalParsedInputLength = 0;\n\n        tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n\n        for (i = 0; i < tokens.length; i++) {\n            token = tokens[i];\n            parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n            // console.log('token', token, 'parsedInput', parsedInput,\n            //         'regex', getParseRegexForToken(token, config));\n            if (parsedInput) {\n                skipped = string.substr(0, string.indexOf(parsedInput));\n                if (skipped.length > 0) {\n                    getParsingFlags(config).unusedInput.push(skipped);\n                }\n                string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n                totalParsedInputLength += parsedInput.length;\n            }\n            // don't parse if it's not a known token\n            if (formatTokenFunctions[token]) {\n                if (parsedInput) {\n                    getParsingFlags(config).empty = false;\n                }\n                else {\n                    getParsingFlags(config).unusedTokens.push(token);\n                }\n                addTimeToArrayFromToken(token, parsedInput, config);\n            }\n            else if (config._strict && !parsedInput) {\n                getParsingFlags(config).unusedTokens.push(token);\n            }\n        }\n\n        // add remaining unparsed input length to the string\n        getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;\n        if (string.length > 0) {\n            getParsingFlags(config).unusedInput.push(string);\n        }\n\n        // clear _12h flag if hour is <= 12\n        if (getParsingFlags(config).bigHour === true &&\n                config._a[HOUR] <= 12 &&\n                config._a[HOUR] > 0) {\n            getParsingFlags(config).bigHour = undefined;\n        }\n        // handle meridiem\n        config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);\n\n        configFromArray(config);\n        checkOverflow(config);\n    }\n\n\n    function meridiemFixWrap (locale, hour, meridiem) {\n        var isPm;\n\n        if (meridiem == null) {\n            // nothing to do\n            return hour;\n        }\n        if (locale.meridiemHour != null) {\n            return locale.meridiemHour(hour, meridiem);\n        } else if (locale.isPM != null) {\n            // Fallback\n            isPm = locale.isPM(meridiem);\n            if (isPm && hour < 12) {\n                hour += 12;\n            }\n            if (!isPm && hour === 12) {\n                hour = 0;\n            }\n            return hour;\n        } else {\n            // this is not supposed to happen\n            return hour;\n        }\n    }\n\n    // date from string and array of format strings\n    function configFromStringAndArray(config) {\n        var tempConfig,\n            bestMoment,\n\n            scoreToBeat,\n            i,\n            currentScore;\n\n        if (config._f.length === 0) {\n            getParsingFlags(config).invalidFormat = true;\n            config._d = new Date(NaN);\n            return;\n        }\n\n        for (i = 0; i < config._f.length; i++) {\n            currentScore = 0;\n            tempConfig = copyConfig({}, config);\n            if (config._useUTC != null) {\n                tempConfig._useUTC = config._useUTC;\n            }\n            tempConfig._f = config._f[i];\n            configFromStringAndFormat(tempConfig);\n\n            if (!valid__isValid(tempConfig)) {\n                continue;\n            }\n\n            // if there is any input that was not parsed add a penalty for that format\n            currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n            //or tokens\n            currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n            getParsingFlags(tempConfig).score = currentScore;\n\n            if (scoreToBeat == null || currentScore < scoreToBeat) {\n                scoreToBeat = currentScore;\n                bestMoment = tempConfig;\n            }\n        }\n\n        extend(config, bestMoment || tempConfig);\n    }\n\n    function configFromObject(config) {\n        if (config._d) {\n            return;\n        }\n\n        var i = normalizeObjectUnits(config._i);\n        config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n            return obj && parseInt(obj, 10);\n        });\n\n        configFromArray(config);\n    }\n\n    function createFromConfig (config) {\n        var res = new Moment(checkOverflow(prepareConfig(config)));\n        if (res._nextDay) {\n            // Adding is smart enough around DST\n            res.add(1, 'd');\n            res._nextDay = undefined;\n        }\n\n        return res;\n    }\n\n    function prepareConfig (config) {\n        var input = config._i,\n            format = config._f;\n\n        config._locale = config._locale || locale_locales__getLocale(config._l);\n\n        if (input === null || (format === undefined && input === '')) {\n            return valid__createInvalid({nullInput: true});\n        }\n\n        if (typeof input === 'string') {\n            config._i = input = config._locale.preparse(input);\n        }\n\n        if (isMoment(input)) {\n            return new Moment(checkOverflow(input));\n        } else if (isArray(format)) {\n            configFromStringAndArray(config);\n        } else if (format) {\n            configFromStringAndFormat(config);\n        } else if (isDate(input)) {\n            config._d = input;\n        } else {\n            configFromInput(config);\n        }\n\n        if (!valid__isValid(config)) {\n            config._d = null;\n        }\n\n        return config;\n    }\n\n    function configFromInput(config) {\n        var input = config._i;\n        if (input === undefined) {\n            config._d = new Date(utils_hooks__hooks.now());\n        } else if (isDate(input)) {\n            config._d = new Date(+input);\n        } else if (typeof input === 'string') {\n            configFromString(config);\n        } else if (isArray(input)) {\n            config._a = map(input.slice(0), function (obj) {\n                return parseInt(obj, 10);\n            });\n            configFromArray(config);\n        } else if (typeof(input) === 'object') {\n            configFromObject(config);\n        } else if (typeof(input) === 'number') {\n            // from milliseconds\n            config._d = new Date(input);\n        } else {\n            utils_hooks__hooks.createFromInputFallback(config);\n        }\n    }\n\n    function createLocalOrUTC (input, format, locale, strict, isUTC) {\n        var c = {};\n\n        if (typeof(locale) === 'boolean') {\n            strict = locale;\n            locale = undefined;\n        }\n        // object construction must be done this way.\n        // https://github.com/moment/moment/issues/1423\n        c._isAMomentObject = true;\n        c._useUTC = c._isUTC = isUTC;\n        c._l = locale;\n        c._i = input;\n        c._f = format;\n        c._strict = strict;\n\n        return createFromConfig(c);\n    }\n\n    function local__createLocal (input, format, locale, strict) {\n        return createLocalOrUTC(input, format, locale, strict, false);\n    }\n\n    var prototypeMin = deprecate(\n         'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548',\n         function () {\n             var other = local__createLocal.apply(null, arguments);\n             if (this.isValid() && other.isValid()) {\n                 return other < this ? this : other;\n             } else {\n                 return valid__createInvalid();\n             }\n         }\n     );\n\n    var prototypeMax = deprecate(\n        'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548',\n        function () {\n            var other = local__createLocal.apply(null, arguments);\n            if (this.isValid() && other.isValid()) {\n                return other > this ? this : other;\n            } else {\n                return valid__createInvalid();\n            }\n        }\n    );\n\n    // Pick a moment m from moments so that m[fn](other) is true for all\n    // other. This relies on the function fn to be transitive.\n    //\n    // moments should either be an array of moment objects or an array, whose\n    // first element is an array of moment objects.\n    function pickBy(fn, moments) {\n        var res, i;\n        if (moments.length === 1 && isArray(moments[0])) {\n            moments = moments[0];\n        }\n        if (!moments.length) {\n            return local__createLocal();\n        }\n        res = moments[0];\n        for (i = 1; i < moments.length; ++i) {\n            if (!moments[i].isValid() || moments[i][fn](res)) {\n                res = moments[i];\n            }\n        }\n        return res;\n    }\n\n    // TODO: Use [].sort instead?\n    function min () {\n        var args = [].slice.call(arguments, 0);\n\n        return pickBy('isBefore', args);\n    }\n\n    function max () {\n        var args = [].slice.call(arguments, 0);\n\n        return pickBy('isAfter', args);\n    }\n\n    var now = function () {\n        return Date.now ? Date.now() : +(new Date());\n    };\n\n    function Duration (duration) {\n        var normalizedInput = normalizeObjectUnits(duration),\n            years = normalizedInput.year || 0,\n            quarters = normalizedInput.quarter || 0,\n            months = normalizedInput.month || 0,\n            weeks = normalizedInput.week || 0,\n            days = normalizedInput.day || 0,\n            hours = normalizedInput.hour || 0,\n            minutes = normalizedInput.minute || 0,\n            seconds = normalizedInput.second || 0,\n            milliseconds = normalizedInput.millisecond || 0;\n\n        // representation for dateAddRemove\n        this._milliseconds = +milliseconds +\n            seconds * 1e3 + // 1000\n            minutes * 6e4 + // 1000 * 60\n            hours * 36e5; // 1000 * 60 * 60\n        // Because of dateAddRemove treats 24 hours as different from a\n        // day when working around DST, we need to store them separately\n        this._days = +days +\n            weeks * 7;\n        // It is impossible translate months into days without knowing\n        // which months you are are talking about, so we have to store\n        // it separately.\n        this._months = +months +\n            quarters * 3 +\n            years * 12;\n\n        this._data = {};\n\n        this._locale = locale_locales__getLocale();\n\n        this._bubble();\n    }\n\n    function isDuration (obj) {\n        return obj instanceof Duration;\n    }\n\n    // FORMATTING\n\n    function offset (token, separator) {\n        addFormatToken(token, 0, 0, function () {\n            var offset = this.utcOffset();\n            var sign = '+';\n            if (offset < 0) {\n                offset = -offset;\n                sign = '-';\n            }\n            return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);\n        });\n    }\n\n    offset('Z', ':');\n    offset('ZZ', '');\n\n    // PARSING\n\n    addRegexToken('Z',  matchShortOffset);\n    addRegexToken('ZZ', matchShortOffset);\n    addParseToken(['Z', 'ZZ'], function (input, array, config) {\n        config._useUTC = true;\n        config._tzm = offsetFromString(matchShortOffset, input);\n    });\n\n    // HELPERS\n\n    // timezone chunker\n    // '+10:00' > ['10',  '00']\n    // '-1530'  > ['-15', '30']\n    var chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\n    function offsetFromString(matcher, string) {\n        var matches = ((string || '').match(matcher) || []);\n        var chunk   = matches[matches.length - 1] || [];\n        var parts   = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n        var minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n        return parts[0] === '+' ? minutes : -minutes;\n    }\n\n    // Return a moment from input, that is local/utc/zone equivalent to model.\n    function cloneWithOffset(input, model) {\n        var res, diff;\n        if (model._isUTC) {\n            res = model.clone();\n            diff = (isMoment(input) || isDate(input) ? +input : +local__createLocal(input)) - (+res);\n            // Use low-level api, because this fn is low-level api.\n            res._d.setTime(+res._d + diff);\n            utils_hooks__hooks.updateOffset(res, false);\n            return res;\n        } else {\n            return local__createLocal(input).local();\n        }\n    }\n\n    function getDateOffset (m) {\n        // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n        // https://github.com/moment/moment/pull/1871\n        return -Math.round(m._d.getTimezoneOffset() / 15) * 15;\n    }\n\n    // HOOKS\n\n    // This function will be called whenever a moment is mutated.\n    // It is intended to keep the offset in sync with the timezone.\n    utils_hooks__hooks.updateOffset = function () {};\n\n    // MOMENTS\n\n    // keepLocalTime = true means only change the timezone, without\n    // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n    // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n    // +0200, so we adjust the time as needed, to be valid.\n    //\n    // Keeping the time actually adds/subtracts (one hour)\n    // from the actual represented time. That is why we call updateOffset\n    // a second time. In case it wants us to change the offset again\n    // _changeInProgress == true case, then we have to adjust, because\n    // there is no such time in the given timezone.\n    function getSetOffset (input, keepLocalTime) {\n        var offset = this._offset || 0,\n            localAdjust;\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n        if (input != null) {\n            if (typeof input === 'string') {\n                input = offsetFromString(matchShortOffset, input);\n            } else if (Math.abs(input) < 16) {\n                input = input * 60;\n            }\n            if (!this._isUTC && keepLocalTime) {\n                localAdjust = getDateOffset(this);\n            }\n            this._offset = input;\n            this._isUTC = true;\n            if (localAdjust != null) {\n                this.add(localAdjust, 'm');\n            }\n            if (offset !== input) {\n                if (!keepLocalTime || this._changeInProgress) {\n                    add_subtract__addSubtract(this, create__createDuration(input - offset, 'm'), 1, false);\n                } else if (!this._changeInProgress) {\n                    this._changeInProgress = true;\n                    utils_hooks__hooks.updateOffset(this, true);\n                    this._changeInProgress = null;\n                }\n            }\n            return this;\n        } else {\n            return this._isUTC ? offset : getDateOffset(this);\n        }\n    }\n\n    function getSetZone (input, keepLocalTime) {\n        if (input != null) {\n            if (typeof input !== 'string') {\n                input = -input;\n            }\n\n            this.utcOffset(input, keepLocalTime);\n\n            return this;\n        } else {\n            return -this.utcOffset();\n        }\n    }\n\n    function setOffsetToUTC (keepLocalTime) {\n        return this.utcOffset(0, keepLocalTime);\n    }\n\n    function setOffsetToLocal (keepLocalTime) {\n        if (this._isUTC) {\n            this.utcOffset(0, keepLocalTime);\n            this._isUTC = false;\n\n            if (keepLocalTime) {\n                this.subtract(getDateOffset(this), 'm');\n            }\n        }\n        return this;\n    }\n\n    function setOffsetToParsedOffset () {\n        if (this._tzm) {\n            this.utcOffset(this._tzm);\n        } else if (typeof this._i === 'string') {\n            this.utcOffset(offsetFromString(matchOffset, this._i));\n        }\n        return this;\n    }\n\n    function hasAlignedHourOffset (input) {\n        if (!this.isValid()) {\n            return false;\n        }\n        input = input ? local__createLocal(input).utcOffset() : 0;\n\n        return (this.utcOffset() - input) % 60 === 0;\n    }\n\n    function isDaylightSavingTime () {\n        return (\n            this.utcOffset() > this.clone().month(0).utcOffset() ||\n            this.utcOffset() > this.clone().month(5).utcOffset()\n        );\n    }\n\n    function isDaylightSavingTimeShifted () {\n        if (!isUndefined(this._isDSTShifted)) {\n            return this._isDSTShifted;\n        }\n\n        var c = {};\n\n        copyConfig(c, this);\n        c = prepareConfig(c);\n\n        if (c._a) {\n            var other = c._isUTC ? create_utc__createUTC(c._a) : local__createLocal(c._a);\n            this._isDSTShifted = this.isValid() &&\n                compareArrays(c._a, other.toArray()) > 0;\n        } else {\n            this._isDSTShifted = false;\n        }\n\n        return this._isDSTShifted;\n    }\n\n    function isLocal () {\n        return this.isValid() ? !this._isUTC : false;\n    }\n\n    function isUtcOffset () {\n        return this.isValid() ? this._isUTC : false;\n    }\n\n    function isUtc () {\n        return this.isValid() ? this._isUTC && this._offset === 0 : false;\n    }\n\n    // ASP.NET json date format regex\n    var aspNetRegex = /(\\-)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)\\.?(\\d{3})?)?/;\n\n    // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n    // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n    var isoRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/;\n\n    function create__createDuration (input, key) {\n        var duration = input,\n            // matching against regexp is expensive, do it on demand\n            match = null,\n            sign,\n            ret,\n            diffRes;\n\n        if (isDuration(input)) {\n            duration = {\n                ms : input._milliseconds,\n                d  : input._days,\n                M  : input._months\n            };\n        } else if (typeof input === 'number') {\n            duration = {};\n            if (key) {\n                duration[key] = input;\n            } else {\n                duration.milliseconds = input;\n            }\n        } else if (!!(match = aspNetRegex.exec(input))) {\n            sign = (match[1] === '-') ? -1 : 1;\n            duration = {\n                y  : 0,\n                d  : toInt(match[DATE])        * sign,\n                h  : toInt(match[HOUR])        * sign,\n                m  : toInt(match[MINUTE])      * sign,\n                s  : toInt(match[SECOND])      * sign,\n                ms : toInt(match[MILLISECOND]) * sign\n            };\n        } else if (!!(match = isoRegex.exec(input))) {\n            sign = (match[1] === '-') ? -1 : 1;\n            duration = {\n                y : parseIso(match[2], sign),\n                M : parseIso(match[3], sign),\n                d : parseIso(match[4], sign),\n                h : parseIso(match[5], sign),\n                m : parseIso(match[6], sign),\n                s : parseIso(match[7], sign),\n                w : parseIso(match[8], sign)\n            };\n        } else if (duration == null) {// checks for null or undefined\n            duration = {};\n        } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\n            diffRes = momentsDifference(local__createLocal(duration.from), local__createLocal(duration.to));\n\n            duration = {};\n            duration.ms = diffRes.milliseconds;\n            duration.M = diffRes.months;\n        }\n\n        ret = new Duration(duration);\n\n        if (isDuration(input) && hasOwnProp(input, '_locale')) {\n            ret._locale = input._locale;\n        }\n\n        return ret;\n    }\n\n    create__createDuration.fn = Duration.prototype;\n\n    function parseIso (inp, sign) {\n        // We'd normally use ~~inp for this, but unfortunately it also\n        // converts floats to ints.\n        // inp may be undefined, so careful calling replace on it.\n        var res = inp && parseFloat(inp.replace(',', '.'));\n        // apply sign while we're at it\n        return (isNaN(res) ? 0 : res) * sign;\n    }\n\n    function positiveMomentsDifference(base, other) {\n        var res = {milliseconds: 0, months: 0};\n\n        res.months = other.month() - base.month() +\n            (other.year() - base.year()) * 12;\n        if (base.clone().add(res.months, 'M').isAfter(other)) {\n            --res.months;\n        }\n\n        res.milliseconds = +other - +(base.clone().add(res.months, 'M'));\n\n        return res;\n    }\n\n    function momentsDifference(base, other) {\n        var res;\n        if (!(base.isValid() && other.isValid())) {\n            return {milliseconds: 0, months: 0};\n        }\n\n        other = cloneWithOffset(other, base);\n        if (base.isBefore(other)) {\n            res = positiveMomentsDifference(base, other);\n        } else {\n            res = positiveMomentsDifference(other, base);\n            res.milliseconds = -res.milliseconds;\n            res.months = -res.months;\n        }\n\n        return res;\n    }\n\n    // TODO: remove 'name' arg after deprecation is removed\n    function createAdder(direction, name) {\n        return function (val, period) {\n            var dur, tmp;\n            //invert the arguments, but complain about it\n            if (period !== null && !isNaN(+period)) {\n                deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period).');\n                tmp = val; val = period; period = tmp;\n            }\n\n            val = typeof val === 'string' ? +val : val;\n            dur = create__createDuration(val, period);\n            add_subtract__addSubtract(this, dur, direction);\n            return this;\n        };\n    }\n\n    function add_subtract__addSubtract (mom, duration, isAdding, updateOffset) {\n        var milliseconds = duration._milliseconds,\n            days = duration._days,\n            months = duration._months;\n\n        if (!mom.isValid()) {\n            // No op\n            return;\n        }\n\n        updateOffset = updateOffset == null ? true : updateOffset;\n\n        if (milliseconds) {\n            mom._d.setTime(+mom._d + milliseconds * isAdding);\n        }\n        if (days) {\n            get_set__set(mom, 'Date', get_set__get(mom, 'Date') + days * isAdding);\n        }\n        if (months) {\n            setMonth(mom, get_set__get(mom, 'Month') + months * isAdding);\n        }\n        if (updateOffset) {\n            utils_hooks__hooks.updateOffset(mom, days || months);\n        }\n    }\n\n    var add_subtract__add      = createAdder(1, 'add');\n    var add_subtract__subtract = createAdder(-1, 'subtract');\n\n    function moment_calendar__calendar (time, formats) {\n        // We want to compare the start of today, vs this.\n        // Getting start-of-today depends on whether we're local/utc/offset or not.\n        var now = time || local__createLocal(),\n            sod = cloneWithOffset(now, this).startOf('day'),\n            diff = this.diff(sod, 'days', true),\n            format = diff < -6 ? 'sameElse' :\n                diff < -1 ? 'lastWeek' :\n                diff < 0 ? 'lastDay' :\n                diff < 1 ? 'sameDay' :\n                diff < 2 ? 'nextDay' :\n                diff < 7 ? 'nextWeek' : 'sameElse';\n\n        var output = formats && (isFunction(formats[format]) ? formats[format]() : formats[format]);\n\n        return this.format(output || this.localeData().calendar(format, this, local__createLocal(now)));\n    }\n\n    function clone () {\n        return new Moment(this);\n    }\n\n    function isAfter (input, units) {\n        var localInput = isMoment(input) ? input : local__createLocal(input);\n        if (!(this.isValid() && localInput.isValid())) {\n            return false;\n        }\n        units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n        if (units === 'millisecond') {\n            return +this > +localInput;\n        } else {\n            return +localInput < +this.clone().startOf(units);\n        }\n    }\n\n    function isBefore (input, units) {\n        var localInput = isMoment(input) ? input : local__createLocal(input);\n        if (!(this.isValid() && localInput.isValid())) {\n            return false;\n        }\n        units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n        if (units === 'millisecond') {\n            return +this < +localInput;\n        } else {\n            return +this.clone().endOf(units) < +localInput;\n        }\n    }\n\n    function isBetween (from, to, units) {\n        return this.isAfter(from, units) && this.isBefore(to, units);\n    }\n\n    function isSame (input, units) {\n        var localInput = isMoment(input) ? input : local__createLocal(input),\n            inputMs;\n        if (!(this.isValid() && localInput.isValid())) {\n            return false;\n        }\n        units = normalizeUnits(units || 'millisecond');\n        if (units === 'millisecond') {\n            return +this === +localInput;\n        } else {\n            inputMs = +localInput;\n            return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units));\n        }\n    }\n\n    function isSameOrAfter (input, units) {\n        return this.isSame(input, units) || this.isAfter(input,units);\n    }\n\n    function isSameOrBefore (input, units) {\n        return this.isSame(input, units) || this.isBefore(input,units);\n    }\n\n    function diff (input, units, asFloat) {\n        var that,\n            zoneDelta,\n            delta, output;\n\n        if (!this.isValid()) {\n            return NaN;\n        }\n\n        that = cloneWithOffset(input, this);\n\n        if (!that.isValid()) {\n            return NaN;\n        }\n\n        zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n        units = normalizeUnits(units);\n\n        if (units === 'year' || units === 'month' || units === 'quarter') {\n            output = monthDiff(this, that);\n            if (units === 'quarter') {\n                output = output / 3;\n            } else if (units === 'year') {\n                output = output / 12;\n            }\n        } else {\n            delta = this - that;\n            output = units === 'second' ? delta / 1e3 : // 1000\n                units === 'minute' ? delta / 6e4 : // 1000 * 60\n                units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60\n                units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst\n                units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst\n                delta;\n        }\n        return asFloat ? output : absFloor(output);\n    }\n\n    function monthDiff (a, b) {\n        // difference in months\n        var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),\n            // b is in (anchor - 1 month, anchor + 1 month)\n            anchor = a.clone().add(wholeMonthDiff, 'months'),\n            anchor2, adjust;\n\n        if (b - anchor < 0) {\n            anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n            // linear across the month\n            adjust = (b - anchor) / (anchor - anchor2);\n        } else {\n            anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n            // linear across the month\n            adjust = (b - anchor) / (anchor2 - anchor);\n        }\n\n        return -(wholeMonthDiff + adjust);\n    }\n\n    utils_hooks__hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\n\n    function toString () {\n        return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n    }\n\n    function moment_format__toISOString () {\n        var m = this.clone().utc();\n        if (0 < m.year() && m.year() <= 9999) {\n            if (isFunction(Date.prototype.toISOString)) {\n                // native implementation is ~50x faster, use it when we can\n                return this.toDate().toISOString();\n            } else {\n                return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\n            }\n        } else {\n            return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\n        }\n    }\n\n    function format (inputString) {\n        var output = formatMoment(this, inputString || utils_hooks__hooks.defaultFormat);\n        return this.localeData().postformat(output);\n    }\n\n    function from (time, withoutSuffix) {\n        if (this.isValid() &&\n                ((isMoment(time) && time.isValid()) ||\n                 local__createLocal(time).isValid())) {\n            return create__createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);\n        } else {\n            return this.localeData().invalidDate();\n        }\n    }\n\n    function fromNow (withoutSuffix) {\n        return this.from(local__createLocal(), withoutSuffix);\n    }\n\n    function to (time, withoutSuffix) {\n        if (this.isValid() &&\n                ((isMoment(time) && time.isValid()) ||\n                 local__createLocal(time).isValid())) {\n            return create__createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);\n        } else {\n            return this.localeData().invalidDate();\n        }\n    }\n\n    function toNow (withoutSuffix) {\n        return this.to(local__createLocal(), withoutSuffix);\n    }\n\n    // If passed a locale key, it will set the locale for this\n    // instance.  Otherwise, it will return the locale configuration\n    // variables for this instance.\n    function locale (key) {\n        var newLocaleData;\n\n        if (key === undefined) {\n            return this._locale._abbr;\n        } else {\n            newLocaleData = locale_locales__getLocale(key);\n            if (newLocaleData != null) {\n                this._locale = newLocaleData;\n            }\n            return this;\n        }\n    }\n\n    var lang = deprecate(\n        'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n        function (key) {\n            if (key === undefined) {\n                return this.localeData();\n            } else {\n                return this.locale(key);\n            }\n        }\n    );\n\n    function localeData () {\n        return this._locale;\n    }\n\n    function startOf (units) {\n        units = normalizeUnits(units);\n        // the following switch intentionally omits break keywords\n        // to utilize falling through the cases.\n        switch (units) {\n        case 'year':\n            this.month(0);\n            /* falls through */\n        case 'quarter':\n        case 'month':\n            this.date(1);\n            /* falls through */\n        case 'week':\n        case 'isoWeek':\n        case 'day':\n            this.hours(0);\n            /* falls through */\n        case 'hour':\n            this.minutes(0);\n            /* falls through */\n        case 'minute':\n            this.seconds(0);\n            /* falls through */\n        case 'second':\n            this.milliseconds(0);\n        }\n\n        // weeks are a special case\n        if (units === 'week') {\n            this.weekday(0);\n        }\n        if (units === 'isoWeek') {\n            this.isoWeekday(1);\n        }\n\n        // quarters are also special\n        if (units === 'quarter') {\n            this.month(Math.floor(this.month() / 3) * 3);\n        }\n\n        return this;\n    }\n\n    function endOf (units) {\n        units = normalizeUnits(units);\n        if (units === undefined || units === 'millisecond') {\n            return this;\n        }\n        return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');\n    }\n\n    function to_type__valueOf () {\n        return +this._d - ((this._offset || 0) * 60000);\n    }\n\n    function unix () {\n        return Math.floor(+this / 1000);\n    }\n\n    function toDate () {\n        return this._offset ? new Date(+this) : this._d;\n    }\n\n    function toArray () {\n        var m = this;\n        return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n    }\n\n    function toObject () {\n        var m = this;\n        return {\n            years: m.year(),\n            months: m.month(),\n            date: m.date(),\n            hours: m.hours(),\n            minutes: m.minutes(),\n            seconds: m.seconds(),\n            milliseconds: m.milliseconds()\n        };\n    }\n\n    function toJSON () {\n        // JSON.stringify(new Date(NaN)) === 'null'\n        return this.isValid() ? this.toISOString() : 'null';\n    }\n\n    function moment_valid__isValid () {\n        return valid__isValid(this);\n    }\n\n    function parsingFlags () {\n        return extend({}, getParsingFlags(this));\n    }\n\n    function invalidAt () {\n        return getParsingFlags(this).overflow;\n    }\n\n    function creationData() {\n        return {\n            input: this._i,\n            format: this._f,\n            locale: this._locale,\n            isUTC: this._isUTC,\n            strict: this._strict\n        };\n    }\n\n    // FORMATTING\n\n    addFormatToken(0, ['gg', 2], 0, function () {\n        return this.weekYear() % 100;\n    });\n\n    addFormatToken(0, ['GG', 2], 0, function () {\n        return this.isoWeekYear() % 100;\n    });\n\n    function addWeekYearFormatToken (token, getter) {\n        addFormatToken(0, [token, token.length], 0, getter);\n    }\n\n    addWeekYearFormatToken('gggg',     'weekYear');\n    addWeekYearFormatToken('ggggg',    'weekYear');\n    addWeekYearFormatToken('GGGG',  'isoWeekYear');\n    addWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n    // ALIASES\n\n    addUnitAlias('weekYear', 'gg');\n    addUnitAlias('isoWeekYear', 'GG');\n\n    // PARSING\n\n    addRegexToken('G',      matchSigned);\n    addRegexToken('g',      matchSigned);\n    addRegexToken('GG',     match1to2, match2);\n    addRegexToken('gg',     match1to2, match2);\n    addRegexToken('GGGG',   match1to4, match4);\n    addRegexToken('gggg',   match1to4, match4);\n    addRegexToken('GGGGG',  match1to6, match6);\n    addRegexToken('ggggg',  match1to6, match6);\n\n    addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n        week[token.substr(0, 2)] = toInt(input);\n    });\n\n    addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n        week[token] = utils_hooks__hooks.parseTwoDigitYear(input);\n    });\n\n    // MOMENTS\n\n    function getSetWeekYear (input) {\n        return getSetWeekYearHelper.call(this,\n                input,\n                this.week(),\n                this.weekday(),\n                this.localeData()._week.dow,\n                this.localeData()._week.doy);\n    }\n\n    function getSetISOWeekYear (input) {\n        return getSetWeekYearHelper.call(this,\n                input, this.isoWeek(), this.isoWeekday(), 1, 4);\n    }\n\n    function getISOWeeksInYear () {\n        return weeksInYear(this.year(), 1, 4);\n    }\n\n    function getWeeksInYear () {\n        var weekInfo = this.localeData()._week;\n        return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n    }\n\n    function getSetWeekYearHelper(input, week, weekday, dow, doy) {\n        var weeksTarget;\n        if (input == null) {\n            return weekOfYear(this, dow, doy).year;\n        } else {\n            weeksTarget = weeksInYear(input, dow, doy);\n            if (week > weeksTarget) {\n                week = weeksTarget;\n            }\n            return setWeekAll.call(this, input, week, weekday, dow, doy);\n        }\n    }\n\n    function setWeekAll(weekYear, week, weekday, dow, doy) {\n        var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n            date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n        // console.log(\"got\", weekYear, week, weekday, \"set\", date.toISOString());\n        this.year(date.getUTCFullYear());\n        this.month(date.getUTCMonth());\n        this.date(date.getUTCDate());\n        return this;\n    }\n\n    // FORMATTING\n\n    addFormatToken('Q', 0, 'Qo', 'quarter');\n\n    // ALIASES\n\n    addUnitAlias('quarter', 'Q');\n\n    // PARSING\n\n    addRegexToken('Q', match1);\n    addParseToken('Q', function (input, array) {\n        array[MONTH] = (toInt(input) - 1) * 3;\n    });\n\n    // MOMENTS\n\n    function getSetQuarter (input) {\n        return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n    }\n\n    // FORMATTING\n\n    addFormatToken('w', ['ww', 2], 'wo', 'week');\n    addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n    // ALIASES\n\n    addUnitAlias('week', 'w');\n    addUnitAlias('isoWeek', 'W');\n\n    // PARSING\n\n    addRegexToken('w',  match1to2);\n    addRegexToken('ww', match1to2, match2);\n    addRegexToken('W',  match1to2);\n    addRegexToken('WW', match1to2, match2);\n\n    addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n        week[token.substr(0, 1)] = toInt(input);\n    });\n\n    // HELPERS\n\n    // LOCALES\n\n    function localeWeek (mom) {\n        return weekOfYear(mom, this._week.dow, this._week.doy).week;\n    }\n\n    var defaultLocaleWeek = {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    };\n\n    function localeFirstDayOfWeek () {\n        return this._week.dow;\n    }\n\n    function localeFirstDayOfYear () {\n        return this._week.doy;\n    }\n\n    // MOMENTS\n\n    function getSetWeek (input) {\n        var week = this.localeData().week(this);\n        return input == null ? week : this.add((input - week) * 7, 'd');\n    }\n\n    function getSetISOWeek (input) {\n        var week = weekOfYear(this, 1, 4).week;\n        return input == null ? week : this.add((input - week) * 7, 'd');\n    }\n\n    // FORMATTING\n\n    addFormatToken('D', ['DD', 2], 'Do', 'date');\n\n    // ALIASES\n\n    addUnitAlias('date', 'D');\n\n    // PARSING\n\n    addRegexToken('D',  match1to2);\n    addRegexToken('DD', match1to2, match2);\n    addRegexToken('Do', function (isStrict, locale) {\n        return isStrict ? locale._ordinalParse : locale._ordinalParseLenient;\n    });\n\n    addParseToken(['D', 'DD'], DATE);\n    addParseToken('Do', function (input, array) {\n        array[DATE] = toInt(input.match(match1to2)[0], 10);\n    });\n\n    // MOMENTS\n\n    var getSetDayOfMonth = makeGetSet('Date', true);\n\n    // FORMATTING\n\n    addFormatToken('d', 0, 'do', 'day');\n\n    addFormatToken('dd', 0, 0, function (format) {\n        return this.localeData().weekdaysMin(this, format);\n    });\n\n    addFormatToken('ddd', 0, 0, function (format) {\n        return this.localeData().weekdaysShort(this, format);\n    });\n\n    addFormatToken('dddd', 0, 0, function (format) {\n        return this.localeData().weekdays(this, format);\n    });\n\n    addFormatToken('e', 0, 0, 'weekday');\n    addFormatToken('E', 0, 0, 'isoWeekday');\n\n    // ALIASES\n\n    addUnitAlias('day', 'd');\n    addUnitAlias('weekday', 'e');\n    addUnitAlias('isoWeekday', 'E');\n\n    // PARSING\n\n    addRegexToken('d',    match1to2);\n    addRegexToken('e',    match1to2);\n    addRegexToken('E',    match1to2);\n    addRegexToken('dd',   matchWord);\n    addRegexToken('ddd',  matchWord);\n    addRegexToken('dddd', matchWord);\n\n    addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n        var weekday = config._locale.weekdaysParse(input, token, config._strict);\n        // if we didn't get a weekday name, mark the date as invalid\n        if (weekday != null) {\n            week.d = weekday;\n        } else {\n            getParsingFlags(config).invalidWeekday = input;\n        }\n    });\n\n    addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n        week[token] = toInt(input);\n    });\n\n    // HELPERS\n\n    function parseWeekday(input, locale) {\n        if (typeof input !== 'string') {\n            return input;\n        }\n\n        if (!isNaN(input)) {\n            return parseInt(input, 10);\n        }\n\n        input = locale.weekdaysParse(input);\n        if (typeof input === 'number') {\n            return input;\n        }\n\n        return null;\n    }\n\n    // LOCALES\n\n    var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\n    function localeWeekdays (m, format) {\n        return isArray(this._weekdays) ? this._weekdays[m.day()] :\n            this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];\n    }\n\n    var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\n    function localeWeekdaysShort (m) {\n        return this._weekdaysShort[m.day()];\n    }\n\n    var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\n    function localeWeekdaysMin (m) {\n        return this._weekdaysMin[m.day()];\n    }\n\n    function localeWeekdaysParse (weekdayName, format, strict) {\n        var i, mom, regex;\n\n        if (!this._weekdaysParse) {\n            this._weekdaysParse = [];\n            this._minWeekdaysParse = [];\n            this._shortWeekdaysParse = [];\n            this._fullWeekdaysParse = [];\n        }\n\n        for (i = 0; i < 7; i++) {\n            // make the regex if we don't have it already\n\n            mom = local__createLocal([2000, 1]).day(i);\n            if (strict && !this._fullWeekdaysParse[i]) {\n                this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i');\n                this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i');\n                this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i');\n            }\n            if (!this._weekdaysParse[i]) {\n                regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n                this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n            }\n            // test the regex\n            if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\n                return i;\n            } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\n                return i;\n            } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\n                return i;\n            } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n                return i;\n            }\n        }\n    }\n\n    // MOMENTS\n\n    function getSetDayOfWeek (input) {\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n        var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n        if (input != null) {\n            input = parseWeekday(input, this.localeData());\n            return this.add(input - day, 'd');\n        } else {\n            return day;\n        }\n    }\n\n    function getSetLocaleDayOfWeek (input) {\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n        var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n        return input == null ? weekday : this.add(input - weekday, 'd');\n    }\n\n    function getSetISODayOfWeek (input) {\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n        // behaves the same as moment#day except\n        // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n        // as a setter, sunday should belong to the previous week.\n        return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7);\n    }\n\n    // FORMATTING\n\n    addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n    // ALIASES\n\n    addUnitAlias('dayOfYear', 'DDD');\n\n    // PARSING\n\n    addRegexToken('DDD',  match1to3);\n    addRegexToken('DDDD', match3);\n    addParseToken(['DDD', 'DDDD'], function (input, array, config) {\n        config._dayOfYear = toInt(input);\n    });\n\n    // HELPERS\n\n    // MOMENTS\n\n    function getSetDayOfYear (input) {\n        var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\n        return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');\n    }\n\n    // FORMATTING\n\n    function hFormat() {\n        return this.hours() % 12 || 12;\n    }\n\n    addFormatToken('H', ['HH', 2], 0, 'hour');\n    addFormatToken('h', ['hh', 2], 0, hFormat);\n\n    addFormatToken('hmm', 0, 0, function () {\n        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n    });\n\n    addFormatToken('hmmss', 0, 0, function () {\n        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\n            zeroFill(this.seconds(), 2);\n    });\n\n    addFormatToken('Hmm', 0, 0, function () {\n        return '' + this.hours() + zeroFill(this.minutes(), 2);\n    });\n\n    addFormatToken('Hmmss', 0, 0, function () {\n        return '' + this.hours() + zeroFill(this.minutes(), 2) +\n            zeroFill(this.seconds(), 2);\n    });\n\n    function meridiem (token, lowercase) {\n        addFormatToken(token, 0, 0, function () {\n            return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n        });\n    }\n\n    meridiem('a', true);\n    meridiem('A', false);\n\n    // ALIASES\n\n    addUnitAlias('hour', 'h');\n\n    // PARSING\n\n    function matchMeridiem (isStrict, locale) {\n        return locale._meridiemParse;\n    }\n\n    addRegexToken('a',  matchMeridiem);\n    addRegexToken('A',  matchMeridiem);\n    addRegexToken('H',  match1to2);\n    addRegexToken('h',  match1to2);\n    addRegexToken('HH', match1to2, match2);\n    addRegexToken('hh', match1to2, match2);\n\n    addRegexToken('hmm', match3to4);\n    addRegexToken('hmmss', match5to6);\n    addRegexToken('Hmm', match3to4);\n    addRegexToken('Hmmss', match5to6);\n\n    addParseToken(['H', 'HH'], HOUR);\n    addParseToken(['a', 'A'], function (input, array, config) {\n        config._isPm = config._locale.isPM(input);\n        config._meridiem = input;\n    });\n    addParseToken(['h', 'hh'], function (input, array, config) {\n        array[HOUR] = toInt(input);\n        getParsingFlags(config).bigHour = true;\n    });\n    addParseToken('hmm', function (input, array, config) {\n        var pos = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos));\n        array[MINUTE] = toInt(input.substr(pos));\n        getParsingFlags(config).bigHour = true;\n    });\n    addParseToken('hmmss', function (input, array, config) {\n        var pos1 = input.length - 4;\n        var pos2 = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos1));\n        array[MINUTE] = toInt(input.substr(pos1, 2));\n        array[SECOND] = toInt(input.substr(pos2));\n        getParsingFlags(config).bigHour = true;\n    });\n    addParseToken('Hmm', function (input, array, config) {\n        var pos = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos));\n        array[MINUTE] = toInt(input.substr(pos));\n    });\n    addParseToken('Hmmss', function (input, array, config) {\n        var pos1 = input.length - 4;\n        var pos2 = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos1));\n        array[MINUTE] = toInt(input.substr(pos1, 2));\n        array[SECOND] = toInt(input.substr(pos2));\n    });\n\n    // LOCALES\n\n    function localeIsPM (input) {\n        // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n        // Using charAt should be more compatible.\n        return ((input + '').toLowerCase().charAt(0) === 'p');\n    }\n\n    var defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\n    function localeMeridiem (hours, minutes, isLower) {\n        if (hours > 11) {\n            return isLower ? 'pm' : 'PM';\n        } else {\n            return isLower ? 'am' : 'AM';\n        }\n    }\n\n\n    // MOMENTS\n\n    // Setting the hour should keep the time, because the user explicitly\n    // specified which hour he wants. So trying to maintain the same hour (in\n    // a new timezone) makes sense. Adding/subtracting hours does not follow\n    // this rule.\n    var getSetHour = makeGetSet('Hours', true);\n\n    // FORMATTING\n\n    addFormatToken('m', ['mm', 2], 0, 'minute');\n\n    // ALIASES\n\n    addUnitAlias('minute', 'm');\n\n    // PARSING\n\n    addRegexToken('m',  match1to2);\n    addRegexToken('mm', match1to2, match2);\n    addParseToken(['m', 'mm'], MINUTE);\n\n    // MOMENTS\n\n    var getSetMinute = makeGetSet('Minutes', false);\n\n    // FORMATTING\n\n    addFormatToken('s', ['ss', 2], 0, 'second');\n\n    // ALIASES\n\n    addUnitAlias('second', 's');\n\n    // PARSING\n\n    addRegexToken('s',  match1to2);\n    addRegexToken('ss', match1to2, match2);\n    addParseToken(['s', 'ss'], SECOND);\n\n    // MOMENTS\n\n    var getSetSecond = makeGetSet('Seconds', false);\n\n    // FORMATTING\n\n    addFormatToken('S', 0, 0, function () {\n        return ~~(this.millisecond() / 100);\n    });\n\n    addFormatToken(0, ['SS', 2], 0, function () {\n        return ~~(this.millisecond() / 10);\n    });\n\n    addFormatToken(0, ['SSS', 3], 0, 'millisecond');\n    addFormatToken(0, ['SSSS', 4], 0, function () {\n        return this.millisecond() * 10;\n    });\n    addFormatToken(0, ['SSSSS', 5], 0, function () {\n        return this.millisecond() * 100;\n    });\n    addFormatToken(0, ['SSSSSS', 6], 0, function () {\n        return this.millisecond() * 1000;\n    });\n    addFormatToken(0, ['SSSSSSS', 7], 0, function () {\n        return this.millisecond() * 10000;\n    });\n    addFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n        return this.millisecond() * 100000;\n    });\n    addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n        return this.millisecond() * 1000000;\n    });\n\n\n    // ALIASES\n\n    addUnitAlias('millisecond', 'ms');\n\n    // PARSING\n\n    addRegexToken('S',    match1to3, match1);\n    addRegexToken('SS',   match1to3, match2);\n    addRegexToken('SSS',  match1to3, match3);\n\n    var token;\n    for (token = 'SSSS'; token.length <= 9; token += 'S') {\n        addRegexToken(token, matchUnsigned);\n    }\n\n    function parseMs(input, array) {\n        array[MILLISECOND] = toInt(('0.' + input) * 1000);\n    }\n\n    for (token = 'S'; token.length <= 9; token += 'S') {\n        addParseToken(token, parseMs);\n    }\n    // MOMENTS\n\n    var getSetMillisecond = makeGetSet('Milliseconds', false);\n\n    // FORMATTING\n\n    addFormatToken('z',  0, 0, 'zoneAbbr');\n    addFormatToken('zz', 0, 0, 'zoneName');\n\n    // MOMENTS\n\n    function getZoneAbbr () {\n        return this._isUTC ? 'UTC' : '';\n    }\n\n    function getZoneName () {\n        return this._isUTC ? 'Coordinated Universal Time' : '';\n    }\n\n    var momentPrototype__proto = Moment.prototype;\n\n    momentPrototype__proto.add               = add_subtract__add;\n    momentPrototype__proto.calendar          = moment_calendar__calendar;\n    momentPrototype__proto.clone             = clone;\n    momentPrototype__proto.diff              = diff;\n    momentPrototype__proto.endOf             = endOf;\n    momentPrototype__proto.format            = format;\n    momentPrototype__proto.from              = from;\n    momentPrototype__proto.fromNow           = fromNow;\n    momentPrototype__proto.to                = to;\n    momentPrototype__proto.toNow             = toNow;\n    momentPrototype__proto.get               = getSet;\n    momentPrototype__proto.invalidAt         = invalidAt;\n    momentPrototype__proto.isAfter           = isAfter;\n    momentPrototype__proto.isBefore          = isBefore;\n    momentPrototype__proto.isBetween         = isBetween;\n    momentPrototype__proto.isSame            = isSame;\n    momentPrototype__proto.isSameOrAfter     = isSameOrAfter;\n    momentPrototype__proto.isSameOrBefore    = isSameOrBefore;\n    momentPrototype__proto.isValid           = moment_valid__isValid;\n    momentPrototype__proto.lang              = lang;\n    momentPrototype__proto.locale            = locale;\n    momentPrototype__proto.localeData        = localeData;\n    momentPrototype__proto.max               = prototypeMax;\n    momentPrototype__proto.min               = prototypeMin;\n    momentPrototype__proto.parsingFlags      = parsingFlags;\n    momentPrototype__proto.set               = getSet;\n    momentPrototype__proto.startOf           = startOf;\n    momentPrototype__proto.subtract          = add_subtract__subtract;\n    momentPrototype__proto.toArray           = toArray;\n    momentPrototype__proto.toObject          = toObject;\n    momentPrototype__proto.toDate            = toDate;\n    momentPrototype__proto.toISOString       = moment_format__toISOString;\n    momentPrototype__proto.toJSON            = toJSON;\n    momentPrototype__proto.toString          = toString;\n    momentPrototype__proto.unix              = unix;\n    momentPrototype__proto.valueOf           = to_type__valueOf;\n    momentPrototype__proto.creationData      = creationData;\n\n    // Year\n    momentPrototype__proto.year       = getSetYear;\n    momentPrototype__proto.isLeapYear = getIsLeapYear;\n\n    // Week Year\n    momentPrototype__proto.weekYear    = getSetWeekYear;\n    momentPrototype__proto.isoWeekYear = getSetISOWeekYear;\n\n    // Quarter\n    momentPrototype__proto.quarter = momentPrototype__proto.quarters = getSetQuarter;\n\n    // Month\n    momentPrototype__proto.month       = getSetMonth;\n    momentPrototype__proto.daysInMonth = getDaysInMonth;\n\n    // Week\n    momentPrototype__proto.week           = momentPrototype__proto.weeks        = getSetWeek;\n    momentPrototype__proto.isoWeek        = momentPrototype__proto.isoWeeks     = getSetISOWeek;\n    momentPrototype__proto.weeksInYear    = getWeeksInYear;\n    momentPrototype__proto.isoWeeksInYear = getISOWeeksInYear;\n\n    // Day\n    momentPrototype__proto.date       = getSetDayOfMonth;\n    momentPrototype__proto.day        = momentPrototype__proto.days             = getSetDayOfWeek;\n    momentPrototype__proto.weekday    = getSetLocaleDayOfWeek;\n    momentPrototype__proto.isoWeekday = getSetISODayOfWeek;\n    momentPrototype__proto.dayOfYear  = getSetDayOfYear;\n\n    // Hour\n    momentPrototype__proto.hour = momentPrototype__proto.hours = getSetHour;\n\n    // Minute\n    momentPrototype__proto.minute = momentPrototype__proto.minutes = getSetMinute;\n\n    // Second\n    momentPrototype__proto.second = momentPrototype__proto.seconds = getSetSecond;\n\n    // Millisecond\n    momentPrototype__proto.millisecond = momentPrototype__proto.milliseconds = getSetMillisecond;\n\n    // Offset\n    momentPrototype__proto.utcOffset            = getSetOffset;\n    momentPrototype__proto.utc                  = setOffsetToUTC;\n    momentPrototype__proto.local                = setOffsetToLocal;\n    momentPrototype__proto.parseZone            = setOffsetToParsedOffset;\n    momentPrototype__proto.hasAlignedHourOffset = hasAlignedHourOffset;\n    momentPrototype__proto.isDST                = isDaylightSavingTime;\n    momentPrototype__proto.isDSTShifted         = isDaylightSavingTimeShifted;\n    momentPrototype__proto.isLocal              = isLocal;\n    momentPrototype__proto.isUtcOffset          = isUtcOffset;\n    momentPrototype__proto.isUtc                = isUtc;\n    momentPrototype__proto.isUTC                = isUtc;\n\n    // Timezone\n    momentPrototype__proto.zoneAbbr = getZoneAbbr;\n    momentPrototype__proto.zoneName = getZoneName;\n\n    // Deprecations\n    momentPrototype__proto.dates  = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\n    momentPrototype__proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\n    momentPrototype__proto.years  = deprecate('years accessor is deprecated. Use year instead', getSetYear);\n    momentPrototype__proto.zone   = deprecate('moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779', getSetZone);\n\n    var momentPrototype = momentPrototype__proto;\n\n    function moment__createUnix (input) {\n        return local__createLocal(input * 1000);\n    }\n\n    function moment__createInZone () {\n        return local__createLocal.apply(null, arguments).parseZone();\n    }\n\n    var defaultCalendar = {\n        sameDay : '[Today at] LT',\n        nextDay : '[Tomorrow at] LT',\n        nextWeek : 'dddd [at] LT',\n        lastDay : '[Yesterday at] LT',\n        lastWeek : '[Last] dddd [at] LT',\n        sameElse : 'L'\n    };\n\n    function locale_calendar__calendar (key, mom, now) {\n        var output = this._calendar[key];\n        return isFunction(output) ? output.call(mom, now) : output;\n    }\n\n    var defaultLongDateFormat = {\n        LTS  : 'h:mm:ss A',\n        LT   : 'h:mm A',\n        L    : 'MM/DD/YYYY',\n        LL   : 'MMMM D, YYYY',\n        LLL  : 'MMMM D, YYYY h:mm A',\n        LLLL : 'dddd, MMMM D, YYYY h:mm A'\n    };\n\n    function longDateFormat (key) {\n        var format = this._longDateFormat[key],\n            formatUpper = this._longDateFormat[key.toUpperCase()];\n\n        if (format || !formatUpper) {\n            return format;\n        }\n\n        this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {\n            return val.slice(1);\n        });\n\n        return this._longDateFormat[key];\n    }\n\n    var defaultInvalidDate = 'Invalid date';\n\n    function invalidDate () {\n        return this._invalidDate;\n    }\n\n    var defaultOrdinal = '%d';\n    var defaultOrdinalParse = /\\d{1,2}/;\n\n    function ordinal (number) {\n        return this._ordinal.replace('%d', number);\n    }\n\n    function preParsePostFormat (string) {\n        return string;\n    }\n\n    var defaultRelativeTime = {\n        future : 'in %s',\n        past   : '%s ago',\n        s  : 'a few seconds',\n        m  : 'a minute',\n        mm : '%d minutes',\n        h  : 'an hour',\n        hh : '%d hours',\n        d  : 'a day',\n        dd : '%d days',\n        M  : 'a month',\n        MM : '%d months',\n        y  : 'a year',\n        yy : '%d years'\n    };\n\n    function relative__relativeTime (number, withoutSuffix, string, isFuture) {\n        var output = this._relativeTime[string];\n        return (isFunction(output)) ?\n            output(number, withoutSuffix, string, isFuture) :\n            output.replace(/%d/i, number);\n    }\n\n    function pastFuture (diff, output) {\n        var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n        return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n    }\n\n    function locale_set__set (config) {\n        var prop, i;\n        for (i in config) {\n            prop = config[i];\n            if (isFunction(prop)) {\n                this[i] = prop;\n            } else {\n                this['_' + i] = prop;\n            }\n        }\n        // Lenient ordinal parsing accepts just a number in addition to\n        // number + (possibly) stuff coming from _ordinalParseLenient.\n        this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + (/\\d{1,2}/).source);\n    }\n\n    var prototype__proto = Locale.prototype;\n\n    prototype__proto._calendar       = defaultCalendar;\n    prototype__proto.calendar        = locale_calendar__calendar;\n    prototype__proto._longDateFormat = defaultLongDateFormat;\n    prototype__proto.longDateFormat  = longDateFormat;\n    prototype__proto._invalidDate    = defaultInvalidDate;\n    prototype__proto.invalidDate     = invalidDate;\n    prototype__proto._ordinal        = defaultOrdinal;\n    prototype__proto.ordinal         = ordinal;\n    prototype__proto._ordinalParse   = defaultOrdinalParse;\n    prototype__proto.preparse        = preParsePostFormat;\n    prototype__proto.postformat      = preParsePostFormat;\n    prototype__proto._relativeTime   = defaultRelativeTime;\n    prototype__proto.relativeTime    = relative__relativeTime;\n    prototype__proto.pastFuture      = pastFuture;\n    prototype__proto.set             = locale_set__set;\n\n    // Month\n    prototype__proto.months            =        localeMonths;\n    prototype__proto._months           = defaultLocaleMonths;\n    prototype__proto.monthsShort       =        localeMonthsShort;\n    prototype__proto._monthsShort      = defaultLocaleMonthsShort;\n    prototype__proto.monthsParse       =        localeMonthsParse;\n    prototype__proto._monthsRegex      = defaultMonthsRegex;\n    prototype__proto.monthsRegex       = monthsRegex;\n    prototype__proto._monthsShortRegex = defaultMonthsShortRegex;\n    prototype__proto.monthsShortRegex  = monthsShortRegex;\n\n    // Week\n    prototype__proto.week = localeWeek;\n    prototype__proto._week = defaultLocaleWeek;\n    prototype__proto.firstDayOfYear = localeFirstDayOfYear;\n    prototype__proto.firstDayOfWeek = localeFirstDayOfWeek;\n\n    // Day of Week\n    prototype__proto.weekdays       =        localeWeekdays;\n    prototype__proto._weekdays      = defaultLocaleWeekdays;\n    prototype__proto.weekdaysMin    =        localeWeekdaysMin;\n    prototype__proto._weekdaysMin   = defaultLocaleWeekdaysMin;\n    prototype__proto.weekdaysShort  =        localeWeekdaysShort;\n    prototype__proto._weekdaysShort = defaultLocaleWeekdaysShort;\n    prototype__proto.weekdaysParse  =        localeWeekdaysParse;\n\n    // Hours\n    prototype__proto.isPM = localeIsPM;\n    prototype__proto._meridiemParse = defaultLocaleMeridiemParse;\n    prototype__proto.meridiem = localeMeridiem;\n\n    function lists__get (format, index, field, setter) {\n        var locale = locale_locales__getLocale();\n        var utc = create_utc__createUTC().set(setter, index);\n        return locale[field](utc, format);\n    }\n\n    function list (format, index, field, count, setter) {\n        if (typeof format === 'number') {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n\n        if (index != null) {\n            return lists__get(format, index, field, setter);\n        }\n\n        var i;\n        var out = [];\n        for (i = 0; i < count; i++) {\n            out[i] = lists__get(format, i, field, setter);\n        }\n        return out;\n    }\n\n    function lists__listMonths (format, index) {\n        return list(format, index, 'months', 12, 'month');\n    }\n\n    function lists__listMonthsShort (format, index) {\n        return list(format, index, 'monthsShort', 12, 'month');\n    }\n\n    function lists__listWeekdays (format, index) {\n        return list(format, index, 'weekdays', 7, 'day');\n    }\n\n    function lists__listWeekdaysShort (format, index) {\n        return list(format, index, 'weekdaysShort', 7, 'day');\n    }\n\n    function lists__listWeekdaysMin (format, index) {\n        return list(format, index, 'weekdaysMin', 7, 'day');\n    }\n\n    locale_locales__getSetGlobalLocale('en', {\n        ordinalParse: /\\d{1,2}(th|st|nd|rd)/,\n        ordinal : function (number) {\n            var b = number % 10,\n                output = (toInt(number % 100 / 10) === 1) ? 'th' :\n                (b === 1) ? 'st' :\n                (b === 2) ? 'nd' :\n                (b === 3) ? 'rd' : 'th';\n            return number + output;\n        }\n    });\n\n    // Side effect imports\n    utils_hooks__hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', locale_locales__getSetGlobalLocale);\n    utils_hooks__hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', locale_locales__getLocale);\n\n    var mathAbs = Math.abs;\n\n    function duration_abs__abs () {\n        var data           = this._data;\n\n        this._milliseconds = mathAbs(this._milliseconds);\n        this._days         = mathAbs(this._days);\n        this._months       = mathAbs(this._months);\n\n        data.milliseconds  = mathAbs(data.milliseconds);\n        data.seconds       = mathAbs(data.seconds);\n        data.minutes       = mathAbs(data.minutes);\n        data.hours         = mathAbs(data.hours);\n        data.months        = mathAbs(data.months);\n        data.years         = mathAbs(data.years);\n\n        return this;\n    }\n\n    function duration_add_subtract__addSubtract (duration, input, value, direction) {\n        var other = create__createDuration(input, value);\n\n        duration._milliseconds += direction * other._milliseconds;\n        duration._days         += direction * other._days;\n        duration._months       += direction * other._months;\n\n        return duration._bubble();\n    }\n\n    // supports only 2.0-style add(1, 's') or add(duration)\n    function duration_add_subtract__add (input, value) {\n        return duration_add_subtract__addSubtract(this, input, value, 1);\n    }\n\n    // supports only 2.0-style subtract(1, 's') or subtract(duration)\n    function duration_add_subtract__subtract (input, value) {\n        return duration_add_subtract__addSubtract(this, input, value, -1);\n    }\n\n    function absCeil (number) {\n        if (number < 0) {\n            return Math.floor(number);\n        } else {\n            return Math.ceil(number);\n        }\n    }\n\n    function bubble () {\n        var milliseconds = this._milliseconds;\n        var days         = this._days;\n        var months       = this._months;\n        var data         = this._data;\n        var seconds, minutes, hours, years, monthsFromDays;\n\n        // if we have a mix of positive and negative values, bubble down first\n        // check: https://github.com/moment/moment/issues/2166\n        if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||\n                (milliseconds <= 0 && days <= 0 && months <= 0))) {\n            milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n            days = 0;\n            months = 0;\n        }\n\n        // The following code bubbles up values, see the tests for\n        // examples of what that means.\n        data.milliseconds = milliseconds % 1000;\n\n        seconds           = absFloor(milliseconds / 1000);\n        data.seconds      = seconds % 60;\n\n        minutes           = absFloor(seconds / 60);\n        data.minutes      = minutes % 60;\n\n        hours             = absFloor(minutes / 60);\n        data.hours        = hours % 24;\n\n        days += absFloor(hours / 24);\n\n        // convert days to months\n        monthsFromDays = absFloor(daysToMonths(days));\n        months += monthsFromDays;\n        days -= absCeil(monthsToDays(monthsFromDays));\n\n        // 12 months -> 1 year\n        years = absFloor(months / 12);\n        months %= 12;\n\n        data.days   = days;\n        data.months = months;\n        data.years  = years;\n\n        return this;\n    }\n\n    function daysToMonths (days) {\n        // 400 years have 146097 days (taking into account leap year rules)\n        // 400 years have 12 months === 4800\n        return days * 4800 / 146097;\n    }\n\n    function monthsToDays (months) {\n        // the reverse of daysToMonths\n        return months * 146097 / 4800;\n    }\n\n    function as (units) {\n        var days;\n        var months;\n        var milliseconds = this._milliseconds;\n\n        units = normalizeUnits(units);\n\n        if (units === 'month' || units === 'year') {\n            days   = this._days   + milliseconds / 864e5;\n            months = this._months + daysToMonths(days);\n            return units === 'month' ? months : months / 12;\n        } else {\n            // handle milliseconds separately because of floating point math errors (issue #1867)\n            days = this._days + Math.round(monthsToDays(this._months));\n            switch (units) {\n                case 'week'   : return days / 7     + milliseconds / 6048e5;\n                case 'day'    : return days         + milliseconds / 864e5;\n                case 'hour'   : return days * 24    + milliseconds / 36e5;\n                case 'minute' : return days * 1440  + milliseconds / 6e4;\n                case 'second' : return days * 86400 + milliseconds / 1000;\n                // Math.floor prevents floating point math errors here\n                case 'millisecond': return Math.floor(days * 864e5) + milliseconds;\n                default: throw new Error('Unknown unit ' + units);\n            }\n        }\n    }\n\n    // TODO: Use this.as('ms')?\n    function duration_as__valueOf () {\n        return (\n            this._milliseconds +\n            this._days * 864e5 +\n            (this._months % 12) * 2592e6 +\n            toInt(this._months / 12) * 31536e6\n        );\n    }\n\n    function makeAs (alias) {\n        return function () {\n            return this.as(alias);\n        };\n    }\n\n    var asMilliseconds = makeAs('ms');\n    var asSeconds      = makeAs('s');\n    var asMinutes      = makeAs('m');\n    var asHours        = makeAs('h');\n    var asDays         = makeAs('d');\n    var asWeeks        = makeAs('w');\n    var asMonths       = makeAs('M');\n    var asYears        = makeAs('y');\n\n    function duration_get__get (units) {\n        units = normalizeUnits(units);\n        return this[units + 's']();\n    }\n\n    function makeGetter(name) {\n        return function () {\n            return this._data[name];\n        };\n    }\n\n    var milliseconds = makeGetter('milliseconds');\n    var seconds      = makeGetter('seconds');\n    var minutes      = makeGetter('minutes');\n    var hours        = makeGetter('hours');\n    var days         = makeGetter('days');\n    var months       = makeGetter('months');\n    var years        = makeGetter('years');\n\n    function weeks () {\n        return absFloor(this.days() / 7);\n    }\n\n    var round = Math.round;\n    var thresholds = {\n        s: 45,  // seconds to minute\n        m: 45,  // minutes to hour\n        h: 22,  // hours to day\n        d: 26,  // days to month\n        M: 11   // months to year\n    };\n\n    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\n    function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n        return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n    }\n\n    function duration_humanize__relativeTime (posNegDuration, withoutSuffix, locale) {\n        var duration = create__createDuration(posNegDuration).abs();\n        var seconds  = round(duration.as('s'));\n        var minutes  = round(duration.as('m'));\n        var hours    = round(duration.as('h'));\n        var days     = round(duration.as('d'));\n        var months   = round(duration.as('M'));\n        var years    = round(duration.as('y'));\n\n        var a = seconds < thresholds.s && ['s', seconds]  ||\n                minutes <= 1           && ['m']           ||\n                minutes < thresholds.m && ['mm', minutes] ||\n                hours   <= 1           && ['h']           ||\n                hours   < thresholds.h && ['hh', hours]   ||\n                days    <= 1           && ['d']           ||\n                days    < thresholds.d && ['dd', days]    ||\n                months  <= 1           && ['M']           ||\n                months  < thresholds.M && ['MM', months]  ||\n                years   <= 1           && ['y']           || ['yy', years];\n\n        a[2] = withoutSuffix;\n        a[3] = +posNegDuration > 0;\n        a[4] = locale;\n        return substituteTimeAgo.apply(null, a);\n    }\n\n    // This function allows you to set a threshold for relative time strings\n    function duration_humanize__getSetRelativeTimeThreshold (threshold, limit) {\n        if (thresholds[threshold] === undefined) {\n            return false;\n        }\n        if (limit === undefined) {\n            return thresholds[threshold];\n        }\n        thresholds[threshold] = limit;\n        return true;\n    }\n\n    function humanize (withSuffix) {\n        var locale = this.localeData();\n        var output = duration_humanize__relativeTime(this, !withSuffix, locale);\n\n        if (withSuffix) {\n            output = locale.pastFuture(+this, output);\n        }\n\n        return locale.postformat(output);\n    }\n\n    var iso_string__abs = Math.abs;\n\n    function iso_string__toISOString() {\n        // for ISO strings we do not use the normal bubbling rules:\n        //  * milliseconds bubble up until they become hours\n        //  * days do not bubble at all\n        //  * months bubble up until they become years\n        // This is because there is no context-free conversion between hours and days\n        // (think of clock changes)\n        // and also not between days and months (28-31 days per month)\n        var seconds = iso_string__abs(this._milliseconds) / 1000;\n        var days         = iso_string__abs(this._days);\n        var months       = iso_string__abs(this._months);\n        var minutes, hours, years;\n\n        // 3600 seconds -> 60 minutes -> 1 hour\n        minutes           = absFloor(seconds / 60);\n        hours             = absFloor(minutes / 60);\n        seconds %= 60;\n        minutes %= 60;\n\n        // 12 months -> 1 year\n        years  = absFloor(months / 12);\n        months %= 12;\n\n\n        // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n        var Y = years;\n        var M = months;\n        var D = days;\n        var h = hours;\n        var m = minutes;\n        var s = seconds;\n        var total = this.asSeconds();\n\n        if (!total) {\n            // this is the same as C#'s (Noda) and python (isodate)...\n            // but not other JS (goog.date)\n            return 'P0D';\n        }\n\n        return (total < 0 ? '-' : '') +\n            'P' +\n            (Y ? Y + 'Y' : '') +\n            (M ? M + 'M' : '') +\n            (D ? D + 'D' : '') +\n            ((h || m || s) ? 'T' : '') +\n            (h ? h + 'H' : '') +\n            (m ? m + 'M' : '') +\n            (s ? s + 'S' : '');\n    }\n\n    var duration_prototype__proto = Duration.prototype;\n\n    duration_prototype__proto.abs            = duration_abs__abs;\n    duration_prototype__proto.add            = duration_add_subtract__add;\n    duration_prototype__proto.subtract       = duration_add_subtract__subtract;\n    duration_prototype__proto.as             = as;\n    duration_prototype__proto.asMilliseconds = asMilliseconds;\n    duration_prototype__proto.asSeconds      = asSeconds;\n    duration_prototype__proto.asMinutes      = asMinutes;\n    duration_prototype__proto.asHours        = asHours;\n    duration_prototype__proto.asDays         = asDays;\n    duration_prototype__proto.asWeeks        = asWeeks;\n    duration_prototype__proto.asMonths       = asMonths;\n    duration_prototype__proto.asYears        = asYears;\n    duration_prototype__proto.valueOf        = duration_as__valueOf;\n    duration_prototype__proto._bubble        = bubble;\n    duration_prototype__proto.get            = duration_get__get;\n    duration_prototype__proto.milliseconds   = milliseconds;\n    duration_prototype__proto.seconds        = seconds;\n    duration_prototype__proto.minutes        = minutes;\n    duration_prototype__proto.hours          = hours;\n    duration_prototype__proto.days           = days;\n    duration_prototype__proto.weeks          = weeks;\n    duration_prototype__proto.months         = months;\n    duration_prototype__proto.years          = years;\n    duration_prototype__proto.humanize       = humanize;\n    duration_prototype__proto.toISOString    = iso_string__toISOString;\n    duration_prototype__proto.toString       = iso_string__toISOString;\n    duration_prototype__proto.toJSON         = iso_string__toISOString;\n    duration_prototype__proto.locale         = locale;\n    duration_prototype__proto.localeData     = localeData;\n\n    // Deprecations\n    duration_prototype__proto.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', iso_string__toISOString);\n    duration_prototype__proto.lang = lang;\n\n    // Side effect imports\n\n    // FORMATTING\n\n    addFormatToken('X', 0, 0, 'unix');\n    addFormatToken('x', 0, 0, 'valueOf');\n\n    // PARSING\n\n    addRegexToken('x', matchSigned);\n    addRegexToken('X', matchTimestamp);\n    addParseToken('X', function (input, array, config) {\n        config._d = new Date(parseFloat(input, 10) * 1000);\n    });\n    addParseToken('x', function (input, array, config) {\n        config._d = new Date(toInt(input));\n    });\n\n    // Side effect imports\n\n\n    utils_hooks__hooks.version = '2.11.1';\n\n    setHookCallback(local__createLocal);\n\n    utils_hooks__hooks.fn                    = momentPrototype;\n    utils_hooks__hooks.min                   = min;\n    utils_hooks__hooks.max                   = max;\n    utils_hooks__hooks.now                   = now;\n    utils_hooks__hooks.utc                   = create_utc__createUTC;\n    utils_hooks__hooks.unix                  = moment__createUnix;\n    utils_hooks__hooks.months                = lists__listMonths;\n    utils_hooks__hooks.isDate                = isDate;\n    utils_hooks__hooks.locale                = locale_locales__getSetGlobalLocale;\n    utils_hooks__hooks.invalid               = valid__createInvalid;\n    utils_hooks__hooks.duration              = create__createDuration;\n    utils_hooks__hooks.isMoment              = isMoment;\n    utils_hooks__hooks.weekdays              = lists__listWeekdays;\n    utils_hooks__hooks.parseZone             = moment__createInZone;\n    utils_hooks__hooks.localeData            = locale_locales__getLocale;\n    utils_hooks__hooks.isDuration            = isDuration;\n    utils_hooks__hooks.monthsShort           = lists__listMonthsShort;\n    utils_hooks__hooks.weekdaysMin           = lists__listWeekdaysMin;\n    utils_hooks__hooks.defineLocale          = defineLocale;\n    utils_hooks__hooks.weekdaysShort         = lists__listWeekdaysShort;\n    utils_hooks__hooks.normalizeUnits        = normalizeUnits;\n    utils_hooks__hooks.relativeTimeThreshold = duration_humanize__getSetRelativeTimeThreshold;\n    utils_hooks__hooks.prototype             = momentPrototype;\n\n    var _moment = utils_hooks__hooks;\n\n    return _moment;\n\n}));","\n/**\n * Module dependencies.\n */\n\nvar url = require('./url');\nvar parser = require('socket.io-parser');\nvar Manager = require('./manager');\nvar debug = require('debug')('socket.io-client');\n\n/**\n * Module exports.\n */\n\nmodule.exports = exports = lookup;\n\n/**\n * Managers cache.\n */\n\nvar cache = exports.managers = {};\n\n/**\n * Looks up an existing `Manager` for multiplexing.\n * If the user summons:\n *\n *   `io('http://localhost/a');`\n *   `io('http://localhost/b');`\n *\n * We reuse the existing instance based on same scheme/port/host,\n * and we initialize sockets for each namespace.\n *\n * @api public\n */\n\nfunction lookup(uri, opts) {\n  if (typeof uri == 'object') {\n    opts = uri;\n    uri = undefined;\n  }\n\n  opts = opts || {};\n\n  var parsed = url(uri);\n  var source = parsed.source;\n  var id = parsed.id;\n  var path = parsed.path;\n  var sameNamespace = cache[id] && path in cache[id].nsps;\n  var newConnection = opts.forceNew || opts['force new connection'] ||\n                      false === opts.multiplex || sameNamespace;\n\n  var io;\n\n  if (newConnection) {\n    debug('ignoring socket cache for %s', source);\n    io = Manager(source, opts);\n  } else {\n    if (!cache[id]) {\n      debug('new io instance for %s', source);\n      cache[id] = Manager(source, opts);\n    }\n    io = cache[id];\n  }\n\n  return io.socket(parsed.path);\n}\n\n/**\n * Protocol version.\n *\n * @api public\n */\n\nexports.protocol = parser.protocol;\n\n/**\n * `connect`.\n *\n * @param {String} uri\n * @api public\n */\n\nexports.connect = lookup;\n\n/**\n * Expose constructors for standalone build.\n *\n * @api public\n */\n\nexports.Manager = require('./manager');\nexports.Socket = require('./socket');\n","/*!\n * vue-router v0.7.10\n * (c) 2016 Evan You\n * Released under the MIT License.\n */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  global.VueRouter = factory();\n}(this, function () { 'use strict';\n\n  var babelHelpers = {};\n\n  babelHelpers.classCallCheck = function (instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  };\n  function Target(path, matcher, delegate) {\n    this.path = path;\n    this.matcher = matcher;\n    this.delegate = delegate;\n  }\n\n  Target.prototype = {\n    to: function to(target, callback) {\n      var delegate = this.delegate;\n\n      if (delegate && delegate.willAddRoute) {\n        target = delegate.willAddRoute(this.matcher.target, target);\n      }\n\n      this.matcher.add(this.path, target);\n\n      if (callback) {\n        if (callback.length === 0) {\n          throw new Error(\"You must have an argument in the function passed to `to`\");\n        }\n        this.matcher.addChild(this.path, target, callback, this.delegate);\n      }\n      return this;\n    }\n  };\n\n  function Matcher(target) {\n    this.routes = {};\n    this.children = {};\n    this.target = target;\n  }\n\n  Matcher.prototype = {\n    add: function add(path, handler) {\n      this.routes[path] = handler;\n    },\n\n    addChild: function addChild(path, target, callback, delegate) {\n      var matcher = new Matcher(target);\n      this.children[path] = matcher;\n\n      var match = generateMatch(path, matcher, delegate);\n\n      if (delegate && delegate.contextEntered) {\n        delegate.contextEntered(target, match);\n      }\n\n      callback(match);\n    }\n  };\n\n  function generateMatch(startingPath, matcher, delegate) {\n    return function (path, nestedCallback) {\n      var fullPath = startingPath + path;\n\n      if (nestedCallback) {\n        nestedCallback(generateMatch(fullPath, matcher, delegate));\n      } else {\n        return new Target(startingPath + path, matcher, delegate);\n      }\n    };\n  }\n\n  function addRoute(routeArray, path, handler) {\n    var len = 0;\n    for (var i = 0, l = routeArray.length; i < l; i++) {\n      len += routeArray[i].path.length;\n    }\n\n    path = path.substr(len);\n    var route = { path: path, handler: handler };\n    routeArray.push(route);\n  }\n\n  function eachRoute(baseRoute, matcher, callback, binding) {\n    var routes = matcher.routes;\n\n    for (var path in routes) {\n      if (routes.hasOwnProperty(path)) {\n        var routeArray = baseRoute.slice();\n        addRoute(routeArray, path, routes[path]);\n\n        if (matcher.children[path]) {\n          eachRoute(routeArray, matcher.children[path], callback, binding);\n        } else {\n          callback.call(binding, routeArray);\n        }\n      }\n    }\n  }\n\n  function map (callback, addRouteCallback) {\n    var matcher = new Matcher();\n\n    callback(generateMatch(\"\", matcher, this.delegate));\n\n    eachRoute([], matcher, function (route) {\n      if (addRouteCallback) {\n        addRouteCallback(this, route);\n      } else {\n        this.add(route);\n      }\n    }, this);\n  }\n\n  var specials = ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\\\'];\n\n  var escapeRegex = new RegExp('(\\\\' + specials.join('|\\\\') + ')', 'g');\n\n  function isArray(test) {\n    return Object.prototype.toString.call(test) === \"[object Array]\";\n  }\n\n  // A Segment represents a segment in the original route description.\n  // Each Segment type provides an `eachChar` and `regex` method.\n  //\n  // The `eachChar` method invokes the callback with one or more character\n  // specifications. A character specification consumes one or more input\n  // characters.\n  //\n  // The `regex` method returns a regex fragment for the segment. If the\n  // segment is a dynamic of star segment, the regex fragment also includes\n  // a capture.\n  //\n  // A character specification contains:\n  //\n  // * `validChars`: a String with a list of all valid characters, or\n  // * `invalidChars`: a String with a list of all invalid characters\n  // * `repeat`: true if the character specification can repeat\n\n  function StaticSegment(string) {\n    this.string = string;\n  }\n  StaticSegment.prototype = {\n    eachChar: function eachChar(callback) {\n      var string = this.string,\n          ch;\n\n      for (var i = 0, l = string.length; i < l; i++) {\n        ch = string.charAt(i);\n        callback({ validChars: ch });\n      }\n    },\n\n    regex: function regex() {\n      return this.string.replace(escapeRegex, '\\\\$1');\n    },\n\n    generate: function generate() {\n      return this.string;\n    }\n  };\n\n  function DynamicSegment(name) {\n    this.name = name;\n  }\n  DynamicSegment.prototype = {\n    eachChar: function eachChar(callback) {\n      callback({ invalidChars: \"/\", repeat: true });\n    },\n\n    regex: function regex() {\n      return \"([^/]+)\";\n    },\n\n    generate: function generate(params) {\n      var val = params[this.name];\n      return val == null ? \":\" + this.name : val;\n    }\n  };\n\n  function StarSegment(name) {\n    this.name = name;\n  }\n  StarSegment.prototype = {\n    eachChar: function eachChar(callback) {\n      callback({ invalidChars: \"\", repeat: true });\n    },\n\n    regex: function regex() {\n      return \"(.+)\";\n    },\n\n    generate: function generate(params) {\n      var val = params[this.name];\n      return val == null ? \":\" + this.name : val;\n    }\n  };\n\n  function EpsilonSegment() {}\n  EpsilonSegment.prototype = {\n    eachChar: function eachChar() {},\n    regex: function regex() {\n      return \"\";\n    },\n    generate: function generate() {\n      return \"\";\n    }\n  };\n\n  function parse(route, names, specificity) {\n    // normalize route as not starting with a \"/\". Recognition will\n    // also normalize.\n    if (route.charAt(0) === \"/\") {\n      route = route.substr(1);\n    }\n\n    var segments = route.split(\"/\"),\n        results = [];\n\n    // A routes has specificity determined by the order that its different segments\n    // appear in. This system mirrors how the magnitude of numbers written as strings\n    // works.\n    // Consider a number written as: \"abc\". An example would be \"200\". Any other number written\n    // \"xyz\" will be smaller than \"abc\" so long as `a > z`. For instance, \"199\" is smaller\n    // then \"200\", even though \"y\" and \"z\" (which are both 9) are larger than \"0\" (the value\n    // of (`b` and `c`). This is because the leading symbol, \"2\", is larger than the other\n    // leading symbol, \"1\".\n    // The rule is that symbols to the left carry more weight than symbols to the right\n    // when a number is written out as a string. In the above strings, the leading digit\n    // represents how many 100's are in the number, and it carries more weight than the middle\n    // number which represents how many 10's are in the number.\n    // This system of number magnitude works well for route specificity, too. A route written as\n    // `a/b/c` will be more specific than `x/y/z` as long as `a` is more specific than\n    // `x`, irrespective of the other parts.\n    // Because of this similarity, we assign each type of segment a number value written as a\n    // string. We can find the specificity of compound routes by concatenating these strings\n    // together, from left to right. After we have looped through all of the segments,\n    // we convert the string to a number.\n    specificity.val = '';\n\n    for (var i = 0, l = segments.length; i < l; i++) {\n      var segment = segments[i],\n          match;\n\n      if (match = segment.match(/^:([^\\/]+)$/)) {\n        results.push(new DynamicSegment(match[1]));\n        names.push(match[1]);\n        specificity.val += '3';\n      } else if (match = segment.match(/^\\*([^\\/]+)$/)) {\n        results.push(new StarSegment(match[1]));\n        specificity.val += '2';\n        names.push(match[1]);\n      } else if (segment === \"\") {\n        results.push(new EpsilonSegment());\n        specificity.val += '1';\n      } else {\n        results.push(new StaticSegment(segment));\n        specificity.val += '4';\n      }\n    }\n\n    specificity.val = +specificity.val;\n\n    return results;\n  }\n\n  // A State has a character specification and (`charSpec`) and a list of possible\n  // subsequent states (`nextStates`).\n  //\n  // If a State is an accepting state, it will also have several additional\n  // properties:\n  //\n  // * `regex`: A regular expression that is used to extract parameters from paths\n  //   that reached this accepting state.\n  // * `handlers`: Information on how to convert the list of captures into calls\n  //   to registered handlers with the specified parameters\n  // * `types`: How many static, dynamic or star segments in this route. Used to\n  //   decide which route to use if multiple registered routes match a path.\n  //\n  // Currently, State is implemented naively by looping over `nextStates` and\n  // comparing a character specification against a character. A more efficient\n  // implementation would use a hash of keys pointing at one or more next states.\n\n  function State(charSpec) {\n    this.charSpec = charSpec;\n    this.nextStates = [];\n  }\n\n  State.prototype = {\n    get: function get(charSpec) {\n      var nextStates = this.nextStates;\n\n      for (var i = 0, l = nextStates.length; i < l; i++) {\n        var child = nextStates[i];\n\n        var isEqual = child.charSpec.validChars === charSpec.validChars;\n        isEqual = isEqual && child.charSpec.invalidChars === charSpec.invalidChars;\n\n        if (isEqual) {\n          return child;\n        }\n      }\n    },\n\n    put: function put(charSpec) {\n      var state;\n\n      // If the character specification already exists in a child of the current\n      // state, just return that state.\n      if (state = this.get(charSpec)) {\n        return state;\n      }\n\n      // Make a new state for the character spec\n      state = new State(charSpec);\n\n      // Insert the new state as a child of the current state\n      this.nextStates.push(state);\n\n      // If this character specification repeats, insert the new state as a child\n      // of itself. Note that this will not trigger an infinite loop because each\n      // transition during recognition consumes a character.\n      if (charSpec.repeat) {\n        state.nextStates.push(state);\n      }\n\n      // Return the new state\n      return state;\n    },\n\n    // Find a list of child states matching the next character\n    match: function match(ch) {\n      // DEBUG \"Processing `\" + ch + \"`:\"\n      var nextStates = this.nextStates,\n          child,\n          charSpec,\n          chars;\n\n      // DEBUG \"  \" + debugState(this)\n      var returned = [];\n\n      for (var i = 0, l = nextStates.length; i < l; i++) {\n        child = nextStates[i];\n\n        charSpec = child.charSpec;\n\n        if (typeof (chars = charSpec.validChars) !== 'undefined') {\n          if (chars.indexOf(ch) !== -1) {\n            returned.push(child);\n          }\n        } else if (typeof (chars = charSpec.invalidChars) !== 'undefined') {\n          if (chars.indexOf(ch) === -1) {\n            returned.push(child);\n          }\n        }\n      }\n\n      return returned;\n    }\n\n    /** IF DEBUG\n    , debug: function() {\n      var charSpec = this.charSpec,\n          debug = \"[\",\n          chars = charSpec.validChars || charSpec.invalidChars;\n       if (charSpec.invalidChars) { debug += \"^\"; }\n      debug += chars;\n      debug += \"]\";\n       if (charSpec.repeat) { debug += \"+\"; }\n       return debug;\n    }\n    END IF **/\n  };\n\n  /** IF DEBUG\n  function debug(log) {\n    console.log(log);\n  }\n\n  function debugState(state) {\n    return state.nextStates.map(function(n) {\n      if (n.nextStates.length === 0) { return \"( \" + n.debug() + \" [accepting] )\"; }\n      return \"( \" + n.debug() + \" <then> \" + n.nextStates.map(function(s) { return s.debug() }).join(\" or \") + \" )\";\n    }).join(\", \")\n  }\n  END IF **/\n\n  // Sort the routes by specificity\n  function sortSolutions(states) {\n    return states.sort(function (a, b) {\n      return b.specificity.val - a.specificity.val;\n    });\n  }\n\n  function recognizeChar(states, ch) {\n    var nextStates = [];\n\n    for (var i = 0, l = states.length; i < l; i++) {\n      var state = states[i];\n\n      nextStates = nextStates.concat(state.match(ch));\n    }\n\n    return nextStates;\n  }\n\n  var oCreate = Object.create || function (proto) {\n    function F() {}\n    F.prototype = proto;\n    return new F();\n  };\n\n  function RecognizeResults(queryParams) {\n    this.queryParams = queryParams || {};\n  }\n  RecognizeResults.prototype = oCreate({\n    splice: Array.prototype.splice,\n    slice: Array.prototype.slice,\n    push: Array.prototype.push,\n    length: 0,\n    queryParams: null\n  });\n\n  function findHandler(state, path, queryParams) {\n    var handlers = state.handlers,\n        regex = state.regex;\n    var captures = path.match(regex),\n        currentCapture = 1;\n    var result = new RecognizeResults(queryParams);\n\n    for (var i = 0, l = handlers.length; i < l; i++) {\n      var handler = handlers[i],\n          names = handler.names,\n          params = {};\n\n      for (var j = 0, m = names.length; j < m; j++) {\n        params[names[j]] = captures[currentCapture++];\n      }\n\n      result.push({ handler: handler.handler, params: params, isDynamic: !!names.length });\n    }\n\n    return result;\n  }\n\n  function addSegment(currentState, segment) {\n    segment.eachChar(function (ch) {\n      var state;\n\n      currentState = currentState.put(ch);\n    });\n\n    return currentState;\n  }\n\n  function decodeQueryParamPart(part) {\n    // http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1\n    part = part.replace(/\\+/gm, '%20');\n    return decodeURIComponent(part);\n  }\n\n  // The main interface\n\n  var RouteRecognizer = function RouteRecognizer() {\n    this.rootState = new State();\n    this.names = {};\n  };\n\n  RouteRecognizer.prototype = {\n    add: function add(routes, options) {\n      var currentState = this.rootState,\n          regex = \"^\",\n          specificity = {},\n          handlers = [],\n          allSegments = [],\n          name;\n\n      var isEmpty = true;\n\n      for (var i = 0, l = routes.length; i < l; i++) {\n        var route = routes[i],\n            names = [];\n\n        var segments = parse(route.path, names, specificity);\n\n        allSegments = allSegments.concat(segments);\n\n        for (var j = 0, m = segments.length; j < m; j++) {\n          var segment = segments[j];\n\n          if (segment instanceof EpsilonSegment) {\n            continue;\n          }\n\n          isEmpty = false;\n\n          // Add a \"/\" for the new segment\n          currentState = currentState.put({ validChars: \"/\" });\n          regex += \"/\";\n\n          // Add a representation of the segment to the NFA and regex\n          currentState = addSegment(currentState, segment);\n          regex += segment.regex();\n        }\n\n        var handler = { handler: route.handler, names: names };\n        handlers.push(handler);\n      }\n\n      if (isEmpty) {\n        currentState = currentState.put({ validChars: \"/\" });\n        regex += \"/\";\n      }\n\n      currentState.handlers = handlers;\n      currentState.regex = new RegExp(regex + \"$\");\n      currentState.specificity = specificity;\n\n      if (name = options && options.as) {\n        this.names[name] = {\n          segments: allSegments,\n          handlers: handlers\n        };\n      }\n    },\n\n    handlersFor: function handlersFor(name) {\n      var route = this.names[name],\n          result = [];\n      if (!route) {\n        throw new Error(\"There is no route named \" + name);\n      }\n\n      for (var i = 0, l = route.handlers.length; i < l; i++) {\n        result.push(route.handlers[i]);\n      }\n\n      return result;\n    },\n\n    hasRoute: function hasRoute(name) {\n      return !!this.names[name];\n    },\n\n    generate: function generate(name, params) {\n      var route = this.names[name],\n          output = \"\";\n      if (!route) {\n        throw new Error(\"There is no route named \" + name);\n      }\n\n      var segments = route.segments;\n\n      for (var i = 0, l = segments.length; i < l; i++) {\n        var segment = segments[i];\n\n        if (segment instanceof EpsilonSegment) {\n          continue;\n        }\n\n        output += \"/\";\n        output += segment.generate(params);\n      }\n\n      if (output.charAt(0) !== '/') {\n        output = '/' + output;\n      }\n\n      if (params && params.queryParams) {\n        output += this.generateQueryString(params.queryParams);\n      }\n\n      return output;\n    },\n\n    generateQueryString: function generateQueryString(params) {\n      var pairs = [];\n      var keys = [];\n      for (var key in params) {\n        if (params.hasOwnProperty(key)) {\n          keys.push(key);\n        }\n      }\n      keys.sort();\n      for (var i = 0, len = keys.length; i < len; i++) {\n        key = keys[i];\n        var value = params[key];\n        if (value == null) {\n          continue;\n        }\n        var pair = encodeURIComponent(key);\n        if (isArray(value)) {\n          for (var j = 0, l = value.length; j < l; j++) {\n            var arrayPair = key + '[]' + '=' + encodeURIComponent(value[j]);\n            pairs.push(arrayPair);\n          }\n        } else {\n          pair += \"=\" + encodeURIComponent(value);\n          pairs.push(pair);\n        }\n      }\n\n      if (pairs.length === 0) {\n        return '';\n      }\n\n      return \"?\" + pairs.join(\"&\");\n    },\n\n    parseQueryString: function parseQueryString(queryString) {\n      var pairs = queryString.split(\"&\"),\n          queryParams = {};\n      for (var i = 0; i < pairs.length; i++) {\n        var pair = pairs[i].split('='),\n            key = decodeQueryParamPart(pair[0]),\n            keyLength = key.length,\n            isArray = false,\n            value;\n        if (pair.length === 1) {\n          value = 'true';\n        } else {\n          //Handle arrays\n          if (keyLength > 2 && key.slice(keyLength - 2) === '[]') {\n            isArray = true;\n            key = key.slice(0, keyLength - 2);\n            if (!queryParams[key]) {\n              queryParams[key] = [];\n            }\n          }\n          value = pair[1] ? decodeQueryParamPart(pair[1]) : '';\n        }\n        if (isArray) {\n          queryParams[key].push(value);\n        } else {\n          queryParams[key] = value;\n        }\n      }\n      return queryParams;\n    },\n\n    recognize: function recognize(path) {\n      var states = [this.rootState],\n          pathLen,\n          i,\n          l,\n          queryStart,\n          queryParams = {},\n          isSlashDropped = false;\n\n      queryStart = path.indexOf('?');\n      if (queryStart !== -1) {\n        var queryString = path.substr(queryStart + 1, path.length);\n        path = path.substr(0, queryStart);\n        queryParams = this.parseQueryString(queryString);\n      }\n\n      path = decodeURI(path);\n\n      // DEBUG GROUP path\n\n      if (path.charAt(0) !== \"/\") {\n        path = \"/\" + path;\n      }\n\n      pathLen = path.length;\n      if (pathLen > 1 && path.charAt(pathLen - 1) === \"/\") {\n        path = path.substr(0, pathLen - 1);\n        isSlashDropped = true;\n      }\n\n      for (i = 0, l = path.length; i < l; i++) {\n        states = recognizeChar(states, path.charAt(i));\n        if (!states.length) {\n          break;\n        }\n      }\n\n      // END DEBUG GROUP\n\n      var solutions = [];\n      for (i = 0, l = states.length; i < l; i++) {\n        if (states[i].handlers) {\n          solutions.push(states[i]);\n        }\n      }\n\n      states = sortSolutions(solutions);\n\n      var state = solutions[0];\n\n      if (state && state.handlers) {\n        // if a trailing slash was dropped and a star segment is the last segment\n        // specified, put the trailing slash back\n        if (isSlashDropped && state.regex.source.slice(-5) === \"(.+)$\") {\n          path = path + \"/\";\n        }\n        return findHandler(state, path, queryParams);\n      }\n    }\n  };\n\n  RouteRecognizer.prototype.map = map;\n\n  RouteRecognizer.VERSION = '0.1.9';\n\n  var genQuery = RouteRecognizer.prototype.generateQueryString;\n\n  // export default for holding the Vue reference\n  var exports$1 = {};\n  /**\n   * Warn stuff.\n   *\n   * @param {String} msg\n   */\n\n  function warn(msg) {\n    /* istanbul ignore next */\n    if (window.console) {\n      console.warn('[vue-router] ' + msg);\n      if (!exports$1.Vue || exports$1.Vue.config.debug) {\n        console.warn(new Error('warning stack trace:').stack);\n      }\n    }\n  }\n\n  /**\n   * Resolve a relative path.\n   *\n   * @param {String} base\n   * @param {String} relative\n   * @param {Boolean} append\n   * @return {String}\n   */\n\n  function resolvePath(base, relative, append) {\n    var query = base.match(/(\\?.*)$/);\n    if (query) {\n      query = query[1];\n      base = base.slice(0, -query.length);\n    }\n    // a query!\n    if (relative.charAt(0) === '?') {\n      return base + relative;\n    }\n    var stack = base.split('/');\n    // remove trailing segment if:\n    // - not appending\n    // - appending to trailing slash (last segment is empty)\n    if (!append || !stack[stack.length - 1]) {\n      stack.pop();\n    }\n    // resolve relative path\n    var segments = relative.replace(/^\\//, '').split('/');\n    for (var i = 0; i < segments.length; i++) {\n      var segment = segments[i];\n      if (segment === '.') {\n        continue;\n      } else if (segment === '..') {\n        stack.pop();\n      } else {\n        stack.push(segment);\n      }\n    }\n    // ensure leading slash\n    if (stack[0] !== '') {\n      stack.unshift('');\n    }\n    return stack.join('/');\n  }\n\n  /**\n   * Forgiving check for a promise\n   *\n   * @param {Object} p\n   * @return {Boolean}\n   */\n\n  function isPromise(p) {\n    return p && typeof p.then === 'function';\n  }\n\n  /**\n   * Retrive a route config field from a component instance\n   * OR a component contructor.\n   *\n   * @param {Function|Vue} component\n   * @param {String} name\n   * @return {*}\n   */\n\n  function getRouteConfig(component, name) {\n    var options = component && (component.$options || component.options);\n    return options && options.route && options.route[name];\n  }\n\n  /**\n   * Resolve an async component factory. Have to do a dirty\n   * mock here because of Vue core's internal API depends on\n   * an ID check.\n   *\n   * @param {Object} handler\n   * @param {Function} cb\n   */\n\n  var resolver = undefined;\n\n  function resolveAsyncComponent(handler, cb) {\n    if (!resolver) {\n      resolver = {\n        resolve: exports$1.Vue.prototype._resolveComponent,\n        $options: {\n          components: {\n            _: handler.component\n          }\n        }\n      };\n    } else {\n      resolver.$options.components._ = handler.component;\n    }\n    resolver.resolve('_', function (Component) {\n      handler.component = Component;\n      cb(Component);\n    });\n  }\n\n  /**\n   * Map the dynamic segments in a path to params.\n   *\n   * @param {String} path\n   * @param {Object} params\n   * @param {Object} query\n   */\n\n  function mapParams(path, params, query) {\n    if (params === undefined) params = {};\n\n    path = path.replace(/:([^\\/]+)/g, function (_, key) {\n      var val = params[key];\n      /* istanbul ignore if */\n      if (!val) {\n        warn('param \"' + key + '\" not found when generating ' + 'path for \"' + path + '\" with params ' + JSON.stringify(params));\n      }\n      return val || '';\n    });\n    if (query) {\n      path += genQuery(query);\n    }\n    return path;\n  }\n\n  var hashRE = /#.*$/;\n\n  var HTML5History = (function () {\n    function HTML5History(_ref) {\n      var root = _ref.root;\n      var onChange = _ref.onChange;\n      babelHelpers.classCallCheck(this, HTML5History);\n\n      if (root) {\n        // make sure there's the starting slash\n        if (root.charAt(0) !== '/') {\n          root = '/' + root;\n        }\n        // remove trailing slash\n        this.root = root.replace(/\\/$/, '');\n        this.rootRE = new RegExp('^\\\\' + this.root);\n      } else {\n        this.root = null;\n      }\n      this.onChange = onChange;\n      // check base tag\n      var baseEl = document.querySelector('base');\n      this.base = baseEl && baseEl.getAttribute('href');\n    }\n\n    HTML5History.prototype.start = function start() {\n      var _this = this;\n\n      this.listener = function (e) {\n        var url = decodeURI(location.pathname + location.search);\n        if (_this.root) {\n          url = url.replace(_this.rootRE, '');\n        }\n        _this.onChange(url, e && e.state, location.hash);\n      };\n      window.addEventListener('popstate', this.listener);\n      this.listener();\n    };\n\n    HTML5History.prototype.stop = function stop() {\n      window.removeEventListener('popstate', this.listener);\n    };\n\n    HTML5History.prototype.go = function go(path, replace, append) {\n      var url = this.formatPath(path, append);\n      if (replace) {\n        history.replaceState({}, '', url);\n      } else {\n        // record scroll position by replacing current state\n        history.replaceState({\n          pos: {\n            x: window.pageXOffset,\n            y: window.pageYOffset\n          }\n        }, '');\n        // then push new state\n        history.pushState({}, '', url);\n      }\n      var hashMatch = path.match(hashRE);\n      var hash = hashMatch && hashMatch[0];\n      path = url\n      // strip hash so it doesn't mess up params\n      .replace(hashRE, '')\n      // remove root before matching\n      .replace(this.rootRE, '');\n      this.onChange(path, null, hash);\n    };\n\n    HTML5History.prototype.formatPath = function formatPath(path, append) {\n      return path.charAt(0) === '/'\n      // absolute path\n      ? this.root ? this.root + '/' + path.replace(/^\\//, '') : path : resolvePath(this.base || location.pathname, path, append);\n    };\n\n    return HTML5History;\n  })();\n\n  var HashHistory = (function () {\n    function HashHistory(_ref) {\n      var hashbang = _ref.hashbang;\n      var onChange = _ref.onChange;\n      babelHelpers.classCallCheck(this, HashHistory);\n\n      this.hashbang = hashbang;\n      this.onChange = onChange;\n    }\n\n    HashHistory.prototype.start = function start() {\n      var self = this;\n      this.listener = function () {\n        var path = location.hash;\n        var raw = path.replace(/^#!?/, '');\n        // always\n        if (raw.charAt(0) !== '/') {\n          raw = '/' + raw;\n        }\n        var formattedPath = self.formatPath(raw);\n        if (formattedPath !== path) {\n          location.replace(formattedPath);\n          return;\n        }\n        // determine query\n        // note it's possible to have queries in both the actual URL\n        // and the hash fragment itself.\n        var query = location.search && path.indexOf('?') > -1 ? '&' + location.search.slice(1) : location.search;\n        self.onChange(decodeURI(path.replace(/^#!?/, '') + query));\n      };\n      window.addEventListener('hashchange', this.listener);\n      this.listener();\n    };\n\n    HashHistory.prototype.stop = function stop() {\n      window.removeEventListener('hashchange', this.listener);\n    };\n\n    HashHistory.prototype.go = function go(path, replace, append) {\n      path = this.formatPath(path, append);\n      if (replace) {\n        location.replace(path);\n      } else {\n        location.hash = path;\n      }\n    };\n\n    HashHistory.prototype.formatPath = function formatPath(path, append) {\n      var isAbsoloute = path.charAt(0) === '/';\n      var prefix = '#' + (this.hashbang ? '!' : '');\n      return isAbsoloute ? prefix + path : prefix + resolvePath(location.hash.replace(/^#!?/, ''), path, append);\n    };\n\n    return HashHistory;\n  })();\n\n  var AbstractHistory = (function () {\n    function AbstractHistory(_ref) {\n      var onChange = _ref.onChange;\n      babelHelpers.classCallCheck(this, AbstractHistory);\n\n      this.onChange = onChange;\n      this.currentPath = '/';\n    }\n\n    AbstractHistory.prototype.start = function start() {\n      this.onChange('/');\n    };\n\n    AbstractHistory.prototype.stop = function stop() {\n      // noop\n    };\n\n    AbstractHistory.prototype.go = function go(path, replace, append) {\n      path = this.currentPath = this.formatPath(path, append);\n      this.onChange(path);\n    };\n\n    AbstractHistory.prototype.formatPath = function formatPath(path, append) {\n      return path.charAt(0) === '/' ? path : resolvePath(this.currentPath, path, append);\n    };\n\n    return AbstractHistory;\n  })();\n\n  /**\n   * Determine the reusability of an existing router view.\n   *\n   * @param {Directive} view\n   * @param {Object} handler\n   * @param {Transition} transition\n   */\n\n  function canReuse(view, handler, transition) {\n    var component = view.childVM;\n    if (!component || !handler) {\n      return false;\n    }\n    // important: check view.Component here because it may\n    // have been changed in activate hook\n    if (view.Component !== handler.component) {\n      return false;\n    }\n    var canReuseFn = getRouteConfig(component, 'canReuse');\n    return typeof canReuseFn === 'boolean' ? canReuseFn : canReuseFn ? canReuseFn.call(component, {\n      to: transition.to,\n      from: transition.from\n    }) : true; // defaults to true\n  }\n\n  /**\n   * Check if a component can deactivate.\n   *\n   * @param {Directive} view\n   * @param {Transition} transition\n   * @param {Function} next\n   */\n\n  function canDeactivate(view, transition, next) {\n    var fromComponent = view.childVM;\n    var hook = getRouteConfig(fromComponent, 'canDeactivate');\n    if (!hook) {\n      next();\n    } else {\n      transition.callHook(hook, fromComponent, next, {\n        expectBoolean: true\n      });\n    }\n  }\n\n  /**\n   * Check if a component can activate.\n   *\n   * @param {Object} handler\n   * @param {Transition} transition\n   * @param {Function} next\n   */\n\n  function canActivate(handler, transition, next) {\n    resolveAsyncComponent(handler, function (Component) {\n      // have to check due to async-ness\n      if (transition.aborted) {\n        return;\n      }\n      // determine if this component can be activated\n      var hook = getRouteConfig(Component, 'canActivate');\n      if (!hook) {\n        next();\n      } else {\n        transition.callHook(hook, null, next, {\n          expectBoolean: true\n        });\n      }\n    });\n  }\n\n  /**\n   * Call deactivate hooks for existing router-views.\n   *\n   * @param {Directive} view\n   * @param {Transition} transition\n   * @param {Function} next\n   */\n\n  function deactivate(view, transition, next) {\n    var component = view.childVM;\n    var hook = getRouteConfig(component, 'deactivate');\n    if (!hook) {\n      next();\n    } else {\n      transition.callHooks(hook, component, next);\n    }\n  }\n\n  /**\n   * Activate / switch component for a router-view.\n   *\n   * @param {Directive} view\n   * @param {Transition} transition\n   * @param {Number} depth\n   * @param {Function} [cb]\n   */\n\n  function activate(view, transition, depth, cb, reuse) {\n    var handler = transition.activateQueue[depth];\n    if (!handler) {\n      saveChildView(view);\n      if (view._bound) {\n        view.setComponent(null);\n      }\n      cb && cb();\n      return;\n    }\n\n    var Component = view.Component = handler.component;\n    var activateHook = getRouteConfig(Component, 'activate');\n    var dataHook = getRouteConfig(Component, 'data');\n    var waitForData = getRouteConfig(Component, 'waitForData');\n\n    view.depth = depth;\n    view.activated = false;\n\n    var component = undefined;\n    var loading = !!(dataHook && !waitForData);\n\n    // \"reuse\" is a flag passed down when the parent view is\n    // either reused via keep-alive or as a child of a kept-alive view.\n    // of course we can only reuse if the current kept-alive instance\n    // is of the correct type.\n    reuse = reuse && view.childVM && view.childVM.constructor === Component;\n\n    if (reuse) {\n      // just reuse\n      component = view.childVM;\n      component.$loadingRouteData = loading;\n    } else {\n      saveChildView(view);\n\n      // unbuild current component. this step also destroys\n      // and removes all nested child views.\n      view.unbuild(true);\n\n      // build the new component. this will also create the\n      // direct child view of the current one. it will register\n      // itself as view.childView.\n      component = view.build({\n        _meta: {\n          $loadingRouteData: loading\n        },\n        created: function created() {\n          this._routerView = view;\n        }\n      });\n\n      // handle keep-alive.\n      // when a kept-alive child vm is restored, we need to\n      // add its cached child views into the router's view list,\n      // and also properly update current view's child view.\n      if (view.keepAlive) {\n        component.$loadingRouteData = loading;\n        var cachedChildView = component._keepAliveRouterView;\n        if (cachedChildView) {\n          view.childView = cachedChildView;\n          component._keepAliveRouterView = null;\n        }\n      }\n    }\n\n    // cleanup the component in case the transition is aborted\n    // before the component is ever inserted.\n    var cleanup = function cleanup() {\n      component.$destroy();\n    };\n\n    // actually insert the component and trigger transition\n    var insert = function insert() {\n      if (reuse) {\n        cb && cb();\n        return;\n      }\n      var router = transition.router;\n      if (router._rendered || router._transitionOnLoad) {\n        view.transition(component);\n      } else {\n        // no transition on first render, manual transition\n        /* istanbul ignore if */\n        if (view.setCurrent) {\n          // 0.12 compat\n          view.setCurrent(component);\n        } else {\n          // 1.0\n          view.childVM = component;\n        }\n        component.$before(view.anchor, null, false);\n      }\n      cb && cb();\n    };\n\n    var afterData = function afterData() {\n      // activate the child view\n      if (view.childView) {\n        activate(view.childView, transition, depth + 1, null, reuse || view.keepAlive);\n      }\n      insert();\n    };\n\n    // called after activation hook is resolved\n    var afterActivate = function afterActivate() {\n      view.activated = true;\n      if (dataHook && waitForData) {\n        // wait until data loaded to insert\n        loadData(component, transition, dataHook, afterData, cleanup);\n      } else {\n        // load data and insert at the same time\n        if (dataHook) {\n          loadData(component, transition, dataHook);\n        }\n        afterData();\n      }\n    };\n\n    if (activateHook) {\n      transition.callHooks(activateHook, component, afterActivate, { cleanup: cleanup });\n    } else {\n      afterActivate();\n    }\n  }\n\n  /**\n   * Reuse a view, just reload data if necessary.\n   *\n   * @param {Directive} view\n   * @param {Transition} transition\n   */\n\n  function reuse(view, transition) {\n    var component = view.childVM;\n    var dataHook = getRouteConfig(component, 'data');\n    if (dataHook) {\n      loadData(component, transition, dataHook);\n    }\n  }\n\n  /**\n   * Asynchronously load and apply data to component.\n   *\n   * @param {Vue} component\n   * @param {Transition} transition\n   * @param {Function} hook\n   * @param {Function} cb\n   * @param {Function} cleanup\n   */\n\n  function loadData(component, transition, hook, cb, cleanup) {\n    component.$loadingRouteData = true;\n    transition.callHooks(hook, component, function (data, onError) {\n      // merge data from multiple data hooks\n      if (Array.isArray(data) && data._needMerge) {\n        data = data.reduce(function (res, obj) {\n          if (isPlainObject(obj)) {\n            Object.keys(obj).forEach(function (key) {\n              res[key] = obj[key];\n            });\n          }\n          return res;\n        }, Object.create(null));\n      }\n      // handle promise sugar syntax\n      var promises = [];\n      if (isPlainObject(data)) {\n        Object.keys(data).forEach(function (key) {\n          var val = data[key];\n          if (isPromise(val)) {\n            promises.push(val.then(function (resolvedVal) {\n              component.$set(key, resolvedVal);\n            }));\n          } else {\n            component.$set(key, val);\n          }\n        });\n      }\n      if (!promises.length) {\n        component.$loadingRouteData = false;\n        component.$emit('route-data-loaded', component);\n        cb && cb();\n      } else {\n        promises[0].constructor.all(promises).then(function () {\n          component.$loadingRouteData = false;\n          component.$emit('route-data-loaded', component);\n          cb && cb();\n        }, onError);\n      }\n    }, {\n      cleanup: cleanup,\n      expectData: true\n    });\n  }\n\n  /**\n   * Save the child view for a kept-alive view so that\n   * we can restore it when it is switched back to.\n   *\n   * @param {Directive} view\n   */\n\n  function saveChildView(view) {\n    if (view.keepAlive && view.childVM && view.childView) {\n      view.childVM._keepAliveRouterView = view.childView;\n    }\n    view.childView = null;\n  }\n\n  /**\n   * Check plain object.\n   *\n   * @param {*} val\n   */\n\n  function isPlainObject(val) {\n    return Object.prototype.toString.call(val) === '[object Object]';\n  }\n\n  /**\n   * A RouteTransition object manages the pipeline of a\n   * router-view switching process. This is also the object\n   * passed into user route hooks.\n   *\n   * @param {Router} router\n   * @param {Route} to\n   * @param {Route} from\n   */\n\n  var RouteTransition = (function () {\n    function RouteTransition(router, to, from) {\n      babelHelpers.classCallCheck(this, RouteTransition);\n\n      this.router = router;\n      this.to = to;\n      this.from = from;\n      this.next = null;\n      this.aborted = false;\n      this.done = false;\n    }\n\n    /**\n     * Abort current transition and return to previous location.\n     */\n\n    RouteTransition.prototype.abort = function abort() {\n      if (!this.aborted) {\n        this.aborted = true;\n        // if the root path throws an error during validation\n        // on initial load, it gets caught in an infinite loop.\n        var abortingOnLoad = !this.from.path && this.to.path === '/';\n        if (!abortingOnLoad) {\n          this.router.replace(this.from.path || '/');\n        }\n      }\n    };\n\n    /**\n     * Abort current transition and redirect to a new location.\n     *\n     * @param {String} path\n     */\n\n    RouteTransition.prototype.redirect = function redirect(path) {\n      if (!this.aborted) {\n        this.aborted = true;\n        if (typeof path === 'string') {\n          path = mapParams(path, this.to.params, this.to.query);\n        } else {\n          path.params = path.params || this.to.params;\n          path.query = path.query || this.to.query;\n        }\n        this.router.replace(path);\n      }\n    };\n\n    /**\n     * A router view transition's pipeline can be described as\n     * follows, assuming we are transitioning from an existing\n     * <router-view> chain [Component A, Component B] to a new\n     * chain [Component A, Component C]:\n     *\n     *  A    A\n     *  | => |\n     *  B    C\n     *\n     * 1. Reusablity phase:\n     *   -> canReuse(A, A)\n     *   -> canReuse(B, C)\n     *   -> determine new queues:\n     *      - deactivation: [B]\n     *      - activation: [C]\n     *\n     * 2. Validation phase:\n     *   -> canDeactivate(B)\n     *   -> canActivate(C)\n     *\n     * 3. Activation phase:\n     *   -> deactivate(B)\n     *   -> activate(C)\n     *\n     * Each of these steps can be asynchronous, and any\n     * step can potentially abort the transition.\n     *\n     * @param {Function} cb\n     */\n\n    RouteTransition.prototype.start = function start(cb) {\n      var transition = this;\n\n      // determine the queue of views to deactivate\n      var deactivateQueue = [];\n      var view = this.router._rootView;\n      while (view) {\n        deactivateQueue.unshift(view);\n        view = view.childView;\n      }\n      var reverseDeactivateQueue = deactivateQueue.slice().reverse();\n\n      // determine the queue of route handlers to activate\n      var activateQueue = this.activateQueue = toArray(this.to.matched).map(function (match) {\n        return match.handler;\n      });\n\n      // 1. Reusability phase\n      var i = undefined,\n          reuseQueue = undefined;\n      for (i = 0; i < reverseDeactivateQueue.length; i++) {\n        if (!canReuse(reverseDeactivateQueue[i], activateQueue[i], transition)) {\n          break;\n        }\n      }\n      if (i > 0) {\n        reuseQueue = reverseDeactivateQueue.slice(0, i);\n        deactivateQueue = reverseDeactivateQueue.slice(i).reverse();\n        activateQueue = activateQueue.slice(i);\n      }\n\n      // 2. Validation phase\n      transition.runQueue(deactivateQueue, canDeactivate, function () {\n        transition.runQueue(activateQueue, canActivate, function () {\n          transition.runQueue(deactivateQueue, deactivate, function () {\n            // 3. Activation phase\n\n            // Update router current route\n            transition.router._onTransitionValidated(transition);\n\n            // trigger reuse for all reused views\n            reuseQueue && reuseQueue.forEach(function (view) {\n              return reuse(view, transition);\n            });\n\n            // the root of the chain that needs to be replaced\n            // is the top-most non-reusable view.\n            if (deactivateQueue.length) {\n              var _view = deactivateQueue[deactivateQueue.length - 1];\n              var depth = reuseQueue ? reuseQueue.length : 0;\n              activate(_view, transition, depth, cb);\n            } else {\n              cb();\n            }\n          });\n        });\n      });\n    };\n\n    /**\n     * Asynchronously and sequentially apply a function to a\n     * queue.\n     *\n     * @param {Array} queue\n     * @param {Function} fn\n     * @param {Function} cb\n     */\n\n    RouteTransition.prototype.runQueue = function runQueue(queue, fn, cb) {\n      var transition = this;\n      step(0);\n      function step(index) {\n        if (index >= queue.length) {\n          cb();\n        } else {\n          fn(queue[index], transition, function () {\n            step(index + 1);\n          });\n        }\n      }\n    };\n\n    /**\n     * Call a user provided route transition hook and handle\n     * the response (e.g. if the user returns a promise).\n     *\n     * If the user neither expects an argument nor returns a\n     * promise, the hook is assumed to be synchronous.\n     *\n     * @param {Function} hook\n     * @param {*} [context]\n     * @param {Function} [cb]\n     * @param {Object} [options]\n     *                 - {Boolean} expectBoolean\n     *                 - {Boolean} expectData\n     *                 - {Function} cleanup\n     */\n\n    RouteTransition.prototype.callHook = function callHook(hook, context, cb) {\n      var _ref = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];\n\n      var _ref$expectBoolean = _ref.expectBoolean;\n      var expectBoolean = _ref$expectBoolean === undefined ? false : _ref$expectBoolean;\n      var _ref$expectData = _ref.expectData;\n      var expectData = _ref$expectData === undefined ? false : _ref$expectData;\n      var cleanup = _ref.cleanup;\n\n      var transition = this;\n      var nextCalled = false;\n\n      // abort the transition\n      var abort = function abort() {\n        cleanup && cleanup();\n        transition.abort();\n      };\n\n      // handle errors\n      var onError = function onError(err) {\n        // cleanup indicates an after-activation hook,\n        // so instead of aborting we just let the transition\n        // finish.\n        cleanup ? next() : abort();\n        if (err && !transition.router._suppress) {\n          warn('Uncaught error during transition: ');\n          throw err instanceof Error ? err : new Error(err);\n        }\n      };\n\n      // advance the transition to the next step\n      var next = function next(data) {\n        if (nextCalled) {\n          warn('transition.next() should be called only once.');\n          return;\n        }\n        nextCalled = true;\n        if (transition.aborted) {\n          cleanup && cleanup();\n          return;\n        }\n        cb && cb(data, onError);\n      };\n\n      // expose a clone of the transition object, so that each\n      // hook gets a clean copy and prevent the user from\n      // messing with the internals.\n      var exposed = {\n        to: transition.to,\n        from: transition.from,\n        abort: abort,\n        next: next,\n        redirect: function redirect() {\n          transition.redirect.apply(transition, arguments);\n        }\n      };\n\n      // actually call the hook\n      var res = undefined;\n      try {\n        res = hook.call(context, exposed);\n      } catch (err) {\n        return onError(err);\n      }\n\n      // handle boolean/promise return values\n      var resIsPromise = isPromise(res);\n      if (expectBoolean) {\n        if (typeof res === 'boolean') {\n          res ? next() : abort();\n        } else if (resIsPromise) {\n          res.then(function (ok) {\n            ok ? next() : abort();\n          }, onError);\n        } else if (!hook.length) {\n          next(res);\n        }\n      } else if (resIsPromise) {\n        res.then(next, onError);\n      } else if (expectData && isPlainOjbect(res) || !hook.length) {\n        next(res);\n      }\n    };\n\n    /**\n     * Call a single hook or an array of async hooks in series.\n     *\n     * @param {Array} hooks\n     * @param {*} context\n     * @param {Function} cb\n     * @param {Object} [options]\n     */\n\n    RouteTransition.prototype.callHooks = function callHooks(hooks, context, cb, options) {\n      var _this = this;\n\n      if (Array.isArray(hooks)) {\n        (function () {\n          var res = [];\n          res._needMerge = true;\n          var onError = undefined;\n          _this.runQueue(hooks, function (hook, _, next) {\n            if (!_this.aborted) {\n              _this.callHook(hook, context, function (r, onError) {\n                if (r) res.push(r);\n                onError = onError;\n                next();\n              }, options);\n            }\n          }, function () {\n            cb(res, onError);\n          });\n        })();\n      } else {\n        this.callHook(hooks, context, cb, options);\n      }\n    };\n\n    return RouteTransition;\n  })();\n\n  function isPlainOjbect(val) {\n    return Object.prototype.toString.call(val) === '[object Object]';\n  }\n\n  function toArray(val) {\n    return val ? Array.prototype.slice.call(val) : [];\n  }\n\n  var internalKeysRE = /^(component|subRoutes)$/;\n\n  /**\n   * Route Context Object\n   *\n   * @param {String} path\n   * @param {Router} router\n   */\n\n  var Route = function Route(path, router) {\n    var _this = this;\n\n    babelHelpers.classCallCheck(this, Route);\n\n    var matched = router._recognizer.recognize(path);\n    if (matched) {\n      // copy all custom fields from route configs\n      [].forEach.call(matched, function (match) {\n        for (var key in match.handler) {\n          if (!internalKeysRE.test(key)) {\n            _this[key] = match.handler[key];\n          }\n        }\n      });\n      // set query and params\n      this.query = matched.queryParams;\n      this.params = [].reduce.call(matched, function (prev, cur) {\n        if (cur.params) {\n          for (var key in cur.params) {\n            prev[key] = cur.params[key];\n          }\n        }\n        return prev;\n      }, {});\n    }\n    // expose path and router\n    this.path = path;\n    this.router = router;\n    // for internal use\n    this.matched = matched || router._notFoundHandler;\n    // Important: freeze self to prevent observation\n    Object.freeze(this);\n  };\n\n  function applyOverride (Vue) {\n    var _Vue$util = Vue.util;\n    var extend = _Vue$util.extend;\n    var isArray = _Vue$util.isArray;\n    var defineReactive = _Vue$util.defineReactive;\n\n    // override Vue's init and destroy process to keep track of router instances\n    var init = Vue.prototype._init;\n    Vue.prototype._init = function (options) {\n      options = options || {};\n      var root = options._parent || options.parent || this;\n      var router = root.$router;\n      var route = root.$route;\n      if (router) {\n        // expose router\n        this.$router = router;\n        router._children.push(this);\n        /* istanbul ignore if */\n        if (this._defineMeta) {\n          // 0.12\n          this._defineMeta('$route', route);\n        } else {\n          // 1.0\n          defineReactive(this, '$route', route);\n        }\n      }\n      init.call(this, options);\n    };\n\n    var destroy = Vue.prototype._destroy;\n    Vue.prototype._destroy = function () {\n      if (!this._isBeingDestroyed && this.$router) {\n        this.$router._children.$remove(this);\n      }\n      destroy.apply(this, arguments);\n    };\n\n    // 1.0 only: enable route mixins\n    var strats = Vue.config.optionMergeStrategies;\n    var hooksToMergeRE = /^(data|activate|deactivate)$/;\n\n    if (strats) {\n      strats.route = function (parentVal, childVal) {\n        if (!childVal) return parentVal;\n        if (!parentVal) return childVal;\n        var ret = {};\n        extend(ret, parentVal);\n        for (var key in childVal) {\n          var a = ret[key];\n          var b = childVal[key];\n          // for data, activate and deactivate, we need to merge them into\n          // arrays similar to lifecycle hooks.\n          if (a && hooksToMergeRE.test(key)) {\n            ret[key] = (isArray(a) ? a : [a]).concat(b);\n          } else {\n            ret[key] = b;\n          }\n        }\n        return ret;\n      };\n    }\n  }\n\n  function View (Vue) {\n\n    var _ = Vue.util;\n    var componentDef =\n    // 0.12\n    Vue.directive('_component') ||\n    // 1.0\n    Vue.internalDirectives.component;\n    // <router-view> extends the internal component directive\n    var viewDef = _.extend({}, componentDef);\n\n    // with some overrides\n    _.extend(viewDef, {\n\n      _isRouterView: true,\n\n      bind: function bind() {\n        var route = this.vm.$route;\n        /* istanbul ignore if */\n        if (!route) {\n          warn('<router-view> can only be used inside a ' + 'router-enabled app.');\n          return;\n        }\n        // force dynamic directive so v-component doesn't\n        // attempt to build right now\n        this._isDynamicLiteral = true;\n        // finally, init by delegating to v-component\n        componentDef.bind.call(this);\n\n        // locate the parent view\n        var parentView = undefined;\n        var parent = this.vm;\n        while (parent) {\n          if (parent._routerView) {\n            parentView = parent._routerView;\n            break;\n          }\n          parent = parent.$parent;\n        }\n        if (parentView) {\n          // register self as a child of the parent view,\n          // instead of activating now. This is so that the\n          // child's activate hook is called after the\n          // parent's has resolved.\n          this.parentView = parentView;\n          parentView.childView = this;\n        } else {\n          // this is the root view!\n          var router = route.router;\n          router._rootView = this;\n        }\n\n        // handle late-rendered view\n        // two possibilities:\n        // 1. root view rendered after transition has been\n        //    validated;\n        // 2. child view rendered after parent view has been\n        //    activated.\n        var transition = route.router._currentTransition;\n        if (!parentView && transition.done || parentView && parentView.activated) {\n          var depth = parentView ? parentView.depth + 1 : 0;\n          activate(this, transition, depth);\n        }\n      },\n\n      unbind: function unbind() {\n        if (this.parentView) {\n          this.parentView.childView = null;\n        }\n        componentDef.unbind.call(this);\n      }\n    });\n\n    Vue.elementDirective('router-view', viewDef);\n  }\n\n  var trailingSlashRE = /\\/$/;\n  var regexEscapeRE = /[-.*+?^${}()|[\\]\\/\\\\]/g;\n  var queryStringRE = /\\?.*$/;\n\n  // install v-link, which provides navigation support for\n  // HTML5 history mode\n  function Link (Vue) {\n    var _Vue$util = Vue.util;\n    var _bind = _Vue$util.bind;\n    var isObject = _Vue$util.isObject;\n    var addClass = _Vue$util.addClass;\n    var removeClass = _Vue$util.removeClass;\n\n    Vue.directive('link-active', {\n      priority: 1001,\n      bind: function bind() {\n        this.el.__v_link_active = true;\n      }\n    });\n\n    Vue.directive('link', {\n      priority: 1000,\n\n      bind: function bind() {\n        var vm = this.vm;\n        /* istanbul ignore if */\n        if (!vm.$route) {\n          warn('v-link can only be used inside a router-enabled app.');\n          return;\n        }\n        this.router = vm.$route.router;\n        // update things when the route changes\n        this.unwatch = vm.$watch('$route', _bind(this.onRouteUpdate, this));\n        // check if active classes should be applied to a different element\n        this.activeEl = this.el;\n        var parent = this.el.parentNode;\n        while (parent) {\n          if (parent.__v_link_active) {\n            this.activeEl = parent;\n            break;\n          }\n          parent = parent.parentNode;\n        }\n        // no need to handle click if link expects to be opened\n        // in a new window/tab.\n        /* istanbul ignore if */\n        if (this.el.tagName === 'A' && this.el.getAttribute('target') === '_blank') {\n          return;\n        }\n        // handle click\n        this.el.addEventListener('click', _bind(this.onClick, this));\n      },\n\n      update: function update(target) {\n        this.target = target;\n        if (isObject(target)) {\n          this.append = target.append;\n          this.exact = target.exact;\n          this.prevActiveClass = this.activeClass;\n          this.activeClass = target.activeClass;\n        }\n        this.onRouteUpdate(this.vm.$route);\n      },\n\n      onClick: function onClick(e) {\n        // don't redirect with control keys\n        /* istanbul ignore if */\n        if (e.metaKey || e.ctrlKey || e.shiftKey) return;\n        // don't redirect when preventDefault called\n        /* istanbul ignore if */\n        if (e.defaultPrevented) return;\n        // don't redirect on right click\n        /* istanbul ignore if */\n        if (e.button !== 0) return;\n\n        var target = this.target;\n        if (target) {\n          // v-link with expression, just go\n          e.preventDefault();\n          this.router.go(target);\n        } else {\n          // no expression, delegate for an <a> inside\n          var el = e.target;\n          while (el.tagName !== 'A' && el !== this.el) {\n            el = el.parentNode;\n          }\n          if (el.tagName === 'A' && sameOrigin(el)) {\n            e.preventDefault();\n            this.router.go({\n              path: el.pathname,\n              replace: target && target.replace,\n              append: target && target.append\n            });\n          }\n        }\n      },\n\n      onRouteUpdate: function onRouteUpdate(route) {\n        // router._stringifyPath is dependent on current route\n        // and needs to be called again whenver route changes.\n        var newPath = this.router._stringifyPath(this.target);\n        if (this.path !== newPath) {\n          this.path = newPath;\n          this.updateActiveMatch();\n          this.updateHref();\n        }\n        this.updateClasses(route.path);\n      },\n\n      updateActiveMatch: function updateActiveMatch() {\n        this.activeRE = this.path && !this.exact ? new RegExp('^' + this.path.replace(/\\/$/, '').replace(queryStringRE, '').replace(regexEscapeRE, '\\\\$&') + '(\\\\/|$)') : null;\n      },\n\n      updateHref: function updateHref() {\n        if (this.el.tagName !== 'A') {\n          return;\n        }\n        var path = this.path;\n        var router = this.router;\n        var isAbsolute = path.charAt(0) === '/';\n        // do not format non-hash relative paths\n        var href = path && (router.mode === 'hash' || isAbsolute) ? router.history.formatPath(path, this.append) : path;\n        if (href) {\n          this.el.href = href;\n        } else {\n          this.el.removeAttribute('href');\n        }\n      },\n\n      updateClasses: function updateClasses(path) {\n        var el = this.activeEl;\n        var activeClass = this.activeClass || this.router._linkActiveClass;\n        // clear old class\n        if (this.prevActiveClass !== activeClass) {\n          removeClass(el, this.prevActiveClass);\n        }\n        // remove query string before matching\n        var dest = this.path.replace(queryStringRE, '');\n        path = path.replace(queryStringRE, '');\n        // add new class\n        if (this.exact) {\n          if (dest === path ||\n          // also allow additional trailing slash\n          dest.charAt(dest.length - 1) !== '/' && dest === path.replace(trailingSlashRE, '')) {\n            addClass(el, activeClass);\n          } else {\n            removeClass(el, activeClass);\n          }\n        } else {\n          if (this.activeRE && this.activeRE.test(path)) {\n            addClass(el, activeClass);\n          } else {\n            removeClass(el, activeClass);\n          }\n        }\n      },\n\n      unbind: function unbind() {\n        this.el.removeEventListener('click', this.handler);\n        this.unwatch && this.unwatch();\n      }\n    });\n\n    function sameOrigin(link) {\n      return link.protocol === location.protocol && link.hostname === location.hostname && link.port === location.port;\n    }\n  }\n\n  var historyBackends = {\n    abstract: AbstractHistory,\n    hash: HashHistory,\n    html5: HTML5History\n  };\n\n  // late bind during install\n  var Vue = undefined;\n\n  /**\n   * Router constructor\n   *\n   * @param {Object} [options]\n   */\n\n  var Router = (function () {\n    function Router() {\n      var _this = this;\n\n      var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n      var _ref$hashbang = _ref.hashbang;\n      var hashbang = _ref$hashbang === undefined ? true : _ref$hashbang;\n      var _ref$abstract = _ref.abstract;\n      var abstract = _ref$abstract === undefined ? false : _ref$abstract;\n      var _ref$history = _ref.history;\n      var history = _ref$history === undefined ? false : _ref$history;\n      var _ref$saveScrollPosition = _ref.saveScrollPosition;\n      var saveScrollPosition = _ref$saveScrollPosition === undefined ? false : _ref$saveScrollPosition;\n      var _ref$transitionOnLoad = _ref.transitionOnLoad;\n      var transitionOnLoad = _ref$transitionOnLoad === undefined ? false : _ref$transitionOnLoad;\n      var _ref$suppressTransitionError = _ref.suppressTransitionError;\n      var suppressTransitionError = _ref$suppressTransitionError === undefined ? false : _ref$suppressTransitionError;\n      var _ref$root = _ref.root;\n      var root = _ref$root === undefined ? null : _ref$root;\n      var _ref$linkActiveClass = _ref.linkActiveClass;\n      var linkActiveClass = _ref$linkActiveClass === undefined ? 'v-link-active' : _ref$linkActiveClass;\n      babelHelpers.classCallCheck(this, Router);\n\n      /* istanbul ignore if */\n      if (!Router.installed) {\n        throw new Error('Please install the Router with Vue.use() before ' + 'creating an instance.');\n      }\n\n      // Vue instances\n      this.app = null;\n      this._children = [];\n\n      // route recognizer\n      this._recognizer = new RouteRecognizer();\n      this._guardRecognizer = new RouteRecognizer();\n\n      // state\n      this._started = false;\n      this._startCb = null;\n      this._currentRoute = {};\n      this._currentTransition = null;\n      this._previousTransition = null;\n      this._notFoundHandler = null;\n      this._notFoundRedirect = null;\n      this._beforeEachHooks = [];\n      this._afterEachHooks = [];\n\n      // trigger transition on initial render?\n      this._rendered = false;\n      this._transitionOnLoad = transitionOnLoad;\n\n      // history mode\n      this._root = root;\n      this._abstract = abstract;\n      this._hashbang = hashbang;\n\n      // check if HTML5 history is available\n      var hasPushState = typeof window !== 'undefined' && window.history && window.history.pushState;\n      this._history = history && hasPushState;\n      this._historyFallback = history && !hasPushState;\n\n      // create history object\n      var inBrowser = Vue.util.inBrowser;\n      this.mode = !inBrowser || this._abstract ? 'abstract' : this._history ? 'html5' : 'hash';\n\n      var History = historyBackends[this.mode];\n      this.history = new History({\n        root: root,\n        hashbang: this._hashbang,\n        onChange: function onChange(path, state, anchor) {\n          _this._match(path, state, anchor);\n        }\n      });\n\n      // other options\n      this._saveScrollPosition = saveScrollPosition;\n      this._linkActiveClass = linkActiveClass;\n      this._suppress = suppressTransitionError;\n    }\n\n    /**\n     * Allow directly passing components to a route\n     * definition.\n     *\n     * @param {String} path\n     * @param {Object} handler\n     */\n\n    // API ===================================================\n\n    /**\n    * Register a map of top-level paths.\n    *\n    * @param {Object} map\n    */\n\n    Router.prototype.map = function map(_map) {\n      for (var route in _map) {\n        this.on(route, _map[route]);\n      }\n      return this;\n    };\n\n    /**\n     * Register a single root-level path\n     *\n     * @param {String} rootPath\n     * @param {Object} handler\n     *                 - {String} component\n     *                 - {Object} [subRoutes]\n     *                 - {Boolean} [forceRefresh]\n     *                 - {Function} [before]\n     *                 - {Function} [after]\n     */\n\n    Router.prototype.on = function on(rootPath, handler) {\n      if (rootPath === '*') {\n        this._notFound(handler);\n      } else {\n        this._addRoute(rootPath, handler, []);\n      }\n      return this;\n    };\n\n    /**\n     * Set redirects.\n     *\n     * @param {Object} map\n     */\n\n    Router.prototype.redirect = function redirect(map) {\n      for (var path in map) {\n        this._addRedirect(path, map[path]);\n      }\n      return this;\n    };\n\n    /**\n     * Set aliases.\n     *\n     * @param {Object} map\n     */\n\n    Router.prototype.alias = function alias(map) {\n      for (var path in map) {\n        this._addAlias(path, map[path]);\n      }\n      return this;\n    };\n\n    /**\n     * Set global before hook.\n     *\n     * @param {Function} fn\n     */\n\n    Router.prototype.beforeEach = function beforeEach(fn) {\n      this._beforeEachHooks.push(fn);\n      return this;\n    };\n\n    /**\n     * Set global after hook.\n     *\n     * @param {Function} fn\n     */\n\n    Router.prototype.afterEach = function afterEach(fn) {\n      this._afterEachHooks.push(fn);\n      return this;\n    };\n\n    /**\n     * Navigate to a given path.\n     * The path can be an object describing a named path in\n     * the format of { name: '...', params: {}, query: {}}\n     * The path is assumed to be already decoded, and will\n     * be resolved against root (if provided)\n     *\n     * @param {String|Object} path\n     * @param {Boolean} [replace]\n     */\n\n    Router.prototype.go = function go(path) {\n      var replace = false;\n      var append = false;\n      if (Vue.util.isObject(path)) {\n        replace = path.replace;\n        append = path.append;\n      }\n      path = this._stringifyPath(path);\n      if (path) {\n        this.history.go(path, replace, append);\n      }\n    };\n\n    /**\n     * Short hand for replacing current path\n     *\n     * @param {String} path\n     */\n\n    Router.prototype.replace = function replace(path) {\n      if (typeof path === 'string') {\n        path = { path: path };\n      }\n      path.replace = true;\n      this.go(path);\n    };\n\n    /**\n     * Start the router.\n     *\n     * @param {VueConstructor} App\n     * @param {String|Element} container\n     * @param {Function} [cb]\n     */\n\n    Router.prototype.start = function start(App, container, cb) {\n      /* istanbul ignore if */\n      if (this._started) {\n        warn('already started.');\n        return;\n      }\n      this._started = true;\n      this._startCb = cb;\n      if (!this.app) {\n        /* istanbul ignore if */\n        if (!App || !container) {\n          throw new Error('Must start vue-router with a component and a ' + 'root container.');\n        }\n        /* istanbul ignore if */\n        if (App instanceof Vue) {\n          throw new Error('Must start vue-router with a component, not a ' + 'Vue instance.');\n        }\n        this._appContainer = container;\n        var Ctor = this._appConstructor = typeof App === 'function' ? App : Vue.extend(App);\n        // give it a name for better debugging\n        Ctor.options.name = Ctor.options.name || 'RouterApp';\n      }\n\n      // handle history fallback in browsers that do not\n      // support HTML5 history API\n      if (this._historyFallback) {\n        var _location = window.location;\n        var _history = new HTML5History({ root: this._root });\n        var path = _history.root ? _location.pathname.replace(_history.rootRE, '') : _location.pathname;\n        if (path && path !== '/') {\n          _location.assign((_history.root || '') + '/' + this.history.formatPath(path) + _location.search);\n          return;\n        }\n      }\n\n      this.history.start();\n    };\n\n    /**\n     * Stop listening to route changes.\n     */\n\n    Router.prototype.stop = function stop() {\n      this.history.stop();\n      this._started = false;\n    };\n\n    // Internal methods ======================================\n\n    /**\n    * Add a route containing a list of segments to the internal\n    * route recognizer. Will be called recursively to add all\n    * possible sub-routes.\n    *\n    * @param {String} path\n    * @param {Object} handler\n    * @param {Array} segments\n    */\n\n    Router.prototype._addRoute = function _addRoute(path, handler, segments) {\n      guardComponent(path, handler);\n      handler.path = path;\n      handler.fullPath = (segments.reduce(function (path, segment) {\n        return path + segment.path;\n      }, '') + path).replace('//', '/');\n      segments.push({\n        path: path,\n        handler: handler\n      });\n      this._recognizer.add(segments, {\n        as: handler.name\n      });\n      // add sub routes\n      if (handler.subRoutes) {\n        for (var subPath in handler.subRoutes) {\n          // recursively walk all sub routes\n          this._addRoute(subPath, handler.subRoutes[subPath],\n          // pass a copy in recursion to avoid mutating\n          // across branches\n          segments.slice());\n        }\n      }\n    };\n\n    /**\n     * Set the notFound route handler.\n     *\n     * @param {Object} handler\n     */\n\n    Router.prototype._notFound = function _notFound(handler) {\n      guardComponent('*', handler);\n      this._notFoundHandler = [{ handler: handler }];\n    };\n\n    /**\n     * Add a redirect record.\n     *\n     * @param {String} path\n     * @param {String} redirectPath\n     */\n\n    Router.prototype._addRedirect = function _addRedirect(path, redirectPath) {\n      if (path === '*') {\n        this._notFoundRedirect = redirectPath;\n      } else {\n        this._addGuard(path, redirectPath, this.replace);\n      }\n    };\n\n    /**\n     * Add an alias record.\n     *\n     * @param {String} path\n     * @param {String} aliasPath\n     */\n\n    Router.prototype._addAlias = function _addAlias(path, aliasPath) {\n      this._addGuard(path, aliasPath, this._match);\n    };\n\n    /**\n     * Add a path guard.\n     *\n     * @param {String} path\n     * @param {String} mappedPath\n     * @param {Function} handler\n     */\n\n    Router.prototype._addGuard = function _addGuard(path, mappedPath, _handler) {\n      var _this2 = this;\n\n      this._guardRecognizer.add([{\n        path: path,\n        handler: function handler(match, query) {\n          var realPath = mapParams(mappedPath, match.params, query);\n          _handler.call(_this2, realPath);\n        }\n      }]);\n    };\n\n    /**\n     * Check if a path matches any redirect records.\n     *\n     * @param {String} path\n     * @return {Boolean} - if true, will skip normal match.\n     */\n\n    Router.prototype._checkGuard = function _checkGuard(path) {\n      var matched = this._guardRecognizer.recognize(path);\n      if (matched) {\n        matched[0].handler(matched[0], matched.queryParams);\n        return true;\n      } else if (this._notFoundRedirect) {\n        matched = this._recognizer.recognize(path);\n        if (!matched) {\n          this.replace(this._notFoundRedirect);\n          return true;\n        }\n      }\n    };\n\n    /**\n     * Match a URL path and set the route context on vm,\n     * triggering view updates.\n     *\n     * @param {String} path\n     * @param {Object} [state]\n     * @param {String} [anchor]\n     */\n\n    Router.prototype._match = function _match(path, state, anchor) {\n      var _this3 = this;\n\n      if (this._checkGuard(path)) {\n        return;\n      }\n\n      var currentRoute = this._currentRoute;\n      var currentTransition = this._currentTransition;\n\n      if (currentTransition) {\n        if (currentTransition.to.path === path) {\n          // do nothing if we have an active transition going to the same path\n          return;\n        } else if (currentRoute.path === path) {\n          // We are going to the same path, but we also have an ongoing but\n          // not-yet-validated transition. Abort that transition and reset to\n          // prev transition.\n          currentTransition.aborted = true;\n          this._currentTransition = this._prevTransition;\n          return;\n        } else {\n          // going to a totally different path. abort ongoing transition.\n          currentTransition.aborted = true;\n        }\n      }\n\n      // construct new route and transition context\n      var route = new Route(path, this);\n      var transition = new RouteTransition(this, route, currentRoute);\n\n      // current transition is updated right now.\n      // however, current route will only be updated after the transition has\n      // been validated.\n      this._prevTransition = currentTransition;\n      this._currentTransition = transition;\n\n      if (!this.app) {\n        (function () {\n          // initial render\n          var router = _this3;\n          _this3.app = new _this3._appConstructor({\n            el: _this3._appContainer,\n            created: function created() {\n              this.$router = router;\n            },\n            _meta: {\n              $route: route\n            }\n          });\n        })();\n      }\n\n      // check global before hook\n      var beforeHooks = this._beforeEachHooks;\n      var startTransition = function startTransition() {\n        transition.start(function () {\n          _this3._postTransition(route, state, anchor);\n        });\n      };\n\n      if (beforeHooks.length) {\n        transition.runQueue(beforeHooks, function (hook, _, next) {\n          if (transition === _this3._currentTransition) {\n            transition.callHook(hook, null, next, {\n              expectBoolean: true\n            });\n          }\n        }, startTransition);\n      } else {\n        startTransition();\n      }\n\n      if (!this._rendered && this._startCb) {\n        this._startCb.call(null);\n      }\n\n      // HACK:\n      // set rendered to true after the transition start, so\n      // that components that are acitvated synchronously know\n      // whether it is the initial render.\n      this._rendered = true;\n    };\n\n    /**\n     * Set current to the new transition.\n     * This is called by the transition object when the\n     * validation of a route has succeeded.\n     *\n     * @param {Transition} transition\n     */\n\n    Router.prototype._onTransitionValidated = function _onTransitionValidated(transition) {\n      // set current route\n      var route = this._currentRoute = transition.to;\n      // update route context for all children\n      if (this.app.$route !== route) {\n        this.app.$route = route;\n        this._children.forEach(function (child) {\n          child.$route = route;\n        });\n      }\n      // call global after hook\n      if (this._afterEachHooks.length) {\n        this._afterEachHooks.forEach(function (hook) {\n          return hook.call(null, {\n            to: transition.to,\n            from: transition.from\n          });\n        });\n      }\n      this._currentTransition.done = true;\n    };\n\n    /**\n     * Handle stuff after the transition.\n     *\n     * @param {Route} route\n     * @param {Object} [state]\n     * @param {String} [anchor]\n     */\n\n    Router.prototype._postTransition = function _postTransition(route, state, anchor) {\n      // handle scroll positions\n      // saved scroll positions take priority\n      // then we check if the path has an anchor\n      var pos = state && state.pos;\n      if (pos && this._saveScrollPosition) {\n        Vue.nextTick(function () {\n          window.scrollTo(pos.x, pos.y);\n        });\n      } else if (anchor) {\n        Vue.nextTick(function () {\n          var el = document.getElementById(anchor.slice(1));\n          if (el) {\n            window.scrollTo(window.scrollX, el.offsetTop);\n          }\n        });\n      }\n    };\n\n    /**\n     * Normalize named route object / string paths into\n     * a string.\n     *\n     * @param {Object|String|Number} path\n     * @return {String}\n     */\n\n    Router.prototype._stringifyPath = function _stringifyPath(path) {\n      var fullPath = '';\n      if (path && typeof path === 'object') {\n        if (path.name) {\n          var extend = Vue.util.extend;\n          var currentParams = this._currentTransition && this._currentTransition.to.params;\n          var targetParams = path.params || {};\n          var params = currentParams ? extend(extend({}, currentParams), targetParams) : targetParams;\n          if (path.query) {\n            params.queryParams = path.query;\n          }\n          fullPath = this._recognizer.generate(path.name, params);\n        } else if (path.path) {\n          fullPath = path.path;\n          if (path.query) {\n            var query = this._recognizer.generateQueryString(path.query);\n            if (fullPath.indexOf('?') > -1) {\n              fullPath += '&' + query.slice(1);\n            } else {\n              fullPath += query;\n            }\n          }\n        }\n      } else {\n        fullPath = path ? path + '' : '';\n      }\n      return encodeURI(fullPath);\n    };\n\n    return Router;\n  })();\n\n  function guardComponent(path, handler) {\n    var comp = handler.component;\n    if (Vue.util.isPlainObject(comp)) {\n      comp = handler.component = Vue.extend(comp);\n    }\n    /* istanbul ignore if */\n    if (typeof comp !== 'function') {\n      handler.component = null;\n      warn('invalid component for route \"' + path + '\".');\n    }\n  }\n\n  /* Installation */\n\n  Router.installed = false;\n\n  /**\n   * Installation interface.\n   * Install the necessary directives.\n   */\n\n  Router.install = function (externalVue) {\n    /* istanbul ignore if */\n    if (Router.installed) {\n      warn('already installed.');\n      return;\n    }\n    Vue = externalVue;\n    applyOverride(Vue);\n    View(Vue);\n    Link(Vue);\n    exports$1.Vue = Vue;\n    Router.installed = true;\n  };\n\n  // auto install\n  /* istanbul ignore if */\n  if (typeof window !== 'undefined' && window.Vue) {\n    window.Vue.use(Router);\n  }\n\n  return Router;\n\n}));","// module.exports =\n\n// // ' <div id=\"Archive\">'+\n// // '  <div class=\"container\">'+\n// // '    <h1>Search the Archives</h1>'+\n// // '  </div>'+\n// '        <div class=\"creek-broadcast\" v-for=\"broadcast in broadcasts\" :data-url= \\'/broadcasts/\\'+broadcast.id\">'+\n// '            <span class=\"creek-image\"><img v-attr=\"src: broadcast.Image ? broadcast.Image.url_sm : broadcast.Show.Image.url_sm\" /></span>'+\n// '            <h3><span class=\"archive-title\"><span v-text=\"broadcast.Show.title\"></span> - <span v-text=\"broadcast.title\"></span></span></h3>'+\n// '            <h3><span class=\"creek-archive-title\"><span v-text=\"broadcast.Show.title\"></span></span></h3>'+\n// '            <div class=\"creek-item-info\">'+\n// // '              <!-- <a class=\"show-title\" v-text=\"broadcast.Show.title\" v-attr=\"href: \\'/broadcasts/view/\\'+broadcast.id\"></a> -->'+\n// '              <span class=\"creek-date-time\" v-text=\"broadcast.start | moment \\'dddd, MMMM Do YYYY, h:mma\\'\"></span>'+\n// '            </div>'+\n// '            <div class=\"creek-item-description\">'+\n// '              <!-- <a class=\"read-more\" v-attr=\"href: \\'/broadcasts/\\'+broadcast.id \">Read more</a> -->'+\n// '              <span v-text=\"broadcast.text\"></span>'+\n// '            </div>'+\n// '            <div class=\"creek-social-buttons\">'+\n// '              <span class=\"creek-social-button creek-social-button-facebook\" v-attr=\"data-url: Creek.base_url+\\'/broadcasts/\\'+broadcast.id \" href=\"#\"><i class=\"fa fa-facebook\"></i> Share</span>'+\n// '              <span class=\"creek-social-button creek-social-button-twitter\" v-attr=\"data-url: Creek.base_url+\\'/broadcasts/\\'+broadcast.id \" href=\"#\"><i class=\"fa fa-twitter\"></i> Tweet</span>'+\n// '              <span class=\"creek-social-button creek-social-button-email\" href=\"#\" v-attr=\"data-url: Creek.base_url\"><i class=\"fa fa-envelope\"></i> Email</span>'+\n// '            </div>'+\n// '        </div>'+\n// // '</div>';\n// '';\n\n\n\n\n//\n//\nmodule.exports =\n// ' <div id=\"Archive\">'+\n// '  <div class=\"container\">'+\n// '    <h1>Search the Archives</h1>'+\n// '  </div>'+\n'  <div class=\"creek-broadcasts-filter-toolbar\">'+\n'    <form id=\"creek-archives-search-form\">'+\n'      <div class=\"creek-inputs-container\">'+\n'        <div class=\"creek-input-block\">'+\n'          <select type=\"text\" id=\"creek-broadcasts-program\" class=\"creek-input\">'+\n'            <option value=\"\">Show Name</option>'+\n'            <option value=\"\">I don\\'t know</option>'+\n// '            <option v-repeat=\"program in programs\" v-attr=\"value: program.id\" v-text=\"program.title\"></option>'+\n'          </select>'+\n'        </div>'+\n'        <div class=\"creek-input-block\">'+\n'          <select type=\"text\" id=\"broadcasts-show-ategory\" class=\"creek-input\">'+\n'            <option value=\"\">Category</option>'+\n'            <option value=\"\">I don\\'t know</option>'+\n// '            <option v-repeat=\"category in categories\" v-attr=\"value: category.id\" v-text=\"category.title\"></option>'+\n'          </select>'+\n'        </div>'+\n'        <div class=\"creek-input-block\">'+\n'          <input type=\"text\" id=\"broadcasts-date-start\" class=\"creek-input\" placeholder=\"Date\" />'+\n'          <!-- <input type=\"hidden\" id=\"broadcasts-date-end\" /> -->'+\n'        </div>'+\n'        <div class=\"creek-input-block\">'+\n'          <input type=\"text\" id=\"broadcasts-search-box\" class=\"creek-input\" placeholder=\"Keywords...\" />'+\n'        </div>'+\n'      </div>'+\n'    </form>'+\n// '<!-- \";\n'    <div class=\"submit\">'+\n'      <button type=\"button\" id=\"broadcasts-search-button\">Find Archives</button>'+\n'    </div>'+\n// ' -->'+\n'  </div>'+\n// '  <div >'+\n// '    <div class=\"creek-broadcasts-container\">'+\n'      <div class=\"creek-container creek-broadcasts\">'+\n'        <div class=\"creek-broadcast\" v-for=\"broadcast in broadcasts\" :data-url=\" \\'/broadcasts/\\'+broadcast.id\">'+\n'            <a class=\"creek-image\" :href=\"\\'/broadcasts/\\'+broadcast.id\"><img :src=\"broadcast.Image ? broadcast.Image.url_sm : broadcast.Show.Image.url_sm\" /></a>'+\n// '            <h3><span class=\"archive-title\"><span v-text=\"broadcast.Show.title\"></span> - <span v-text=\"broadcast.title\"></span></span></h3>'+\n// '            <h3><span class=\"creek-archive-title\"><span v-text=\"broadcast.Show.title\"></span></span></h3>'+\n'            <div class=\"creek-info\">'+\n'              <a class=\"creek-broadcast-title\" v-text=\"broadcast.title\" :href=\"\\'/broadcasts/view/\\'+broadcast.id\"></a>'+\n'              <a class=\"creek-show-title\" v-text=\"broadcast.Show.title\" :href=\"\\'/shows/\\'+broadcast.Show.short_name\"></a>'+\n'              <span class=\"creek-date-time\" v-text=\"broadcast.start | moment \\'dddd, MMMM Do YYYY, h:mma\\'\"></span>'+\n'            </div>'+\n// '            <div class=\"creek-item-description\">'+\n// // '              <!-- <a class=\"read-more\" :href=\"\\'/broadcasts/\\'+broadcast.id \">Read more</a> -->'+\n// '              <span v-text=\"broadcast.text\"></span>'+\n// '            </div>'+\n// '            <div class=\"creek-social-buttons\">'+\n// '              <span class=\"creek-social-button creek-social-button-facebook\" v-attr=\"data-url: Creek.base_url+\\'/broadcasts/\\'+broadcast.id \" href=\"#\"><i class=\"fa fa-facebook\"></i> Share</span>'+\n// '              <span class=\"creek-social-button creek-social-button-twitter\" v-attr=\"data-url: Creek.base_url+\\'/broadcasts/\\'+broadcast.id \" href=\"#\"><i class=\"fa fa-twitter\"></i> Tweet</span>'+\n// '              <span class=\"creek-social-button creek-social-button-email\" href=\"#\" v-attr=\"data-url: Creek.base_url\"><i class=\"fa fa-envelope\"></i> Email</span>'+\n// '            </div>'+\n'        </div>'+\n'      </div>'+\n// '    </div>'+\n// '  </div>'+\n// '</div>';\n'';\n","\n/**\n * Module dependencies.\n */\n\nvar parseuri = require('parseuri');\nvar debug = require('debug')('socket.io-client:url');\n\n/**\n * Module exports.\n */\n\nmodule.exports = url;\n\n/**\n * URL parser.\n *\n * @param {String} url\n * @param {Object} An object meant to mimic window.location.\n *                 Defaults to window.location.\n * @api public\n */\n\nfunction url(uri, loc){\n  var obj = uri;\n\n  // default to window.location\n  var loc = loc || global.location;\n  if (null == uri) uri = loc.protocol + '//' + loc.host;\n\n  // relative path support\n  if ('string' == typeof uri) {\n    if ('/' == uri.charAt(0)) {\n      if ('/' == uri.charAt(1)) {\n        uri = loc.protocol + uri;\n      } else {\n        uri = loc.host + uri;\n      }\n    }\n\n    if (!/^(https?|wss?):\\/\\//.test(uri)) {\n      debug('protocol-less url %s', uri);\n      if ('undefined' != typeof loc) {\n        uri = loc.protocol + '//' + uri;\n      } else {\n        uri = 'https://' + uri;\n      }\n    }\n\n    // parse\n    debug('parse %s', uri);\n    obj = parseuri(uri);\n  }\n\n  // make sure we treat `localhost:80` and `localhost` equally\n  if (!obj.port) {\n    if (/^(http|ws)$/.test(obj.protocol)) {\n      obj.port = '80';\n    }\n    else if (/^(http|ws)s$/.test(obj.protocol)) {\n      obj.port = '443';\n    }\n  }\n\n  obj.path = obj.path || '/';\n\n  var ipv6 = obj.host.indexOf(':') !== -1;\n  var host = ipv6 ? '[' + obj.host + ']' : obj.host;\n\n  // define unique id\n  obj.id = obj.protocol + '://' + host + ':' + obj.port;\n  // define href\n  obj.href = obj.protocol + '://' + host + (loc && loc.port == obj.port ? '' : (':' + obj.port));\n\n  return obj;\n}\n","\n/**\n * Module dependencies.\n */\n\nvar eio = require('engine.io-client');\nvar Socket = require('./socket');\nvar Emitter = require('component-emitter');\nvar parser = require('socket.io-parser');\nvar on = require('./on');\nvar bind = require('component-bind');\nvar debug = require('debug')('socket.io-client:manager');\nvar indexOf = require('indexof');\nvar Backoff = require('backo2');\n\n/**\n * IE6+ hasOwnProperty\n */\n\nvar has = Object.prototype.hasOwnProperty;\n\n/**\n * Module exports\n */\n\nmodule.exports = Manager;\n\n/**\n * `Manager` constructor.\n *\n * @param {String} engine instance or engine uri/opts\n * @param {Object} options\n * @api public\n */\n\nfunction Manager(uri, opts){\n  if (!(this instanceof Manager)) return new Manager(uri, opts);\n  if (uri && ('object' == typeof uri)) {\n    opts = uri;\n    uri = undefined;\n  }\n  opts = opts || {};\n\n  opts.path = opts.path || '/socket.io';\n  this.nsps = {};\n  this.subs = [];\n  this.opts = opts;\n  this.reconnection(opts.reconnection !== false);\n  this.reconnectionAttempts(opts.reconnectionAttempts || Infinity);\n  this.reconnectionDelay(opts.reconnectionDelay || 1000);\n  this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000);\n  this.randomizationFactor(opts.randomizationFactor || 0.5);\n  this.backoff = new Backoff({\n    min: this.reconnectionDelay(),\n    max: this.reconnectionDelayMax(),\n    jitter: this.randomizationFactor()\n  });\n  this.timeout(null == opts.timeout ? 20000 : opts.timeout);\n  this.readyState = 'closed';\n  this.uri = uri;\n  this.connecting = [];\n  this.lastPing = null;\n  this.encoding = false;\n  this.packetBuffer = [];\n  this.encoder = new parser.Encoder();\n  this.decoder = new parser.Decoder();\n  this.autoConnect = opts.autoConnect !== false;\n  if (this.autoConnect) this.open();\n}\n\n/**\n * Propagate given event to sockets and emit on `this`\n *\n * @api private\n */\n\nManager.prototype.emitAll = function() {\n  this.emit.apply(this, arguments);\n  for (var nsp in this.nsps) {\n    if (has.call(this.nsps, nsp)) {\n      this.nsps[nsp].emit.apply(this.nsps[nsp], arguments);\n    }\n  }\n};\n\n/**\n * Update `socket.id` of all sockets\n *\n * @api private\n */\n\nManager.prototype.updateSocketIds = function(){\n  for (var nsp in this.nsps) {\n    if (has.call(this.nsps, nsp)) {\n      this.nsps[nsp].id = this.engine.id;\n    }\n  }\n};\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Manager.prototype);\n\n/**\n * Sets the `reconnection` config.\n *\n * @param {Boolean} true/false if it should automatically reconnect\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnection = function(v){\n  if (!arguments.length) return this._reconnection;\n  this._reconnection = !!v;\n  return this;\n};\n\n/**\n * Sets the reconnection attempts config.\n *\n * @param {Number} max reconnection attempts before giving up\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnectionAttempts = function(v){\n  if (!arguments.length) return this._reconnectionAttempts;\n  this._reconnectionAttempts = v;\n  return this;\n};\n\n/**\n * Sets the delay between reconnections.\n *\n * @param {Number} delay\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnectionDelay = function(v){\n  if (!arguments.length) return this._reconnectionDelay;\n  this._reconnectionDelay = v;\n  this.backoff && this.backoff.setMin(v);\n  return this;\n};\n\nManager.prototype.randomizationFactor = function(v){\n  if (!arguments.length) return this._randomizationFactor;\n  this._randomizationFactor = v;\n  this.backoff && this.backoff.setJitter(v);\n  return this;\n};\n\n/**\n * Sets the maximum delay between reconnections.\n *\n * @param {Number} delay\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnectionDelayMax = function(v){\n  if (!arguments.length) return this._reconnectionDelayMax;\n  this._reconnectionDelayMax = v;\n  this.backoff && this.backoff.setMax(v);\n  return this;\n};\n\n/**\n * Sets the connection timeout. `false` to disable\n *\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.timeout = function(v){\n  if (!arguments.length) return this._timeout;\n  this._timeout = v;\n  return this;\n};\n\n/**\n * Starts trying to reconnect if reconnection is enabled and we have not\n * started reconnecting yet\n *\n * @api private\n */\n\nManager.prototype.maybeReconnectOnOpen = function() {\n  // Only try to reconnect if it's the first time we're connecting\n  if (!this.reconnecting && this._reconnection && this.backoff.attempts === 0) {\n    // keeps reconnection from firing twice for the same reconnection loop\n    this.reconnect();\n  }\n};\n\n\n/**\n * Sets the current transport `socket`.\n *\n * @param {Function} optional, callback\n * @return {Manager} self\n * @api public\n */\n\nManager.prototype.open =\nManager.prototype.connect = function(fn){\n  debug('readyState %s', this.readyState);\n  if (~this.readyState.indexOf('open')) return this;\n\n  debug('opening %s', this.uri);\n  this.engine = eio(this.uri, this.opts);\n  var socket = this.engine;\n  var self = this;\n  this.readyState = 'opening';\n  this.skipReconnect = false;\n\n  // emit `open`\n  var openSub = on(socket, 'open', function() {\n    self.onopen();\n    fn && fn();\n  });\n\n  // emit `connect_error`\n  var errorSub = on(socket, 'error', function(data){\n    debug('connect_error');\n    self.cleanup();\n    self.readyState = 'closed';\n    self.emitAll('connect_error', data);\n    if (fn) {\n      var err = new Error('Connection error');\n      err.data = data;\n      fn(err);\n    } else {\n      // Only do this if there is no fn to handle the error\n      self.maybeReconnectOnOpen();\n    }\n  });\n\n  // emit `connect_timeout`\n  if (false !== this._timeout) {\n    var timeout = this._timeout;\n    debug('connect attempt will timeout after %d', timeout);\n\n    // set timer\n    var timer = setTimeout(function(){\n      debug('connect attempt timed out after %d', timeout);\n      openSub.destroy();\n      socket.close();\n      socket.emit('error', 'timeout');\n      self.emitAll('connect_timeout', timeout);\n    }, timeout);\n\n    this.subs.push({\n      destroy: function(){\n        clearTimeout(timer);\n      }\n    });\n  }\n\n  this.subs.push(openSub);\n  this.subs.push(errorSub);\n\n  return this;\n};\n\n/**\n * Called upon transport open.\n *\n * @api private\n */\n\nManager.prototype.onopen = function(){\n  debug('open');\n\n  // clear old subs\n  this.cleanup();\n\n  // mark as open\n  this.readyState = 'open';\n  this.emit('open');\n\n  // add new subs\n  var socket = this.engine;\n  this.subs.push(on(socket, 'data', bind(this, 'ondata')));\n  this.subs.push(on(socket, 'ping', bind(this, 'onping')));\n  this.subs.push(on(socket, 'pong', bind(this, 'onpong')));\n  this.subs.push(on(socket, 'error', bind(this, 'onerror')));\n  this.subs.push(on(socket, 'close', bind(this, 'onclose')));\n  this.subs.push(on(this.decoder, 'decoded', bind(this, 'ondecoded')));\n};\n\n/**\n * Called upon a ping.\n *\n * @api private\n */\n\nManager.prototype.onping = function(){\n  this.lastPing = new Date;\n  this.emitAll('ping');\n};\n\n/**\n * Called upon a packet.\n *\n * @api private\n */\n\nManager.prototype.onpong = function(){\n  this.emitAll('pong', new Date - this.lastPing);\n};\n\n/**\n * Called with data.\n *\n * @api private\n */\n\nManager.prototype.ondata = function(data){\n  this.decoder.add(data);\n};\n\n/**\n * Called when parser fully decodes a packet.\n *\n * @api private\n */\n\nManager.prototype.ondecoded = function(packet) {\n  this.emit('packet', packet);\n};\n\n/**\n * Called upon socket error.\n *\n * @api private\n */\n\nManager.prototype.onerror = function(err){\n  debug('error', err);\n  this.emitAll('error', err);\n};\n\n/**\n * Creates a new socket for the given `nsp`.\n *\n * @return {Socket}\n * @api public\n */\n\nManager.prototype.socket = function(nsp){\n  var socket = this.nsps[nsp];\n  if (!socket) {\n    socket = new Socket(this, nsp);\n    this.nsps[nsp] = socket;\n    var self = this;\n    socket.on('connecting', onConnecting);\n    socket.on('connect', function(){\n      socket.id = self.engine.id;\n    });\n\n    if (this.autoConnect) {\n      // manually call here since connecting evnet is fired before listening\n      onConnecting();\n    }\n  }\n\n  function onConnecting() {\n    if (!~indexOf(self.connecting, socket)) {\n      self.connecting.push(socket);\n    }\n  }\n\n  return socket;\n};\n\n/**\n * Called upon a socket close.\n *\n * @param {Socket} socket\n */\n\nManager.prototype.destroy = function(socket){\n  var index = indexOf(this.connecting, socket);\n  if (~index) this.connecting.splice(index, 1);\n  if (this.connecting.length) return;\n\n  this.close();\n};\n\n/**\n * Writes a packet.\n *\n * @param {Object} packet\n * @api private\n */\n\nManager.prototype.packet = function(packet){\n  debug('writing packet %j', packet);\n  var self = this;\n\n  if (!self.encoding) {\n    // encode, then write to engine with result\n    self.encoding = true;\n    this.encoder.encode(packet, function(encodedPackets) {\n      for (var i = 0; i < encodedPackets.length; i++) {\n        self.engine.write(encodedPackets[i], packet.options);\n      }\n      self.encoding = false;\n      self.processPacketQueue();\n    });\n  } else { // add packet to the queue\n    self.packetBuffer.push(packet);\n  }\n};\n\n/**\n * If packet buffer is non-empty, begins encoding the\n * next packet in line.\n *\n * @api private\n */\n\nManager.prototype.processPacketQueue = function() {\n  if (this.packetBuffer.length > 0 && !this.encoding) {\n    var pack = this.packetBuffer.shift();\n    this.packet(pack);\n  }\n};\n\n/**\n * Clean up transport subscriptions and packet buffer.\n *\n * @api private\n */\n\nManager.prototype.cleanup = function(){\n  debug('cleanup');\n\n  var sub;\n  while (sub = this.subs.shift()) sub.destroy();\n\n  this.packetBuffer = [];\n  this.encoding = false;\n  this.lastPing = null;\n\n  this.decoder.destroy();\n};\n\n/**\n * Close the current socket.\n *\n * @api private\n */\n\nManager.prototype.close =\nManager.prototype.disconnect = function(){\n  debug('disconnect');\n  this.skipReconnect = true;\n  this.reconnecting = false;\n  if ('opening' == this.readyState) {\n    // `onclose` will not fire because\n    // an open event never happened\n    this.cleanup();\n  }\n  this.backoff.reset();\n  this.readyState = 'closed';\n  if (this.engine) this.engine.close();\n};\n\n/**\n * Called upon engine close.\n *\n * @api private\n */\n\nManager.prototype.onclose = function(reason){\n  debug('onclose');\n\n  this.cleanup();\n  this.backoff.reset();\n  this.readyState = 'closed';\n  this.emit('close', reason);\n\n  if (this._reconnection && !this.skipReconnect) {\n    this.reconnect();\n  }\n};\n\n/**\n * Attempt a reconnection.\n *\n * @api private\n */\n\nManager.prototype.reconnect = function(){\n  if (this.reconnecting || this.skipReconnect) return this;\n\n  var self = this;\n\n  if (this.backoff.attempts >= this._reconnectionAttempts) {\n    debug('reconnect failed');\n    this.backoff.reset();\n    this.emitAll('reconnect_failed');\n    this.reconnecting = false;\n  } else {\n    var delay = this.backoff.duration();\n    debug('will wait %dms before reconnect attempt', delay);\n\n    this.reconnecting = true;\n    var timer = setTimeout(function(){\n      if (self.skipReconnect) return;\n\n      debug('attempting reconnect');\n      self.emitAll('reconnect_attempt', self.backoff.attempts);\n      self.emitAll('reconnecting', self.backoff.attempts);\n\n      // check again for the case socket closed in above events\n      if (self.skipReconnect) return;\n\n      self.open(function(err){\n        if (err) {\n          debug('reconnect attempt error');\n          self.reconnecting = false;\n          self.reconnect();\n          self.emitAll('reconnect_error', err.data);\n        } else {\n          debug('reconnect success');\n          self.onreconnect();\n        }\n      });\n    }, delay);\n\n    this.subs.push({\n      destroy: function(){\n        clearTimeout(timer);\n      }\n    });\n  }\n};\n\n/**\n * Called upon successful reconnect.\n *\n * @api private\n */\n\nManager.prototype.onreconnect = function(){\n  var attempt = this.backoff.attempts;\n  this.reconnecting = false;\n  this.backoff.reset();\n  this.updateSocketIds();\n  this.emitAll('reconnect', attempt);\n};\n","\n/**\n * Module dependencies.\n */\n\nvar parser = require('socket.io-parser');\nvar Emitter = require('component-emitter');\nvar toArray = require('to-array');\nvar on = require('./on');\nvar bind = require('component-bind');\nvar debug = require('debug')('socket.io-client:socket');\nvar hasBin = require('has-binary');\n\n/**\n * Module exports.\n */\n\nmodule.exports = exports = Socket;\n\n/**\n * Internal events (blacklisted).\n * These events can't be emitted by the user.\n *\n * @api private\n */\n\nvar events = {\n  connect: 1,\n  connect_error: 1,\n  connect_timeout: 1,\n  connecting: 1,\n  disconnect: 1,\n  error: 1,\n  reconnect: 1,\n  reconnect_attempt: 1,\n  reconnect_failed: 1,\n  reconnect_error: 1,\n  reconnecting: 1,\n  ping: 1,\n  pong: 1\n};\n\n/**\n * Shortcut to `Emitter#emit`.\n */\n\nvar emit = Emitter.prototype.emit;\n\n/**\n * `Socket` constructor.\n *\n * @api public\n */\n\nfunction Socket(io, nsp){\n  this.io = io;\n  this.nsp = nsp;\n  this.json = this; // compat\n  this.ids = 0;\n  this.acks = {};\n  this.receiveBuffer = [];\n  this.sendBuffer = [];\n  this.connected = false;\n  this.disconnected = true;\n  if (this.io.autoConnect) this.open();\n}\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Socket.prototype);\n\n/**\n * Subscribe to open, close and packet events\n *\n * @api private\n */\n\nSocket.prototype.subEvents = function() {\n  if (this.subs) return;\n\n  var io = this.io;\n  this.subs = [\n    on(io, 'open', bind(this, 'onopen')),\n    on(io, 'packet', bind(this, 'onpacket')),\n    on(io, 'close', bind(this, 'onclose'))\n  ];\n};\n\n/**\n * \"Opens\" the socket.\n *\n * @api public\n */\n\nSocket.prototype.open =\nSocket.prototype.connect = function(){\n  if (this.connected) return this;\n\n  this.subEvents();\n  this.io.open(); // ensure open\n  if ('open' == this.io.readyState) this.onopen();\n  this.emit('connecting');\n  return this;\n};\n\n/**\n * Sends a `message` event.\n *\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.send = function(){\n  var args = toArray(arguments);\n  args.unshift('message');\n  this.emit.apply(this, args);\n  return this;\n};\n\n/**\n * Override `emit`.\n * If the event is in `events`, it's emitted normally.\n *\n * @param {String} event name\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.emit = function(ev){\n  if (events.hasOwnProperty(ev)) {\n    emit.apply(this, arguments);\n    return this;\n  }\n\n  var args = toArray(arguments);\n  var parserType = parser.EVENT; // default\n  if (hasBin(args)) { parserType = parser.BINARY_EVENT; } // binary\n  var packet = { type: parserType, data: args };\n\n  packet.options = {};\n  packet.options.compress = !this.flags || false !== this.flags.compress;\n\n  // event ack callback\n  if ('function' == typeof args[args.length - 1]) {\n    debug('emitting packet with ack id %d', this.ids);\n    this.acks[this.ids] = args.pop();\n    packet.id = this.ids++;\n  }\n\n  if (this.connected) {\n    this.packet(packet);\n  } else {\n    this.sendBuffer.push(packet);\n  }\n\n  delete this.flags;\n\n  return this;\n};\n\n/**\n * Sends a packet.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.packet = function(packet){\n  packet.nsp = this.nsp;\n  this.io.packet(packet);\n};\n\n/**\n * Called upon engine `open`.\n *\n * @api private\n */\n\nSocket.prototype.onopen = function(){\n  debug('transport is open - connecting');\n\n  // write connect packet if necessary\n  if ('/' != this.nsp) {\n    this.packet({ type: parser.CONNECT });\n  }\n};\n\n/**\n * Called upon engine `close`.\n *\n * @param {String} reason\n * @api private\n */\n\nSocket.prototype.onclose = function(reason){\n  debug('close (%s)', reason);\n  this.connected = false;\n  this.disconnected = true;\n  delete this.id;\n  this.emit('disconnect', reason);\n};\n\n/**\n * Called with socket packet.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.onpacket = function(packet){\n  if (packet.nsp != this.nsp) return;\n\n  switch (packet.type) {\n    case parser.CONNECT:\n      this.onconnect();\n      break;\n\n    case parser.EVENT:\n      this.onevent(packet);\n      break;\n\n    case parser.BINARY_EVENT:\n      this.onevent(packet);\n      break;\n\n    case parser.ACK:\n      this.onack(packet);\n      break;\n\n    case parser.BINARY_ACK:\n      this.onack(packet);\n      break;\n\n    case parser.DISCONNECT:\n      this.ondisconnect();\n      break;\n\n    case parser.ERROR:\n      this.emit('error', packet.data);\n      break;\n  }\n};\n\n/**\n * Called upon a server event.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.onevent = function(packet){\n  var args = packet.data || [];\n  debug('emitting event %j', args);\n\n  if (null != packet.id) {\n    debug('attaching ack callback to event');\n    args.push(this.ack(packet.id));\n  }\n\n  if (this.connected) {\n    emit.apply(this, args);\n  } else {\n    this.receiveBuffer.push(args);\n  }\n};\n\n/**\n * Produces an ack callback to emit with an event.\n *\n * @api private\n */\n\nSocket.prototype.ack = function(id){\n  var self = this;\n  var sent = false;\n  return function(){\n    // prevent double callbacks\n    if (sent) return;\n    sent = true;\n    var args = toArray(arguments);\n    debug('sending ack %j', args);\n\n    var type = hasBin(args) ? parser.BINARY_ACK : parser.ACK;\n    self.packet({\n      type: type,\n      id: id,\n      data: args\n    });\n  };\n};\n\n/**\n * Called upon a server acknowlegement.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.onack = function(packet){\n  var ack = this.acks[packet.id];\n  if ('function' == typeof ack) {\n    debug('calling ack %s with %j', packet.id, packet.data);\n    ack.apply(this, packet.data);\n    delete this.acks[packet.id];\n  } else {\n    debug('bad ack %s', packet.id);\n  }\n};\n\n/**\n * Called upon server connect.\n *\n * @api private\n */\n\nSocket.prototype.onconnect = function(){\n  this.connected = true;\n  this.disconnected = false;\n  this.emit('connect');\n  this.emitBuffered();\n};\n\n/**\n * Emit buffered events (received and emitted).\n *\n * @api private\n */\n\nSocket.prototype.emitBuffered = function(){\n  var i;\n  for (i = 0; i < this.receiveBuffer.length; i++) {\n    emit.apply(this, this.receiveBuffer[i]);\n  }\n  this.receiveBuffer = [];\n\n  for (i = 0; i < this.sendBuffer.length; i++) {\n    this.packet(this.sendBuffer[i]);\n  }\n  this.sendBuffer = [];\n};\n\n/**\n * Called upon server disconnect.\n *\n * @api private\n */\n\nSocket.prototype.ondisconnect = function(){\n  debug('server disconnect (%s)', this.nsp);\n  this.destroy();\n  this.onclose('io server disconnect');\n};\n\n/**\n * Called upon forced client/server side disconnections,\n * this method ensures the manager stops tracking us and\n * that reconnections don't get triggered for this.\n *\n * @api private.\n */\n\nSocket.prototype.destroy = function(){\n  if (this.subs) {\n    // clean subscriptions to avoid reconnections\n    for (var i = 0; i < this.subs.length; i++) {\n      this.subs[i].destroy();\n    }\n    this.subs = null;\n  }\n\n  this.io.destroy(this);\n};\n\n/**\n * Disconnects the socket manually.\n *\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.close =\nSocket.prototype.disconnect = function(){\n  if (this.connected) {\n    debug('performing disconnect (%s)', this.nsp);\n    this.packet({ type: parser.DISCONNECT });\n  }\n\n  // remove socket from pool\n  this.destroy();\n\n  if (this.connected) {\n    // fire events\n    this.onclose('io client disconnect');\n  }\n  return this;\n};\n\n/**\n * Sets the compress flag.\n *\n * @param {Boolean} if `true`, compresses the sending data\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.compress = function(compress){\n  this.flags = this.flags || {};\n  this.flags.compress = compress;\n  return this;\n};\n","/*!\n * Vue.js v1.0.16\n * (c) 2016 Evan You\n * Released under the MIT License.\n */\n'use strict';\n\nfunction set(obj, key, val) {\n  if (hasOwn(obj, key)) {\n    obj[key] = val;\n    return;\n  }\n  if (obj._isVue) {\n    set(obj._data, key, val);\n    return;\n  }\n  var ob = obj.__ob__;\n  if (!ob) {\n    obj[key] = val;\n    return;\n  }\n  ob.convert(key, val);\n  ob.dep.notify();\n  if (ob.vms) {\n    var i = ob.vms.length;\n    while (i--) {\n      var vm = ob.vms[i];\n      vm._proxy(key);\n      vm._digest();\n    }\n  }\n  return val;\n}\n\n/**\n * Delete a property and trigger change if necessary.\n *\n * @param {Object} obj\n * @param {String} key\n */\n\nfunction del(obj, key) {\n  if (!hasOwn(obj, key)) {\n    return;\n  }\n  delete obj[key];\n  var ob = obj.__ob__;\n  if (!ob) {\n    return;\n  }\n  ob.dep.notify();\n  if (ob.vms) {\n    var i = ob.vms.length;\n    while (i--) {\n      var vm = ob.vms[i];\n      vm._unproxy(key);\n      vm._digest();\n    }\n  }\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Check whether the object has the property.\n *\n * @param {Object} obj\n * @param {String} key\n * @return {Boolean}\n */\n\nfunction hasOwn(obj, key) {\n  return hasOwnProperty.call(obj, key);\n}\n\n/**\n * Check if an expression is a literal value.\n *\n * @param {String} exp\n * @return {Boolean}\n */\n\nvar literalValueRE = /^\\s?(true|false|-?[\\d\\.]+|'[^']*'|\"[^\"]*\")\\s?$/;\n\nfunction isLiteral(exp) {\n  return literalValueRE.test(exp);\n}\n\n/**\n * Check if a string starts with $ or _\n *\n * @param {String} str\n * @return {Boolean}\n */\n\nfunction isReserved(str) {\n  var c = (str + '').charCodeAt(0);\n  return c === 0x24 || c === 0x5F;\n}\n\n/**\n * Guard text output, make sure undefined outputs\n * empty string\n *\n * @param {*} value\n * @return {String}\n */\n\nfunction _toString(value) {\n  return value == null ? '' : value.toString();\n}\n\n/**\n * Check and convert possible numeric strings to numbers\n * before setting back to data\n *\n * @param {*} value\n * @return {*|Number}\n */\n\nfunction toNumber(value) {\n  if (typeof value !== 'string') {\n    return value;\n  } else {\n    var parsed = Number(value);\n    return isNaN(parsed) ? value : parsed;\n  }\n}\n\n/**\n * Convert string boolean literals into real booleans.\n *\n * @param {*} value\n * @return {*|Boolean}\n */\n\nfunction toBoolean(value) {\n  return value === 'true' ? true : value === 'false' ? false : value;\n}\n\n/**\n * Strip quotes from a string\n *\n * @param {String} str\n * @return {String | false}\n */\n\nfunction stripQuotes(str) {\n  var a = str.charCodeAt(0);\n  var b = str.charCodeAt(str.length - 1);\n  return a === b && (a === 0x22 || a === 0x27) ? str.slice(1, -1) : str;\n}\n\n/**\n * Camelize a hyphen-delmited string.\n *\n * @param {String} str\n * @return {String}\n */\n\nvar camelizeRE = /-(\\w)/g;\n\nfunction camelize(str) {\n  return str.replace(camelizeRE, toUpper);\n}\n\nfunction toUpper(_, c) {\n  return c ? c.toUpperCase() : '';\n}\n\n/**\n * Hyphenate a camelCase string.\n *\n * @param {String} str\n * @return {String}\n */\n\nvar hyphenateRE = /([a-z\\d])([A-Z])/g;\n\nfunction hyphenate(str) {\n  return str.replace(hyphenateRE, '$1-$2').toLowerCase();\n}\n\n/**\n * Converts hyphen/underscore/slash delimitered names into\n * camelized classNames.\n *\n * e.g. my-component => MyComponent\n *      some_else    => SomeElse\n *      some/comp    => SomeComp\n *\n * @param {String} str\n * @return {String}\n */\n\nvar classifyRE = /(?:^|[-_\\/])(\\w)/g;\n\nfunction classify(str) {\n  return str.replace(classifyRE, toUpper);\n}\n\n/**\n * Simple bind, faster than native\n *\n * @param {Function} fn\n * @param {Object} ctx\n * @return {Function}\n */\n\nfunction bind$1(fn, ctx) {\n  return function (a) {\n    var l = arguments.length;\n    return l ? l > 1 ? fn.apply(ctx, arguments) : fn.call(ctx, a) : fn.call(ctx);\n  };\n}\n\n/**\n * Convert an Array-like object to a real Array.\n *\n * @param {Array-like} list\n * @param {Number} [start] - start index\n * @return {Array}\n */\n\nfunction toArray(list, start) {\n  start = start || 0;\n  var i = list.length - start;\n  var ret = new Array(i);\n  while (i--) {\n    ret[i] = list[i + start];\n  }\n  return ret;\n}\n\n/**\n * Mix properties into target object.\n *\n * @param {Object} to\n * @param {Object} from\n */\n\nfunction extend(to, from) {\n  var keys = Object.keys(from);\n  var i = keys.length;\n  while (i--) {\n    to[keys[i]] = from[keys[i]];\n  }\n  return to;\n}\n\n/**\n * Quick object check - this is primarily used to tell\n * Objects from primitive values when we know the value\n * is a JSON-compliant type.\n *\n * @param {*} obj\n * @return {Boolean}\n */\n\nfunction isObject(obj) {\n  return obj !== null && typeof obj === 'object';\n}\n\n/**\n * Strict object type check. Only returns true\n * for plain JavaScript objects.\n *\n * @param {*} obj\n * @return {Boolean}\n */\n\nvar toString = Object.prototype.toString;\nvar OBJECT_STRING = '[object Object]';\n\nfunction isPlainObject(obj) {\n  return toString.call(obj) === OBJECT_STRING;\n}\n\n/**\n * Array type check.\n *\n * @param {*} obj\n * @return {Boolean}\n */\n\nvar isArray = Array.isArray;\n\n/**\n * Define a non-enumerable property\n *\n * @param {Object} obj\n * @param {String} key\n * @param {*} val\n * @param {Boolean} [enumerable]\n */\n\nfunction def(obj, key, val, enumerable) {\n  Object.defineProperty(obj, key, {\n    value: val,\n    enumerable: !!enumerable,\n    writable: true,\n    configurable: true\n  });\n}\n\n/**\n * Debounce a function so it only gets called after the\n * input stops arriving after the given wait period.\n *\n * @param {Function} func\n * @param {Number} wait\n * @return {Function} - the debounced function\n */\n\nfunction _debounce(func, wait) {\n  var timeout, args, context, timestamp, result;\n  var later = function later() {\n    var last = Date.now() - timestamp;\n    if (last < wait && last >= 0) {\n      timeout = setTimeout(later, wait - last);\n    } else {\n      timeout = null;\n      result = func.apply(context, args);\n      if (!timeout) context = args = null;\n    }\n  };\n  return function () {\n    context = this;\n    args = arguments;\n    timestamp = Date.now();\n    if (!timeout) {\n      timeout = setTimeout(later, wait);\n    }\n    return result;\n  };\n}\n\n/**\n * Manual indexOf because it's slightly faster than\n * native.\n *\n * @param {Array} arr\n * @param {*} obj\n */\n\nfunction indexOf(arr, obj) {\n  var i = arr.length;\n  while (i--) {\n    if (arr[i] === obj) return i;\n  }\n  return -1;\n}\n\n/**\n * Make a cancellable version of an async callback.\n *\n * @param {Function} fn\n * @return {Function}\n */\n\nfunction cancellable(fn) {\n  var cb = function cb() {\n    if (!cb.cancelled) {\n      return fn.apply(this, arguments);\n    }\n  };\n  cb.cancel = function () {\n    cb.cancelled = true;\n  };\n  return cb;\n}\n\n/**\n * Check if two values are loosely equal - that is,\n * if they are plain objects, do they have the same shape?\n *\n * @param {*} a\n * @param {*} b\n * @return {Boolean}\n */\n\nfunction looseEqual(a, b) {\n  /* eslint-disable eqeqeq */\n  return a == b || (isObject(a) && isObject(b) ? JSON.stringify(a) === JSON.stringify(b) : false);\n  /* eslint-enable eqeqeq */\n}\n\nvar hasProto = ('__proto__' in {});\n\n// Browser environment sniffing\nvar inBrowser = typeof window !== 'undefined' && Object.prototype.toString.call(window) !== '[object Object]';\n\nvar devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;\n\nvar isIE9 = inBrowser && navigator.userAgent.toLowerCase().indexOf('msie 9.0') > 0;\n\nvar isAndroid = inBrowser && navigator.userAgent.toLowerCase().indexOf('android') > 0;\n\nvar transitionProp = undefined;\nvar transitionEndEvent = undefined;\nvar animationProp = undefined;\nvar animationEndEvent = undefined;\n\n// Transition property/event sniffing\nif (inBrowser && !isIE9) {\n  var isWebkitTrans = window.ontransitionend === undefined && window.onwebkittransitionend !== undefined;\n  var isWebkitAnim = window.onanimationend === undefined && window.onwebkitanimationend !== undefined;\n  transitionProp = isWebkitTrans ? 'WebkitTransition' : 'transition';\n  transitionEndEvent = isWebkitTrans ? 'webkitTransitionEnd' : 'transitionend';\n  animationProp = isWebkitAnim ? 'WebkitAnimation' : 'animation';\n  animationEndEvent = isWebkitAnim ? 'webkitAnimationEnd' : 'animationend';\n}\n\n/**\n * Defer a task to execute it asynchronously. Ideally this\n * should be executed as a microtask, so we leverage\n * MutationObserver if it's available, and fallback to\n * setTimeout(0).\n *\n * @param {Function} cb\n * @param {Object} ctx\n */\n\nvar nextTick = (function () {\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\n  function nextTickHandler() {\n    pending = false;\n    var copies = callbacks.slice(0);\n    callbacks = [];\n    for (var i = 0; i < copies.length; i++) {\n      copies[i]();\n    }\n  }\n\n  /* istanbul ignore if */\n  if (typeof MutationObserver !== 'undefined') {\n    var counter = 1;\n    var observer = new MutationObserver(nextTickHandler);\n    var textNode = document.createTextNode(counter);\n    observer.observe(textNode, {\n      characterData: true\n    });\n    timerFunc = function () {\n      counter = (counter + 1) % 2;\n      textNode.data = counter;\n    };\n  } else {\n    // webpack attempts to inject a shim for setImmediate\n    // if it is used as a global, so we have to work around that to\n    // avoid bundling unnecessary code.\n    var context = inBrowser ? window : typeof global !== 'undefined' ? global : {};\n    timerFunc = context.setImmediate || setTimeout;\n  }\n  return function (cb, ctx) {\n    var func = ctx ? function () {\n      cb.call(ctx);\n    } : cb;\n    callbacks.push(func);\n    if (pending) return;\n    pending = true;\n    timerFunc(nextTickHandler, 0);\n  };\n})();\n\nfunction Cache(limit) {\n  this.size = 0;\n  this.limit = limit;\n  this.head = this.tail = undefined;\n  this._keymap = Object.create(null);\n}\n\nvar p = Cache.prototype;\n\n/**\n * Put <value> into the cache associated with <key>.\n * Returns the entry which was removed to make room for\n * the new entry. Otherwise undefined is returned.\n * (i.e. if there was enough room already).\n *\n * @param {String} key\n * @param {*} value\n * @return {Entry|undefined}\n */\n\np.put = function (key, value) {\n  var removed;\n  if (this.size === this.limit) {\n    removed = this.shift();\n  }\n\n  var entry = this.get(key, true);\n  if (!entry) {\n    entry = {\n      key: key\n    };\n    this._keymap[key] = entry;\n    if (this.tail) {\n      this.tail.newer = entry;\n      entry.older = this.tail;\n    } else {\n      this.head = entry;\n    }\n    this.tail = entry;\n    this.size++;\n  }\n  entry.value = value;\n\n  return removed;\n};\n\n/**\n * Purge the least recently used (oldest) entry from the\n * cache. Returns the removed entry or undefined if the\n * cache was empty.\n */\n\np.shift = function () {\n  var entry = this.head;\n  if (entry) {\n    this.head = this.head.newer;\n    this.head.older = undefined;\n    entry.newer = entry.older = undefined;\n    this._keymap[entry.key] = undefined;\n    this.size--;\n  }\n  return entry;\n};\n\n/**\n * Get and register recent use of <key>. Returns the value\n * associated with <key> or undefined if not in cache.\n *\n * @param {String} key\n * @param {Boolean} returnEntry\n * @return {Entry|*}\n */\n\np.get = function (key, returnEntry) {\n  var entry = this._keymap[key];\n  if (entry === undefined) return;\n  if (entry === this.tail) {\n    return returnEntry ? entry : entry.value;\n  }\n  // HEAD--------------TAIL\n  //   <.older   .newer>\n  //  <--- add direction --\n  //   A  B  C  <D>  E\n  if (entry.newer) {\n    if (entry === this.head) {\n      this.head = entry.newer;\n    }\n    entry.newer.older = entry.older; // C <-- E.\n  }\n  if (entry.older) {\n    entry.older.newer = entry.newer; // C. --> E\n  }\n  entry.newer = undefined; // D --x\n  entry.older = this.tail; // D. --> E\n  if (this.tail) {\n    this.tail.newer = entry; // E. <-- D\n  }\n  this.tail = entry;\n  return returnEntry ? entry : entry.value;\n};\n\nvar cache$1 = new Cache(1000);\nvar filterTokenRE = /[^\\s'\"]+|'[^']*'|\"[^\"]*\"/g;\nvar reservedArgRE = /^in$|^-?\\d+/;\n\n/**\n * Parser state\n */\n\nvar str;\nvar dir;\nvar c;\nvar prev;\nvar i;\nvar l;\nvar lastFilterIndex;\nvar inSingle;\nvar inDouble;\nvar curly;\nvar square;\nvar paren;\n/**\n * Push a filter to the current directive object\n */\n\nfunction pushFilter() {\n  var exp = str.slice(lastFilterIndex, i).trim();\n  var filter;\n  if (exp) {\n    filter = {};\n    var tokens = exp.match(filterTokenRE);\n    filter.name = tokens[0];\n    if (tokens.length > 1) {\n      filter.args = tokens.slice(1).map(processFilterArg);\n    }\n  }\n  if (filter) {\n    (dir.filters = dir.filters || []).push(filter);\n  }\n  lastFilterIndex = i + 1;\n}\n\n/**\n * Check if an argument is dynamic and strip quotes.\n *\n * @param {String} arg\n * @return {Object}\n */\n\nfunction processFilterArg(arg) {\n  if (reservedArgRE.test(arg)) {\n    return {\n      value: toNumber(arg),\n      dynamic: false\n    };\n  } else {\n    var stripped = stripQuotes(arg);\n    var dynamic = stripped === arg;\n    return {\n      value: dynamic ? arg : stripped,\n      dynamic: dynamic\n    };\n  }\n}\n\n/**\n * Parse a directive value and extract the expression\n * and its filters into a descriptor.\n *\n * Example:\n *\n * \"a + 1 | uppercase\" will yield:\n * {\n *   expression: 'a + 1',\n *   filters: [\n *     { name: 'uppercase', args: null }\n *   ]\n * }\n *\n * @param {String} str\n * @return {Object}\n */\n\nfunction parseDirective(s) {\n\n  var hit = cache$1.get(s);\n  if (hit) {\n    return hit;\n  }\n\n  // reset parser state\n  str = s;\n  inSingle = inDouble = false;\n  curly = square = paren = 0;\n  lastFilterIndex = 0;\n  dir = {};\n\n  for (i = 0, l = str.length; i < l; i++) {\n    prev = c;\n    c = str.charCodeAt(i);\n    if (inSingle) {\n      // check single quote\n      if (c === 0x27 && prev !== 0x5C) inSingle = !inSingle;\n    } else if (inDouble) {\n      // check double quote\n      if (c === 0x22 && prev !== 0x5C) inDouble = !inDouble;\n    } else if (c === 0x7C && // pipe\n    str.charCodeAt(i + 1) !== 0x7C && str.charCodeAt(i - 1) !== 0x7C) {\n      if (dir.expression == null) {\n        // first filter, end of expression\n        lastFilterIndex = i + 1;\n        dir.expression = str.slice(0, i).trim();\n      } else {\n        // already has filter\n        pushFilter();\n      }\n    } else {\n      switch (c) {\n        case 0x22:\n          inDouble = true;break; // \"\n        case 0x27:\n          inSingle = true;break; // '\n        case 0x28:\n          paren++;break; // (\n        case 0x29:\n          paren--;break; // )\n        case 0x5B:\n          square++;break; // [\n        case 0x5D:\n          square--;break; // ]\n        case 0x7B:\n          curly++;break; // {\n        case 0x7D:\n          curly--;break; // }\n      }\n    }\n  }\n\n  if (dir.expression == null) {\n    dir.expression = str.slice(0, i).trim();\n  } else if (lastFilterIndex !== 0) {\n    pushFilter();\n  }\n\n  cache$1.put(s, dir);\n  return dir;\n}\n\nvar directive = Object.freeze({\n  parseDirective: parseDirective\n});\n\nvar regexEscapeRE = /[-.*+?^${}()|[\\]\\/\\\\]/g;\nvar cache = undefined;\nvar tagRE = undefined;\nvar htmlRE = undefined;\n/**\n * Escape a string so it can be used in a RegExp\n * constructor.\n *\n * @param {String} str\n */\n\nfunction escapeRegex(str) {\n  return str.replace(regexEscapeRE, '\\\\$&');\n}\n\nfunction compileRegex() {\n  var open = escapeRegex(config.delimiters[0]);\n  var close = escapeRegex(config.delimiters[1]);\n  var unsafeOpen = escapeRegex(config.unsafeDelimiters[0]);\n  var unsafeClose = escapeRegex(config.unsafeDelimiters[1]);\n  tagRE = new RegExp(unsafeOpen + '(.+?)' + unsafeClose + '|' + open + '(.+?)' + close, 'g');\n  htmlRE = new RegExp('^' + unsafeOpen + '.*' + unsafeClose + '$');\n  // reset cache\n  cache = new Cache(1000);\n}\n\n/**\n * Parse a template text string into an array of tokens.\n *\n * @param {String} text\n * @return {Array<Object> | null}\n *               - {String} type\n *               - {String} value\n *               - {Boolean} [html]\n *               - {Boolean} [oneTime]\n */\n\nfunction parseText(text) {\n  if (!cache) {\n    compileRegex();\n  }\n  var hit = cache.get(text);\n  if (hit) {\n    return hit;\n  }\n  text = text.replace(/\\n/g, '');\n  if (!tagRE.test(text)) {\n    return null;\n  }\n  var tokens = [];\n  var lastIndex = tagRE.lastIndex = 0;\n  var match, index, html, value, first, oneTime;\n  /* eslint-disable no-cond-assign */\n  while (match = tagRE.exec(text)) {\n    /* eslint-enable no-cond-assign */\n    index = match.index;\n    // push text token\n    if (index > lastIndex) {\n      tokens.push({\n        value: text.slice(lastIndex, index)\n      });\n    }\n    // tag token\n    html = htmlRE.test(match[0]);\n    value = html ? match[1] : match[2];\n    first = value.charCodeAt(0);\n    oneTime = first === 42; // *\n    value = oneTime ? value.slice(1) : value;\n    tokens.push({\n      tag: true,\n      value: value.trim(),\n      html: html,\n      oneTime: oneTime\n    });\n    lastIndex = index + match[0].length;\n  }\n  if (lastIndex < text.length) {\n    tokens.push({\n      value: text.slice(lastIndex)\n    });\n  }\n  cache.put(text, tokens);\n  return tokens;\n}\n\n/**\n * Format a list of tokens into an expression.\n * e.g. tokens parsed from 'a {{b}} c' can be serialized\n * into one single expression as '\"a \" + b + \" c\"'.\n *\n * @param {Array} tokens\n * @param {Vue} [vm]\n * @return {String}\n */\n\nfunction tokensToExp(tokens, vm) {\n  if (tokens.length > 1) {\n    return tokens.map(function (token) {\n      return formatToken(token, vm);\n    }).join('+');\n  } else {\n    return formatToken(tokens[0], vm, true);\n  }\n}\n\n/**\n * Format a single token.\n *\n * @param {Object} token\n * @param {Vue} [vm]\n * @param {Boolean} [single]\n * @return {String}\n */\n\nfunction formatToken(token, vm, single) {\n  return token.tag ? token.oneTime && vm ? '\"' + vm.$eval(token.value) + '\"' : inlineFilters(token.value, single) : '\"' + token.value + '\"';\n}\n\n/**\n * For an attribute with multiple interpolation tags,\n * e.g. attr=\"some-{{thing | filter}}\", in order to combine\n * the whole thing into a single watchable expression, we\n * have to inline those filters. This function does exactly\n * that. This is a bit hacky but it avoids heavy changes\n * to directive parser and watcher mechanism.\n *\n * @param {String} exp\n * @param {Boolean} single\n * @return {String}\n */\n\nvar filterRE$1 = /[^|]\\|[^|]/;\nfunction inlineFilters(exp, single) {\n  if (!filterRE$1.test(exp)) {\n    return single ? exp : '(' + exp + ')';\n  } else {\n    var dir = parseDirective(exp);\n    if (!dir.filters) {\n      return '(' + exp + ')';\n    } else {\n      return 'this._applyFilters(' + dir.expression + // value\n      ',null,' + // oldValue (null for read)\n      JSON.stringify(dir.filters) + // filter descriptors\n      ',false)'; // write?\n    }\n  }\n}\n\nvar text$1 = Object.freeze({\n  compileRegex: compileRegex,\n  parseText: parseText,\n  tokensToExp: tokensToExp\n});\n\nvar delimiters = ['{{', '}}'];\nvar unsafeDelimiters = ['{{{', '}}}'];\n\nvar config = Object.defineProperties({\n\n  /**\n   * Whether to print debug messages.\n   * Also enables stack trace for warnings.\n   *\n   * @type {Boolean}\n   */\n\n  debug: false,\n\n  /**\n   * Whether to suppress warnings.\n   *\n   * @type {Boolean}\n   */\n\n  silent: false,\n\n  /**\n   * Whether to use async rendering.\n   */\n\n  async: true,\n\n  /**\n   * Whether to warn against errors caught when evaluating\n   * expressions.\n   */\n\n  warnExpressionErrors: true,\n\n  /**\n   * Whether or not to handle fully object properties which\n   * are already backed by getters and seters. Depending on\n   * use case and environment, this might introduce non-neglible\n   * performance penalties.\n   */\n  convertAllProperties: false,\n\n  /**\n   * Internal flag to indicate the delimiters have been\n   * changed.\n   *\n   * @type {Boolean}\n   */\n\n  _delimitersChanged: true,\n\n  /**\n   * List of asset types that a component can own.\n   *\n   * @type {Array}\n   */\n\n  _assetTypes: ['component', 'directive', 'elementDirective', 'filter', 'transition', 'partial'],\n\n  /**\n   * prop binding modes\n   */\n\n  _propBindingModes: {\n    ONE_WAY: 0,\n    TWO_WAY: 1,\n    ONE_TIME: 2\n  },\n\n  /**\n   * Max circular updates allowed in a batcher flush cycle.\n   */\n\n  _maxUpdateCount: 100\n\n}, {\n  delimiters: { /**\n                 * Interpolation delimiters. Changing these would trigger\n                 * the text parser to re-compile the regular expressions.\n                 *\n                 * @type {Array<String>}\n                 */\n\n    get: function get() {\n      return delimiters;\n    },\n    set: function set(val) {\n      delimiters = val;\n      compileRegex();\n    },\n    configurable: true,\n    enumerable: true\n  },\n  unsafeDelimiters: {\n    get: function get() {\n      return unsafeDelimiters;\n    },\n    set: function set(val) {\n      unsafeDelimiters = val;\n      compileRegex();\n    },\n    configurable: true,\n    enumerable: true\n  }\n});\n\nvar warn = undefined;\n\nif (process.env.NODE_ENV !== 'production') {\n  (function () {\n    var hasConsole = typeof console !== 'undefined';\n    warn = function (msg, e) {\n      if (hasConsole && (!config.silent || config.debug)) {\n        console.warn('[Vue warn]: ' + msg);\n        /* istanbul ignore if */\n        if (config.debug) {\n          if (e) {\n            throw e;\n          } else {\n            console.warn(new Error('Warning Stack Trace').stack);\n          }\n        }\n      }\n    };\n  })();\n}\n\n/**\n * Append with transition.\n *\n * @param {Element} el\n * @param {Element} target\n * @param {Vue} vm\n * @param {Function} [cb]\n */\n\nfunction appendWithTransition(el, target, vm, cb) {\n  applyTransition(el, 1, function () {\n    target.appendChild(el);\n  }, vm, cb);\n}\n\n/**\n * InsertBefore with transition.\n *\n * @param {Element} el\n * @param {Element} target\n * @param {Vue} vm\n * @param {Function} [cb]\n */\n\nfunction beforeWithTransition(el, target, vm, cb) {\n  applyTransition(el, 1, function () {\n    before(el, target);\n  }, vm, cb);\n}\n\n/**\n * Remove with transition.\n *\n * @param {Element} el\n * @param {Vue} vm\n * @param {Function} [cb]\n */\n\nfunction removeWithTransition(el, vm, cb) {\n  applyTransition(el, -1, function () {\n    remove(el);\n  }, vm, cb);\n}\n\n/**\n * Apply transitions with an operation callback.\n *\n * @param {Element} el\n * @param {Number} direction\n *                  1: enter\n *                 -1: leave\n * @param {Function} op - the actual DOM operation\n * @param {Vue} vm\n * @param {Function} [cb]\n */\n\nfunction applyTransition(el, direction, op, vm, cb) {\n  var transition = el.__v_trans;\n  if (!transition ||\n  // skip if there are no js hooks and CSS transition is\n  // not supported\n  !transition.hooks && !transitionEndEvent ||\n  // skip transitions for initial compile\n  !vm._isCompiled ||\n  // if the vm is being manipulated by a parent directive\n  // during the parent's compilation phase, skip the\n  // animation.\n  vm.$parent && !vm.$parent._isCompiled) {\n    op();\n    if (cb) cb();\n    return;\n  }\n  var action = direction > 0 ? 'enter' : 'leave';\n  transition[action](op, cb);\n}\n\n/**\n * Query an element selector if it's not an element already.\n *\n * @param {String|Element} el\n * @return {Element}\n */\n\nfunction query(el) {\n  if (typeof el === 'string') {\n    var selector = el;\n    el = document.querySelector(el);\n    if (!el) {\n      process.env.NODE_ENV !== 'production' && warn('Cannot find element: ' + selector);\n    }\n  }\n  return el;\n}\n\n/**\n * Check if a node is in the document.\n * Note: document.documentElement.contains should work here\n * but always returns false for comment nodes in phantomjs,\n * making unit tests difficult. This is fixed by doing the\n * contains() check on the node's parentNode instead of\n * the node itself.\n *\n * @param {Node} node\n * @return {Boolean}\n */\n\nfunction inDoc(node) {\n  var doc = document.documentElement;\n  var parent = node && node.parentNode;\n  return doc === node || doc === parent || !!(parent && parent.nodeType === 1 && doc.contains(parent));\n}\n\n/**\n * Get and remove an attribute from a node.\n *\n * @param {Node} node\n * @param {String} _attr\n */\n\nfunction getAttr(node, _attr) {\n  var val = node.getAttribute(_attr);\n  if (val !== null) {\n    node.removeAttribute(_attr);\n  }\n  return val;\n}\n\n/**\n * Get an attribute with colon or v-bind: prefix.\n *\n * @param {Node} node\n * @param {String} name\n * @return {String|null}\n */\n\nfunction getBindAttr(node, name) {\n  var val = getAttr(node, ':' + name);\n  if (val === null) {\n    val = getAttr(node, 'v-bind:' + name);\n  }\n  return val;\n}\n\n/**\n * Check the presence of a bind attribute.\n *\n * @param {Node} node\n * @param {String} name\n * @return {Boolean}\n */\n\nfunction hasBindAttr(node, name) {\n  return node.hasAttribute(name) || node.hasAttribute(':' + name) || node.hasAttribute('v-bind:' + name);\n}\n\n/**\n * Insert el before target\n *\n * @param {Element} el\n * @param {Element} target\n */\n\nfunction before(el, target) {\n  target.parentNode.insertBefore(el, target);\n}\n\n/**\n * Insert el after target\n *\n * @param {Element} el\n * @param {Element} target\n */\n\nfunction after(el, target) {\n  if (target.nextSibling) {\n    before(el, target.nextSibling);\n  } else {\n    target.parentNode.appendChild(el);\n  }\n}\n\n/**\n * Remove el from DOM\n *\n * @param {Element} el\n */\n\nfunction remove(el) {\n  el.parentNode.removeChild(el);\n}\n\n/**\n * Prepend el to target\n *\n * @param {Element} el\n * @param {Element} target\n */\n\nfunction prepend(el, target) {\n  if (target.firstChild) {\n    before(el, target.firstChild);\n  } else {\n    target.appendChild(el);\n  }\n}\n\n/**\n * Replace target with el\n *\n * @param {Element} target\n * @param {Element} el\n */\n\nfunction replace(target, el) {\n  var parent = target.parentNode;\n  if (parent) {\n    parent.replaceChild(el, target);\n  }\n}\n\n/**\n * Add event listener shorthand.\n *\n * @param {Element} el\n * @param {String} event\n * @param {Function} cb\n * @param {Boolean} [useCapture]\n */\n\nfunction on$1(el, event, cb, useCapture) {\n  el.addEventListener(event, cb, useCapture);\n}\n\n/**\n * Remove event listener shorthand.\n *\n * @param {Element} el\n * @param {String} event\n * @param {Function} cb\n */\n\nfunction off(el, event, cb) {\n  el.removeEventListener(event, cb);\n}\n\n/**\n * In IE9, setAttribute('class') will result in empty class\n * if the element also has the :class attribute; However in\n * PhantomJS, setting `className` does not work on SVG elements...\n * So we have to do a conditional check here.\n *\n * @param {Element} el\n * @param {String} cls\n */\n\nfunction setClass(el, cls) {\n  /* istanbul ignore if */\n  if (isIE9 && !(el instanceof SVGElement)) {\n    el.className = cls;\n  } else {\n    el.setAttribute('class', cls);\n  }\n}\n\n/**\n * Add class with compatibility for IE & SVG\n *\n * @param {Element} el\n * @param {String} cls\n */\n\nfunction addClass(el, cls) {\n  if (el.classList) {\n    el.classList.add(cls);\n  } else {\n    var cur = ' ' + (el.getAttribute('class') || '') + ' ';\n    if (cur.indexOf(' ' + cls + ' ') < 0) {\n      setClass(el, (cur + cls).trim());\n    }\n  }\n}\n\n/**\n * Remove class with compatibility for IE & SVG\n *\n * @param {Element} el\n * @param {String} cls\n */\n\nfunction removeClass(el, cls) {\n  if (el.classList) {\n    el.classList.remove(cls);\n  } else {\n    var cur = ' ' + (el.getAttribute('class') || '') + ' ';\n    var tar = ' ' + cls + ' ';\n    while (cur.indexOf(tar) >= 0) {\n      cur = cur.replace(tar, ' ');\n    }\n    setClass(el, cur.trim());\n  }\n  if (!el.className) {\n    el.removeAttribute('class');\n  }\n}\n\n/**\n * Extract raw content inside an element into a temporary\n * container div\n *\n * @param {Element} el\n * @param {Boolean} asFragment\n * @return {Element}\n */\n\nfunction extractContent(el, asFragment) {\n  var child;\n  var rawContent;\n  /* istanbul ignore if */\n  if (isTemplate(el) && el.content instanceof DocumentFragment) {\n    el = el.content;\n  }\n  if (el.hasChildNodes()) {\n    trimNode(el);\n    rawContent = asFragment ? document.createDocumentFragment() : document.createElement('div');\n    /* eslint-disable no-cond-assign */\n    while (child = el.firstChild) {\n      /* eslint-enable no-cond-assign */\n      rawContent.appendChild(child);\n    }\n  }\n  return rawContent;\n}\n\n/**\n * Trim possible empty head/tail text and comment\n * nodes inside a parent.\n *\n * @param {Node} node\n */\n\nfunction trimNode(node) {\n  var child;\n  /* eslint-disable no-sequences */\n  while ((child = node.firstChild, isTrimmable(child))) {\n    node.removeChild(child);\n  }\n  while ((child = node.lastChild, isTrimmable(child))) {\n    node.removeChild(child);\n  }\n  /* eslint-enable no-sequences */\n}\n\nfunction isTrimmable(node) {\n  return node && (node.nodeType === 3 && !node.data.trim() || node.nodeType === 8);\n}\n\n/**\n * Check if an element is a template tag.\n * Note if the template appears inside an SVG its tagName\n * will be in lowercase.\n *\n * @param {Element} el\n */\n\nfunction isTemplate(el) {\n  return el.tagName && el.tagName.toLowerCase() === 'template';\n}\n\n/**\n * Create an \"anchor\" for performing dom insertion/removals.\n * This is used in a number of scenarios:\n * - fragment instance\n * - v-html\n * - v-if\n * - v-for\n * - component\n *\n * @param {String} content\n * @param {Boolean} persist - IE trashes empty textNodes on\n *                            cloneNode(true), so in certain\n *                            cases the anchor needs to be\n *                            non-empty to be persisted in\n *                            templates.\n * @return {Comment|Text}\n */\n\nfunction createAnchor(content, persist) {\n  var anchor = config.debug ? document.createComment(content) : document.createTextNode(persist ? ' ' : '');\n  anchor.__vue_anchor = true;\n  return anchor;\n}\n\n/**\n * Find a component ref attribute that starts with $.\n *\n * @param {Element} node\n * @return {String|undefined}\n */\n\nvar refRE = /^v-ref:/;\n\nfunction findRef(node) {\n  if (node.hasAttributes()) {\n    var attrs = node.attributes;\n    for (var i = 0, l = attrs.length; i < l; i++) {\n      var name = attrs[i].name;\n      if (refRE.test(name)) {\n        return camelize(name.replace(refRE, ''));\n      }\n    }\n  }\n}\n\n/**\n * Map a function to a range of nodes .\n *\n * @param {Node} node\n * @param {Node} end\n * @param {Function} op\n */\n\nfunction mapNodeRange(node, end, op) {\n  var next;\n  while (node !== end) {\n    next = node.nextSibling;\n    op(node);\n    node = next;\n  }\n  op(end);\n}\n\n/**\n * Remove a range of nodes with transition, store\n * the nodes in a fragment with correct ordering,\n * and call callback when done.\n *\n * @param {Node} start\n * @param {Node} end\n * @param {Vue} vm\n * @param {DocumentFragment} frag\n * @param {Function} cb\n */\n\nfunction removeNodeRange(start, end, vm, frag, cb) {\n  var done = false;\n  var removed = 0;\n  var nodes = [];\n  mapNodeRange(start, end, function (node) {\n    if (node === end) done = true;\n    nodes.push(node);\n    removeWithTransition(node, vm, onRemoved);\n  });\n  function onRemoved() {\n    removed++;\n    if (done && removed >= nodes.length) {\n      for (var i = 0; i < nodes.length; i++) {\n        frag.appendChild(nodes[i]);\n      }\n      cb && cb();\n    }\n  }\n}\n\nvar commonTagRE = /^(div|p|span|img|a|b|i|br|ul|ol|li|h1|h2|h3|h4|h5|h6|code|pre|table|th|td|tr|form|label|input|select|option|nav|article|section|header|footer)$/;\nvar reservedTagRE = /^(slot|partial|component)$/;\n\n/**\n * Check if an element is a component, if yes return its\n * component id.\n *\n * @param {Element} el\n * @param {Object} options\n * @return {Object|undefined}\n */\n\nfunction checkComponentAttr(el, options) {\n  var tag = el.tagName.toLowerCase();\n  var hasAttrs = el.hasAttributes();\n  if (!commonTagRE.test(tag) && !reservedTagRE.test(tag)) {\n    if (resolveAsset(options, 'components', tag)) {\n      return { id: tag };\n    } else {\n      var is = hasAttrs && getIsBinding(el);\n      if (is) {\n        return is;\n      } else if (process.env.NODE_ENV !== 'production') {\n        if (tag.indexOf('-') > -1 || /HTMLUnknownElement/.test(el.toString()) &&\n        // Chrome returns unknown for several HTML5 elements.\n        // https://code.google.com/p/chromium/issues/detail?id=540526\n        !/^(data|time|rtc|rb)$/.test(tag)) {\n          warn('Unknown custom element: <' + tag + '> - did you ' + 'register the component correctly? For recursive components, ' + 'make sure to provide the \"name\" option.');\n        }\n      }\n    }\n  } else if (hasAttrs) {\n    return getIsBinding(el);\n  }\n}\n\n/**\n * Get \"is\" binding from an element.\n *\n * @param {Element} el\n * @return {Object|undefined}\n */\n\nfunction getIsBinding(el) {\n  // dynamic syntax\n  var exp = getAttr(el, 'is');\n  if (exp != null) {\n    return { id: exp };\n  } else {\n    exp = getBindAttr(el, 'is');\n    if (exp != null) {\n      return { id: exp, dynamic: true };\n    }\n  }\n}\n\n/**\n * Set a prop's initial value on a vm and its data object.\n *\n * @param {Vue} vm\n * @param {Object} prop\n * @param {*} value\n */\n\nfunction initProp(vm, prop, value) {\n  var key = prop.path;\n  value = coerceProp(prop, value);\n  vm[key] = vm._data[key] = assertProp(prop, value) ? value : undefined;\n}\n\n/**\n * Assert whether a prop is valid.\n *\n * @param {Object} prop\n * @param {*} value\n */\n\nfunction assertProp(prop, value) {\n  // if a prop is not provided and is not required,\n  // skip the check.\n  if (prop.raw === null && !prop.required) {\n    return true;\n  }\n  var options = prop.options;\n  var type = options.type;\n  var valid = true;\n  var expectedType;\n  if (type) {\n    if (type === String) {\n      expectedType = 'string';\n      valid = typeof value === expectedType;\n    } else if (type === Number) {\n      expectedType = 'number';\n      valid = typeof value === 'number';\n    } else if (type === Boolean) {\n      expectedType = 'boolean';\n      valid = typeof value === 'boolean';\n    } else if (type === Function) {\n      expectedType = 'function';\n      valid = typeof value === 'function';\n    } else if (type === Object) {\n      expectedType = 'object';\n      valid = isPlainObject(value);\n    } else if (type === Array) {\n      expectedType = 'array';\n      valid = isArray(value);\n    } else {\n      valid = value instanceof type;\n    }\n  }\n  if (!valid) {\n    process.env.NODE_ENV !== 'production' && warn('Invalid prop: type check failed for ' + prop.path + '=\"' + prop.raw + '\".' + ' Expected ' + formatType(expectedType) + ', got ' + formatValue(value) + '.');\n    return false;\n  }\n  var validator = options.validator;\n  if (validator) {\n    if (!validator.call(null, value)) {\n      process.env.NODE_ENV !== 'production' && warn('Invalid prop: custom validator check failed for ' + prop.path + '=\"' + prop.raw + '\"');\n      return false;\n    }\n  }\n  return true;\n}\n\n/**\n * Force parsing value with coerce option.\n *\n * @param {*} value\n * @param {Object} options\n * @return {*}\n */\n\nfunction coerceProp(prop, value) {\n  var coerce = prop.options.coerce;\n  if (!coerce) {\n    return value;\n  }\n  // coerce is a function\n  return coerce(value);\n}\n\nfunction formatType(val) {\n  return val ? val.charAt(0).toUpperCase() + val.slice(1) : 'custom type';\n}\n\nfunction formatValue(val) {\n  return Object.prototype.toString.call(val).slice(8, -1);\n}\n\n/**\n * Option overwriting strategies are functions that handle\n * how to merge a parent option value and a child option\n * value into the final value.\n *\n * All strategy functions follow the same signature:\n *\n * @param {*} parentVal\n * @param {*} childVal\n * @param {Vue} [vm]\n */\n\nvar strats = config.optionMergeStrategies = Object.create(null);\n\n/**\n * Helper that recursively merges two data objects together.\n */\n\nfunction mergeData(to, from) {\n  var key, toVal, fromVal;\n  for (key in from) {\n    toVal = to[key];\n    fromVal = from[key];\n    if (!hasOwn(to, key)) {\n      set(to, key, fromVal);\n    } else if (isObject(toVal) && isObject(fromVal)) {\n      mergeData(toVal, fromVal);\n    }\n  }\n  return to;\n}\n\n/**\n * Data\n */\n\nstrats.data = function (parentVal, childVal, vm) {\n  if (!vm) {\n    // in a Vue.extend merge, both should be functions\n    if (!childVal) {\n      return parentVal;\n    }\n    if (typeof childVal !== 'function') {\n      process.env.NODE_ENV !== 'production' && warn('The \"data\" option should be a function ' + 'that returns a per-instance value in component ' + 'definitions.');\n      return parentVal;\n    }\n    if (!parentVal) {\n      return childVal;\n    }\n    // when parentVal & childVal are both present,\n    // we need to return a function that returns the\n    // merged result of both functions... no need to\n    // check if parentVal is a function here because\n    // it has to be a function to pass previous merges.\n    return function mergedDataFn() {\n      return mergeData(childVal.call(this), parentVal.call(this));\n    };\n  } else if (parentVal || childVal) {\n    return function mergedInstanceDataFn() {\n      // instance merge\n      var instanceData = typeof childVal === 'function' ? childVal.call(vm) : childVal;\n      var defaultData = typeof parentVal === 'function' ? parentVal.call(vm) : undefined;\n      if (instanceData) {\n        return mergeData(instanceData, defaultData);\n      } else {\n        return defaultData;\n      }\n    };\n  }\n};\n\n/**\n * El\n */\n\nstrats.el = function (parentVal, childVal, vm) {\n  if (!vm && childVal && typeof childVal !== 'function') {\n    process.env.NODE_ENV !== 'production' && warn('The \"el\" option should be a function ' + 'that returns a per-instance value in component ' + 'definitions.');\n    return;\n  }\n  var ret = childVal || parentVal;\n  // invoke the element factory if this is instance merge\n  return vm && typeof ret === 'function' ? ret.call(vm) : ret;\n};\n\n/**\n * Hooks and param attributes are merged as arrays.\n */\n\nstrats.init = strats.created = strats.ready = strats.attached = strats.detached = strats.beforeCompile = strats.compiled = strats.beforeDestroy = strats.destroyed = function (parentVal, childVal) {\n  return childVal ? parentVal ? parentVal.concat(childVal) : isArray(childVal) ? childVal : [childVal] : parentVal;\n};\n\n/**\n * 0.11 deprecation warning\n */\n\nstrats.paramAttributes = function () {\n  /* istanbul ignore next */\n  process.env.NODE_ENV !== 'production' && warn('\"paramAttributes\" option has been deprecated in 0.12. ' + 'Use \"props\" instead.');\n};\n\n/**\n * Assets\n *\n * When a vm is present (instance creation), we need to do\n * a three-way merge between constructor options, instance\n * options and parent options.\n */\n\nfunction mergeAssets(parentVal, childVal) {\n  var res = Object.create(parentVal);\n  return childVal ? extend(res, guardArrayAssets(childVal)) : res;\n}\n\nconfig._assetTypes.forEach(function (type) {\n  strats[type + 's'] = mergeAssets;\n});\n\n/**\n * Events & Watchers.\n *\n * Events & watchers hashes should not overwrite one\n * another, so we merge them as arrays.\n */\n\nstrats.watch = strats.events = function (parentVal, childVal) {\n  if (!childVal) return parentVal;\n  if (!parentVal) return childVal;\n  var ret = {};\n  extend(ret, parentVal);\n  for (var key in childVal) {\n    var parent = ret[key];\n    var child = childVal[key];\n    if (parent && !isArray(parent)) {\n      parent = [parent];\n    }\n    ret[key] = parent ? parent.concat(child) : [child];\n  }\n  return ret;\n};\n\n/**\n * Other object hashes.\n */\n\nstrats.props = strats.methods = strats.computed = function (parentVal, childVal) {\n  if (!childVal) return parentVal;\n  if (!parentVal) return childVal;\n  var ret = Object.create(null);\n  extend(ret, parentVal);\n  extend(ret, childVal);\n  return ret;\n};\n\n/**\n * Default strategy.\n */\n\nvar defaultStrat = function defaultStrat(parentVal, childVal) {\n  return childVal === undefined ? parentVal : childVal;\n};\n\n/**\n * Make sure component options get converted to actual\n * constructors.\n *\n * @param {Object} options\n */\n\nfunction guardComponents(options) {\n  if (options.components) {\n    var components = options.components = guardArrayAssets(options.components);\n    var def;\n    var ids = Object.keys(components);\n    for (var i = 0, l = ids.length; i < l; i++) {\n      var key = ids[i];\n      if (commonTagRE.test(key) || reservedTagRE.test(key)) {\n        process.env.NODE_ENV !== 'production' && warn('Do not use built-in or reserved HTML elements as component ' + 'id: ' + key);\n        continue;\n      }\n      def = components[key];\n      if (isPlainObject(def)) {\n        components[key] = Vue.extend(def);\n      }\n    }\n  }\n}\n\n/**\n * Ensure all props option syntax are normalized into the\n * Object-based format.\n *\n * @param {Object} options\n */\n\nfunction guardProps(options) {\n  var props = options.props;\n  var i, val;\n  if (isArray(props)) {\n    options.props = {};\n    i = props.length;\n    while (i--) {\n      val = props[i];\n      if (typeof val === 'string') {\n        options.props[val] = null;\n      } else if (val.name) {\n        options.props[val.name] = val;\n      }\n    }\n  } else if (isPlainObject(props)) {\n    var keys = Object.keys(props);\n    i = keys.length;\n    while (i--) {\n      val = props[keys[i]];\n      if (typeof val === 'function') {\n        props[keys[i]] = { type: val };\n      }\n    }\n  }\n}\n\n/**\n * Guard an Array-format assets option and converted it\n * into the key-value Object format.\n *\n * @param {Object|Array} assets\n * @return {Object}\n */\n\nfunction guardArrayAssets(assets) {\n  if (isArray(assets)) {\n    var res = {};\n    var i = assets.length;\n    var asset;\n    while (i--) {\n      asset = assets[i];\n      var id = typeof asset === 'function' ? asset.options && asset.options.name || asset.id : asset.name || asset.id;\n      if (!id) {\n        process.env.NODE_ENV !== 'production' && warn('Array-syntax assets must provide a \"name\" or \"id\" field.');\n      } else {\n        res[id] = asset;\n      }\n    }\n    return res;\n  }\n  return assets;\n}\n\n/**\n * Merge two option objects into a new one.\n * Core utility used in both instantiation and inheritance.\n *\n * @param {Object} parent\n * @param {Object} child\n * @param {Vue} [vm] - if vm is present, indicates this is\n *                     an instantiation merge.\n */\n\nfunction mergeOptions(parent, child, vm) {\n  guardComponents(child);\n  guardProps(child);\n  var options = {};\n  var key;\n  if (child.mixins) {\n    for (var i = 0, l = child.mixins.length; i < l; i++) {\n      parent = mergeOptions(parent, child.mixins[i], vm);\n    }\n  }\n  for (key in parent) {\n    mergeField(key);\n  }\n  for (key in child) {\n    if (!hasOwn(parent, key)) {\n      mergeField(key);\n    }\n  }\n  function mergeField(key) {\n    var strat = strats[key] || defaultStrat;\n    options[key] = strat(parent[key], child[key], vm, key);\n  }\n  return options;\n}\n\n/**\n * Resolve an asset.\n * This function is used because child instances need access\n * to assets defined in its ancestor chain.\n *\n * @param {Object} options\n * @param {String} type\n * @param {String} id\n * @return {Object|Function}\n */\n\nfunction resolveAsset(options, type, id) {\n  /* istanbul ignore if */\n  if (typeof id !== 'string') {\n    return;\n  }\n  var assets = options[type];\n  var camelizedId;\n  return assets[id] ||\n  // camelCase ID\n  assets[camelizedId = camelize(id)] ||\n  // Pascal Case ID\n  assets[camelizedId.charAt(0).toUpperCase() + camelizedId.slice(1)];\n}\n\n/**\n * Assert asset exists\n */\n\nfunction assertAsset(val, type, id) {\n  if (!val) {\n    process.env.NODE_ENV !== 'production' && warn('Failed to resolve ' + type + ': ' + id);\n  }\n}\n\nvar arrayProto = Array.prototype;\nvar arrayMethods = Object.create(arrayProto)\n\n/**\n * Intercept mutating methods and emit events\n */\n\n;['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'].forEach(function (method) {\n  // cache original method\n  var original = arrayProto[method];\n  def(arrayMethods, method, function mutator() {\n    // avoid leaking arguments:\n    // http://jsperf.com/closure-with-arguments\n    var i = arguments.length;\n    var args = new Array(i);\n    while (i--) {\n      args[i] = arguments[i];\n    }\n    var result = original.apply(this, args);\n    var ob = this.__ob__;\n    var inserted;\n    switch (method) {\n      case 'push':\n        inserted = args;\n        break;\n      case 'unshift':\n        inserted = args;\n        break;\n      case 'splice':\n        inserted = args.slice(2);\n        break;\n    }\n    if (inserted) ob.observeArray(inserted);\n    // notify change\n    ob.dep.notify();\n    return result;\n  });\n});\n\n/**\n * Swap the element at the given index with a new value\n * and emits corresponding event.\n *\n * @param {Number} index\n * @param {*} val\n * @return {*} - replaced element\n */\n\ndef(arrayProto, '$set', function $set(index, val) {\n  if (index >= this.length) {\n    this.length = Number(index) + 1;\n  }\n  return this.splice(index, 1, val)[0];\n});\n\n/**\n * Convenience method to remove the element at given index.\n *\n * @param {Number} index\n * @param {*} val\n */\n\ndef(arrayProto, '$remove', function $remove(item) {\n  /* istanbul ignore if */\n  if (!this.length) return;\n  var index = indexOf(this, item);\n  if (index > -1) {\n    return this.splice(index, 1);\n  }\n});\n\nvar uid$3 = 0;\n\n/**\n * A dep is an observable that can have multiple\n * directives subscribing to it.\n *\n * @constructor\n */\nfunction Dep() {\n  this.id = uid$3++;\n  this.subs = [];\n}\n\n// the current target watcher being evaluated.\n// this is globally unique because there could be only one\n// watcher being evaluated at any time.\nDep.target = null;\n\n/**\n * Add a directive subscriber.\n *\n * @param {Directive} sub\n */\n\nDep.prototype.addSub = function (sub) {\n  this.subs.push(sub);\n};\n\n/**\n * Remove a directive subscriber.\n *\n * @param {Directive} sub\n */\n\nDep.prototype.removeSub = function (sub) {\n  this.subs.$remove(sub);\n};\n\n/**\n * Add self as a dependency to the target watcher.\n */\n\nDep.prototype.depend = function () {\n  Dep.target.addDep(this);\n};\n\n/**\n * Notify all subscribers of a new value.\n */\n\nDep.prototype.notify = function () {\n  // stablize the subscriber list first\n  var subs = toArray(this.subs);\n  for (var i = 0, l = subs.length; i < l; i++) {\n    subs[i].update();\n  }\n};\n\nvar arrayKeys = Object.getOwnPropertyNames(arrayMethods);\n\n/**\n * Observer class that are attached to each observed\n * object. Once attached, the observer converts target\n * object's property keys into getter/setters that\n * collect dependencies and dispatches updates.\n *\n * @param {Array|Object} value\n * @constructor\n */\n\nfunction Observer(value) {\n  this.value = value;\n  this.dep = new Dep();\n  def(value, '__ob__', this);\n  if (isArray(value)) {\n    var augment = hasProto ? protoAugment : copyAugment;\n    augment(value, arrayMethods, arrayKeys);\n    this.observeArray(value);\n  } else {\n    this.walk(value);\n  }\n}\n\n// Instance methods\n\n/**\n * Walk through each property and convert them into\n * getter/setters. This method should only be called when\n * value type is Object.\n *\n * @param {Object} obj\n */\n\nObserver.prototype.walk = function (obj) {\n  var keys = Object.keys(obj);\n  for (var i = 0, l = keys.length; i < l; i++) {\n    this.convert(keys[i], obj[keys[i]]);\n  }\n};\n\n/**\n * Observe a list of Array items.\n *\n * @param {Array} items\n */\n\nObserver.prototype.observeArray = function (items) {\n  for (var i = 0, l = items.length; i < l; i++) {\n    observe(items[i]);\n  }\n};\n\n/**\n * Convert a property into getter/setter so we can emit\n * the events when the property is accessed/changed.\n *\n * @param {String} key\n * @param {*} val\n */\n\nObserver.prototype.convert = function (key, val) {\n  defineReactive(this.value, key, val);\n};\n\n/**\n * Add an owner vm, so that when $set/$delete mutations\n * happen we can notify owner vms to proxy the keys and\n * digest the watchers. This is only called when the object\n * is observed as an instance's root $data.\n *\n * @param {Vue} vm\n */\n\nObserver.prototype.addVm = function (vm) {\n  (this.vms || (this.vms = [])).push(vm);\n};\n\n/**\n * Remove an owner vm. This is called when the object is\n * swapped out as an instance's $data object.\n *\n * @param {Vue} vm\n */\n\nObserver.prototype.removeVm = function (vm) {\n  this.vms.$remove(vm);\n};\n\n// helpers\n\n/**\n * Augment an target Object or Array by intercepting\n * the prototype chain using __proto__\n *\n * @param {Object|Array} target\n * @param {Object} proto\n */\n\nfunction protoAugment(target, src) {\n  target.__proto__ = src;\n}\n\n/**\n * Augment an target Object or Array by defining\n * hidden properties.\n *\n * @param {Object|Array} target\n * @param {Object} proto\n */\n\nfunction copyAugment(target, src, keys) {\n  for (var i = 0, l = keys.length; i < l; i++) {\n    var key = keys[i];\n    def(target, key, src[key]);\n  }\n}\n\n/**\n * Attempt to create an observer instance for a value,\n * returns the new observer if successfully observed,\n * or the existing observer if the value already has one.\n *\n * @param {*} value\n * @param {Vue} [vm]\n * @return {Observer|undefined}\n * @static\n */\n\nfunction observe(value, vm) {\n  if (!value || typeof value !== 'object') {\n    return;\n  }\n  var ob;\n  if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {\n    ob = value.__ob__;\n  } else if ((isArray(value) || isPlainObject(value)) && Object.isExtensible(value) && !value._isVue) {\n    ob = new Observer(value);\n  }\n  if (ob && vm) {\n    ob.addVm(vm);\n  }\n  return ob;\n}\n\n/**\n * Define a reactive property on an Object.\n *\n * @param {Object} obj\n * @param {String} key\n * @param {*} val\n */\n\nfunction defineReactive(obj, key, val) {\n  var dep = new Dep();\n\n  // cater for pre-defined getter/setters\n  var getter, setter;\n  if (config.convertAllProperties) {\n    var property = Object.getOwnPropertyDescriptor(obj, key);\n    if (property && property.configurable === false) {\n      return;\n    }\n    getter = property && property.get;\n    setter = property && property.set;\n  }\n\n  var childOb = observe(val);\n  Object.defineProperty(obj, key, {\n    enumerable: true,\n    configurable: true,\n    get: function reactiveGetter() {\n      var value = getter ? getter.call(obj) : val;\n      if (Dep.target) {\n        dep.depend();\n        if (childOb) {\n          childOb.dep.depend();\n        }\n        if (isArray(value)) {\n          for (var e, i = 0, l = value.length; i < l; i++) {\n            e = value[i];\n            e && e.__ob__ && e.__ob__.dep.depend();\n          }\n        }\n      }\n      return value;\n    },\n    set: function reactiveSetter(newVal) {\n      var value = getter ? getter.call(obj) : val;\n      if (newVal === value) {\n        return;\n      }\n      if (setter) {\n        setter.call(obj, newVal);\n      } else {\n        val = newVal;\n      }\n      childOb = observe(newVal);\n      dep.notify();\n    }\n  });\n}\n\nvar util = Object.freeze({\n\tdefineReactive: defineReactive,\n\tset: set,\n\tdel: del,\n\thasOwn: hasOwn,\n\tisLiteral: isLiteral,\n\tisReserved: isReserved,\n\t_toString: _toString,\n\ttoNumber: toNumber,\n\ttoBoolean: toBoolean,\n\tstripQuotes: stripQuotes,\n\tcamelize: camelize,\n\thyphenate: hyphenate,\n\tclassify: classify,\n\tbind: bind$1,\n\ttoArray: toArray,\n\textend: extend,\n\tisObject: isObject,\n\tisPlainObject: isPlainObject,\n\tdef: def,\n\tdebounce: _debounce,\n\tindexOf: indexOf,\n\tcancellable: cancellable,\n\tlooseEqual: looseEqual,\n\tisArray: isArray,\n\thasProto: hasProto,\n\tinBrowser: inBrowser,\n\tdevtools: devtools,\n\tisIE9: isIE9,\n\tisAndroid: isAndroid,\n\tget transitionProp () { return transitionProp; },\n\tget transitionEndEvent () { return transitionEndEvent; },\n\tget animationProp () { return animationProp; },\n\tget animationEndEvent () { return animationEndEvent; },\n\tnextTick: nextTick,\n\tquery: query,\n\tinDoc: inDoc,\n\tgetAttr: getAttr,\n\tgetBindAttr: getBindAttr,\n\thasBindAttr: hasBindAttr,\n\tbefore: before,\n\tafter: after,\n\tremove: remove,\n\tprepend: prepend,\n\treplace: replace,\n\ton: on$1,\n\toff: off,\n\tsetClass: setClass,\n\taddClass: addClass,\n\tremoveClass: removeClass,\n\textractContent: extractContent,\n\ttrimNode: trimNode,\n\tisTemplate: isTemplate,\n\tcreateAnchor: createAnchor,\n\tfindRef: findRef,\n\tmapNodeRange: mapNodeRange,\n\tremoveNodeRange: removeNodeRange,\n\tmergeOptions: mergeOptions,\n\tresolveAsset: resolveAsset,\n\tassertAsset: assertAsset,\n\tcheckComponentAttr: checkComponentAttr,\n\tinitProp: initProp,\n\tassertProp: assertProp,\n\tcoerceProp: coerceProp,\n\tcommonTagRE: commonTagRE,\n\treservedTagRE: reservedTagRE,\n\tget warn () { return warn; }\n});\n\nvar uid = 0;\n\nfunction initMixin (Vue) {\n\n  /**\n   * The main init sequence. This is called for every\n   * instance, including ones that are created from extended\n   * constructors.\n   *\n   * @param {Object} options - this options object should be\n   *                           the result of merging class\n   *                           options and the options passed\n   *                           in to the constructor.\n   */\n\n  Vue.prototype._init = function (options) {\n\n    options = options || {};\n\n    this.$el = null;\n    this.$parent = options.parent;\n    this.$root = this.$parent ? this.$parent.$root : this;\n    this.$children = [];\n    this.$refs = {}; // child vm references\n    this.$els = {}; // element references\n    this._watchers = []; // all watchers as an array\n    this._directives = []; // all directives\n\n    // a uid\n    this._uid = uid++;\n\n    // a flag to avoid this being observed\n    this._isVue = true;\n\n    // events bookkeeping\n    this._events = {}; // registered callbacks\n    this._eventsCount = {}; // for $broadcast optimization\n\n    // fragment instance properties\n    this._isFragment = false;\n    this._fragment = // @type {DocumentFragment}\n    this._fragmentStart = // @type {Text|Comment}\n    this._fragmentEnd = null; // @type {Text|Comment}\n\n    // lifecycle state\n    this._isCompiled = this._isDestroyed = this._isReady = this._isAttached = this._isBeingDestroyed = this._vForRemoving = false;\n    this._unlinkFn = null;\n\n    // context:\n    // if this is a transcluded component, context\n    // will be the common parent vm of this instance\n    // and its host.\n    this._context = options._context || this.$parent;\n\n    // scope:\n    // if this is inside an inline v-for, the scope\n    // will be the intermediate scope created for this\n    // repeat fragment. this is used for linking props\n    // and container directives.\n    this._scope = options._scope;\n\n    // fragment:\n    // if this instance is compiled inside a Fragment, it\n    // needs to reigster itself as a child of that fragment\n    // for attach/detach to work properly.\n    this._frag = options._frag;\n    if (this._frag) {\n      this._frag.children.push(this);\n    }\n\n    // push self into parent / transclusion host\n    if (this.$parent) {\n      this.$parent.$children.push(this);\n    }\n\n    // save raw constructor data before merge\n    // so that we know which properties are provided at\n    // instantiation.\n    if (process.env.NODE_ENV !== 'production') {\n      this._runtimeData = options.data;\n    }\n\n    // merge options.\n    options = this.$options = mergeOptions(this.constructor.options, options, this);\n\n    // set ref\n    this._updateRef();\n\n    // initialize data as empty object.\n    // it will be filled up in _initScope().\n    this._data = {};\n\n    // call init hook\n    this._callHook('init');\n\n    // initialize data observation and scope inheritance.\n    this._initState();\n\n    // setup event system and option events.\n    this._initEvents();\n\n    // call created hook\n    this._callHook('created');\n\n    // if `el` option is passed, start compilation.\n    if (options.el) {\n      this.$mount(options.el);\n    }\n  };\n}\n\nvar pathCache = new Cache(1000);\n\n// actions\nvar APPEND = 0;\nvar PUSH = 1;\nvar INC_SUB_PATH_DEPTH = 2;\nvar PUSH_SUB_PATH = 3;\n\n// states\nvar BEFORE_PATH = 0;\nvar IN_PATH = 1;\nvar BEFORE_IDENT = 2;\nvar IN_IDENT = 3;\nvar IN_SUB_PATH = 4;\nvar IN_SINGLE_QUOTE = 5;\nvar IN_DOUBLE_QUOTE = 6;\nvar AFTER_PATH = 7;\nvar ERROR = 8;\n\nvar pathStateMachine = [];\n\npathStateMachine[BEFORE_PATH] = {\n  'ws': [BEFORE_PATH],\n  'ident': [IN_IDENT, APPEND],\n  '[': [IN_SUB_PATH],\n  'eof': [AFTER_PATH]\n};\n\npathStateMachine[IN_PATH] = {\n  'ws': [IN_PATH],\n  '.': [BEFORE_IDENT],\n  '[': [IN_SUB_PATH],\n  'eof': [AFTER_PATH]\n};\n\npathStateMachine[BEFORE_IDENT] = {\n  'ws': [BEFORE_IDENT],\n  'ident': [IN_IDENT, APPEND]\n};\n\npathStateMachine[IN_IDENT] = {\n  'ident': [IN_IDENT, APPEND],\n  '0': [IN_IDENT, APPEND],\n  'number': [IN_IDENT, APPEND],\n  'ws': [IN_PATH, PUSH],\n  '.': [BEFORE_IDENT, PUSH],\n  '[': [IN_SUB_PATH, PUSH],\n  'eof': [AFTER_PATH, PUSH]\n};\n\npathStateMachine[IN_SUB_PATH] = {\n  \"'\": [IN_SINGLE_QUOTE, APPEND],\n  '\"': [IN_DOUBLE_QUOTE, APPEND],\n  '[': [IN_SUB_PATH, INC_SUB_PATH_DEPTH],\n  ']': [IN_PATH, PUSH_SUB_PATH],\n  'eof': ERROR,\n  'else': [IN_SUB_PATH, APPEND]\n};\n\npathStateMachine[IN_SINGLE_QUOTE] = {\n  \"'\": [IN_SUB_PATH, APPEND],\n  'eof': ERROR,\n  'else': [IN_SINGLE_QUOTE, APPEND]\n};\n\npathStateMachine[IN_DOUBLE_QUOTE] = {\n  '\"': [IN_SUB_PATH, APPEND],\n  'eof': ERROR,\n  'else': [IN_DOUBLE_QUOTE, APPEND]\n};\n\n/**\n * Determine the type of a character in a keypath.\n *\n * @param {Char} ch\n * @return {String} type\n */\n\nfunction getPathCharType(ch) {\n  if (ch === undefined) {\n    return 'eof';\n  }\n\n  var code = ch.charCodeAt(0);\n\n  switch (code) {\n    case 0x5B: // [\n    case 0x5D: // ]\n    case 0x2E: // .\n    case 0x22: // \"\n    case 0x27: // '\n    case 0x30:\n      // 0\n      return ch;\n\n    case 0x5F: // _\n    case 0x24:\n      // $\n      return 'ident';\n\n    case 0x20: // Space\n    case 0x09: // Tab\n    case 0x0A: // Newline\n    case 0x0D: // Return\n    case 0xA0: // No-break space\n    case 0xFEFF: // Byte Order Mark\n    case 0x2028: // Line Separator\n    case 0x2029:\n      // Paragraph Separator\n      return 'ws';\n  }\n\n  // a-z, A-Z\n  if (code >= 0x61 && code <= 0x7A || code >= 0x41 && code <= 0x5A) {\n    return 'ident';\n  }\n\n  // 1-9\n  if (code >= 0x31 && code <= 0x39) {\n    return 'number';\n  }\n\n  return 'else';\n}\n\n/**\n * Format a subPath, return its plain form if it is\n * a literal string or number. Otherwise prepend the\n * dynamic indicator (*).\n *\n * @param {String} path\n * @return {String}\n */\n\nfunction formatSubPath(path) {\n  var trimmed = path.trim();\n  // invalid leading 0\n  if (path.charAt(0) === '0' && isNaN(path)) {\n    return false;\n  }\n  return isLiteral(trimmed) ? stripQuotes(trimmed) : '*' + trimmed;\n}\n\n/**\n * Parse a string path into an array of segments\n *\n * @param {String} path\n * @return {Array|undefined}\n */\n\nfunction parse(path) {\n  var keys = [];\n  var index = -1;\n  var mode = BEFORE_PATH;\n  var subPathDepth = 0;\n  var c, newChar, key, type, transition, action, typeMap;\n\n  var actions = [];\n\n  actions[PUSH] = function () {\n    if (key !== undefined) {\n      keys.push(key);\n      key = undefined;\n    }\n  };\n\n  actions[APPEND] = function () {\n    if (key === undefined) {\n      key = newChar;\n    } else {\n      key += newChar;\n    }\n  };\n\n  actions[INC_SUB_PATH_DEPTH] = function () {\n    actions[APPEND]();\n    subPathDepth++;\n  };\n\n  actions[PUSH_SUB_PATH] = function () {\n    if (subPathDepth > 0) {\n      subPathDepth--;\n      mode = IN_SUB_PATH;\n      actions[APPEND]();\n    } else {\n      subPathDepth = 0;\n      key = formatSubPath(key);\n      if (key === false) {\n        return false;\n      } else {\n        actions[PUSH]();\n      }\n    }\n  };\n\n  function maybeUnescapeQuote() {\n    var nextChar = path[index + 1];\n    if (mode === IN_SINGLE_QUOTE && nextChar === \"'\" || mode === IN_DOUBLE_QUOTE && nextChar === '\"') {\n      index++;\n      newChar = '\\\\' + nextChar;\n      actions[APPEND]();\n      return true;\n    }\n  }\n\n  while (mode != null) {\n    index++;\n    c = path[index];\n\n    if (c === '\\\\' && maybeUnescapeQuote()) {\n      continue;\n    }\n\n    type = getPathCharType(c);\n    typeMap = pathStateMachine[mode];\n    transition = typeMap[type] || typeMap['else'] || ERROR;\n\n    if (transition === ERROR) {\n      return; // parse error\n    }\n\n    mode = transition[0];\n    action = actions[transition[1]];\n    if (action) {\n      newChar = transition[2];\n      newChar = newChar === undefined ? c : newChar;\n      if (action() === false) {\n        return;\n      }\n    }\n\n    if (mode === AFTER_PATH) {\n      keys.raw = path;\n      return keys;\n    }\n  }\n}\n\n/**\n * External parse that check for a cache hit first\n *\n * @param {String} path\n * @return {Array|undefined}\n */\n\nfunction parsePath(path) {\n  var hit = pathCache.get(path);\n  if (!hit) {\n    hit = parse(path);\n    if (hit) {\n      pathCache.put(path, hit);\n    }\n  }\n  return hit;\n}\n\n/**\n * Get from an object from a path string\n *\n * @param {Object} obj\n * @param {String} path\n */\n\nfunction getPath(obj, path) {\n  return parseExpression(path).get(obj);\n}\n\n/**\n * Warn against setting non-existent root path on a vm.\n */\n\nvar warnNonExistent;\nif (process.env.NODE_ENV !== 'production') {\n  warnNonExistent = function (path) {\n    warn('You are setting a non-existent path \"' + path.raw + '\" ' + 'on a vm instance. Consider pre-initializing the property ' + 'with the \"data\" option for more reliable reactivity ' + 'and better performance.');\n  };\n}\n\n/**\n * Set on an object from a path\n *\n * @param {Object} obj\n * @param {String | Array} path\n * @param {*} val\n */\n\nfunction setPath(obj, path, val) {\n  var original = obj;\n  if (typeof path === 'string') {\n    path = parse(path);\n  }\n  if (!path || !isObject(obj)) {\n    return false;\n  }\n  var last, key;\n  for (var i = 0, l = path.length; i < l; i++) {\n    last = obj;\n    key = path[i];\n    if (key.charAt(0) === '*') {\n      key = parseExpression(key.slice(1)).get.call(original, original);\n    }\n    if (i < l - 1) {\n      obj = obj[key];\n      if (!isObject(obj)) {\n        obj = {};\n        if (process.env.NODE_ENV !== 'production' && last._isVue) {\n          warnNonExistent(path);\n        }\n        set(last, key, obj);\n      }\n    } else {\n      if (isArray(obj)) {\n        obj.$set(key, val);\n      } else if (key in obj) {\n        obj[key] = val;\n      } else {\n        if (process.env.NODE_ENV !== 'production' && obj._isVue) {\n          warnNonExistent(path);\n        }\n        set(obj, key, val);\n      }\n    }\n  }\n  return true;\n}\n\nvar path = Object.freeze({\n  parsePath: parsePath,\n  getPath: getPath,\n  setPath: setPath\n});\n\nvar expressionCache = new Cache(1000);\n\nvar allowedKeywords = 'Math,Date,this,true,false,null,undefined,Infinity,NaN,' + 'isNaN,isFinite,decodeURI,decodeURIComponent,encodeURI,' + 'encodeURIComponent,parseInt,parseFloat';\nvar allowedKeywordsRE = new RegExp('^(' + allowedKeywords.replace(/,/g, '\\\\b|') + '\\\\b)');\n\n// keywords that don't make sense inside expressions\nvar improperKeywords = 'break,case,class,catch,const,continue,debugger,default,' + 'delete,do,else,export,extends,finally,for,function,if,' + 'import,in,instanceof,let,return,super,switch,throw,try,' + 'var,while,with,yield,enum,await,implements,package,' + 'proctected,static,interface,private,public';\nvar improperKeywordsRE = new RegExp('^(' + improperKeywords.replace(/,/g, '\\\\b|') + '\\\\b)');\n\nvar wsRE = /\\s/g;\nvar newlineRE = /\\n/g;\nvar saveRE = /[\\{,]\\s*[\\w\\$_]+\\s*:|('(?:[^'\\\\]|\\\\.)*'|\"(?:[^\"\\\\]|\\\\.)*\")|new |typeof |void /g;\nvar restoreRE = /\"(\\d+)\"/g;\nvar pathTestRE = /^[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*|\\['.*?'\\]|\\[\".*?\"\\]|\\[\\d+\\]|\\[[A-Za-z_$][\\w$]*\\])*$/;\nvar identRE = /[^\\w$\\.](?:[A-Za-z_$][\\w$]*)/g;\nvar booleanLiteralRE = /^(?:true|false)$/;\n\n/**\n * Save / Rewrite / Restore\n *\n * When rewriting paths found in an expression, it is\n * possible for the same letter sequences to be found in\n * strings and Object literal property keys. Therefore we\n * remove and store these parts in a temporary array, and\n * restore them after the path rewrite.\n */\n\nvar saved = [];\n\n/**\n * Save replacer\n *\n * The save regex can match two possible cases:\n * 1. An opening object literal\n * 2. A string\n * If matched as a plain string, we need to escape its\n * newlines, since the string needs to be preserved when\n * generating the function body.\n *\n * @param {String} str\n * @param {String} isString - str if matched as a string\n * @return {String} - placeholder with index\n */\n\nfunction save(str, isString) {\n  var i = saved.length;\n  saved[i] = isString ? str.replace(newlineRE, '\\\\n') : str;\n  return '\"' + i + '\"';\n}\n\n/**\n * Path rewrite replacer\n *\n * @param {String} raw\n * @return {String}\n */\n\nfunction rewrite(raw) {\n  var c = raw.charAt(0);\n  var path = raw.slice(1);\n  if (allowedKeywordsRE.test(path)) {\n    return raw;\n  } else {\n    path = path.indexOf('\"') > -1 ? path.replace(restoreRE, restore) : path;\n    return c + 'scope.' + path;\n  }\n}\n\n/**\n * Restore replacer\n *\n * @param {String} str\n * @param {String} i - matched save index\n * @return {String}\n */\n\nfunction restore(str, i) {\n  return saved[i];\n}\n\n/**\n * Rewrite an expression, prefixing all path accessors with\n * `scope.` and generate getter/setter functions.\n *\n * @param {String} exp\n * @return {Function}\n */\n\nfunction compileGetter(exp) {\n  if (improperKeywordsRE.test(exp)) {\n    process.env.NODE_ENV !== 'production' && warn('Avoid using reserved keywords in expression: ' + exp);\n  }\n  // reset state\n  saved.length = 0;\n  // save strings and object literal keys\n  var body = exp.replace(saveRE, save).replace(wsRE, '');\n  // rewrite all paths\n  // pad 1 space here becaue the regex matches 1 extra char\n  body = (' ' + body).replace(identRE, rewrite).replace(restoreRE, restore);\n  return makeGetterFn(body);\n}\n\n/**\n * Build a getter function. Requires eval.\n *\n * We isolate the try/catch so it doesn't affect the\n * optimization of the parse function when it is not called.\n *\n * @param {String} body\n * @return {Function|undefined}\n */\n\nfunction makeGetterFn(body) {\n  try {\n    return new Function('scope', 'return ' + body + ';');\n  } catch (e) {\n    process.env.NODE_ENV !== 'production' && warn('Invalid expression. ' + 'Generated function body: ' + body);\n  }\n}\n\n/**\n * Compile a setter function for the expression.\n *\n * @param {String} exp\n * @return {Function|undefined}\n */\n\nfunction compileSetter(exp) {\n  var path = parsePath(exp);\n  if (path) {\n    return function (scope, val) {\n      setPath(scope, path, val);\n    };\n  } else {\n    process.env.NODE_ENV !== 'production' && warn('Invalid setter expression: ' + exp);\n  }\n}\n\n/**\n * Parse an expression into re-written getter/setters.\n *\n * @param {String} exp\n * @param {Boolean} needSet\n * @return {Function}\n */\n\nfunction parseExpression(exp, needSet) {\n  exp = exp.trim();\n  // try cache\n  var hit = expressionCache.get(exp);\n  if (hit) {\n    if (needSet && !hit.set) {\n      hit.set = compileSetter(hit.exp);\n    }\n    return hit;\n  }\n  var res = { exp: exp };\n  res.get = isSimplePath(exp) && exp.indexOf('[') < 0\n  // optimized super simple getter\n  ? makeGetterFn('scope.' + exp)\n  // dynamic getter\n  : compileGetter(exp);\n  if (needSet) {\n    res.set = compileSetter(exp);\n  }\n  expressionCache.put(exp, res);\n  return res;\n}\n\n/**\n * Check if an expression is a simple path.\n *\n * @param {String} exp\n * @return {Boolean}\n */\n\nfunction isSimplePath(exp) {\n  return pathTestRE.test(exp) &&\n  // don't treat true/false as paths\n  !booleanLiteralRE.test(exp) &&\n  // Math constants e.g. Math.PI, Math.E etc.\n  exp.slice(0, 5) !== 'Math.';\n}\n\nvar expression = Object.freeze({\n  parseExpression: parseExpression,\n  isSimplePath: isSimplePath\n});\n\n// we have two separate queues: one for directive updates\n// and one for user watcher registered via $watch().\n// we want to guarantee directive updates to be called\n// before user watchers so that when user watchers are\n// triggered, the DOM would have already been in updated\n// state.\nvar queue = [];\nvar userQueue = [];\nvar has = {};\nvar circular = {};\nvar waiting = false;\nvar internalQueueDepleted = false;\n\n/**\n * Reset the batcher's state.\n */\n\nfunction resetBatcherState() {\n  queue = [];\n  userQueue = [];\n  has = {};\n  circular = {};\n  waiting = internalQueueDepleted = false;\n}\n\n/**\n * Flush both queues and run the watchers.\n */\n\nfunction flushBatcherQueue() {\n  runBatcherQueue(queue);\n  internalQueueDepleted = true;\n  runBatcherQueue(userQueue);\n  // dev tool hook\n  /* istanbul ignore if */\n  if (devtools) {\n    devtools.emit('flush');\n  }\n  resetBatcherState();\n}\n\n/**\n * Run the watchers in a single queue.\n *\n * @param {Array} queue\n */\n\nfunction runBatcherQueue(queue) {\n  // do not cache length because more watchers might be pushed\n  // as we run existing watchers\n  for (var i = 0; i < queue.length; i++) {\n    var watcher = queue[i];\n    var id = watcher.id;\n    has[id] = null;\n    watcher.run();\n    // in dev build, check and stop circular updates.\n    if (process.env.NODE_ENV !== 'production' && has[id] != null) {\n      circular[id] = (circular[id] || 0) + 1;\n      if (circular[id] > config._maxUpdateCount) {\n        queue.splice(has[id], 1);\n        warn('You may have an infinite update loop for watcher ' + 'with expression: ' + watcher.expression);\n      }\n    }\n  }\n}\n\n/**\n * Push a watcher into the watcher queue.\n * Jobs with duplicate IDs will be skipped unless it's\n * pushed when the queue is being flushed.\n *\n * @param {Watcher} watcher\n *   properties:\n *   - {Number} id\n *   - {Function} run\n */\n\nfunction pushWatcher(watcher) {\n  var id = watcher.id;\n  if (has[id] == null) {\n    // if an internal watcher is pushed, but the internal\n    // queue is already depleted, we run it immediately.\n    if (internalQueueDepleted && !watcher.user) {\n      watcher.run();\n      return;\n    }\n    // push watcher into appropriate queue\n    var q = watcher.user ? userQueue : queue;\n    has[id] = q.length;\n    q.push(watcher);\n    // queue the flush\n    if (!waiting) {\n      waiting = true;\n      nextTick(flushBatcherQueue);\n    }\n  }\n}\n\nvar uid$2 = 0;\n\n/**\n * A watcher parses an expression, collects dependencies,\n * and fires callback when the expression value changes.\n * This is used for both the $watch() api and directives.\n *\n * @param {Vue} vm\n * @param {String} expression\n * @param {Function} cb\n * @param {Object} options\n *                 - {Array} filters\n *                 - {Boolean} twoWay\n *                 - {Boolean} deep\n *                 - {Boolean} user\n *                 - {Boolean} sync\n *                 - {Boolean} lazy\n *                 - {Function} [preProcess]\n *                 - {Function} [postProcess]\n * @constructor\n */\nfunction Watcher(vm, expOrFn, cb, options) {\n  // mix in options\n  if (options) {\n    extend(this, options);\n  }\n  var isFn = typeof expOrFn === 'function';\n  this.vm = vm;\n  vm._watchers.push(this);\n  this.expression = isFn ? expOrFn.toString() : expOrFn;\n  this.cb = cb;\n  this.id = ++uid$2; // uid for batching\n  this.active = true;\n  this.dirty = this.lazy; // for lazy watchers\n  this.deps = Object.create(null);\n  this.newDeps = null;\n  this.prevError = null; // for async error stacks\n  // parse expression for getter/setter\n  if (isFn) {\n    this.getter = expOrFn;\n    this.setter = undefined;\n  } else {\n    var res = parseExpression(expOrFn, this.twoWay);\n    this.getter = res.get;\n    this.setter = res.set;\n  }\n  this.value = this.lazy ? undefined : this.get();\n  // state for avoiding false triggers for deep and Array\n  // watchers during vm._digest()\n  this.queued = this.shallow = false;\n}\n\n/**\n * Add a dependency to this directive.\n *\n * @param {Dep} dep\n */\n\nWatcher.prototype.addDep = function (dep) {\n  var id = dep.id;\n  if (!this.newDeps[id]) {\n    this.newDeps[id] = dep;\n    if (!this.deps[id]) {\n      this.deps[id] = dep;\n      dep.addSub(this);\n    }\n  }\n};\n\n/**\n * Evaluate the getter, and re-collect dependencies.\n */\n\nWatcher.prototype.get = function () {\n  this.beforeGet();\n  var scope = this.scope || this.vm;\n  var value;\n  try {\n    value = this.getter.call(scope, scope);\n  } catch (e) {\n    if (process.env.NODE_ENV !== 'production' && config.warnExpressionErrors) {\n      warn('Error when evaluating expression \"' + this.expression + '\". ' + (config.debug ? '' : 'Turn on debug mode to see stack trace.'), e);\n    }\n  }\n  // \"touch\" every property so they are all tracked as\n  // dependencies for deep watching\n  if (this.deep) {\n    traverse(value);\n  }\n  if (this.preProcess) {\n    value = this.preProcess(value);\n  }\n  if (this.filters) {\n    value = scope._applyFilters(value, null, this.filters, false);\n  }\n  if (this.postProcess) {\n    value = this.postProcess(value);\n  }\n  this.afterGet();\n  return value;\n};\n\n/**\n * Set the corresponding value with the setter.\n *\n * @param {*} value\n */\n\nWatcher.prototype.set = function (value) {\n  var scope = this.scope || this.vm;\n  if (this.filters) {\n    value = scope._applyFilters(value, this.value, this.filters, true);\n  }\n  try {\n    this.setter.call(scope, scope, value);\n  } catch (e) {\n    if (process.env.NODE_ENV !== 'production' && config.warnExpressionErrors) {\n      warn('Error when evaluating setter \"' + this.expression + '\"', e);\n    }\n  }\n  // two-way sync for v-for alias\n  var forContext = scope.$forContext;\n  if (forContext && forContext.alias === this.expression) {\n    if (forContext.filters) {\n      process.env.NODE_ENV !== 'production' && warn('It seems you are using two-way binding on ' + 'a v-for alias (' + this.expression + '), and the ' + 'v-for has filters. This will not work properly. ' + 'Either remove the filters or use an array of ' + 'objects and bind to object properties instead.');\n      return;\n    }\n    forContext._withLock(function () {\n      if (scope.$key) {\n        // original is an object\n        forContext.rawValue[scope.$key] = value;\n      } else {\n        forContext.rawValue.$set(scope.$index, value);\n      }\n    });\n  }\n};\n\n/**\n * Prepare for dependency collection.\n */\n\nWatcher.prototype.beforeGet = function () {\n  Dep.target = this;\n  this.newDeps = Object.create(null);\n};\n\n/**\n * Clean up for dependency collection.\n */\n\nWatcher.prototype.afterGet = function () {\n  Dep.target = null;\n  var ids = Object.keys(this.deps);\n  var i = ids.length;\n  while (i--) {\n    var id = ids[i];\n    if (!this.newDeps[id]) {\n      this.deps[id].removeSub(this);\n    }\n  }\n  this.deps = this.newDeps;\n};\n\n/**\n * Subscriber interface.\n * Will be called when a dependency changes.\n *\n * @param {Boolean} shallow\n */\n\nWatcher.prototype.update = function (shallow) {\n  if (this.lazy) {\n    this.dirty = true;\n  } else if (this.sync || !config.async) {\n    this.run();\n  } else {\n    // if queued, only overwrite shallow with non-shallow,\n    // but not the other way around.\n    this.shallow = this.queued ? shallow ? this.shallow : false : !!shallow;\n    this.queued = true;\n    // record before-push error stack in debug mode\n    /* istanbul ignore if */\n    if (process.env.NODE_ENV !== 'production' && config.debug) {\n      this.prevError = new Error('[vue] async stack trace');\n    }\n    pushWatcher(this);\n  }\n};\n\n/**\n * Batcher job interface.\n * Will be called by the batcher.\n */\n\nWatcher.prototype.run = function () {\n  if (this.active) {\n    var value = this.get();\n    if (value !== this.value ||\n    // Deep watchers and watchers on Object/Arrays should fire even\n    // when the value is the same, because the value may\n    // have mutated; but only do so if this is a\n    // non-shallow update (caused by a vm digest).\n    (isObject(value) || this.deep) && !this.shallow) {\n      // set new value\n      var oldValue = this.value;\n      this.value = value;\n      // in debug + async mode, when a watcher callbacks\n      // throws, we also throw the saved before-push error\n      // so the full cross-tick stack trace is available.\n      var prevError = this.prevError;\n      /* istanbul ignore if */\n      if (process.env.NODE_ENV !== 'production' && config.debug && prevError) {\n        this.prevError = null;\n        try {\n          this.cb.call(this.vm, value, oldValue);\n        } catch (e) {\n          nextTick(function () {\n            throw prevError;\n          }, 0);\n          throw e;\n        }\n      } else {\n        this.cb.call(this.vm, value, oldValue);\n      }\n    }\n    this.queued = this.shallow = false;\n  }\n};\n\n/**\n * Evaluate the value of the watcher.\n * This only gets called for lazy watchers.\n */\n\nWatcher.prototype.evaluate = function () {\n  // avoid overwriting another watcher that is being\n  // collected.\n  var current = Dep.target;\n  this.value = this.get();\n  this.dirty = false;\n  Dep.target = current;\n};\n\n/**\n * Depend on all deps collected by this watcher.\n */\n\nWatcher.prototype.depend = function () {\n  var depIds = Object.keys(this.deps);\n  var i = depIds.length;\n  while (i--) {\n    this.deps[depIds[i]].depend();\n  }\n};\n\n/**\n * Remove self from all dependencies' subcriber list.\n */\n\nWatcher.prototype.teardown = function () {\n  if (this.active) {\n    // remove self from vm's watcher list\n    // this is a somewhat expensive operation so we skip it\n    // if the vm is being destroyed or is performing a v-for\n    // re-render (the watcher list is then filtered by v-for).\n    if (!this.vm._isBeingDestroyed && !this.vm._vForRemoving) {\n      this.vm._watchers.$remove(this);\n    }\n    var depIds = Object.keys(this.deps);\n    var i = depIds.length;\n    while (i--) {\n      this.deps[depIds[i]].removeSub(this);\n    }\n    this.active = false;\n    this.vm = this.cb = this.value = null;\n  }\n};\n\n/**\n * Recrusively traverse an object to evoke all converted\n * getters, so that every nested property inside the object\n * is collected as a \"deep\" dependency.\n *\n * @param {*} val\n */\n\nfunction traverse(val) {\n  var i, keys;\n  if (isArray(val)) {\n    i = val.length;\n    while (i--) traverse(val[i]);\n  } else if (isObject(val)) {\n    keys = Object.keys(val);\n    i = keys.length;\n    while (i--) traverse(val[keys[i]]);\n  }\n}\n\nvar cloak = {\n  bind: function bind() {\n    var el = this.el;\n    this.vm.$once('pre-hook:compiled', function () {\n      el.removeAttribute('v-cloak');\n    });\n  }\n};\n\nvar ref = {\n  bind: function bind() {\n    process.env.NODE_ENV !== 'production' && warn('v-ref:' + this.arg + ' must be used on a child ' + 'component. Found on <' + this.el.tagName.toLowerCase() + '>.');\n  }\n};\n\nvar ON = 700;\nvar MODEL = 800;\nvar BIND = 850;\nvar TRANSITION = 1100;\nvar EL = 1500;\nvar COMPONENT = 1500;\nvar PARTIAL = 1750;\nvar FOR = 2000;\nvar IF = 2000;\nvar SLOT = 2100;\n\nvar el = {\n\n  priority: EL,\n\n  bind: function bind() {\n    /* istanbul ignore if */\n    if (!this.arg) {\n      return;\n    }\n    var id = this.id = camelize(this.arg);\n    var refs = (this._scope || this.vm).$els;\n    if (hasOwn(refs, id)) {\n      refs[id] = this.el;\n    } else {\n      defineReactive(refs, id, this.el);\n    }\n  },\n\n  unbind: function unbind() {\n    var refs = (this._scope || this.vm).$els;\n    if (refs[this.id] === this.el) {\n      refs[this.id] = null;\n    }\n  }\n};\n\nvar prefixes = ['-webkit-', '-moz-', '-ms-'];\nvar camelPrefixes = ['Webkit', 'Moz', 'ms'];\nvar importantRE = /!important;?$/;\nvar propCache = Object.create(null);\n\nvar testEl = null;\n\nvar style = {\n\n  deep: true,\n\n  update: function update(value) {\n    if (typeof value === 'string') {\n      this.el.style.cssText = value;\n    } else if (isArray(value)) {\n      this.handleObject(value.reduce(extend, {}));\n    } else {\n      this.handleObject(value || {});\n    }\n  },\n\n  handleObject: function handleObject(value) {\n    // cache object styles so that only changed props\n    // are actually updated.\n    var cache = this.cache || (this.cache = {});\n    var name, val;\n    for (name in cache) {\n      if (!(name in value)) {\n        this.handleSingle(name, null);\n        delete cache[name];\n      }\n    }\n    for (name in value) {\n      val = value[name];\n      if (val !== cache[name]) {\n        cache[name] = val;\n        this.handleSingle(name, val);\n      }\n    }\n  },\n\n  handleSingle: function handleSingle(prop, value) {\n    prop = normalize(prop);\n    if (!prop) return; // unsupported prop\n    // cast possible numbers/booleans into strings\n    if (value != null) value += '';\n    if (value) {\n      var isImportant = importantRE.test(value) ? 'important' : '';\n      if (isImportant) {\n        value = value.replace(importantRE, '').trim();\n      }\n      this.el.style.setProperty(prop, value, isImportant);\n    } else {\n      this.el.style.removeProperty(prop);\n    }\n  }\n\n};\n\n/**\n * Normalize a CSS property name.\n * - cache result\n * - auto prefix\n * - camelCase -> dash-case\n *\n * @param {String} prop\n * @return {String}\n */\n\nfunction normalize(prop) {\n  if (propCache[prop]) {\n    return propCache[prop];\n  }\n  var res = prefix(prop);\n  propCache[prop] = propCache[res] = res;\n  return res;\n}\n\n/**\n * Auto detect the appropriate prefix for a CSS property.\n * https://gist.github.com/paulirish/523692\n *\n * @param {String} prop\n * @return {String}\n */\n\nfunction prefix(prop) {\n  prop = hyphenate(prop);\n  var camel = camelize(prop);\n  var upper = camel.charAt(0).toUpperCase() + camel.slice(1);\n  if (!testEl) {\n    testEl = document.createElement('div');\n  }\n  var i = prefixes.length;\n  var prefixed;\n  while (i--) {\n    prefixed = camelPrefixes[i] + upper;\n    if (prefixed in testEl.style) {\n      return prefixes[i] + prop;\n    }\n  }\n  if (camel in testEl.style) {\n    return prop;\n  }\n}\n\n// xlink\nvar xlinkNS = 'http://www.w3.org/1999/xlink';\nvar xlinkRE = /^xlink:/;\n\n// check for attributes that prohibit interpolations\nvar disallowedInterpAttrRE = /^v-|^:|^@|^(?:is|transition|transition-mode|debounce|track-by|stagger|enter-stagger|leave-stagger)$/;\n// these attributes should also set their corresponding properties\n// because they only affect the initial state of the element\nvar attrWithPropsRE = /^(?:value|checked|selected|muted)$/;\n\n// these attributes should set a hidden property for\n// binding v-model to object values\nvar modelProps = {\n  value: '_value',\n  'true-value': '_trueValue',\n  'false-value': '_falseValue'\n};\n\nvar bind = {\n\n  priority: BIND,\n\n  bind: function bind() {\n    var attr = this.arg;\n    var tag = this.el.tagName;\n    // should be deep watch on object mode\n    if (!attr) {\n      this.deep = true;\n    }\n    // handle interpolation bindings\n    var descriptor = this.descriptor;\n    var tokens = descriptor.interp;\n    if (tokens) {\n      // handle interpolations with one-time tokens\n      if (descriptor.hasOneTime) {\n        this.expression = tokensToExp(tokens, this._scope || this.vm);\n      }\n\n      // only allow binding on native attributes\n      if (disallowedInterpAttrRE.test(attr) || attr === 'name' && (tag === 'PARTIAL' || tag === 'SLOT')) {\n        process.env.NODE_ENV !== 'production' && warn(attr + '=\"' + descriptor.raw + '\": ' + 'attribute interpolation is not allowed in Vue.js ' + 'directives and special attributes.');\n        this.el.removeAttribute(attr);\n        this.invalid = true;\n      }\n\n      /* istanbul ignore if */\n      if (process.env.NODE_ENV !== 'production') {\n        var raw = attr + '=\"' + descriptor.raw + '\": ';\n        // warn src\n        if (attr === 'src') {\n          warn(raw + 'interpolation in \"src\" attribute will cause ' + 'a 404 request. Use v-bind:src instead.');\n        }\n\n        // warn style\n        if (attr === 'style') {\n          warn(raw + 'interpolation in \"style\" attribute will cause ' + 'the attribute to be discarded in Internet Explorer. ' + 'Use v-bind:style instead.');\n        }\n      }\n    }\n  },\n\n  update: function update(value) {\n    if (this.invalid) {\n      return;\n    }\n    var attr = this.arg;\n    if (this.arg) {\n      this.handleSingle(attr, value);\n    } else {\n      this.handleObject(value || {});\n    }\n  },\n\n  // share object handler with v-bind:class\n  handleObject: style.handleObject,\n\n  handleSingle: function handleSingle(attr, value) {\n    var el = this.el;\n    var interp = this.descriptor.interp;\n    if (this.modifiers.camel) {\n      attr = camelize(attr);\n    }\n    if (!interp && attrWithPropsRE.test(attr) && attr in el) {\n      el[attr] = attr === 'value' ? value == null // IE9 will set input.value to \"null\" for null...\n      ? '' : value : value;\n    }\n    // set model props\n    var modelProp = modelProps[attr];\n    if (!interp && modelProp) {\n      el[modelProp] = value;\n      // update v-model if present\n      var model = el.__v_model;\n      if (model) {\n        model.listener();\n      }\n    }\n    // do not set value attribute for textarea\n    if (attr === 'value' && el.tagName === 'TEXTAREA') {\n      el.removeAttribute(attr);\n      return;\n    }\n    // update attribute\n    if (value != null && value !== false) {\n      if (attr === 'class') {\n        // handle edge case #1960:\n        // class interpolation should not overwrite Vue transition class\n        if (el.__v_trans) {\n          value += ' ' + el.__v_trans.id + '-transition';\n        }\n        setClass(el, value);\n      } else if (xlinkRE.test(attr)) {\n        el.setAttributeNS(xlinkNS, attr, value === true ? '' : value);\n      } else {\n        el.setAttribute(attr, value === true ? '' : value);\n      }\n    } else {\n      el.removeAttribute(attr);\n    }\n  }\n};\n\n// keyCode aliases\nvar keyCodes = {\n  esc: 27,\n  tab: 9,\n  enter: 13,\n  space: 32,\n  'delete': [8, 46],\n  up: 38,\n  left: 37,\n  right: 39,\n  down: 40\n};\n\nfunction keyFilter(handler, keys) {\n  var codes = keys.map(function (key) {\n    var charCode = key.charCodeAt(0);\n    if (charCode > 47 && charCode < 58) {\n      return parseInt(key, 10);\n    }\n    if (key.length === 1) {\n      charCode = key.toUpperCase().charCodeAt(0);\n      if (charCode > 64 && charCode < 91) {\n        return charCode;\n      }\n    }\n    return keyCodes[key];\n  });\n  codes = [].concat.apply([], codes);\n  return function keyHandler(e) {\n    if (codes.indexOf(e.keyCode) > -1) {\n      return handler.call(this, e);\n    }\n  };\n}\n\nfunction stopFilter(handler) {\n  return function stopHandler(e) {\n    e.stopPropagation();\n    return handler.call(this, e);\n  };\n}\n\nfunction preventFilter(handler) {\n  return function preventHandler(e) {\n    e.preventDefault();\n    return handler.call(this, e);\n  };\n}\n\nfunction selfFilter(handler) {\n  return function selfHandler(e) {\n    if (e.target === e.currentTarget) {\n      return handler.call(this, e);\n    }\n  };\n}\n\nvar on = {\n\n  acceptStatement: true,\n  priority: ON,\n\n  bind: function bind() {\n    // deal with iframes\n    if (this.el.tagName === 'IFRAME' && this.arg !== 'load') {\n      var self = this;\n      this.iframeBind = function () {\n        on$1(self.el.contentWindow, self.arg, self.handler, self.modifiers.capture);\n      };\n      this.on('load', this.iframeBind);\n    }\n  },\n\n  update: function update(handler) {\n    // stub a noop for v-on with no value,\n    // e.g. @mousedown.prevent\n    if (!this.descriptor.raw) {\n      handler = function () {};\n    }\n\n    if (typeof handler !== 'function') {\n      process.env.NODE_ENV !== 'production' && warn('v-on:' + this.arg + '=\"' + this.expression + '\" expects a function value, ' + 'got ' + handler);\n      return;\n    }\n\n    // apply modifiers\n    if (this.modifiers.stop) {\n      handler = stopFilter(handler);\n    }\n    if (this.modifiers.prevent) {\n      handler = preventFilter(handler);\n    }\n    if (this.modifiers.self) {\n      handler = selfFilter(handler);\n    }\n    // key filter\n    var keys = Object.keys(this.modifiers).filter(function (key) {\n      return key !== 'stop' && key !== 'prevent';\n    });\n    if (keys.length) {\n      handler = keyFilter(handler, keys);\n    }\n\n    this.reset();\n    this.handler = handler;\n\n    if (this.iframeBind) {\n      this.iframeBind();\n    } else {\n      on$1(this.el, this.arg, this.handler, this.modifiers.capture);\n    }\n  },\n\n  reset: function reset() {\n    var el = this.iframeBind ? this.el.contentWindow : this.el;\n    if (this.handler) {\n      off(el, this.arg, this.handler);\n    }\n  },\n\n  unbind: function unbind() {\n    this.reset();\n  }\n};\n\nvar checkbox = {\n\n  bind: function bind() {\n    var self = this;\n    var el = this.el;\n\n    this.getValue = function () {\n      return el.hasOwnProperty('_value') ? el._value : self.params.number ? toNumber(el.value) : el.value;\n    };\n\n    function getBooleanValue() {\n      var val = el.checked;\n      if (val && el.hasOwnProperty('_trueValue')) {\n        return el._trueValue;\n      }\n      if (!val && el.hasOwnProperty('_falseValue')) {\n        return el._falseValue;\n      }\n      return val;\n    }\n\n    this.listener = function () {\n      var model = self._watcher.value;\n      if (isArray(model)) {\n        var val = self.getValue();\n        if (el.checked) {\n          if (indexOf(model, val) < 0) {\n            model.push(val);\n          }\n        } else {\n          model.$remove(val);\n        }\n      } else {\n        self.set(getBooleanValue());\n      }\n    };\n\n    this.on('change', this.listener);\n    if (el.hasAttribute('checked')) {\n      this.afterBind = this.listener;\n    }\n  },\n\n  update: function update(value) {\n    var el = this.el;\n    if (isArray(value)) {\n      el.checked = indexOf(value, this.getValue()) > -1;\n    } else {\n      if (el.hasOwnProperty('_trueValue')) {\n        el.checked = looseEqual(value, el._trueValue);\n      } else {\n        el.checked = !!value;\n      }\n    }\n  }\n};\n\nvar select = {\n\n  bind: function bind() {\n    var self = this;\n    var el = this.el;\n\n    // method to force update DOM using latest value.\n    this.forceUpdate = function () {\n      if (self._watcher) {\n        self.update(self._watcher.get());\n      }\n    };\n\n    // check if this is a multiple select\n    var multiple = this.multiple = el.hasAttribute('multiple');\n\n    // attach listener\n    this.listener = function () {\n      var value = getValue(el, multiple);\n      value = self.params.number ? isArray(value) ? value.map(toNumber) : toNumber(value) : value;\n      self.set(value);\n    };\n    this.on('change', this.listener);\n\n    // if has initial value, set afterBind\n    var initValue = getValue(el, multiple, true);\n    if (multiple && initValue.length || !multiple && initValue !== null) {\n      this.afterBind = this.listener;\n    }\n\n    // All major browsers except Firefox resets\n    // selectedIndex with value -1 to 0 when the element\n    // is appended to a new parent, therefore we have to\n    // force a DOM update whenever that happens...\n    this.vm.$on('hook:attached', this.forceUpdate);\n  },\n\n  update: function update(value) {\n    var el = this.el;\n    el.selectedIndex = -1;\n    var multi = this.multiple && isArray(value);\n    var options = el.options;\n    var i = options.length;\n    var op, val;\n    while (i--) {\n      op = options[i];\n      val = op.hasOwnProperty('_value') ? op._value : op.value;\n      /* eslint-disable eqeqeq */\n      op.selected = multi ? indexOf$1(value, val) > -1 : looseEqual(value, val);\n      /* eslint-enable eqeqeq */\n    }\n  },\n\n  unbind: function unbind() {\n    /* istanbul ignore next */\n    this.vm.$off('hook:attached', this.forceUpdate);\n  }\n};\n\n/**\n * Get select value\n *\n * @param {SelectElement} el\n * @param {Boolean} multi\n * @param {Boolean} init\n * @return {Array|*}\n */\n\nfunction getValue(el, multi, init) {\n  var res = multi ? [] : null;\n  var op, val, selected;\n  for (var i = 0, l = el.options.length; i < l; i++) {\n    op = el.options[i];\n    selected = init ? op.hasAttribute('selected') : op.selected;\n    if (selected) {\n      val = op.hasOwnProperty('_value') ? op._value : op.value;\n      if (multi) {\n        res.push(val);\n      } else {\n        return val;\n      }\n    }\n  }\n  return res;\n}\n\n/**\n * Native Array.indexOf uses strict equal, but in this\n * case we need to match string/numbers with custom equal.\n *\n * @param {Array} arr\n * @param {*} val\n */\n\nfunction indexOf$1(arr, val) {\n  var i = arr.length;\n  while (i--) {\n    if (looseEqual(arr[i], val)) {\n      return i;\n    }\n  }\n  return -1;\n}\n\nvar radio = {\n\n  bind: function bind() {\n    var self = this;\n    var el = this.el;\n\n    this.getValue = function () {\n      // value overwrite via v-bind:value\n      if (el.hasOwnProperty('_value')) {\n        return el._value;\n      }\n      var val = el.value;\n      if (self.params.number) {\n        val = toNumber(val);\n      }\n      return val;\n    };\n\n    this.listener = function () {\n      self.set(self.getValue());\n    };\n    this.on('change', this.listener);\n\n    if (el.hasAttribute('checked')) {\n      this.afterBind = this.listener;\n    }\n  },\n\n  update: function update(value) {\n    this.el.checked = looseEqual(value, this.getValue());\n  }\n};\n\nvar text$2 = {\n\n  bind: function bind() {\n    var self = this;\n    var el = this.el;\n    var isRange = el.type === 'range';\n    var lazy = this.params.lazy;\n    var number = this.params.number;\n    var debounce = this.params.debounce;\n\n    // handle composition events.\n    //   http://blog.evanyou.me/2014/01/03/composition-event/\n    // skip this for Android because it handles composition\n    // events quite differently. Android doesn't trigger\n    // composition events for language input methods e.g.\n    // Chinese, but instead triggers them for spelling\n    // suggestions... (see Discussion/#162)\n    var composing = false;\n    if (!isAndroid && !isRange) {\n      this.on('compositionstart', function () {\n        composing = true;\n      });\n      this.on('compositionend', function () {\n        composing = false;\n        // in IE11 the \"compositionend\" event fires AFTER\n        // the \"input\" event, so the input handler is blocked\n        // at the end... have to call it here.\n        //\n        // #1327: in lazy mode this is unecessary.\n        if (!lazy) {\n          self.listener();\n        }\n      });\n    }\n\n    // prevent messing with the input when user is typing,\n    // and force update on blur.\n    this.focused = false;\n    if (!isRange && !lazy) {\n      this.on('focus', function () {\n        self.focused = true;\n      });\n      this.on('blur', function () {\n        self.focused = false;\n        // do not sync value after fragment removal (#2017)\n        if (!self._frag || self._frag.inserted) {\n          self.rawListener();\n        }\n      });\n    }\n\n    // Now attach the main listener\n    this.listener = this.rawListener = function () {\n      if (composing || !self._bound) {\n        return;\n      }\n      var val = number || isRange ? toNumber(el.value) : el.value;\n      self.set(val);\n      // force update on next tick to avoid lock & same value\n      // also only update when user is not typing\n      nextTick(function () {\n        if (self._bound && !self.focused) {\n          self.update(self._watcher.value);\n        }\n      });\n    };\n\n    // apply debounce\n    if (debounce) {\n      this.listener = _debounce(this.listener, debounce);\n    }\n\n    // Support jQuery events, since jQuery.trigger() doesn't\n    // trigger native events in some cases and some plugins\n    // rely on $.trigger()\n    //\n    // We want to make sure if a listener is attached using\n    // jQuery, it is also removed with jQuery, that's why\n    // we do the check for each directive instance and\n    // store that check result on itself. This also allows\n    // easier test coverage control by unsetting the global\n    // jQuery variable in tests.\n    this.hasjQuery = typeof jQuery === 'function';\n    if (this.hasjQuery) {\n      var method = jQuery.fn.on ? 'on' : 'bind';\n      jQuery(el)[method]('change', this.listener);\n      if (!lazy) {\n        jQuery(el)[method]('input', this.listener);\n      }\n    } else {\n      this.on('change', this.listener);\n      if (!lazy) {\n        this.on('input', this.listener);\n      }\n    }\n\n    // IE9 doesn't fire input event on backspace/del/cut\n    if (!lazy && isIE9) {\n      this.on('cut', function () {\n        nextTick(self.listener);\n      });\n      this.on('keyup', function (e) {\n        if (e.keyCode === 46 || e.keyCode === 8) {\n          self.listener();\n        }\n      });\n    }\n\n    // set initial value if present\n    if (el.hasAttribute('value') || el.tagName === 'TEXTAREA' && el.value.trim()) {\n      this.afterBind = this.listener;\n    }\n  },\n\n  update: function update(value) {\n    this.el.value = _toString(value);\n  },\n\n  unbind: function unbind() {\n    var el = this.el;\n    if (this.hasjQuery) {\n      var method = jQuery.fn.off ? 'off' : 'unbind';\n      jQuery(el)[method]('change', this.listener);\n      jQuery(el)[method]('input', this.listener);\n    }\n  }\n};\n\nvar handlers = {\n  text: text$2,\n  radio: radio,\n  select: select,\n  checkbox: checkbox\n};\n\nvar model = {\n\n  priority: MODEL,\n  twoWay: true,\n  handlers: handlers,\n  params: ['lazy', 'number', 'debounce'],\n\n  /**\n   * Possible elements:\n   *   <select>\n   *   <textarea>\n   *   <input type=\"*\">\n   *     - text\n   *     - checkbox\n   *     - radio\n   *     - number\n   */\n\n  bind: function bind() {\n    // friendly warning...\n    this.checkFilters();\n    if (this.hasRead && !this.hasWrite) {\n      process.env.NODE_ENV !== 'production' && warn('It seems you are using a read-only filter with ' + 'v-model. You might want to use a two-way filter ' + 'to ensure correct behavior.');\n    }\n    var el = this.el;\n    var tag = el.tagName;\n    var handler;\n    if (tag === 'INPUT') {\n      handler = handlers[el.type] || handlers.text;\n    } else if (tag === 'SELECT') {\n      handler = handlers.select;\n    } else if (tag === 'TEXTAREA') {\n      handler = handlers.text;\n    } else {\n      process.env.NODE_ENV !== 'production' && warn('v-model does not support element type: ' + tag);\n      return;\n    }\n    el.__v_model = this;\n    handler.bind.call(this);\n    this.update = handler.update;\n    this._unbind = handler.unbind;\n  },\n\n  /**\n   * Check read/write filter stats.\n   */\n\n  checkFilters: function checkFilters() {\n    var filters = this.filters;\n    if (!filters) return;\n    var i = filters.length;\n    while (i--) {\n      var filter = resolveAsset(this.vm.$options, 'filters', filters[i].name);\n      if (typeof filter === 'function' || filter.read) {\n        this.hasRead = true;\n      }\n      if (filter.write) {\n        this.hasWrite = true;\n      }\n    }\n  },\n\n  unbind: function unbind() {\n    this.el.__v_model = null;\n    this._unbind && this._unbind();\n  }\n};\n\nvar show = {\n\n  bind: function bind() {\n    // check else block\n    var next = this.el.nextElementSibling;\n    if (next && getAttr(next, 'v-else') !== null) {\n      this.elseEl = next;\n    }\n  },\n\n  update: function update(value) {\n    this.apply(this.el, value);\n    if (this.elseEl) {\n      this.apply(this.elseEl, !value);\n    }\n  },\n\n  apply: function apply(el, value) {\n    if (inDoc(el)) {\n      applyTransition(el, value ? 1 : -1, toggle, this.vm);\n    } else {\n      toggle();\n    }\n    function toggle() {\n      el.style.display = value ? '' : 'none';\n    }\n  }\n};\n\nvar templateCache = new Cache(1000);\nvar idSelectorCache = new Cache(1000);\n\nvar map = {\n  efault: [0, '', ''],\n  legend: [1, '<fieldset>', '</fieldset>'],\n  tr: [2, '<table><tbody>', '</tbody></table>'],\n  col: [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>']\n};\n\nmap.td = map.th = [3, '<table><tbody><tr>', '</tr></tbody></table>'];\n\nmap.option = map.optgroup = [1, '<select multiple=\"multiple\">', '</select>'];\n\nmap.thead = map.tbody = map.colgroup = map.caption = map.tfoot = [1, '<table>', '</table>'];\n\nmap.g = map.defs = map.symbol = map.use = map.image = map.text = map.circle = map.ellipse = map.line = map.path = map.polygon = map.polyline = map.rect = [1, '<svg ' + 'xmlns=\"http://www.w3.org/2000/svg\" ' + 'xmlns:xlink=\"http://www.w3.org/1999/xlink\" ' + 'xmlns:ev=\"http://www.w3.org/2001/xml-events\"' + 'version=\"1.1\">', '</svg>'];\n\n/**\n * Check if a node is a supported template node with a\n * DocumentFragment content.\n *\n * @param {Node} node\n * @return {Boolean}\n */\n\nfunction isRealTemplate(node) {\n  return isTemplate(node) && node.content instanceof DocumentFragment;\n}\n\nvar tagRE$1 = /<([\\w:]+)/;\nvar entityRE = /&#?\\w+?;/;\n\n/**\n * Convert a string template to a DocumentFragment.\n * Determines correct wrapping by tag types. Wrapping\n * strategy found in jQuery & component/domify.\n *\n * @param {String} templateString\n * @param {Boolean} raw\n * @return {DocumentFragment}\n */\n\nfunction stringToFragment(templateString, raw) {\n  // try a cache hit first\n  var cacheKey = raw ? templateString : templateString.trim();\n  var hit = templateCache.get(cacheKey);\n  if (hit) {\n    return hit;\n  }\n\n  var frag = document.createDocumentFragment();\n  var tagMatch = templateString.match(tagRE$1);\n  var entityMatch = entityRE.test(templateString);\n\n  if (!tagMatch && !entityMatch) {\n    // text only, return a single text node.\n    frag.appendChild(document.createTextNode(templateString));\n  } else {\n\n    var tag = tagMatch && tagMatch[1];\n    var wrap = map[tag] || map.efault;\n    var depth = wrap[0];\n    var prefix = wrap[1];\n    var suffix = wrap[2];\n    var node = document.createElement('div');\n\n    node.innerHTML = prefix + templateString + suffix;\n    while (depth--) {\n      node = node.lastChild;\n    }\n\n    var child;\n    /* eslint-disable no-cond-assign */\n    while (child = node.firstChild) {\n      /* eslint-enable no-cond-assign */\n      frag.appendChild(child);\n    }\n  }\n  if (!raw) {\n    trimNode(frag);\n  }\n  templateCache.put(cacheKey, frag);\n  return frag;\n}\n\n/**\n * Convert a template node to a DocumentFragment.\n *\n * @param {Node} node\n * @return {DocumentFragment}\n */\n\nfunction nodeToFragment(node) {\n  // if its a template tag and the browser supports it,\n  // its content is already a document fragment.\n  if (isRealTemplate(node)) {\n    trimNode(node.content);\n    return node.content;\n  }\n  // script template\n  if (node.tagName === 'SCRIPT') {\n    return stringToFragment(node.textContent);\n  }\n  // normal node, clone it to avoid mutating the original\n  var clonedNode = cloneNode(node);\n  var frag = document.createDocumentFragment();\n  var child;\n  /* eslint-disable no-cond-assign */\n  while (child = clonedNode.firstChild) {\n    /* eslint-enable no-cond-assign */\n    frag.appendChild(child);\n  }\n  trimNode(frag);\n  return frag;\n}\n\n// Test for the presence of the Safari template cloning bug\n// https://bugs.webkit.org/showug.cgi?id=137755\nvar hasBrokenTemplate = (function () {\n  /* istanbul ignore else */\n  if (inBrowser) {\n    var a = document.createElement('div');\n    a.innerHTML = '<template>1</template>';\n    return !a.cloneNode(true).firstChild.innerHTML;\n  } else {\n    return false;\n  }\n})();\n\n// Test for IE10/11 textarea placeholder clone bug\nvar hasTextareaCloneBug = (function () {\n  /* istanbul ignore else */\n  if (inBrowser) {\n    var t = document.createElement('textarea');\n    t.placeholder = 't';\n    return t.cloneNode(true).value === 't';\n  } else {\n    return false;\n  }\n})();\n\n/**\n * 1. Deal with Safari cloning nested <template> bug by\n *    manually cloning all template instances.\n * 2. Deal with IE10/11 textarea placeholder bug by setting\n *    the correct value after cloning.\n *\n * @param {Element|DocumentFragment} node\n * @return {Element|DocumentFragment}\n */\n\nfunction cloneNode(node) {\n  if (!node.querySelectorAll) {\n    return node.cloneNode();\n  }\n  var res = node.cloneNode(true);\n  var i, original, cloned;\n  /* istanbul ignore if */\n  if (hasBrokenTemplate) {\n    var tempClone = res;\n    if (isRealTemplate(node)) {\n      node = node.content;\n      tempClone = res.content;\n    }\n    original = node.querySelectorAll('template');\n    if (original.length) {\n      cloned = tempClone.querySelectorAll('template');\n      i = cloned.length;\n      while (i--) {\n        cloned[i].parentNode.replaceChild(cloneNode(original[i]), cloned[i]);\n      }\n    }\n  }\n  /* istanbul ignore if */\n  if (hasTextareaCloneBug) {\n    if (node.tagName === 'TEXTAREA') {\n      res.value = node.value;\n    } else {\n      original = node.querySelectorAll('textarea');\n      if (original.length) {\n        cloned = res.querySelectorAll('textarea');\n        i = cloned.length;\n        while (i--) {\n          cloned[i].value = original[i].value;\n        }\n      }\n    }\n  }\n  return res;\n}\n\n/**\n * Process the template option and normalizes it into a\n * a DocumentFragment that can be used as a partial or a\n * instance template.\n *\n * @param {*} template\n *        Possible values include:\n *        - DocumentFragment object\n *        - Node object of type Template\n *        - id selector: '#some-template-id'\n *        - template string: '<div><span>{{msg}}</span></div>'\n * @param {Boolean} shouldClone\n * @param {Boolean} raw\n *        inline HTML interpolation. Do not check for id\n *        selector and keep whitespace in the string.\n * @return {DocumentFragment|undefined}\n */\n\nfunction parseTemplate(template, shouldClone, raw) {\n  var node, frag;\n\n  // if the template is already a document fragment,\n  // do nothing\n  if (template instanceof DocumentFragment) {\n    trimNode(template);\n    return shouldClone ? cloneNode(template) : template;\n  }\n\n  if (typeof template === 'string') {\n    // id selector\n    if (!raw && template.charAt(0) === '#') {\n      // id selector can be cached too\n      frag = idSelectorCache.get(template);\n      if (!frag) {\n        node = document.getElementById(template.slice(1));\n        if (node) {\n          frag = nodeToFragment(node);\n          // save selector to cache\n          idSelectorCache.put(template, frag);\n        }\n      }\n    } else {\n      // normal string template\n      frag = stringToFragment(template, raw);\n    }\n  } else if (template.nodeType) {\n    // a direct node\n    frag = nodeToFragment(template);\n  }\n\n  return frag && shouldClone ? cloneNode(frag) : frag;\n}\n\nvar template = Object.freeze({\n  cloneNode: cloneNode,\n  parseTemplate: parseTemplate\n});\n\n/**\n * Abstraction for a partially-compiled fragment.\n * Can optionally compile content with a child scope.\n *\n * @param {Function} linker\n * @param {Vue} vm\n * @param {DocumentFragment} frag\n * @param {Vue} [host]\n * @param {Object} [scope]\n */\nfunction Fragment(linker, vm, frag, host, scope, parentFrag) {\n  this.children = [];\n  this.childFrags = [];\n  this.vm = vm;\n  this.scope = scope;\n  this.inserted = false;\n  this.parentFrag = parentFrag;\n  if (parentFrag) {\n    parentFrag.childFrags.push(this);\n  }\n  this.unlink = linker(vm, frag, host, scope, this);\n  var single = this.single = frag.childNodes.length === 1 &&\n  // do not go single mode if the only node is an anchor\n  !frag.childNodes[0].__vue_anchor;\n  if (single) {\n    this.node = frag.childNodes[0];\n    this.before = singleBefore;\n    this.remove = singleRemove;\n  } else {\n    this.node = createAnchor('fragment-start');\n    this.end = createAnchor('fragment-end');\n    this.frag = frag;\n    prepend(this.node, frag);\n    frag.appendChild(this.end);\n    this.before = multiBefore;\n    this.remove = multiRemove;\n  }\n  this.node.__vfrag__ = this;\n}\n\n/**\n * Call attach/detach for all components contained within\n * this fragment. Also do so recursively for all child\n * fragments.\n *\n * @param {Function} hook\n */\n\nFragment.prototype.callHook = function (hook) {\n  var i, l;\n  for (i = 0, l = this.childFrags.length; i < l; i++) {\n    this.childFrags[i].callHook(hook);\n  }\n  for (i = 0, l = this.children.length; i < l; i++) {\n    hook(this.children[i]);\n  }\n};\n\n/**\n * Insert fragment before target, single node version\n *\n * @param {Node} target\n * @param {Boolean} withTransition\n */\n\nfunction singleBefore(target, withTransition) {\n  this.inserted = true;\n  var method = withTransition !== false ? beforeWithTransition : before;\n  method(this.node, target, this.vm);\n  if (inDoc(this.node)) {\n    this.callHook(attach);\n  }\n}\n\n/**\n * Remove fragment, single node version\n */\n\nfunction singleRemove() {\n  this.inserted = false;\n  var shouldCallRemove = inDoc(this.node);\n  var self = this;\n  this.beforeRemove();\n  removeWithTransition(this.node, this.vm, function () {\n    if (shouldCallRemove) {\n      self.callHook(detach);\n    }\n    self.destroy();\n  });\n}\n\n/**\n * Insert fragment before target, multi-nodes version\n *\n * @param {Node} target\n * @param {Boolean} withTransition\n */\n\nfunction multiBefore(target, withTransition) {\n  this.inserted = true;\n  var vm = this.vm;\n  var method = withTransition !== false ? beforeWithTransition : before;\n  mapNodeRange(this.node, this.end, function (node) {\n    method(node, target, vm);\n  });\n  if (inDoc(this.node)) {\n    this.callHook(attach);\n  }\n}\n\n/**\n * Remove fragment, multi-nodes version\n */\n\nfunction multiRemove() {\n  this.inserted = false;\n  var self = this;\n  var shouldCallRemove = inDoc(this.node);\n  this.beforeRemove();\n  removeNodeRange(this.node, this.end, this.vm, this.frag, function () {\n    if (shouldCallRemove) {\n      self.callHook(detach);\n    }\n    self.destroy();\n  });\n}\n\n/**\n * Prepare the fragment for removal.\n */\n\nFragment.prototype.beforeRemove = function () {\n  var i, l;\n  for (i = 0, l = this.childFrags.length; i < l; i++) {\n    // call the same method recursively on child\n    // fragments, depth-first\n    this.childFrags[i].beforeRemove(false);\n  }\n  for (i = 0, l = this.children.length; i < l; i++) {\n    // Call destroy for all contained instances,\n    // with remove:false and defer:true.\n    // Defer is necessary because we need to\n    // keep the children to call detach hooks\n    // on them.\n    this.children[i].$destroy(false, true);\n  }\n  var dirs = this.unlink.dirs;\n  for (i = 0, l = dirs.length; i < l; i++) {\n    // disable the watchers on all the directives\n    // so that the rendered content stays the same\n    // during removal.\n    dirs[i]._watcher && dirs[i]._watcher.teardown();\n  }\n};\n\n/**\n * Destroy the fragment.\n */\n\nFragment.prototype.destroy = function () {\n  if (this.parentFrag) {\n    this.parentFrag.childFrags.$remove(this);\n  }\n  this.node.__vfrag__ = null;\n  this.unlink();\n};\n\n/**\n * Call attach hook for a Vue instance.\n *\n * @param {Vue} child\n */\n\nfunction attach(child) {\n  if (!child._isAttached) {\n    child._callHook('attached');\n  }\n}\n\n/**\n * Call detach hook for a Vue instance.\n *\n * @param {Vue} child\n */\n\nfunction detach(child) {\n  if (child._isAttached) {\n    child._callHook('detached');\n  }\n}\n\nvar linkerCache = new Cache(5000);\n\n/**\n * A factory that can be used to create instances of a\n * fragment. Caches the compiled linker if possible.\n *\n * @param {Vue} vm\n * @param {Element|String} el\n */\nfunction FragmentFactory(vm, el) {\n  this.vm = vm;\n  var template;\n  var isString = typeof el === 'string';\n  if (isString || isTemplate(el)) {\n    template = parseTemplate(el, true);\n  } else {\n    template = document.createDocumentFragment();\n    template.appendChild(el);\n  }\n  this.template = template;\n  // linker can be cached, but only for components\n  var linker;\n  var cid = vm.constructor.cid;\n  if (cid > 0) {\n    var cacheId = cid + (isString ? el : el.outerHTML);\n    linker = linkerCache.get(cacheId);\n    if (!linker) {\n      linker = compile(template, vm.$options, true);\n      linkerCache.put(cacheId, linker);\n    }\n  } else {\n    linker = compile(template, vm.$options, true);\n  }\n  this.linker = linker;\n}\n\n/**\n * Create a fragment instance with given host and scope.\n *\n * @param {Vue} host\n * @param {Object} scope\n * @param {Fragment} parentFrag\n */\n\nFragmentFactory.prototype.create = function (host, scope, parentFrag) {\n  var frag = cloneNode(this.template);\n  return new Fragment(this.linker, this.vm, frag, host, scope, parentFrag);\n};\n\nvar vIf = {\n\n  priority: IF,\n\n  bind: function bind() {\n    var el = this.el;\n    if (!el.__vue__) {\n      // check else block\n      var next = el.nextElementSibling;\n      if (next && getAttr(next, 'v-else') !== null) {\n        remove(next);\n        this.elseFactory = new FragmentFactory(this.vm, next);\n      }\n      // check main block\n      this.anchor = createAnchor('v-if');\n      replace(el, this.anchor);\n      this.factory = new FragmentFactory(this.vm, el);\n    } else {\n      process.env.NODE_ENV !== 'production' && warn('v-if=\"' + this.expression + '\" cannot be ' + 'used on an instance root element.');\n      this.invalid = true;\n    }\n  },\n\n  update: function update(value) {\n    if (this.invalid) return;\n    if (value) {\n      if (!this.frag) {\n        this.insert();\n      }\n    } else {\n      this.remove();\n    }\n  },\n\n  insert: function insert() {\n    if (this.elseFrag) {\n      this.elseFrag.remove();\n      this.elseFrag = null;\n    }\n    this.frag = this.factory.create(this._host, this._scope, this._frag);\n    this.frag.before(this.anchor);\n  },\n\n  remove: function remove() {\n    if (this.frag) {\n      this.frag.remove();\n      this.frag = null;\n    }\n    if (this.elseFactory && !this.elseFrag) {\n      this.elseFrag = this.elseFactory.create(this._host, this._scope, this._frag);\n      this.elseFrag.before(this.anchor);\n    }\n  },\n\n  unbind: function unbind() {\n    if (this.frag) {\n      this.frag.destroy();\n    }\n    if (this.elseFrag) {\n      this.elseFrag.destroy();\n    }\n  }\n};\n\nvar uid$1 = 0;\n\nvar vFor = {\n\n  priority: FOR,\n\n  params: ['track-by', 'stagger', 'enter-stagger', 'leave-stagger'],\n\n  bind: function bind() {\n    // support \"item in items\" syntax\n    var inMatch = this.expression.match(/(.*) in (.*)/);\n    if (inMatch) {\n      var itMatch = inMatch[1].match(/\\((.*),(.*)\\)/);\n      if (itMatch) {\n        this.iterator = itMatch[1].trim();\n        this.alias = itMatch[2].trim();\n      } else {\n        this.alias = inMatch[1].trim();\n      }\n      this.expression = inMatch[2];\n    }\n\n    if (!this.alias) {\n      process.env.NODE_ENV !== 'production' && warn('Alias is required in v-for.');\n      return;\n    }\n\n    // uid as a cache identifier\n    this.id = '__v-for__' + ++uid$1;\n\n    // check if this is an option list,\n    // so that we know if we need to update the <select>'s\n    // v-model when the option list has changed.\n    // because v-model has a lower priority than v-for,\n    // the v-model is not bound here yet, so we have to\n    // retrive it in the actual updateModel() function.\n    var tag = this.el.tagName;\n    this.isOption = (tag === 'OPTION' || tag === 'OPTGROUP') && this.el.parentNode.tagName === 'SELECT';\n\n    // setup anchor nodes\n    this.start = createAnchor('v-for-start');\n    this.end = createAnchor('v-for-end');\n    replace(this.el, this.end);\n    before(this.start, this.end);\n\n    // cache\n    this.cache = Object.create(null);\n\n    // fragment factory\n    this.factory = new FragmentFactory(this.vm, this.el);\n  },\n\n  update: function update(data) {\n    this.diff(data);\n    this.updateRef();\n    this.updateModel();\n  },\n\n  /**\n   * Diff, based on new data and old data, determine the\n   * minimum amount of DOM manipulations needed to make the\n   * DOM reflect the new data Array.\n   *\n   * The algorithm diffs the new data Array by storing a\n   * hidden reference to an owner vm instance on previously\n   * seen data. This allows us to achieve O(n) which is\n   * better than a levenshtein distance based algorithm,\n   * which is O(m * n).\n   *\n   * @param {Array} data\n   */\n\n  diff: function diff(data) {\n    // check if the Array was converted from an Object\n    var item = data[0];\n    var convertedFromObject = this.fromObject = isObject(item) && hasOwn(item, '$key') && hasOwn(item, '$value');\n\n    var trackByKey = this.params.trackBy;\n    var oldFrags = this.frags;\n    var frags = this.frags = new Array(data.length);\n    var alias = this.alias;\n    var iterator = this.iterator;\n    var start = this.start;\n    var end = this.end;\n    var inDocument = inDoc(start);\n    var init = !oldFrags;\n    var i, l, frag, key, value, primitive;\n\n    // First pass, go through the new Array and fill up\n    // the new frags array. If a piece of data has a cached\n    // instance for it, we reuse it. Otherwise build a new\n    // instance.\n    for (i = 0, l = data.length; i < l; i++) {\n      item = data[i];\n      key = convertedFromObject ? item.$key : null;\n      value = convertedFromObject ? item.$value : item;\n      primitive = !isObject(value);\n      frag = !init && this.getCachedFrag(value, i, key);\n      if (frag) {\n        // reusable fragment\n        frag.reused = true;\n        // update $index\n        frag.scope.$index = i;\n        // update $key\n        if (key) {\n          frag.scope.$key = key;\n        }\n        // update iterator\n        if (iterator) {\n          frag.scope[iterator] = key !== null ? key : i;\n        }\n        // update data for track-by, object repeat &\n        // primitive values.\n        if (trackByKey || convertedFromObject || primitive) {\n          frag.scope[alias] = value;\n        }\n      } else {\n        // new isntance\n        frag = this.create(value, alias, i, key);\n        frag.fresh = !init;\n      }\n      frags[i] = frag;\n      if (init) {\n        frag.before(end);\n      }\n    }\n\n    // we're done for the initial render.\n    if (init) {\n      return;\n    }\n\n    // Second pass, go through the old fragments and\n    // destroy those who are not reused (and remove them\n    // from cache)\n    var removalIndex = 0;\n    var totalRemoved = oldFrags.length - frags.length;\n    // when removing a large number of fragments, watcher removal\n    // turns out to be a perf bottleneck, so we batch the watcher\n    // removals into a single filter call!\n    this.vm._vForRemoving = true;\n    for (i = 0, l = oldFrags.length; i < l; i++) {\n      frag = oldFrags[i];\n      if (!frag.reused) {\n        this.deleteCachedFrag(frag);\n        this.remove(frag, removalIndex++, totalRemoved, inDocument);\n      }\n    }\n    this.vm._vForRemoving = false;\n    this.vm._watchers = this.vm._watchers.filter(function (w) {\n      return w.active;\n    });\n\n    // Final pass, move/insert new fragments into the\n    // right place.\n    var targetPrev, prevEl, currentPrev;\n    var insertionIndex = 0;\n    for (i = 0, l = frags.length; i < l; i++) {\n      frag = frags[i];\n      // this is the frag that we should be after\n      targetPrev = frags[i - 1];\n      prevEl = targetPrev ? targetPrev.staggerCb ? targetPrev.staggerAnchor : targetPrev.end || targetPrev.node : start;\n      if (frag.reused && !frag.staggerCb) {\n        currentPrev = findPrevFrag(frag, start, this.id);\n        if (currentPrev !== targetPrev && (!currentPrev ||\n        // optimization for moving a single item.\n        // thanks to suggestions by @livoras in #1807\n        findPrevFrag(currentPrev, start, this.id) !== targetPrev)) {\n          this.move(frag, prevEl);\n        }\n      } else {\n        // new instance, or still in stagger.\n        // insert with updated stagger index.\n        this.insert(frag, insertionIndex++, prevEl, inDocument);\n      }\n      frag.reused = frag.fresh = false;\n    }\n  },\n\n  /**\n   * Create a new fragment instance.\n   *\n   * @param {*} value\n   * @param {String} alias\n   * @param {Number} index\n   * @param {String} [key]\n   * @return {Fragment}\n   */\n\n  create: function create(value, alias, index, key) {\n    var host = this._host;\n    // create iteration scope\n    var parentScope = this._scope || this.vm;\n    var scope = Object.create(parentScope);\n    // ref holder for the scope\n    scope.$refs = Object.create(parentScope.$refs);\n    scope.$els = Object.create(parentScope.$els);\n    // make sure point $parent to parent scope\n    scope.$parent = parentScope;\n    // for two-way binding on alias\n    scope.$forContext = this;\n    // define scope properties\n    defineReactive(scope, alias, value);\n    defineReactive(scope, '$index', index);\n    if (key) {\n      defineReactive(scope, '$key', key);\n    } else if (scope.$key) {\n      // avoid accidental fallback\n      def(scope, '$key', null);\n    }\n    if (this.iterator) {\n      defineReactive(scope, this.iterator, key !== null ? key : index);\n    }\n    var frag = this.factory.create(host, scope, this._frag);\n    frag.forId = this.id;\n    this.cacheFrag(value, frag, index, key);\n    return frag;\n  },\n\n  /**\n   * Update the v-ref on owner vm.\n   */\n\n  updateRef: function updateRef() {\n    var ref = this.descriptor.ref;\n    if (!ref) return;\n    var hash = (this._scope || this.vm).$refs;\n    var refs;\n    if (!this.fromObject) {\n      refs = this.frags.map(findVmFromFrag);\n    } else {\n      refs = {};\n      this.frags.forEach(function (frag) {\n        refs[frag.scope.$key] = findVmFromFrag(frag);\n      });\n    }\n    hash[ref] = refs;\n  },\n\n  /**\n   * For option lists, update the containing v-model on\n   * parent <select>.\n   */\n\n  updateModel: function updateModel() {\n    if (this.isOption) {\n      var parent = this.start.parentNode;\n      var model = parent && parent.__v_model;\n      if (model) {\n        model.forceUpdate();\n      }\n    }\n  },\n\n  /**\n   * Insert a fragment. Handles staggering.\n   *\n   * @param {Fragment} frag\n   * @param {Number} index\n   * @param {Node} prevEl\n   * @param {Boolean} inDocument\n   */\n\n  insert: function insert(frag, index, prevEl, inDocument) {\n    if (frag.staggerCb) {\n      frag.staggerCb.cancel();\n      frag.staggerCb = null;\n    }\n    var staggerAmount = this.getStagger(frag, index, null, 'enter');\n    if (inDocument && staggerAmount) {\n      // create an anchor and insert it synchronously,\n      // so that we can resolve the correct order without\n      // worrying about some elements not inserted yet\n      var anchor = frag.staggerAnchor;\n      if (!anchor) {\n        anchor = frag.staggerAnchor = createAnchor('stagger-anchor');\n        anchor.__vfrag__ = frag;\n      }\n      after(anchor, prevEl);\n      var op = frag.staggerCb = cancellable(function () {\n        frag.staggerCb = null;\n        frag.before(anchor);\n        remove(anchor);\n      });\n      setTimeout(op, staggerAmount);\n    } else {\n      frag.before(prevEl.nextSibling);\n    }\n  },\n\n  /**\n   * Remove a fragment. Handles staggering.\n   *\n   * @param {Fragment} frag\n   * @param {Number} index\n   * @param {Number} total\n   * @param {Boolean} inDocument\n   */\n\n  remove: function remove(frag, index, total, inDocument) {\n    if (frag.staggerCb) {\n      frag.staggerCb.cancel();\n      frag.staggerCb = null;\n      // it's not possible for the same frag to be removed\n      // twice, so if we have a pending stagger callback,\n      // it means this frag is queued for enter but removed\n      // before its transition started. Since it is already\n      // destroyed, we can just leave it in detached state.\n      return;\n    }\n    var staggerAmount = this.getStagger(frag, index, total, 'leave');\n    if (inDocument && staggerAmount) {\n      var op = frag.staggerCb = cancellable(function () {\n        frag.staggerCb = null;\n        frag.remove();\n      });\n      setTimeout(op, staggerAmount);\n    } else {\n      frag.remove();\n    }\n  },\n\n  /**\n   * Move a fragment to a new position.\n   * Force no transition.\n   *\n   * @param {Fragment} frag\n   * @param {Node} prevEl\n   */\n\n  move: function move(frag, prevEl) {\n    // fix a common issue with Sortable:\n    // if prevEl doesn't have nextSibling, this means it's\n    // been dragged after the end anchor. Just re-position\n    // the end anchor to the end of the container.\n    /* istanbul ignore if */\n    if (!prevEl.nextSibling) {\n      this.end.parentNode.appendChild(this.end);\n    }\n    frag.before(prevEl.nextSibling, false);\n  },\n\n  /**\n   * Cache a fragment using track-by or the object key.\n   *\n   * @param {*} value\n   * @param {Fragment} frag\n   * @param {Number} index\n   * @param {String} [key]\n   */\n\n  cacheFrag: function cacheFrag(value, frag, index, key) {\n    var trackByKey = this.params.trackBy;\n    var cache = this.cache;\n    var primitive = !isObject(value);\n    var id;\n    if (key || trackByKey || primitive) {\n      id = trackByKey ? trackByKey === '$index' ? index : value[trackByKey] : key || value;\n      if (!cache[id]) {\n        cache[id] = frag;\n      } else if (trackByKey !== '$index') {\n        process.env.NODE_ENV !== 'production' && this.warnDuplicate(value);\n      }\n    } else {\n      id = this.id;\n      if (hasOwn(value, id)) {\n        if (value[id] === null) {\n          value[id] = frag;\n        } else {\n          process.env.NODE_ENV !== 'production' && this.warnDuplicate(value);\n        }\n      } else {\n        def(value, id, frag);\n      }\n    }\n    frag.raw = value;\n  },\n\n  /**\n   * Get a cached fragment from the value/index/key\n   *\n   * @param {*} value\n   * @param {Number} index\n   * @param {String} key\n   * @return {Fragment}\n   */\n\n  getCachedFrag: function getCachedFrag(value, index, key) {\n    var trackByKey = this.params.trackBy;\n    var primitive = !isObject(value);\n    var frag;\n    if (key || trackByKey || primitive) {\n      var id = trackByKey ? trackByKey === '$index' ? index : value[trackByKey] : key || value;\n      frag = this.cache[id];\n    } else {\n      frag = value[this.id];\n    }\n    if (frag && (frag.reused || frag.fresh)) {\n      process.env.NODE_ENV !== 'production' && this.warnDuplicate(value);\n    }\n    return frag;\n  },\n\n  /**\n   * Delete a fragment from cache.\n   *\n   * @param {Fragment} frag\n   */\n\n  deleteCachedFrag: function deleteCachedFrag(frag) {\n    var value = frag.raw;\n    var trackByKey = this.params.trackBy;\n    var scope = frag.scope;\n    var index = scope.$index;\n    // fix #948: avoid accidentally fall through to\n    // a parent repeater which happens to have $key.\n    var key = hasOwn(scope, '$key') && scope.$key;\n    var primitive = !isObject(value);\n    if (trackByKey || key || primitive) {\n      var id = trackByKey ? trackByKey === '$index' ? index : value[trackByKey] : key || value;\n      this.cache[id] = null;\n    } else {\n      value[this.id] = null;\n      frag.raw = null;\n    }\n  },\n\n  /**\n   * Get the stagger amount for an insertion/removal.\n   *\n   * @param {Fragment} frag\n   * @param {Number} index\n   * @param {Number} total\n   * @param {String} type\n   */\n\n  getStagger: function getStagger(frag, index, total, type) {\n    type = type + 'Stagger';\n    var trans = frag.node.__v_trans;\n    var hooks = trans && trans.hooks;\n    var hook = hooks && (hooks[type] || hooks.stagger);\n    return hook ? hook.call(frag, index, total) : index * parseInt(this.params[type] || this.params.stagger, 10);\n  },\n\n  /**\n   * Pre-process the value before piping it through the\n   * filters. This is passed to and called by the watcher.\n   */\n\n  _preProcess: function _preProcess(value) {\n    // regardless of type, store the un-filtered raw value.\n    this.rawValue = value;\n    return value;\n  },\n\n  /**\n   * Post-process the value after it has been piped through\n   * the filters. This is passed to and called by the watcher.\n   *\n   * It is necessary for this to be called during the\n   * wathcer's dependency collection phase because we want\n   * the v-for to update when the source Object is mutated.\n   */\n\n  _postProcess: function _postProcess(value) {\n    if (isArray(value)) {\n      return value;\n    } else if (isPlainObject(value)) {\n      // convert plain object to array.\n      var keys = Object.keys(value);\n      var i = keys.length;\n      var res = new Array(i);\n      var key;\n      while (i--) {\n        key = keys[i];\n        res[i] = {\n          $key: key,\n          $value: value[key]\n        };\n      }\n      return res;\n    } else {\n      if (typeof value === 'number' && !isNaN(value)) {\n        value = range(value);\n      }\n      return value || [];\n    }\n  },\n\n  unbind: function unbind() {\n    if (this.descriptor.ref) {\n      (this._scope || this.vm).$refs[this.descriptor.ref] = null;\n    }\n    if (this.frags) {\n      var i = this.frags.length;\n      var frag;\n      while (i--) {\n        frag = this.frags[i];\n        this.deleteCachedFrag(frag);\n        frag.destroy();\n      }\n    }\n  }\n};\n\n/**\n * Helper to find the previous element that is a fragment\n * anchor. This is necessary because a destroyed frag's\n * element could still be lingering in the DOM before its\n * leaving transition finishes, but its inserted flag\n * should have been set to false so we can skip them.\n *\n * If this is a block repeat, we want to make sure we only\n * return frag that is bound to this v-for. (see #929)\n *\n * @param {Fragment} frag\n * @param {Comment|Text} anchor\n * @param {String} id\n * @return {Fragment}\n */\n\nfunction findPrevFrag(frag, anchor, id) {\n  var el = frag.node.previousSibling;\n  /* istanbul ignore if */\n  if (!el) return;\n  frag = el.__vfrag__;\n  while ((!frag || frag.forId !== id || !frag.inserted) && el !== anchor) {\n    el = el.previousSibling;\n    /* istanbul ignore if */\n    if (!el) return;\n    frag = el.__vfrag__;\n  }\n  return frag;\n}\n\n/**\n * Find a vm from a fragment.\n *\n * @param {Fragment} frag\n * @return {Vue|undefined}\n */\n\nfunction findVmFromFrag(frag) {\n  var node = frag.node;\n  // handle multi-node frag\n  if (frag.end) {\n    while (!node.__vue__ && node !== frag.end && node.nextSibling) {\n      node = node.nextSibling;\n    }\n  }\n  return node.__vue__;\n}\n\n/**\n * Create a range array from given number.\n *\n * @param {Number} n\n * @return {Array}\n */\n\nfunction range(n) {\n  var i = -1;\n  var ret = new Array(Math.floor(n));\n  while (++i < n) {\n    ret[i] = i;\n  }\n  return ret;\n}\n\nif (process.env.NODE_ENV !== 'production') {\n  vFor.warnDuplicate = function (value) {\n    warn('Duplicate value found in v-for=\"' + this.descriptor.raw + '\": ' + JSON.stringify(value) + '. Use track-by=\"$index\" if ' + 'you are expecting duplicate values.');\n  };\n}\n\nvar html = {\n\n  bind: function bind() {\n    // a comment node means this is a binding for\n    // {{{ inline unescaped html }}}\n    if (this.el.nodeType === 8) {\n      // hold nodes\n      this.nodes = [];\n      // replace the placeholder with proper anchor\n      this.anchor = createAnchor('v-html');\n      replace(this.el, this.anchor);\n    }\n  },\n\n  update: function update(value) {\n    value = _toString(value);\n    if (this.nodes) {\n      this.swap(value);\n    } else {\n      this.el.innerHTML = value;\n    }\n  },\n\n  swap: function swap(value) {\n    // remove old nodes\n    var i = this.nodes.length;\n    while (i--) {\n      remove(this.nodes[i]);\n    }\n    // convert new value to a fragment\n    // do not attempt to retrieve from id selector\n    var frag = parseTemplate(value, true, true);\n    // save a reference to these nodes so we can remove later\n    this.nodes = toArray(frag.childNodes);\n    before(frag, this.anchor);\n  }\n};\n\nvar text = {\n\n  bind: function bind() {\n    this.attr = this.el.nodeType === 3 ? 'data' : 'textContent';\n  },\n\n  update: function update(value) {\n    this.el[this.attr] = _toString(value);\n  }\n};\n\n// must export plain object\nvar publicDirectives = {\n  text: text,\n  html: html,\n  'for': vFor,\n  'if': vIf,\n  show: show,\n  model: model,\n  on: on,\n  bind: bind,\n  el: el,\n  ref: ref,\n  cloak: cloak\n};\n\nvar queue$1 = [];\nvar queued = false;\n\n/**\n * Push a job into the queue.\n *\n * @param {Function} job\n */\n\nfunction pushJob(job) {\n  queue$1.push(job);\n  if (!queued) {\n    queued = true;\n    nextTick(flush);\n  }\n}\n\n/**\n * Flush the queue, and do one forced reflow before\n * triggering transitions.\n */\n\nfunction flush() {\n  // Force layout\n  var f = document.documentElement.offsetHeight;\n  for (var i = 0; i < queue$1.length; i++) {\n    queue$1[i]();\n  }\n  queue$1 = [];\n  queued = false;\n  // dummy return, so js linters don't complain about\n  // unused variable f\n  return f;\n}\n\nvar TYPE_TRANSITION = 'transition';\nvar TYPE_ANIMATION = 'animation';\nvar transDurationProp = transitionProp + 'Duration';\nvar animDurationProp = animationProp + 'Duration';\n\n/**\n * A Transition object that encapsulates the state and logic\n * of the transition.\n *\n * @param {Element} el\n * @param {String} id\n * @param {Object} hooks\n * @param {Vue} vm\n */\nfunction Transition(el, id, hooks, vm) {\n  this.id = id;\n  this.el = el;\n  this.enterClass = hooks && hooks.enterClass || id + '-enter';\n  this.leaveClass = hooks && hooks.leaveClass || id + '-leave';\n  this.hooks = hooks;\n  this.vm = vm;\n  // async state\n  this.pendingCssEvent = this.pendingCssCb = this.cancel = this.pendingJsCb = this.op = this.cb = null;\n  this.justEntered = false;\n  this.entered = this.left = false;\n  this.typeCache = {};\n  // check css transition type\n  this.type = hooks && hooks.type;\n  /* istanbul ignore if */\n  if (process.env.NODE_ENV !== 'production') {\n    if (this.type && this.type !== TYPE_TRANSITION && this.type !== TYPE_ANIMATION) {\n      warn('invalid CSS transition type for transition=\"' + this.id + '\": ' + this.type);\n    }\n  }\n  // bind\n  var self = this;['enterNextTick', 'enterDone', 'leaveNextTick', 'leaveDone'].forEach(function (m) {\n    self[m] = bind$1(self[m], self);\n  });\n}\n\nvar p$1 = Transition.prototype;\n\n/**\n * Start an entering transition.\n *\n * 1. enter transition triggered\n * 2. call beforeEnter hook\n * 3. add enter class\n * 4. insert/show element\n * 5. call enter hook (with possible explicit js callback)\n * 6. reflow\n * 7. based on transition type:\n *    - transition:\n *        remove class now, wait for transitionend,\n *        then done if there's no explicit js callback.\n *    - animation:\n *        wait for animationend, remove class,\n *        then done if there's no explicit js callback.\n *    - no css transition:\n *        done now if there's no explicit js callback.\n * 8. wait for either done or js callback, then call\n *    afterEnter hook.\n *\n * @param {Function} op - insert/show the element\n * @param {Function} [cb]\n */\n\np$1.enter = function (op, cb) {\n  this.cancelPending();\n  this.callHook('beforeEnter');\n  this.cb = cb;\n  addClass(this.el, this.enterClass);\n  op();\n  this.entered = false;\n  this.callHookWithCb('enter');\n  if (this.entered) {\n    return; // user called done synchronously.\n  }\n  this.cancel = this.hooks && this.hooks.enterCancelled;\n  pushJob(this.enterNextTick);\n};\n\n/**\n * The \"nextTick\" phase of an entering transition, which is\n * to be pushed into a queue and executed after a reflow so\n * that removing the class can trigger a CSS transition.\n */\n\np$1.enterNextTick = function () {\n\n  // Important hack:\n  // in Chrome, if a just-entered element is applied the\n  // leave class while its interpolated property still has\n  // a very small value (within one frame), Chrome will\n  // skip the leave transition entirely and not firing the\n  // transtionend event. Therefore we need to protected\n  // against such cases using a one-frame timeout.\n  this.justEntered = true;\n  var self = this;\n  setTimeout(function () {\n    self.justEntered = false;\n  }, 17);\n\n  var enterDone = this.enterDone;\n  var type = this.getCssTransitionType(this.enterClass);\n  if (!this.pendingJsCb) {\n    if (type === TYPE_TRANSITION) {\n      // trigger transition by removing enter class now\n      removeClass(this.el, this.enterClass);\n      this.setupCssCb(transitionEndEvent, enterDone);\n    } else if (type === TYPE_ANIMATION) {\n      this.setupCssCb(animationEndEvent, enterDone);\n    } else {\n      enterDone();\n    }\n  } else if (type === TYPE_TRANSITION) {\n    removeClass(this.el, this.enterClass);\n  }\n};\n\n/**\n * The \"cleanup\" phase of an entering transition.\n */\n\np$1.enterDone = function () {\n  this.entered = true;\n  this.cancel = this.pendingJsCb = null;\n  removeClass(this.el, this.enterClass);\n  this.callHook('afterEnter');\n  if (this.cb) this.cb();\n};\n\n/**\n * Start a leaving transition.\n *\n * 1. leave transition triggered.\n * 2. call beforeLeave hook\n * 3. add leave class (trigger css transition)\n * 4. call leave hook (with possible explicit js callback)\n * 5. reflow if no explicit js callback is provided\n * 6. based on transition type:\n *    - transition or animation:\n *        wait for end event, remove class, then done if\n *        there's no explicit js callback.\n *    - no css transition:\n *        done if there's no explicit js callback.\n * 7. wait for either done or js callback, then call\n *    afterLeave hook.\n *\n * @param {Function} op - remove/hide the element\n * @param {Function} [cb]\n */\n\np$1.leave = function (op, cb) {\n  this.cancelPending();\n  this.callHook('beforeLeave');\n  this.op = op;\n  this.cb = cb;\n  addClass(this.el, this.leaveClass);\n  this.left = false;\n  this.callHookWithCb('leave');\n  if (this.left) {\n    return; // user called done synchronously.\n  }\n  this.cancel = this.hooks && this.hooks.leaveCancelled;\n  // only need to handle leaveDone if\n  // 1. the transition is already done (synchronously called\n  //    by the user, which causes this.op set to null)\n  // 2. there's no explicit js callback\n  if (this.op && !this.pendingJsCb) {\n    // if a CSS transition leaves immediately after enter,\n    // the transitionend event never fires. therefore we\n    // detect such cases and end the leave immediately.\n    if (this.justEntered) {\n      this.leaveDone();\n    } else {\n      pushJob(this.leaveNextTick);\n    }\n  }\n};\n\n/**\n * The \"nextTick\" phase of a leaving transition.\n */\n\np$1.leaveNextTick = function () {\n  var type = this.getCssTransitionType(this.leaveClass);\n  if (type) {\n    var event = type === TYPE_TRANSITION ? transitionEndEvent : animationEndEvent;\n    this.setupCssCb(event, this.leaveDone);\n  } else {\n    this.leaveDone();\n  }\n};\n\n/**\n * The \"cleanup\" phase of a leaving transition.\n */\n\np$1.leaveDone = function () {\n  this.left = true;\n  this.cancel = this.pendingJsCb = null;\n  this.op();\n  removeClass(this.el, this.leaveClass);\n  this.callHook('afterLeave');\n  if (this.cb) this.cb();\n  this.op = null;\n};\n\n/**\n * Cancel any pending callbacks from a previously running\n * but not finished transition.\n */\n\np$1.cancelPending = function () {\n  this.op = this.cb = null;\n  var hasPending = false;\n  if (this.pendingCssCb) {\n    hasPending = true;\n    off(this.el, this.pendingCssEvent, this.pendingCssCb);\n    this.pendingCssEvent = this.pendingCssCb = null;\n  }\n  if (this.pendingJsCb) {\n    hasPending = true;\n    this.pendingJsCb.cancel();\n    this.pendingJsCb = null;\n  }\n  if (hasPending) {\n    removeClass(this.el, this.enterClass);\n    removeClass(this.el, this.leaveClass);\n  }\n  if (this.cancel) {\n    this.cancel.call(this.vm, this.el);\n    this.cancel = null;\n  }\n};\n\n/**\n * Call a user-provided synchronous hook function.\n *\n * @param {String} type\n */\n\np$1.callHook = function (type) {\n  if (this.hooks && this.hooks[type]) {\n    this.hooks[type].call(this.vm, this.el);\n  }\n};\n\n/**\n * Call a user-provided, potentially-async hook function.\n * We check for the length of arguments to see if the hook\n * expects a `done` callback. If true, the transition's end\n * will be determined by when the user calls that callback;\n * otherwise, the end is determined by the CSS transition or\n * animation.\n *\n * @param {String} type\n */\n\np$1.callHookWithCb = function (type) {\n  var hook = this.hooks && this.hooks[type];\n  if (hook) {\n    if (hook.length > 1) {\n      this.pendingJsCb = cancellable(this[type + 'Done']);\n    }\n    hook.call(this.vm, this.el, this.pendingJsCb);\n  }\n};\n\n/**\n * Get an element's transition type based on the\n * calculated styles.\n *\n * @param {String} className\n * @return {Number}\n */\n\np$1.getCssTransitionType = function (className) {\n  /* istanbul ignore if */\n  if (!transitionEndEvent ||\n  // skip CSS transitions if page is not visible -\n  // this solves the issue of transitionend events not\n  // firing until the page is visible again.\n  // pageVisibility API is supported in IE10+, same as\n  // CSS transitions.\n  document.hidden ||\n  // explicit js-only transition\n  this.hooks && this.hooks.css === false ||\n  // element is hidden\n  isHidden(this.el)) {\n    return;\n  }\n  var type = this.type || this.typeCache[className];\n  if (type) return type;\n  var inlineStyles = this.el.style;\n  var computedStyles = window.getComputedStyle(this.el);\n  var transDuration = inlineStyles[transDurationProp] || computedStyles[transDurationProp];\n  if (transDuration && transDuration !== '0s') {\n    type = TYPE_TRANSITION;\n  } else {\n    var animDuration = inlineStyles[animDurationProp] || computedStyles[animDurationProp];\n    if (animDuration && animDuration !== '0s') {\n      type = TYPE_ANIMATION;\n    }\n  }\n  if (type) {\n    this.typeCache[className] = type;\n  }\n  return type;\n};\n\n/**\n * Setup a CSS transitionend/animationend callback.\n *\n * @param {String} event\n * @param {Function} cb\n */\n\np$1.setupCssCb = function (event, cb) {\n  this.pendingCssEvent = event;\n  var self = this;\n  var el = this.el;\n  var onEnd = this.pendingCssCb = function (e) {\n    if (e.target === el) {\n      off(el, event, onEnd);\n      self.pendingCssEvent = self.pendingCssCb = null;\n      if (!self.pendingJsCb && cb) {\n        cb();\n      }\n    }\n  };\n  on$1(el, event, onEnd);\n};\n\n/**\n * Check if an element is hidden - in that case we can just\n * skip the transition alltogether.\n *\n * @param {Element} el\n * @return {Boolean}\n */\n\nfunction isHidden(el) {\n  return !(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nvar transition = {\n\n  priority: TRANSITION,\n\n  update: function update(id, oldId) {\n    var el = this.el;\n    // resolve on owner vm\n    var hooks = resolveAsset(this.vm.$options, 'transitions', id);\n    id = id || 'v';\n    // apply on closest vm\n    el.__v_trans = new Transition(el, id, hooks, this.el.__vue__ || this.vm);\n    if (oldId) {\n      removeClass(el, oldId + '-transition');\n    }\n    addClass(el, id + '-transition');\n  }\n};\n\nvar bindingModes = config._propBindingModes;\n\nvar propDef = {\n\n  bind: function bind() {\n\n    var child = this.vm;\n    var parent = child._context;\n    // passed in from compiler directly\n    var prop = this.descriptor.prop;\n    var childKey = prop.path;\n    var parentKey = prop.parentPath;\n    var twoWay = prop.mode === bindingModes.TWO_WAY;\n\n    var parentWatcher = this.parentWatcher = new Watcher(parent, parentKey, function (val) {\n      val = coerceProp(prop, val);\n      if (assertProp(prop, val)) {\n        child[childKey] = val;\n      }\n    }, {\n      twoWay: twoWay,\n      filters: prop.filters,\n      // important: props need to be observed on the\n      // v-for scope if present\n      scope: this._scope\n    });\n\n    // set the child initial value.\n    initProp(child, prop, parentWatcher.value);\n\n    // setup two-way binding\n    if (twoWay) {\n      // important: defer the child watcher creation until\n      // the created hook (after data observation)\n      var self = this;\n      child.$once('pre-hook:created', function () {\n        self.childWatcher = new Watcher(child, childKey, function (val) {\n          parentWatcher.set(val);\n        }, {\n          // ensure sync upward before parent sync down.\n          // this is necessary in cases e.g. the child\n          // mutates a prop array, then replaces it. (#1683)\n          sync: true\n        });\n      });\n    }\n  },\n\n  unbind: function unbind() {\n    this.parentWatcher.teardown();\n    if (this.childWatcher) {\n      this.childWatcher.teardown();\n    }\n  }\n};\n\nvar component = {\n\n  priority: COMPONENT,\n\n  params: ['keep-alive', 'transition-mode', 'inline-template'],\n\n  /**\n   * Setup. Two possible usages:\n   *\n   * - static:\n   *   <comp> or <div v-component=\"comp\">\n   *\n   * - dynamic:\n   *   <component :is=\"view\">\n   */\n\n  bind: function bind() {\n    if (!this.el.__vue__) {\n      // keep-alive cache\n      this.keepAlive = this.params.keepAlive;\n      if (this.keepAlive) {\n        this.cache = {};\n      }\n      // check inline-template\n      if (this.params.inlineTemplate) {\n        // extract inline template as a DocumentFragment\n        this.inlineTemplate = extractContent(this.el, true);\n      }\n      // component resolution related state\n      this.pendingComponentCb = this.Component = null;\n      // transition related state\n      this.pendingRemovals = 0;\n      this.pendingRemovalCb = null;\n      // create a ref anchor\n      this.anchor = createAnchor('v-component');\n      replace(this.el, this.anchor);\n      // remove is attribute.\n      // this is removed during compilation, but because compilation is\n      // cached, when the component is used elsewhere this attribute\n      // will remain at link time.\n      this.el.removeAttribute('is');\n      // remove ref, same as above\n      if (this.descriptor.ref) {\n        this.el.removeAttribute('v-ref:' + hyphenate(this.descriptor.ref));\n      }\n      // if static, build right now.\n      if (this.literal) {\n        this.setComponent(this.expression);\n      }\n    } else {\n      process.env.NODE_ENV !== 'production' && warn('cannot mount component \"' + this.expression + '\" ' + 'on already mounted element: ' + this.el);\n    }\n  },\n\n  /**\n   * Public update, called by the watcher in the dynamic\n   * literal scenario, e.g. <component :is=\"view\">\n   */\n\n  update: function update(value) {\n    if (!this.literal) {\n      this.setComponent(value);\n    }\n  },\n\n  /**\n   * Switch dynamic components. May resolve the component\n   * asynchronously, and perform transition based on\n   * specified transition mode. Accepts a few additional\n   * arguments specifically for vue-router.\n   *\n   * The callback is called when the full transition is\n   * finished.\n   *\n   * @param {String} value\n   * @param {Function} [cb]\n   */\n\n  setComponent: function setComponent(value, cb) {\n    this.invalidatePending();\n    if (!value) {\n      // just remove current\n      this.unbuild(true);\n      this.remove(this.childVM, cb);\n      this.childVM = null;\n    } else {\n      var self = this;\n      this.resolveComponent(value, function () {\n        self.mountComponent(cb);\n      });\n    }\n  },\n\n  /**\n   * Resolve the component constructor to use when creating\n   * the child vm.\n   */\n\n  resolveComponent: function resolveComponent(id, cb) {\n    var self = this;\n    this.pendingComponentCb = cancellable(function (Component) {\n      self.ComponentName = Component.options.name || id;\n      self.Component = Component;\n      cb();\n    });\n    this.vm._resolveComponent(id, this.pendingComponentCb);\n  },\n\n  /**\n   * Create a new instance using the current constructor and\n   * replace the existing instance. This method doesn't care\n   * whether the new component and the old one are actually\n   * the same.\n   *\n   * @param {Function} [cb]\n   */\n\n  mountComponent: function mountComponent(cb) {\n    // actual mount\n    this.unbuild(true);\n    var self = this;\n    var activateHook = this.Component.options.activate;\n    var cached = this.getCached();\n    var newComponent = this.build();\n    if (activateHook && !cached) {\n      this.waitingFor = newComponent;\n      activateHook.call(newComponent, function () {\n        if (self.waitingFor !== newComponent) {\n          return;\n        }\n        self.waitingFor = null;\n        self.transition(newComponent, cb);\n      });\n    } else {\n      // update ref for kept-alive component\n      if (cached) {\n        newComponent._updateRef();\n      }\n      this.transition(newComponent, cb);\n    }\n  },\n\n  /**\n   * When the component changes or unbinds before an async\n   * constructor is resolved, we need to invalidate its\n   * pending callback.\n   */\n\n  invalidatePending: function invalidatePending() {\n    if (this.pendingComponentCb) {\n      this.pendingComponentCb.cancel();\n      this.pendingComponentCb = null;\n    }\n  },\n\n  /**\n   * Instantiate/insert a new child vm.\n   * If keep alive and has cached instance, insert that\n   * instance; otherwise build a new one and cache it.\n   *\n   * @param {Object} [extraOptions]\n   * @return {Vue} - the created instance\n   */\n\n  build: function build(extraOptions) {\n    var cached = this.getCached();\n    if (cached) {\n      return cached;\n    }\n    if (this.Component) {\n      // default options\n      var options = {\n        name: this.ComponentName,\n        el: cloneNode(this.el),\n        template: this.inlineTemplate,\n        // make sure to add the child with correct parent\n        // if this is a transcluded component, its parent\n        // should be the transclusion host.\n        parent: this._host || this.vm,\n        // if no inline-template, then the compiled\n        // linker can be cached for better performance.\n        _linkerCachable: !this.inlineTemplate,\n        _ref: this.descriptor.ref,\n        _asComponent: true,\n        _isRouterView: this._isRouterView,\n        // if this is a transcluded component, context\n        // will be the common parent vm of this instance\n        // and its host.\n        _context: this.vm,\n        // if this is inside an inline v-for, the scope\n        // will be the intermediate scope created for this\n        // repeat fragment. this is used for linking props\n        // and container directives.\n        _scope: this._scope,\n        // pass in the owner fragment of this component.\n        // this is necessary so that the fragment can keep\n        // track of its contained components in order to\n        // call attach/detach hooks for them.\n        _frag: this._frag\n      };\n      // extra options\n      // in 1.0.0 this is used by vue-router only\n      /* istanbul ignore if */\n      if (extraOptions) {\n        extend(options, extraOptions);\n      }\n      var child = new this.Component(options);\n      if (this.keepAlive) {\n        this.cache[this.Component.cid] = child;\n      }\n      /* istanbul ignore if */\n      if (process.env.NODE_ENV !== 'production' && this.el.hasAttribute('transition') && child._isFragment) {\n        warn('Transitions will not work on a fragment instance. ' + 'Template: ' + child.$options.template);\n      }\n      return child;\n    }\n  },\n\n  /**\n   * Try to get a cached instance of the current component.\n   *\n   * @return {Vue|undefined}\n   */\n\n  getCached: function getCached() {\n    return this.keepAlive && this.cache[this.Component.cid];\n  },\n\n  /**\n   * Teardown the current child, but defers cleanup so\n   * that we can separate the destroy and removal steps.\n   *\n   * @param {Boolean} defer\n   */\n\n  unbuild: function unbuild(defer) {\n    if (this.waitingFor) {\n      this.waitingFor.$destroy();\n      this.waitingFor = null;\n    }\n    var child = this.childVM;\n    if (!child || this.keepAlive) {\n      if (child) {\n        // remove ref\n        child._updateRef(true);\n      }\n      return;\n    }\n    // the sole purpose of `deferCleanup` is so that we can\n    // \"deactivate\" the vm right now and perform DOM removal\n    // later.\n    child.$destroy(false, defer);\n  },\n\n  /**\n   * Remove current destroyed child and manually do\n   * the cleanup after removal.\n   *\n   * @param {Function} cb\n   */\n\n  remove: function remove(child, cb) {\n    var keepAlive = this.keepAlive;\n    if (child) {\n      // we may have a component switch when a previous\n      // component is still being transitioned out.\n      // we want to trigger only one lastest insertion cb\n      // when the existing transition finishes. (#1119)\n      this.pendingRemovals++;\n      this.pendingRemovalCb = cb;\n      var self = this;\n      child.$remove(function () {\n        self.pendingRemovals--;\n        if (!keepAlive) child._cleanup();\n        if (!self.pendingRemovals && self.pendingRemovalCb) {\n          self.pendingRemovalCb();\n          self.pendingRemovalCb = null;\n        }\n      });\n    } else if (cb) {\n      cb();\n    }\n  },\n\n  /**\n   * Actually swap the components, depending on the\n   * transition mode. Defaults to simultaneous.\n   *\n   * @param {Vue} target\n   * @param {Function} [cb]\n   */\n\n  transition: function transition(target, cb) {\n    var self = this;\n    var current = this.childVM;\n    // for devtool inspection\n    if (process.env.NODE_ENV !== 'production') {\n      if (current) current._inactive = true;\n      target._inactive = false;\n    }\n    this.childVM = target;\n    switch (self.params.transitionMode) {\n      case 'in-out':\n        target.$before(self.anchor, function () {\n          self.remove(current, cb);\n        });\n        break;\n      case 'out-in':\n        self.remove(current, function () {\n          target.$before(self.anchor, cb);\n        });\n        break;\n      default:\n        self.remove(current);\n        target.$before(self.anchor, cb);\n    }\n  },\n\n  /**\n   * Unbind.\n   */\n\n  unbind: function unbind() {\n    this.invalidatePending();\n    // Do not defer cleanup when unbinding\n    this.unbuild();\n    // destroy all keep-alive cached instances\n    if (this.cache) {\n      for (var key in this.cache) {\n        this.cache[key].$destroy();\n      }\n      this.cache = null;\n    }\n  }\n};\n\nvar vClass = {\n\n  deep: true,\n\n  update: function update(value) {\n    if (value && typeof value === 'string') {\n      this.handleObject(stringToObject(value));\n    } else if (isPlainObject(value)) {\n      this.handleObject(value);\n    } else if (isArray(value)) {\n      this.handleArray(value);\n    } else {\n      this.cleanup();\n    }\n  },\n\n  handleObject: function handleObject(value) {\n    this.cleanup(value);\n    var keys = this.prevKeys = Object.keys(value);\n    for (var i = 0, l = keys.length; i < l; i++) {\n      var key = keys[i];\n      if (value[key]) {\n        addClass(this.el, key);\n      } else {\n        removeClass(this.el, key);\n      }\n    }\n  },\n\n  handleArray: function handleArray(value) {\n    this.cleanup(value);\n    for (var i = 0, l = value.length; i < l; i++) {\n      if (value[i]) {\n        addClass(this.el, value[i]);\n      }\n    }\n    this.prevKeys = value.slice();\n  },\n\n  cleanup: function cleanup(value) {\n    if (this.prevKeys) {\n      var i = this.prevKeys.length;\n      while (i--) {\n        var key = this.prevKeys[i];\n        if (key && (!value || !contains$1(value, key))) {\n          removeClass(this.el, key);\n        }\n      }\n    }\n  }\n};\n\nfunction stringToObject(value) {\n  var res = {};\n  var keys = value.trim().split(/\\s+/);\n  var i = keys.length;\n  while (i--) {\n    res[keys[i]] = true;\n  }\n  return res;\n}\n\nfunction contains$1(value, key) {\n  return isArray(value) ? value.indexOf(key) > -1 : hasOwn(value, key);\n}\n\nvar internalDirectives = {\n  style: style,\n  'class': vClass,\n  component: component,\n  prop: propDef,\n  transition: transition\n};\n\nvar propBindingModes = config._propBindingModes;\nvar empty = {};\n\n// regexes\nvar identRE$1 = /^[$_a-zA-Z]+[\\w$]*$/;\nvar settablePathRE = /^[A-Za-z_$][\\w$]*(\\.[A-Za-z_$][\\w$]*|\\[[^\\[\\]]+\\])*$/;\n\n/**\n * Compile props on a root element and return\n * a props link function.\n *\n * @param {Element|DocumentFragment} el\n * @param {Array} propOptions\n * @return {Function} propsLinkFn\n */\n\nfunction compileProps(el, propOptions) {\n  var props = [];\n  var names = Object.keys(propOptions);\n  var i = names.length;\n  var options, name, attr, value, path, parsed, prop;\n  while (i--) {\n    name = names[i];\n    options = propOptions[name] || empty;\n\n    if (process.env.NODE_ENV !== 'production' && name === '$data') {\n      warn('Do not use $data as prop.');\n      continue;\n    }\n\n    // props could contain dashes, which will be\n    // interpreted as minus calculations by the parser\n    // so we need to camelize the path here\n    path = camelize(name);\n    if (!identRE$1.test(path)) {\n      process.env.NODE_ENV !== 'production' && warn('Invalid prop key: \"' + name + '\". Prop keys ' + 'must be valid identifiers.');\n      continue;\n    }\n\n    prop = {\n      name: name,\n      path: path,\n      options: options,\n      mode: propBindingModes.ONE_WAY,\n      raw: null\n    };\n\n    attr = hyphenate(name);\n    // first check dynamic version\n    if ((value = getBindAttr(el, attr)) === null) {\n      if ((value = getBindAttr(el, attr + '.sync')) !== null) {\n        prop.mode = propBindingModes.TWO_WAY;\n      } else if ((value = getBindAttr(el, attr + '.once')) !== null) {\n        prop.mode = propBindingModes.ONE_TIME;\n      }\n    }\n    if (value !== null) {\n      // has dynamic binding!\n      prop.raw = value;\n      parsed = parseDirective(value);\n      value = parsed.expression;\n      prop.filters = parsed.filters;\n      // check binding type\n      if (isLiteral(value) && !parsed.filters) {\n        // for expressions containing literal numbers and\n        // booleans, there's no need to setup a prop binding,\n        // so we can optimize them as a one-time set.\n        prop.optimizedLiteral = true;\n      } else {\n        prop.dynamic = true;\n        // check non-settable path for two-way bindings\n        if (process.env.NODE_ENV !== 'production' && prop.mode === propBindingModes.TWO_WAY && !settablePathRE.test(value)) {\n          prop.mode = propBindingModes.ONE_WAY;\n          warn('Cannot bind two-way prop with non-settable ' + 'parent path: ' + value);\n        }\n      }\n      prop.parentPath = value;\n\n      // warn required two-way\n      if (process.env.NODE_ENV !== 'production' && options.twoWay && prop.mode !== propBindingModes.TWO_WAY) {\n        warn('Prop \"' + name + '\" expects a two-way binding type.');\n      }\n    } else if ((value = getAttr(el, attr)) !== null) {\n      // has literal binding!\n      prop.raw = value;\n    } else if (options.required) {\n      // warn missing required\n      process.env.NODE_ENV !== 'production' && warn('Missing required prop: ' + name);\n    }\n    // push prop\n    props.push(prop);\n  }\n  return makePropsLinkFn(props);\n}\n\n/**\n * Build a function that applies props to a vm.\n *\n * @param {Array} props\n * @return {Function} propsLinkFn\n */\n\nfunction makePropsLinkFn(props) {\n  return function propsLinkFn(vm, scope) {\n    // store resolved props info\n    vm._props = {};\n    var i = props.length;\n    var prop, path, options, value, raw;\n    while (i--) {\n      prop = props[i];\n      raw = prop.raw;\n      path = prop.path;\n      options = prop.options;\n      vm._props[path] = prop;\n      if (raw === null) {\n        // initialize absent prop\n        initProp(vm, prop, getDefault(vm, options));\n      } else if (prop.dynamic) {\n        // dynamic prop\n        if (vm._context) {\n          if (prop.mode === propBindingModes.ONE_TIME) {\n            // one time binding\n            value = (scope || vm._context).$get(prop.parentPath);\n            initProp(vm, prop, value);\n          } else {\n            // dynamic binding\n            vm._bindDir({\n              name: 'prop',\n              def: propDef,\n              prop: prop\n            }, null, null, scope); // el, host, scope\n          }\n        } else {\n            process.env.NODE_ENV !== 'production' && warn('Cannot bind dynamic prop on a root instance' + ' with no parent: ' + prop.name + '=\"' + raw + '\"');\n          }\n      } else if (prop.optimizedLiteral) {\n        // optimized literal, cast it and just set once\n        var stripped = stripQuotes(raw);\n        value = stripped === raw ? toBoolean(toNumber(raw)) : stripped;\n        initProp(vm, prop, value);\n      } else {\n        // string literal, but we need to cater for\n        // Boolean props with no value\n        value = options.type === Boolean && raw === '' ? true : raw;\n        initProp(vm, prop, value);\n      }\n    }\n  };\n}\n\n/**\n * Get the default value of a prop.\n *\n * @param {Vue} vm\n * @param {Object} options\n * @return {*}\n */\n\nfunction getDefault(vm, options) {\n  // no default, return undefined\n  if (!hasOwn(options, 'default')) {\n    // absent boolean value defaults to false\n    return options.type === Boolean ? false : undefined;\n  }\n  var def = options['default'];\n  // warn against non-factory defaults for Object & Array\n  if (isObject(def)) {\n    process.env.NODE_ENV !== 'production' && warn('Object/Array as default prop values will be shared ' + 'across multiple instances. Use a factory function ' + 'to return the default value instead.');\n  }\n  // call factory function for non-Function types\n  return typeof def === 'function' && options.type !== Function ? def.call(vm) : def;\n}\n\n// special binding prefixes\nvar bindRE = /^v-bind:|^:/;\nvar onRE = /^v-on:|^@/;\nvar dirAttrRE = /^v-([^:]+)(?:$|:(.*)$)/;\nvar modifierRE = /\\.[^\\.]+/g;\nvar transitionRE = /^(v-bind:|:)?transition$/;\n\n// terminal directives\nvar terminalDirectives = ['for', 'if'];\n\n// default directive priority\nvar DEFAULT_PRIORITY = 1000;\n\n/**\n * Compile a template and return a reusable composite link\n * function, which recursively contains more link functions\n * inside. This top level compile function would normally\n * be called on instance root nodes, but can also be used\n * for partial compilation if the partial argument is true.\n *\n * The returned composite link function, when called, will\n * return an unlink function that tearsdown all directives\n * created during the linking phase.\n *\n * @param {Element|DocumentFragment} el\n * @param {Object} options\n * @param {Boolean} partial\n * @return {Function}\n */\n\nfunction compile(el, options, partial) {\n  // link function for the node itself.\n  var nodeLinkFn = partial || !options._asComponent ? compileNode(el, options) : null;\n  // link function for the childNodes\n  var childLinkFn = !(nodeLinkFn && nodeLinkFn.terminal) && el.tagName !== 'SCRIPT' && el.hasChildNodes() ? compileNodeList(el.childNodes, options) : null;\n\n  /**\n   * A composite linker function to be called on a already\n   * compiled piece of DOM, which instantiates all directive\n   * instances.\n   *\n   * @param {Vue} vm\n   * @param {Element|DocumentFragment} el\n   * @param {Vue} [host] - host vm of transcluded content\n   * @param {Object} [scope] - v-for scope\n   * @param {Fragment} [frag] - link context fragment\n   * @return {Function|undefined}\n   */\n\n  return function compositeLinkFn(vm, el, host, scope, frag) {\n    // cache childNodes before linking parent, fix #657\n    var childNodes = toArray(el.childNodes);\n    // link\n    var dirs = linkAndCapture(function compositeLinkCapturer() {\n      if (nodeLinkFn) nodeLinkFn(vm, el, host, scope, frag);\n      if (childLinkFn) childLinkFn(vm, childNodes, host, scope, frag);\n    }, vm);\n    return makeUnlinkFn(vm, dirs);\n  };\n}\n\n/**\n * Apply a linker to a vm/element pair and capture the\n * directives created during the process.\n *\n * @param {Function} linker\n * @param {Vue} vm\n */\n\nfunction linkAndCapture(linker, vm) {\n  /* istanbul ignore if */\n  if (process.env.NODE_ENV === 'production') {\n    // reset directives before every capture in production\n    // mode, so that when unlinking we don't need to splice\n    // them out (which turns out to be a perf hit).\n    // they are kept in development mode because they are\n    // useful for Vue's own tests.\n    vm._directives = [];\n  }\n  var originalDirCount = vm._directives.length;\n  linker();\n  var dirs = vm._directives.slice(originalDirCount);\n  dirs.sort(directiveComparator);\n  for (var i = 0, l = dirs.length; i < l; i++) {\n    dirs[i]._bind();\n  }\n  return dirs;\n}\n\n/**\n * Directive priority sort comparator\n *\n * @param {Object} a\n * @param {Object} b\n */\n\nfunction directiveComparator(a, b) {\n  a = a.descriptor.def.priority || DEFAULT_PRIORITY;\n  b = b.descriptor.def.priority || DEFAULT_PRIORITY;\n  return a > b ? -1 : a === b ? 0 : 1;\n}\n\n/**\n * Linker functions return an unlink function that\n * tearsdown all directives instances generated during\n * the process.\n *\n * We create unlink functions with only the necessary\n * information to avoid retaining additional closures.\n *\n * @param {Vue} vm\n * @param {Array} dirs\n * @param {Vue} [context]\n * @param {Array} [contextDirs]\n * @return {Function}\n */\n\nfunction makeUnlinkFn(vm, dirs, context, contextDirs) {\n  function unlink(destroying) {\n    teardownDirs(vm, dirs, destroying);\n    if (context && contextDirs) {\n      teardownDirs(context, contextDirs);\n    }\n  }\n  // expose linked directives\n  unlink.dirs = dirs;\n  return unlink;\n}\n\n/**\n * Teardown partial linked directives.\n *\n * @param {Vue} vm\n * @param {Array} dirs\n * @param {Boolean} destroying\n */\n\nfunction teardownDirs(vm, dirs, destroying) {\n  var i = dirs.length;\n  while (i--) {\n    dirs[i]._teardown();\n    if (process.env.NODE_ENV !== 'production' && !destroying) {\n      vm._directives.$remove(dirs[i]);\n    }\n  }\n}\n\n/**\n * Compile link props on an instance.\n *\n * @param {Vue} vm\n * @param {Element} el\n * @param {Object} props\n * @param {Object} [scope]\n * @return {Function}\n */\n\nfunction compileAndLinkProps(vm, el, props, scope) {\n  var propsLinkFn = compileProps(el, props);\n  var propDirs = linkAndCapture(function () {\n    propsLinkFn(vm, scope);\n  }, vm);\n  return makeUnlinkFn(vm, propDirs);\n}\n\n/**\n * Compile the root element of an instance.\n *\n * 1. attrs on context container (context scope)\n * 2. attrs on the component template root node, if\n *    replace:true (child scope)\n *\n * If this is a fragment instance, we only need to compile 1.\n *\n * @param {Element} el\n * @param {Object} options\n * @param {Object} contextOptions\n * @return {Function}\n */\n\nfunction compileRoot(el, options, contextOptions) {\n  var containerAttrs = options._containerAttrs;\n  var replacerAttrs = options._replacerAttrs;\n  var contextLinkFn, replacerLinkFn;\n\n  // only need to compile other attributes for\n  // non-fragment instances\n  if (el.nodeType !== 11) {\n    // for components, container and replacer need to be\n    // compiled separately and linked in different scopes.\n    if (options._asComponent) {\n      // 2. container attributes\n      if (containerAttrs && contextOptions) {\n        contextLinkFn = compileDirectives(containerAttrs, contextOptions);\n      }\n      if (replacerAttrs) {\n        // 3. replacer attributes\n        replacerLinkFn = compileDirectives(replacerAttrs, options);\n      }\n    } else {\n      // non-component, just compile as a normal element.\n      replacerLinkFn = compileDirectives(el.attributes, options);\n    }\n  } else if (process.env.NODE_ENV !== 'production' && containerAttrs) {\n    // warn container directives for fragment instances\n    var names = containerAttrs.filter(function (attr) {\n      // allow vue-loader/vueify scoped css attributes\n      return attr.name.indexOf('_v-') < 0 &&\n      // allow event listeners\n      !onRE.test(attr.name) &&\n      // allow slots\n      attr.name !== 'slot';\n    }).map(function (attr) {\n      return '\"' + attr.name + '\"';\n    });\n    if (names.length) {\n      var plural = names.length > 1;\n      warn('Attribute' + (plural ? 's ' : ' ') + names.join(', ') + (plural ? ' are' : ' is') + ' ignored on component ' + '<' + options.el.tagName.toLowerCase() + '> because ' + 'the component is a fragment instance: ' + 'http://vuejs.org/guide/components.html#Fragment_Instance');\n    }\n  }\n\n  options._containerAttrs = options._replacerAttrs = null;\n  return function rootLinkFn(vm, el, scope) {\n    // link context scope dirs\n    var context = vm._context;\n    var contextDirs;\n    if (context && contextLinkFn) {\n      contextDirs = linkAndCapture(function () {\n        contextLinkFn(context, el, null, scope);\n      }, context);\n    }\n\n    // link self\n    var selfDirs = linkAndCapture(function () {\n      if (replacerLinkFn) replacerLinkFn(vm, el);\n    }, vm);\n\n    // return the unlink function that tearsdown context\n    // container directives.\n    return makeUnlinkFn(vm, selfDirs, context, contextDirs);\n  };\n}\n\n/**\n * Compile a node and return a nodeLinkFn based on the\n * node type.\n *\n * @param {Node} node\n * @param {Object} options\n * @return {Function|null}\n */\n\nfunction compileNode(node, options) {\n  var type = node.nodeType;\n  if (type === 1 && node.tagName !== 'SCRIPT') {\n    return compileElement(node, options);\n  } else if (type === 3 && node.data.trim()) {\n    return compileTextNode(node, options);\n  } else {\n    return null;\n  }\n}\n\n/**\n * Compile an element and return a nodeLinkFn.\n *\n * @param {Element} el\n * @param {Object} options\n * @return {Function|null}\n */\n\nfunction compileElement(el, options) {\n  // preprocess textareas.\n  // textarea treats its text content as the initial value.\n  // just bind it as an attr directive for value.\n  if (el.tagName === 'TEXTAREA') {\n    var tokens = parseText(el.value);\n    if (tokens) {\n      el.setAttribute(':value', tokensToExp(tokens));\n      el.value = '';\n    }\n  }\n  var linkFn;\n  var hasAttrs = el.hasAttributes();\n  // check terminal directives (for & if)\n  if (hasAttrs) {\n    linkFn = checkTerminalDirectives(el, options);\n  }\n  // check element directives\n  if (!linkFn) {\n    linkFn = checkElementDirectives(el, options);\n  }\n  // check component\n  if (!linkFn) {\n    linkFn = checkComponent(el, options);\n  }\n  // normal directives\n  if (!linkFn && hasAttrs) {\n    linkFn = compileDirectives(el.attributes, options);\n  }\n  return linkFn;\n}\n\n/**\n * Compile a textNode and return a nodeLinkFn.\n *\n * @param {TextNode} node\n * @param {Object} options\n * @return {Function|null} textNodeLinkFn\n */\n\nfunction compileTextNode(node, options) {\n  // skip marked text nodes\n  if (node._skip) {\n    return removeText;\n  }\n\n  var tokens = parseText(node.wholeText);\n  if (!tokens) {\n    return null;\n  }\n\n  // mark adjacent text nodes as skipped,\n  // because we are using node.wholeText to compile\n  // all adjacent text nodes together. This fixes\n  // issues in IE where sometimes it splits up a single\n  // text node into multiple ones.\n  var next = node.nextSibling;\n  while (next && next.nodeType === 3) {\n    next._skip = true;\n    next = next.nextSibling;\n  }\n\n  var frag = document.createDocumentFragment();\n  var el, token;\n  for (var i = 0, l = tokens.length; i < l; i++) {\n    token = tokens[i];\n    el = token.tag ? processTextToken(token, options) : document.createTextNode(token.value);\n    frag.appendChild(el);\n  }\n  return makeTextNodeLinkFn(tokens, frag, options);\n}\n\n/**\n * Linker for an skipped text node.\n *\n * @param {Vue} vm\n * @param {Text} node\n */\n\nfunction removeText(vm, node) {\n  remove(node);\n}\n\n/**\n * Process a single text token.\n *\n * @param {Object} token\n * @param {Object} options\n * @return {Node}\n */\n\nfunction processTextToken(token, options) {\n  var el;\n  if (token.oneTime) {\n    el = document.createTextNode(token.value);\n  } else {\n    if (token.html) {\n      el = document.createComment('v-html');\n      setTokenType('html');\n    } else {\n      // IE will clean up empty textNodes during\n      // frag.cloneNode(true), so we have to give it\n      // something here...\n      el = document.createTextNode(' ');\n      setTokenType('text');\n    }\n  }\n  function setTokenType(type) {\n    if (token.descriptor) return;\n    var parsed = parseDirective(token.value);\n    token.descriptor = {\n      name: type,\n      def: publicDirectives[type],\n      expression: parsed.expression,\n      filters: parsed.filters\n    };\n  }\n  return el;\n}\n\n/**\n * Build a function that processes a textNode.\n *\n * @param {Array<Object>} tokens\n * @param {DocumentFragment} frag\n */\n\nfunction makeTextNodeLinkFn(tokens, frag) {\n  return function textNodeLinkFn(vm, el, host, scope) {\n    var fragClone = frag.cloneNode(true);\n    var childNodes = toArray(fragClone.childNodes);\n    var token, value, node;\n    for (var i = 0, l = tokens.length; i < l; i++) {\n      token = tokens[i];\n      value = token.value;\n      if (token.tag) {\n        node = childNodes[i];\n        if (token.oneTime) {\n          value = (scope || vm).$eval(value);\n          if (token.html) {\n            replace(node, parseTemplate(value, true));\n          } else {\n            node.data = value;\n          }\n        } else {\n          vm._bindDir(token.descriptor, node, host, scope);\n        }\n      }\n    }\n    replace(el, fragClone);\n  };\n}\n\n/**\n * Compile a node list and return a childLinkFn.\n *\n * @param {NodeList} nodeList\n * @param {Object} options\n * @return {Function|undefined}\n */\n\nfunction compileNodeList(nodeList, options) {\n  var linkFns = [];\n  var nodeLinkFn, childLinkFn, node;\n  for (var i = 0, l = nodeList.length; i < l; i++) {\n    node = nodeList[i];\n    nodeLinkFn = compileNode(node, options);\n    childLinkFn = !(nodeLinkFn && nodeLinkFn.terminal) && node.tagName !== 'SCRIPT' && node.hasChildNodes() ? compileNodeList(node.childNodes, options) : null;\n    linkFns.push(nodeLinkFn, childLinkFn);\n  }\n  return linkFns.length ? makeChildLinkFn(linkFns) : null;\n}\n\n/**\n * Make a child link function for a node's childNodes.\n *\n * @param {Array<Function>} linkFns\n * @return {Function} childLinkFn\n */\n\nfunction makeChildLinkFn(linkFns) {\n  return function childLinkFn(vm, nodes, host, scope, frag) {\n    var node, nodeLinkFn, childrenLinkFn;\n    for (var i = 0, n = 0, l = linkFns.length; i < l; n++) {\n      node = nodes[n];\n      nodeLinkFn = linkFns[i++];\n      childrenLinkFn = linkFns[i++];\n      // cache childNodes before linking parent, fix #657\n      var childNodes = toArray(node.childNodes);\n      if (nodeLinkFn) {\n        nodeLinkFn(vm, node, host, scope, frag);\n      }\n      if (childrenLinkFn) {\n        childrenLinkFn(vm, childNodes, host, scope, frag);\n      }\n    }\n  };\n}\n\n/**\n * Check for element directives (custom elements that should\n * be resovled as terminal directives).\n *\n * @param {Element} el\n * @param {Object} options\n */\n\nfunction checkElementDirectives(el, options) {\n  var tag = el.tagName.toLowerCase();\n  if (commonTagRE.test(tag)) return;\n  // special case: give named slot a higher priority\n  // than unnamed slots\n  if (tag === 'slot' && hasBindAttr(el, 'name')) {\n    tag = '_namedSlot';\n  }\n  var def = resolveAsset(options, 'elementDirectives', tag);\n  if (def) {\n    return makeTerminalNodeLinkFn(el, tag, '', options, def);\n  }\n}\n\n/**\n * Check if an element is a component. If yes, return\n * a component link function.\n *\n * @param {Element} el\n * @param {Object} options\n * @return {Function|undefined}\n */\n\nfunction checkComponent(el, options) {\n  var component = checkComponentAttr(el, options);\n  if (component) {\n    var ref = findRef(el);\n    var descriptor = {\n      name: 'component',\n      ref: ref,\n      expression: component.id,\n      def: internalDirectives.component,\n      modifiers: {\n        literal: !component.dynamic\n      }\n    };\n    var componentLinkFn = function componentLinkFn(vm, el, host, scope, frag) {\n      if (ref) {\n        defineReactive((scope || vm).$refs, ref, null);\n      }\n      vm._bindDir(descriptor, el, host, scope, frag);\n    };\n    componentLinkFn.terminal = true;\n    return componentLinkFn;\n  }\n}\n\n/**\n * Check an element for terminal directives in fixed order.\n * If it finds one, return a terminal link function.\n *\n * @param {Element} el\n * @param {Object} options\n * @return {Function} terminalLinkFn\n */\n\nfunction checkTerminalDirectives(el, options) {\n  // skip v-pre\n  if (getAttr(el, 'v-pre') !== null) {\n    return skip;\n  }\n  // skip v-else block, but only if following v-if\n  if (el.hasAttribute('v-else')) {\n    var prev = el.previousElementSibling;\n    if (prev && prev.hasAttribute('v-if')) {\n      return skip;\n    }\n  }\n  var value, dirName;\n  for (var i = 0, l = terminalDirectives.length; i < l; i++) {\n    dirName = terminalDirectives[i];\n    value = el.getAttribute('v-' + dirName);\n    if (value != null) {\n      return makeTerminalNodeLinkFn(el, dirName, value, options);\n    }\n  }\n}\n\nfunction skip() {}\nskip.terminal = true;\n\n/**\n * Build a node link function for a terminal directive.\n * A terminal link function terminates the current\n * compilation recursion and handles compilation of the\n * subtree in the directive.\n *\n * @param {Element} el\n * @param {String} dirName\n * @param {String} value\n * @param {Object} options\n * @param {Object} [def]\n * @return {Function} terminalLinkFn\n */\n\nfunction makeTerminalNodeLinkFn(el, dirName, value, options, def) {\n  var parsed = parseDirective(value);\n  var descriptor = {\n    name: dirName,\n    expression: parsed.expression,\n    filters: parsed.filters,\n    raw: value,\n    // either an element directive, or if/for\n    def: def || publicDirectives[dirName]\n  };\n  // check ref for v-for and router-view\n  if (dirName === 'for' || dirName === 'router-view') {\n    descriptor.ref = findRef(el);\n  }\n  var fn = function terminalNodeLinkFn(vm, el, host, scope, frag) {\n    if (descriptor.ref) {\n      defineReactive((scope || vm).$refs, descriptor.ref, null);\n    }\n    vm._bindDir(descriptor, el, host, scope, frag);\n  };\n  fn.terminal = true;\n  return fn;\n}\n\n/**\n * Compile the directives on an element and return a linker.\n *\n * @param {Array|NamedNodeMap} attrs\n * @param {Object} options\n * @return {Function}\n */\n\nfunction compileDirectives(attrs, options) {\n  var i = attrs.length;\n  var dirs = [];\n  var attr, name, value, rawName, rawValue, dirName, arg, modifiers, dirDef, tokens, matched;\n  while (i--) {\n    attr = attrs[i];\n    name = rawName = attr.name;\n    value = rawValue = attr.value;\n    tokens = parseText(value);\n    // reset arg\n    arg = null;\n    // check modifiers\n    modifiers = parseModifiers(name);\n    name = name.replace(modifierRE, '');\n\n    // attribute interpolations\n    if (tokens) {\n      value = tokensToExp(tokens);\n      arg = name;\n      pushDir('bind', publicDirectives.bind, tokens);\n      // warn against mixing mustaches with v-bind\n      if (process.env.NODE_ENV !== 'production') {\n        if (name === 'class' && Array.prototype.some.call(attrs, function (attr) {\n          return attr.name === ':class' || attr.name === 'v-bind:class';\n        })) {\n          warn('class=\"' + rawValue + '\": Do not mix mustache interpolation ' + 'and v-bind for \"class\" on the same element. Use one or the other.');\n        }\n      }\n    } else\n\n      // special attribute: transition\n      if (transitionRE.test(name)) {\n        modifiers.literal = !bindRE.test(name);\n        pushDir('transition', internalDirectives.transition);\n      } else\n\n        // event handlers\n        if (onRE.test(name)) {\n          arg = name.replace(onRE, '');\n          pushDir('on', publicDirectives.on);\n        } else\n\n          // attribute bindings\n          if (bindRE.test(name)) {\n            dirName = name.replace(bindRE, '');\n            if (dirName === 'style' || dirName === 'class') {\n              pushDir(dirName, internalDirectives[dirName]);\n            } else {\n              arg = dirName;\n              pushDir('bind', publicDirectives.bind);\n            }\n          } else\n\n            // normal directives\n            if (matched = name.match(dirAttrRE)) {\n              dirName = matched[1];\n              arg = matched[2];\n\n              // skip v-else (when used with v-show)\n              if (dirName === 'else') {\n                continue;\n              }\n\n              dirDef = resolveAsset(options, 'directives', dirName);\n\n              if (process.env.NODE_ENV !== 'production') {\n                assertAsset(dirDef, 'directive', dirName);\n              }\n\n              if (dirDef) {\n                pushDir(dirName, dirDef);\n              }\n            }\n  }\n\n  /**\n   * Push a directive.\n   *\n   * @param {String} dirName\n   * @param {Object|Function} def\n   * @param {Array} [interpTokens]\n   */\n\n  function pushDir(dirName, def, interpTokens) {\n    var hasOneTimeToken = interpTokens && hasOneTime(interpTokens);\n    var parsed = !hasOneTimeToken && parseDirective(value);\n    dirs.push({\n      name: dirName,\n      attr: rawName,\n      raw: rawValue,\n      def: def,\n      arg: arg,\n      modifiers: modifiers,\n      // conversion from interpolation strings with one-time token\n      // to expression is differed until directive bind time so that we\n      // have access to the actual vm context for one-time bindings.\n      expression: parsed && parsed.expression,\n      filters: parsed && parsed.filters,\n      interp: interpTokens,\n      hasOneTime: hasOneTimeToken\n    });\n  }\n\n  if (dirs.length) {\n    return makeNodeLinkFn(dirs);\n  }\n}\n\n/**\n * Parse modifiers from directive attribute name.\n *\n * @param {String} name\n * @return {Object}\n */\n\nfunction parseModifiers(name) {\n  var res = Object.create(null);\n  var match = name.match(modifierRE);\n  if (match) {\n    var i = match.length;\n    while (i--) {\n      res[match[i].slice(1)] = true;\n    }\n  }\n  return res;\n}\n\n/**\n * Build a link function for all directives on a single node.\n *\n * @param {Array} directives\n * @return {Function} directivesLinkFn\n */\n\nfunction makeNodeLinkFn(directives) {\n  return function nodeLinkFn(vm, el, host, scope, frag) {\n    // reverse apply because it's sorted low to high\n    var i = directives.length;\n    while (i--) {\n      vm._bindDir(directives[i], el, host, scope, frag);\n    }\n  };\n}\n\n/**\n * Check if an interpolation string contains one-time tokens.\n *\n * @param {Array} tokens\n * @return {Boolean}\n */\n\nfunction hasOneTime(tokens) {\n  var i = tokens.length;\n  while (i--) {\n    if (tokens[i].oneTime) return true;\n  }\n}\n\nvar specialCharRE = /[^\\w\\-:\\.]/;\n\n/**\n * Process an element or a DocumentFragment based on a\n * instance option object. This allows us to transclude\n * a template node/fragment before the instance is created,\n * so the processed fragment can then be cloned and reused\n * in v-for.\n *\n * @param {Element} el\n * @param {Object} options\n * @return {Element|DocumentFragment}\n */\n\nfunction transclude(el, options) {\n  // extract container attributes to pass them down\n  // to compiler, because they need to be compiled in\n  // parent scope. we are mutating the options object here\n  // assuming the same object will be used for compile\n  // right after this.\n  if (options) {\n    options._containerAttrs = extractAttrs(el);\n  }\n  // for template tags, what we want is its content as\n  // a documentFragment (for fragment instances)\n  if (isTemplate(el)) {\n    el = parseTemplate(el);\n  }\n  if (options) {\n    if (options._asComponent && !options.template) {\n      options.template = '<slot></slot>';\n    }\n    if (options.template) {\n      options._content = extractContent(el);\n      el = transcludeTemplate(el, options);\n    }\n  }\n  if (el instanceof DocumentFragment) {\n    // anchors for fragment instance\n    // passing in `persist: true` to avoid them being\n    // discarded by IE during template cloning\n    prepend(createAnchor('v-start', true), el);\n    el.appendChild(createAnchor('v-end', true));\n  }\n  return el;\n}\n\n/**\n * Process the template option.\n * If the replace option is true this will swap the $el.\n *\n * @param {Element} el\n * @param {Object} options\n * @return {Element|DocumentFragment}\n */\n\nfunction transcludeTemplate(el, options) {\n  var template = options.template;\n  var frag = parseTemplate(template, true);\n  if (frag) {\n    var replacer = frag.firstChild;\n    var tag = replacer.tagName && replacer.tagName.toLowerCase();\n    if (options.replace) {\n      /* istanbul ignore if */\n      if (el === document.body) {\n        process.env.NODE_ENV !== 'production' && warn('You are mounting an instance with a template to ' + '<body>. This will replace <body> entirely. You ' + 'should probably use `replace: false` here.');\n      }\n      // there are many cases where the instance must\n      // become a fragment instance: basically anything that\n      // can create more than 1 root nodes.\n      if (\n      // multi-children template\n      frag.childNodes.length > 1 ||\n      // non-element template\n      replacer.nodeType !== 1 ||\n      // single nested component\n      tag === 'component' || resolveAsset(options, 'components', tag) || hasBindAttr(replacer, 'is') ||\n      // element directive\n      resolveAsset(options, 'elementDirectives', tag) ||\n      // for block\n      replacer.hasAttribute('v-for') ||\n      // if block\n      replacer.hasAttribute('v-if')) {\n        return frag;\n      } else {\n        options._replacerAttrs = extractAttrs(replacer);\n        mergeAttrs(el, replacer);\n        return replacer;\n      }\n    } else {\n      el.appendChild(frag);\n      return el;\n    }\n  } else {\n    process.env.NODE_ENV !== 'production' && warn('Invalid template option: ' + template);\n  }\n}\n\n/**\n * Helper to extract a component container's attributes\n * into a plain object array.\n *\n * @param {Element} el\n * @return {Array}\n */\n\nfunction extractAttrs(el) {\n  if (el.nodeType === 1 && el.hasAttributes()) {\n    return toArray(el.attributes);\n  }\n}\n\n/**\n * Merge the attributes of two elements, and make sure\n * the class names are merged properly.\n *\n * @param {Element} from\n * @param {Element} to\n */\n\nfunction mergeAttrs(from, to) {\n  var attrs = from.attributes;\n  var i = attrs.length;\n  var name, value;\n  while (i--) {\n    name = attrs[i].name;\n    value = attrs[i].value;\n    if (!to.hasAttribute(name) && !specialCharRE.test(name)) {\n      to.setAttribute(name, value);\n    } else if (name === 'class' && !parseText(value)) {\n      value.split(/\\s+/).forEach(function (cls) {\n        addClass(to, cls);\n      });\n    }\n  }\n}\n\nvar compiler = Object.freeze({\n\tcompile: compile,\n\tcompileAndLinkProps: compileAndLinkProps,\n\tcompileRoot: compileRoot,\n\tterminalDirectives: terminalDirectives,\n\ttransclude: transclude\n});\n\nfunction stateMixin (Vue) {\n\n  /**\n   * Accessor for `$data` property, since setting $data\n   * requires observing the new object and updating\n   * proxied properties.\n   */\n\n  Object.defineProperty(Vue.prototype, '$data', {\n    get: function get() {\n      return this._data;\n    },\n    set: function set(newData) {\n      if (newData !== this._data) {\n        this._setData(newData);\n      }\n    }\n  });\n\n  /**\n   * Setup the scope of an instance, which contains:\n   * - observed data\n   * - computed properties\n   * - user methods\n   * - meta properties\n   */\n\n  Vue.prototype._initState = function () {\n    this._initProps();\n    this._initMeta();\n    this._initMethods();\n    this._initData();\n    this._initComputed();\n  };\n\n  /**\n   * Initialize props.\n   */\n\n  Vue.prototype._initProps = function () {\n    var options = this.$options;\n    var el = options.el;\n    var props = options.props;\n    if (props && !el) {\n      process.env.NODE_ENV !== 'production' && warn('Props will not be compiled if no `el` option is ' + 'provided at instantiation.');\n    }\n    // make sure to convert string selectors into element now\n    el = options.el = query(el);\n    this._propsUnlinkFn = el && el.nodeType === 1 && props\n    // props must be linked in proper scope if inside v-for\n    ? compileAndLinkProps(this, el, props, this._scope) : null;\n  };\n\n  /**\n   * Initialize the data.\n   */\n\n  Vue.prototype._initData = function () {\n    var propsData = this._data;\n    var optionsDataFn = this.$options.data;\n    var optionsData = optionsDataFn && optionsDataFn();\n    var runtimeData;\n    if (process.env.NODE_ENV !== 'production') {\n      runtimeData = (typeof this._runtimeData === 'function' ? this._runtimeData() : this._runtimeData) || {};\n      this._runtimeData = null;\n    }\n    if (optionsData) {\n      this._data = optionsData;\n      for (var prop in propsData) {\n        if (process.env.NODE_ENV !== 'production' && hasOwn(optionsData, prop) && !hasOwn(runtimeData, prop)) {\n          warn('Data field \"' + prop + '\" is already defined ' + 'as a prop. Use prop default value instead.');\n        }\n        if (this._props[prop].raw !== null || !hasOwn(optionsData, prop)) {\n          set(optionsData, prop, propsData[prop]);\n        }\n      }\n    }\n    var data = this._data;\n    // proxy data on instance\n    var keys = Object.keys(data);\n    var i, key;\n    i = keys.length;\n    while (i--) {\n      key = keys[i];\n      this._proxy(key);\n    }\n    // observe data\n    observe(data, this);\n  };\n\n  /**\n   * Swap the instance's $data. Called in $data's setter.\n   *\n   * @param {Object} newData\n   */\n\n  Vue.prototype._setData = function (newData) {\n    newData = newData || {};\n    var oldData = this._data;\n    this._data = newData;\n    var keys, key, i;\n    // unproxy keys not present in new data\n    keys = Object.keys(oldData);\n    i = keys.length;\n    while (i--) {\n      key = keys[i];\n      if (!(key in newData)) {\n        this._unproxy(key);\n      }\n    }\n    // proxy keys not already proxied,\n    // and trigger change for changed values\n    keys = Object.keys(newData);\n    i = keys.length;\n    while (i--) {\n      key = keys[i];\n      if (!hasOwn(this, key)) {\n        // new property\n        this._proxy(key);\n      }\n    }\n    oldData.__ob__.removeVm(this);\n    observe(newData, this);\n    this._digest();\n  };\n\n  /**\n   * Proxy a property, so that\n   * vm.prop === vm._data.prop\n   *\n   * @param {String} key\n   */\n\n  Vue.prototype._proxy = function (key) {\n    if (!isReserved(key)) {\n      // need to store ref to self here\n      // because these getter/setters might\n      // be called by child scopes via\n      // prototype inheritance.\n      var self = this;\n      Object.defineProperty(self, key, {\n        configurable: true,\n        enumerable: true,\n        get: function proxyGetter() {\n          return self._data[key];\n        },\n        set: function proxySetter(val) {\n          self._data[key] = val;\n        }\n      });\n    }\n  };\n\n  /**\n   * Unproxy a property.\n   *\n   * @param {String} key\n   */\n\n  Vue.prototype._unproxy = function (key) {\n    if (!isReserved(key)) {\n      delete this[key];\n    }\n  };\n\n  /**\n   * Force update on every watcher in scope.\n   */\n\n  Vue.prototype._digest = function () {\n    for (var i = 0, l = this._watchers.length; i < l; i++) {\n      this._watchers[i].update(true); // shallow updates\n    }\n  };\n\n  /**\n   * Setup computed properties. They are essentially\n   * special getter/setters\n   */\n\n  function noop() {}\n  Vue.prototype._initComputed = function () {\n    var computed = this.$options.computed;\n    if (computed) {\n      for (var key in computed) {\n        var userDef = computed[key];\n        var def = {\n          enumerable: true,\n          configurable: true\n        };\n        if (typeof userDef === 'function') {\n          def.get = makeComputedGetter(userDef, this);\n          def.set = noop;\n        } else {\n          def.get = userDef.get ? userDef.cache !== false ? makeComputedGetter(userDef.get, this) : bind$1(userDef.get, this) : noop;\n          def.set = userDef.set ? bind$1(userDef.set, this) : noop;\n        }\n        Object.defineProperty(this, key, def);\n      }\n    }\n  };\n\n  function makeComputedGetter(getter, owner) {\n    var watcher = new Watcher(owner, getter, null, {\n      lazy: true\n    });\n    return function computedGetter() {\n      if (watcher.dirty) {\n        watcher.evaluate();\n      }\n      if (Dep.target) {\n        watcher.depend();\n      }\n      return watcher.value;\n    };\n  }\n\n  /**\n   * Setup instance methods. Methods must be bound to the\n   * instance since they might be passed down as a prop to\n   * child components.\n   */\n\n  Vue.prototype._initMethods = function () {\n    var methods = this.$options.methods;\n    if (methods) {\n      for (var key in methods) {\n        this[key] = bind$1(methods[key], this);\n      }\n    }\n  };\n\n  /**\n   * Initialize meta information like $index, $key & $value.\n   */\n\n  Vue.prototype._initMeta = function () {\n    var metas = this.$options._meta;\n    if (metas) {\n      for (var key in metas) {\n        defineReactive(this, key, metas[key]);\n      }\n    }\n  };\n}\n\nvar eventRE = /^v-on:|^@/;\n\nfunction eventsMixin (Vue) {\n\n  /**\n   * Setup the instance's option events & watchers.\n   * If the value is a string, we pull it from the\n   * instance's methods by name.\n   */\n\n  Vue.prototype._initEvents = function () {\n    var options = this.$options;\n    if (options._asComponent) {\n      registerComponentEvents(this, options.el);\n    }\n    registerCallbacks(this, '$on', options.events);\n    registerCallbacks(this, '$watch', options.watch);\n  };\n\n  /**\n   * Register v-on events on a child component\n   *\n   * @param {Vue} vm\n   * @param {Element} el\n   */\n\n  function registerComponentEvents(vm, el) {\n    var attrs = el.attributes;\n    var name, handler;\n    for (var i = 0, l = attrs.length; i < l; i++) {\n      name = attrs[i].name;\n      if (eventRE.test(name)) {\n        name = name.replace(eventRE, '');\n        handler = (vm._scope || vm._context).$eval(attrs[i].value, true);\n        handler._fromParent = true;\n        vm.$on(name.replace(eventRE), handler);\n      }\n    }\n  }\n\n  /**\n   * Register callbacks for option events and watchers.\n   *\n   * @param {Vue} vm\n   * @param {String} action\n   * @param {Object} hash\n   */\n\n  function registerCallbacks(vm, action, hash) {\n    if (!hash) return;\n    var handlers, key, i, j;\n    for (key in hash) {\n      handlers = hash[key];\n      if (isArray(handlers)) {\n        for (i = 0, j = handlers.length; i < j; i++) {\n          register(vm, action, key, handlers[i]);\n        }\n      } else {\n        register(vm, action, key, handlers);\n      }\n    }\n  }\n\n  /**\n   * Helper to register an event/watch callback.\n   *\n   * @param {Vue} vm\n   * @param {String} action\n   * @param {String} key\n   * @param {Function|String|Object} handler\n   * @param {Object} [options]\n   */\n\n  function register(vm, action, key, handler, options) {\n    var type = typeof handler;\n    if (type === 'function') {\n      vm[action](key, handler, options);\n    } else if (type === 'string') {\n      var methods = vm.$options.methods;\n      var method = methods && methods[handler];\n      if (method) {\n        vm[action](key, method, options);\n      } else {\n        process.env.NODE_ENV !== 'production' && warn('Unknown method: \"' + handler + '\" when ' + 'registering callback for ' + action + ': \"' + key + '\".');\n      }\n    } else if (handler && type === 'object') {\n      register(vm, action, key, handler.handler, handler);\n    }\n  }\n\n  /**\n   * Setup recursive attached/detached calls\n   */\n\n  Vue.prototype._initDOMHooks = function () {\n    this.$on('hook:attached', onAttached);\n    this.$on('hook:detached', onDetached);\n  };\n\n  /**\n   * Callback to recursively call attached hook on children\n   */\n\n  function onAttached() {\n    if (!this._isAttached) {\n      this._isAttached = true;\n      this.$children.forEach(callAttach);\n    }\n  }\n\n  /**\n   * Iterator to call attached hook\n   *\n   * @param {Vue} child\n   */\n\n  function callAttach(child) {\n    if (!child._isAttached && inDoc(child.$el)) {\n      child._callHook('attached');\n    }\n  }\n\n  /**\n   * Callback to recursively call detached hook on children\n   */\n\n  function onDetached() {\n    if (this._isAttached) {\n      this._isAttached = false;\n      this.$children.forEach(callDetach);\n    }\n  }\n\n  /**\n   * Iterator to call detached hook\n   *\n   * @param {Vue} child\n   */\n\n  function callDetach(child) {\n    if (child._isAttached && !inDoc(child.$el)) {\n      child._callHook('detached');\n    }\n  }\n\n  /**\n   * Trigger all handlers for a hook\n   *\n   * @param {String} hook\n   */\n\n  Vue.prototype._callHook = function (hook) {\n    this.$emit('pre-hook:' + hook);\n    var handlers = this.$options[hook];\n    if (handlers) {\n      for (var i = 0, j = handlers.length; i < j; i++) {\n        handlers[i].call(this);\n      }\n    }\n    this.$emit('hook:' + hook);\n  };\n}\n\nfunction noop() {}\n\n/**\n * A directive links a DOM element with a piece of data,\n * which is the result of evaluating an expression.\n * It registers a watcher with the expression and calls\n * the DOM update function when a change is triggered.\n *\n * @param {String} name\n * @param {Node} el\n * @param {Vue} vm\n * @param {Object} descriptor\n *                 - {String} name\n *                 - {Object} def\n *                 - {String} expression\n *                 - {Array<Object>} [filters]\n *                 - {Boolean} literal\n *                 - {String} attr\n *                 - {String} raw\n * @param {Object} def - directive definition object\n * @param {Vue} [host] - transclusion host component\n * @param {Object} [scope] - v-for scope\n * @param {Fragment} [frag] - owner fragment\n * @constructor\n */\nfunction Directive(descriptor, vm, el, host, scope, frag) {\n  this.vm = vm;\n  this.el = el;\n  // copy descriptor properties\n  this.descriptor = descriptor;\n  this.name = descriptor.name;\n  this.expression = descriptor.expression;\n  this.arg = descriptor.arg;\n  this.modifiers = descriptor.modifiers;\n  this.filters = descriptor.filters;\n  this.literal = this.modifiers && this.modifiers.literal;\n  // private\n  this._locked = false;\n  this._bound = false;\n  this._listeners = null;\n  // link context\n  this._host = host;\n  this._scope = scope;\n  this._frag = frag;\n  // store directives on node in dev mode\n  if (process.env.NODE_ENV !== 'production' && this.el) {\n    this.el._vue_directives = this.el._vue_directives || [];\n    this.el._vue_directives.push(this);\n  }\n}\n\n/**\n * Initialize the directive, mixin definition properties,\n * setup the watcher, call definition bind() and update()\n * if present.\n *\n * @param {Object} def\n */\n\nDirective.prototype._bind = function () {\n  var name = this.name;\n  var descriptor = this.descriptor;\n\n  // remove attribute\n  if ((name !== 'cloak' || this.vm._isCompiled) && this.el && this.el.removeAttribute) {\n    var attr = descriptor.attr || 'v-' + name;\n    this.el.removeAttribute(attr);\n  }\n\n  // copy def properties\n  var def = descriptor.def;\n  if (typeof def === 'function') {\n    this.update = def;\n  } else {\n    extend(this, def);\n  }\n\n  // setup directive params\n  this._setupParams();\n\n  // initial bind\n  if (this.bind) {\n    this.bind();\n  }\n  this._bound = true;\n\n  if (this.literal) {\n    this.update && this.update(descriptor.raw);\n  } else if ((this.expression || this.modifiers) && (this.update || this.twoWay) && !this._checkStatement()) {\n    // wrapped updater for context\n    var dir = this;\n    if (this.update) {\n      this._update = function (val, oldVal) {\n        if (!dir._locked) {\n          dir.update(val, oldVal);\n        }\n      };\n    } else {\n      this._update = noop;\n    }\n    var preProcess = this._preProcess ? bind$1(this._preProcess, this) : null;\n    var postProcess = this._postProcess ? bind$1(this._postProcess, this) : null;\n    var watcher = this._watcher = new Watcher(this.vm, this.expression, this._update, // callback\n    {\n      filters: this.filters,\n      twoWay: this.twoWay,\n      deep: this.deep,\n      preProcess: preProcess,\n      postProcess: postProcess,\n      scope: this._scope\n    });\n    // v-model with inital inline value need to sync back to\n    // model instead of update to DOM on init. They would\n    // set the afterBind hook to indicate that.\n    if (this.afterBind) {\n      this.afterBind();\n    } else if (this.update) {\n      this.update(watcher.value);\n    }\n  }\n};\n\n/**\n * Setup all param attributes, e.g. track-by,\n * transition-mode, etc...\n */\n\nDirective.prototype._setupParams = function () {\n  if (!this.params) {\n    return;\n  }\n  var params = this.params;\n  // swap the params array with a fresh object.\n  this.params = Object.create(null);\n  var i = params.length;\n  var key, val, mappedKey;\n  while (i--) {\n    key = params[i];\n    mappedKey = camelize(key);\n    val = getBindAttr(this.el, key);\n    if (val != null) {\n      // dynamic\n      this._setupParamWatcher(mappedKey, val);\n    } else {\n      // static\n      val = getAttr(this.el, key);\n      if (val != null) {\n        this.params[mappedKey] = val === '' ? true : val;\n      }\n    }\n  }\n};\n\n/**\n * Setup a watcher for a dynamic param.\n *\n * @param {String} key\n * @param {String} expression\n */\n\nDirective.prototype._setupParamWatcher = function (key, expression) {\n  var self = this;\n  var called = false;\n  var unwatch = (this._scope || this.vm).$watch(expression, function (val, oldVal) {\n    self.params[key] = val;\n    // since we are in immediate mode,\n    // only call the param change callbacks if this is not the first update.\n    if (called) {\n      var cb = self.paramWatchers && self.paramWatchers[key];\n      if (cb) {\n        cb.call(self, val, oldVal);\n      }\n    } else {\n      called = true;\n    }\n  }, {\n    immediate: true,\n    user: false\n  });(this._paramUnwatchFns || (this._paramUnwatchFns = [])).push(unwatch);\n};\n\n/**\n * Check if the directive is a function caller\n * and if the expression is a callable one. If both true,\n * we wrap up the expression and use it as the event\n * handler.\n *\n * e.g. on-click=\"a++\"\n *\n * @return {Boolean}\n */\n\nDirective.prototype._checkStatement = function () {\n  var expression = this.expression;\n  if (expression && this.acceptStatement && !isSimplePath(expression)) {\n    var fn = parseExpression(expression).get;\n    var scope = this._scope || this.vm;\n    var handler = function handler(e) {\n      scope.$event = e;\n      fn.call(scope, scope);\n      scope.$event = null;\n    };\n    if (this.filters) {\n      handler = scope._applyFilters(handler, null, this.filters);\n    }\n    this.update(handler);\n    return true;\n  }\n};\n\n/**\n * Set the corresponding value with the setter.\n * This should only be used in two-way directives\n * e.g. v-model.\n *\n * @param {*} value\n * @public\n */\n\nDirective.prototype.set = function (value) {\n  /* istanbul ignore else */\n  if (this.twoWay) {\n    this._withLock(function () {\n      this._watcher.set(value);\n    });\n  } else if (process.env.NODE_ENV !== 'production') {\n    warn('Directive.set() can only be used inside twoWay' + 'directives.');\n  }\n};\n\n/**\n * Execute a function while preventing that function from\n * triggering updates on this directive instance.\n *\n * @param {Function} fn\n */\n\nDirective.prototype._withLock = function (fn) {\n  var self = this;\n  self._locked = true;\n  fn.call(self);\n  nextTick(function () {\n    self._locked = false;\n  });\n};\n\n/**\n * Convenience method that attaches a DOM event listener\n * to the directive element and autometically tears it down\n * during unbind.\n *\n * @param {String} event\n * @param {Function} handler\n * @param {Boolean} [useCapture]\n */\n\nDirective.prototype.on = function (event, handler, useCapture) {\n  on$1(this.el, event, handler, useCapture);(this._listeners || (this._listeners = [])).push([event, handler]);\n};\n\n/**\n * Teardown the watcher and call unbind.\n */\n\nDirective.prototype._teardown = function () {\n  if (this._bound) {\n    this._bound = false;\n    if (this.unbind) {\n      this.unbind();\n    }\n    if (this._watcher) {\n      this._watcher.teardown();\n    }\n    var listeners = this._listeners;\n    var i;\n    if (listeners) {\n      i = listeners.length;\n      while (i--) {\n        off(this.el, listeners[i][0], listeners[i][1]);\n      }\n    }\n    var unwatchFns = this._paramUnwatchFns;\n    if (unwatchFns) {\n      i = unwatchFns.length;\n      while (i--) {\n        unwatchFns[i]();\n      }\n    }\n    if (process.env.NODE_ENV !== 'production' && this.el) {\n      this.el._vue_directives.$remove(this);\n    }\n    this.vm = this.el = this._watcher = this._listeners = null;\n  }\n};\n\nfunction lifecycleMixin (Vue) {\n\n  /**\n   * Update v-ref for component.\n   *\n   * @param {Boolean} remove\n   */\n\n  Vue.prototype._updateRef = function (remove) {\n    var ref = this.$options._ref;\n    if (ref) {\n      var refs = (this._scope || this._context).$refs;\n      if (remove) {\n        if (refs[ref] === this) {\n          refs[ref] = null;\n        }\n      } else {\n        refs[ref] = this;\n      }\n    }\n  };\n\n  /**\n   * Transclude, compile and link element.\n   *\n   * If a pre-compiled linker is available, that means the\n   * passed in element will be pre-transcluded and compiled\n   * as well - all we need to do is to call the linker.\n   *\n   * Otherwise we need to call transclude/compile/link here.\n   *\n   * @param {Element} el\n   */\n\n  Vue.prototype._compile = function (el) {\n    var options = this.$options;\n\n    // transclude and init element\n    // transclude can potentially replace original\n    // so we need to keep reference; this step also injects\n    // the template and caches the original attributes\n    // on the container node and replacer node.\n    var original = el;\n    el = transclude(el, options);\n    this._initElement(el);\n\n    // handle v-pre on root node (#2026)\n    if (el.nodeType === 1 && getAttr(el, 'v-pre') !== null) {\n      return;\n    }\n\n    // root is always compiled per-instance, because\n    // container attrs and props can be different every time.\n    var contextOptions = this._context && this._context.$options;\n    var rootLinker = compileRoot(el, options, contextOptions);\n\n    // compile and link the rest\n    var contentLinkFn;\n    var ctor = this.constructor;\n    // component compilation can be cached\n    // as long as it's not using inline-template\n    if (options._linkerCachable) {\n      contentLinkFn = ctor.linker;\n      if (!contentLinkFn) {\n        contentLinkFn = ctor.linker = compile(el, options);\n      }\n    }\n\n    // link phase\n    // make sure to link root with prop scope!\n    var rootUnlinkFn = rootLinker(this, el, this._scope);\n    var contentUnlinkFn = contentLinkFn ? contentLinkFn(this, el) : compile(el, options)(this, el);\n\n    // register composite unlink function\n    // to be called during instance destruction\n    this._unlinkFn = function () {\n      rootUnlinkFn();\n      // passing destroying: true to avoid searching and\n      // splicing the directives\n      contentUnlinkFn(true);\n    };\n\n    // finally replace original\n    if (options.replace) {\n      replace(original, el);\n    }\n\n    this._isCompiled = true;\n    this._callHook('compiled');\n  };\n\n  /**\n   * Initialize instance element. Called in the public\n   * $mount() method.\n   *\n   * @param {Element} el\n   */\n\n  Vue.prototype._initElement = function (el) {\n    if (el instanceof DocumentFragment) {\n      this._isFragment = true;\n      this.$el = this._fragmentStart = el.firstChild;\n      this._fragmentEnd = el.lastChild;\n      // set persisted text anchors to empty\n      if (this._fragmentStart.nodeType === 3) {\n        this._fragmentStart.data = this._fragmentEnd.data = '';\n      }\n      this._fragment = el;\n    } else {\n      this.$el = el;\n    }\n    this.$el.__vue__ = this;\n    this._callHook('beforeCompile');\n  };\n\n  /**\n   * Create and bind a directive to an element.\n   *\n   * @param {String} name - directive name\n   * @param {Node} node   - target node\n   * @param {Object} desc - parsed directive descriptor\n   * @param {Object} def  - directive definition object\n   * @param {Vue} [host] - transclusion host component\n   * @param {Object} [scope] - v-for scope\n   * @param {Fragment} [frag] - owner fragment\n   */\n\n  Vue.prototype._bindDir = function (descriptor, node, host, scope, frag) {\n    this._directives.push(new Directive(descriptor, this, node, host, scope, frag));\n  };\n\n  /**\n   * Teardown an instance, unobserves the data, unbind all the\n   * directives, turn off all the event listeners, etc.\n   *\n   * @param {Boolean} remove - whether to remove the DOM node.\n   * @param {Boolean} deferCleanup - if true, defer cleanup to\n   *                                 be called later\n   */\n\n  Vue.prototype._destroy = function (remove, deferCleanup) {\n    if (this._isBeingDestroyed) {\n      if (!deferCleanup) {\n        this._cleanup();\n      }\n      return;\n    }\n\n    var destroyReady;\n    var pendingRemoval;\n\n    var self = this;\n    // Cleanup should be called either synchronously or asynchronoysly as\n    // callback of this.$remove(), or if remove and deferCleanup are false.\n    // In any case it should be called after all other removing, unbinding and\n    // turning of is done\n    var cleanupIfPossible = function cleanupIfPossible() {\n      if (destroyReady && !pendingRemoval && !deferCleanup) {\n        self._cleanup();\n      }\n    };\n\n    // remove DOM element\n    if (remove && this.$el) {\n      pendingRemoval = true;\n      this.$remove(function () {\n        pendingRemoval = false;\n        cleanupIfPossible();\n      });\n    }\n\n    this._callHook('beforeDestroy');\n    this._isBeingDestroyed = true;\n    var i;\n    // remove self from parent. only necessary\n    // if parent is not being destroyed as well.\n    var parent = this.$parent;\n    if (parent && !parent._isBeingDestroyed) {\n      parent.$children.$remove(this);\n      // unregister ref (remove: true)\n      this._updateRef(true);\n    }\n    // destroy all children.\n    i = this.$children.length;\n    while (i--) {\n      this.$children[i].$destroy();\n    }\n    // teardown props\n    if (this._propsUnlinkFn) {\n      this._propsUnlinkFn();\n    }\n    // teardown all directives. this also tearsdown all\n    // directive-owned watchers.\n    if (this._unlinkFn) {\n      this._unlinkFn();\n    }\n    i = this._watchers.length;\n    while (i--) {\n      this._watchers[i].teardown();\n    }\n    // remove reference to self on $el\n    if (this.$el) {\n      this.$el.__vue__ = null;\n    }\n\n    destroyReady = true;\n    cleanupIfPossible();\n  };\n\n  /**\n   * Clean up to ensure garbage collection.\n   * This is called after the leave transition if there\n   * is any.\n   */\n\n  Vue.prototype._cleanup = function () {\n    if (this._isDestroyed) {\n      return;\n    }\n    // remove self from owner fragment\n    // do it in cleanup so that we can call $destroy with\n    // defer right when a fragment is about to be removed.\n    if (this._frag) {\n      this._frag.children.$remove(this);\n    }\n    // remove reference from data ob\n    // frozen object may not have observer.\n    if (this._data.__ob__) {\n      this._data.__ob__.removeVm(this);\n    }\n    // Clean up references to private properties and other\n    // instances. preserve reference to _data so that proxy\n    // accessors still work. The only potential side effect\n    // here is that mutating the instance after it's destroyed\n    // may affect the state of other components that are still\n    // observing the same object, but that seems to be a\n    // reasonable responsibility for the user rather than\n    // always throwing an error on them.\n    this.$el = this.$parent = this.$root = this.$children = this._watchers = this._context = this._scope = this._directives = null;\n    // call the last hook...\n    this._isDestroyed = true;\n    this._callHook('destroyed');\n    // turn off all instance listeners.\n    this.$off();\n  };\n}\n\nfunction miscMixin (Vue) {\n\n  /**\n   * Apply a list of filter (descriptors) to a value.\n   * Using plain for loops here because this will be called in\n   * the getter of any watcher with filters so it is very\n   * performance sensitive.\n   *\n   * @param {*} value\n   * @param {*} [oldValue]\n   * @param {Array} filters\n   * @param {Boolean} write\n   * @return {*}\n   */\n\n  Vue.prototype._applyFilters = function (value, oldValue, filters, write) {\n    var filter, fn, args, arg, offset, i, l, j, k;\n    for (i = 0, l = filters.length; i < l; i++) {\n      filter = filters[i];\n      fn = resolveAsset(this.$options, 'filters', filter.name);\n      if (process.env.NODE_ENV !== 'production') {\n        assertAsset(fn, 'filter', filter.name);\n      }\n      if (!fn) continue;\n      fn = write ? fn.write : fn.read || fn;\n      if (typeof fn !== 'function') continue;\n      args = write ? [value, oldValue] : [value];\n      offset = write ? 2 : 1;\n      if (filter.args) {\n        for (j = 0, k = filter.args.length; j < k; j++) {\n          arg = filter.args[j];\n          args[j + offset] = arg.dynamic ? this.$get(arg.value) : arg.value;\n        }\n      }\n      value = fn.apply(this, args);\n    }\n    return value;\n  };\n\n  /**\n   * Resolve a component, depending on whether the component\n   * is defined normally or using an async factory function.\n   * Resolves synchronously if already resolved, otherwise\n   * resolves asynchronously and caches the resolved\n   * constructor on the factory.\n   *\n   * @param {String} id\n   * @param {Function} cb\n   */\n\n  Vue.prototype._resolveComponent = function (id, cb) {\n    var factory = resolveAsset(this.$options, 'components', id);\n    if (process.env.NODE_ENV !== 'production') {\n      assertAsset(factory, 'component', id);\n    }\n    if (!factory) {\n      return;\n    }\n    // async component factory\n    if (!factory.options) {\n      if (factory.resolved) {\n        // cached\n        cb(factory.resolved);\n      } else if (factory.requested) {\n        // pool callbacks\n        factory.pendingCallbacks.push(cb);\n      } else {\n        factory.requested = true;\n        var cbs = factory.pendingCallbacks = [cb];\n        factory(function resolve(res) {\n          if (isPlainObject(res)) {\n            res = Vue.extend(res);\n          }\n          // cache resolved\n          factory.resolved = res;\n          // invoke callbacks\n          for (var i = 0, l = cbs.length; i < l; i++) {\n            cbs[i](res);\n          }\n        }, function reject(reason) {\n          process.env.NODE_ENV !== 'production' && warn('Failed to resolve async component: ' + id + '. ' + (reason ? '\\nReason: ' + reason : ''));\n        });\n      }\n    } else {\n      // normal component\n      cb(factory);\n    }\n  };\n}\n\nfunction globalAPI (Vue) {\n\n  /**\n   * Expose useful internals\n   */\n\n  Vue.util = util;\n  Vue.config = config;\n  Vue.set = set;\n  Vue['delete'] = del;\n  Vue.nextTick = nextTick;\n\n  /**\n   * The following are exposed for advanced usage / plugins\n   */\n\n  Vue.compiler = compiler;\n  Vue.FragmentFactory = FragmentFactory;\n  Vue.internalDirectives = internalDirectives;\n  Vue.parsers = {\n    path: path,\n    text: text$1,\n    template: template,\n    directive: directive,\n    expression: expression\n  };\n\n  /**\n   * Each instance constructor, including Vue, has a unique\n   * cid. This enables us to create wrapped \"child\n   * constructors\" for prototypal inheritance and cache them.\n   */\n\n  Vue.cid = 0;\n  var cid = 1;\n\n  /**\n   * Class inheritance\n   *\n   * @param {Object} extendOptions\n   */\n\n  Vue.extend = function (extendOptions) {\n    extendOptions = extendOptions || {};\n    var Super = this;\n    var isFirstExtend = Super.cid === 0;\n    if (isFirstExtend && extendOptions._Ctor) {\n      return extendOptions._Ctor;\n    }\n    var name = extendOptions.name || Super.options.name;\n    if (process.env.NODE_ENV !== 'production') {\n      if (!/^[a-zA-Z][\\w-]*$/.test(name)) {\n        warn('Invalid component name: \"' + name + '\". Component names ' + 'can only contain alphanumeric characaters and the hyphen.');\n        name = null;\n      }\n    }\n    var Sub = createClass(name || 'VueComponent');\n    Sub.prototype = Object.create(Super.prototype);\n    Sub.prototype.constructor = Sub;\n    Sub.cid = cid++;\n    Sub.options = mergeOptions(Super.options, extendOptions);\n    Sub['super'] = Super;\n    // allow further extension\n    Sub.extend = Super.extend;\n    // create asset registers, so extended classes\n    // can have their private assets too.\n    config._assetTypes.forEach(function (type) {\n      Sub[type] = Super[type];\n    });\n    // enable recursive self-lookup\n    if (name) {\n      Sub.options.components[name] = Sub;\n    }\n    // cache constructor\n    if (isFirstExtend) {\n      extendOptions._Ctor = Sub;\n    }\n    return Sub;\n  };\n\n  /**\n   * A function that returns a sub-class constructor with the\n   * given name. This gives us much nicer output when\n   * logging instances in the console.\n   *\n   * @param {String} name\n   * @return {Function}\n   */\n\n  function createClass(name) {\n    return new Function('return function ' + classify(name) + ' (options) { this._init(options) }')();\n  }\n\n  /**\n   * Plugin system\n   *\n   * @param {Object} plugin\n   */\n\n  Vue.use = function (plugin) {\n    /* istanbul ignore if */\n    if (plugin.installed) {\n      return;\n    }\n    // additional parameters\n    var args = toArray(arguments, 1);\n    args.unshift(this);\n    if (typeof plugin.install === 'function') {\n      plugin.install.apply(plugin, args);\n    } else {\n      plugin.apply(null, args);\n    }\n    plugin.installed = true;\n    return this;\n  };\n\n  /**\n   * Apply a global mixin by merging it into the default\n   * options.\n   */\n\n  Vue.mixin = function (mixin) {\n    Vue.options = mergeOptions(Vue.options, mixin);\n  };\n\n  /**\n   * Create asset registration methods with the following\n   * signature:\n   *\n   * @param {String} id\n   * @param {*} definition\n   */\n\n  config._assetTypes.forEach(function (type) {\n    Vue[type] = function (id, definition) {\n      if (!definition) {\n        return this.options[type + 's'][id];\n      } else {\n        /* istanbul ignore if */\n        if (process.env.NODE_ENV !== 'production') {\n          if (type === 'component' && (commonTagRE.test(id) || reservedTagRE.test(id))) {\n            warn('Do not use built-in or reserved HTML elements as component ' + 'id: ' + id);\n          }\n        }\n        if (type === 'component' && isPlainObject(definition)) {\n          definition.name = id;\n          definition = Vue.extend(definition);\n        }\n        this.options[type + 's'][id] = definition;\n        return definition;\n      }\n    };\n  });\n}\n\nvar filterRE = /[^|]\\|[^|]/;\n\nfunction dataAPI (Vue) {\n\n  /**\n   * Get the value from an expression on this vm.\n   *\n   * @param {String} exp\n   * @param {Boolean} [asStatement]\n   * @return {*}\n   */\n\n  Vue.prototype.$get = function (exp, asStatement) {\n    var res = parseExpression(exp);\n    if (res) {\n      if (asStatement && !isSimplePath(exp)) {\n        var self = this;\n        return function statementHandler() {\n          self.$arguments = toArray(arguments);\n          var result = res.get.call(self, self);\n          self.$arguments = null;\n          return result;\n        };\n      } else {\n        try {\n          return res.get.call(this, this);\n        } catch (e) {}\n      }\n    }\n  };\n\n  /**\n   * Set the value from an expression on this vm.\n   * The expression must be a valid left-hand\n   * expression in an assignment.\n   *\n   * @param {String} exp\n   * @param {*} val\n   */\n\n  Vue.prototype.$set = function (exp, val) {\n    var res = parseExpression(exp, true);\n    if (res && res.set) {\n      res.set.call(this, this, val);\n    }\n  };\n\n  /**\n   * Delete a property on the VM\n   *\n   * @param {String} key\n   */\n\n  Vue.prototype.$delete = function (key) {\n    del(this._data, key);\n  };\n\n  /**\n   * Watch an expression, trigger callback when its\n   * value changes.\n   *\n   * @param {String|Function} expOrFn\n   * @param {Function} cb\n   * @param {Object} [options]\n   *                 - {Boolean} deep\n   *                 - {Boolean} immediate\n   * @return {Function} - unwatchFn\n   */\n\n  Vue.prototype.$watch = function (expOrFn, cb, options) {\n    var vm = this;\n    var parsed;\n    if (typeof expOrFn === 'string') {\n      parsed = parseDirective(expOrFn);\n      expOrFn = parsed.expression;\n    }\n    var watcher = new Watcher(vm, expOrFn, cb, {\n      deep: options && options.deep,\n      sync: options && options.sync,\n      filters: parsed && parsed.filters,\n      user: !options || options.user !== false\n    });\n    if (options && options.immediate) {\n      cb.call(vm, watcher.value);\n    }\n    return function unwatchFn() {\n      watcher.teardown();\n    };\n  };\n\n  /**\n   * Evaluate a text directive, including filters.\n   *\n   * @param {String} text\n   * @param {Boolean} [asStatement]\n   * @return {String}\n   */\n\n  Vue.prototype.$eval = function (text, asStatement) {\n    // check for filters.\n    if (filterRE.test(text)) {\n      var dir = parseDirective(text);\n      // the filter regex check might give false positive\n      // for pipes inside strings, so it's possible that\n      // we don't get any filters here\n      var val = this.$get(dir.expression, asStatement);\n      return dir.filters ? this._applyFilters(val, null, dir.filters) : val;\n    } else {\n      // no filter\n      return this.$get(text, asStatement);\n    }\n  };\n\n  /**\n   * Interpolate a piece of template text.\n   *\n   * @param {String} text\n   * @return {String}\n   */\n\n  Vue.prototype.$interpolate = function (text) {\n    var tokens = parseText(text);\n    var vm = this;\n    if (tokens) {\n      if (tokens.length === 1) {\n        return vm.$eval(tokens[0].value) + '';\n      } else {\n        return tokens.map(function (token) {\n          return token.tag ? vm.$eval(token.value) : token.value;\n        }).join('');\n      }\n    } else {\n      return text;\n    }\n  };\n\n  /**\n   * Log instance data as a plain JS object\n   * so that it is easier to inspect in console.\n   * This method assumes console is available.\n   *\n   * @param {String} [path]\n   */\n\n  Vue.prototype.$log = function (path) {\n    var data = path ? getPath(this._data, path) : this._data;\n    if (data) {\n      data = clean(data);\n    }\n    // include computed fields\n    if (!path) {\n      for (var key in this.$options.computed) {\n        data[key] = clean(this[key]);\n      }\n    }\n    console.log(data);\n  };\n\n  /**\n   * \"clean\" a getter/setter converted object into a plain\n   * object copy.\n   *\n   * @param {Object} - obj\n   * @return {Object}\n   */\n\n  function clean(obj) {\n    return JSON.parse(JSON.stringify(obj));\n  }\n}\n\nfunction domAPI (Vue) {\n\n  /**\n   * Convenience on-instance nextTick. The callback is\n   * auto-bound to the instance, and this avoids component\n   * modules having to rely on the global Vue.\n   *\n   * @param {Function} fn\n   */\n\n  Vue.prototype.$nextTick = function (fn) {\n    nextTick(fn, this);\n  };\n\n  /**\n   * Append instance to target\n   *\n   * @param {Node} target\n   * @param {Function} [cb]\n   * @param {Boolean} [withTransition] - defaults to true\n   */\n\n  Vue.prototype.$appendTo = function (target, cb, withTransition) {\n    return insert(this, target, cb, withTransition, append, appendWithTransition);\n  };\n\n  /**\n   * Prepend instance to target\n   *\n   * @param {Node} target\n   * @param {Function} [cb]\n   * @param {Boolean} [withTransition] - defaults to true\n   */\n\n  Vue.prototype.$prependTo = function (target, cb, withTransition) {\n    target = query(target);\n    if (target.hasChildNodes()) {\n      this.$before(target.firstChild, cb, withTransition);\n    } else {\n      this.$appendTo(target, cb, withTransition);\n    }\n    return this;\n  };\n\n  /**\n   * Insert instance before target\n   *\n   * @param {Node} target\n   * @param {Function} [cb]\n   * @param {Boolean} [withTransition] - defaults to true\n   */\n\n  Vue.prototype.$before = function (target, cb, withTransition) {\n    return insert(this, target, cb, withTransition, beforeWithCb, beforeWithTransition);\n  };\n\n  /**\n   * Insert instance after target\n   *\n   * @param {Node} target\n   * @param {Function} [cb]\n   * @param {Boolean} [withTransition] - defaults to true\n   */\n\n  Vue.prototype.$after = function (target, cb, withTransition) {\n    target = query(target);\n    if (target.nextSibling) {\n      this.$before(target.nextSibling, cb, withTransition);\n    } else {\n      this.$appendTo(target.parentNode, cb, withTransition);\n    }\n    return this;\n  };\n\n  /**\n   * Remove instance from DOM\n   *\n   * @param {Function} [cb]\n   * @param {Boolean} [withTransition] - defaults to true\n   */\n\n  Vue.prototype.$remove = function (cb, withTransition) {\n    if (!this.$el.parentNode) {\n      return cb && cb();\n    }\n    var inDocument = this._isAttached && inDoc(this.$el);\n    // if we are not in document, no need to check\n    // for transitions\n    if (!inDocument) withTransition = false;\n    var self = this;\n    var realCb = function realCb() {\n      if (inDocument) self._callHook('detached');\n      if (cb) cb();\n    };\n    if (this._isFragment) {\n      removeNodeRange(this._fragmentStart, this._fragmentEnd, this, this._fragment, realCb);\n    } else {\n      var op = withTransition === false ? removeWithCb : removeWithTransition;\n      op(this.$el, this, realCb);\n    }\n    return this;\n  };\n\n  /**\n   * Shared DOM insertion function.\n   *\n   * @param {Vue} vm\n   * @param {Element} target\n   * @param {Function} [cb]\n   * @param {Boolean} [withTransition]\n   * @param {Function} op1 - op for non-transition insert\n   * @param {Function} op2 - op for transition insert\n   * @return vm\n   */\n\n  function insert(vm, target, cb, withTransition, op1, op2) {\n    target = query(target);\n    var targetIsDetached = !inDoc(target);\n    var op = withTransition === false || targetIsDetached ? op1 : op2;\n    var shouldCallHook = !targetIsDetached && !vm._isAttached && !inDoc(vm.$el);\n    if (vm._isFragment) {\n      mapNodeRange(vm._fragmentStart, vm._fragmentEnd, function (node) {\n        op(node, target, vm);\n      });\n      cb && cb();\n    } else {\n      op(vm.$el, target, vm, cb);\n    }\n    if (shouldCallHook) {\n      vm._callHook('attached');\n    }\n    return vm;\n  }\n\n  /**\n   * Check for selectors\n   *\n   * @param {String|Element} el\n   */\n\n  function query(el) {\n    return typeof el === 'string' ? document.querySelector(el) : el;\n  }\n\n  /**\n   * Append operation that takes a callback.\n   *\n   * @param {Node} el\n   * @param {Node} target\n   * @param {Vue} vm - unused\n   * @param {Function} [cb]\n   */\n\n  function append(el, target, vm, cb) {\n    target.appendChild(el);\n    if (cb) cb();\n  }\n\n  /**\n   * InsertBefore operation that takes a callback.\n   *\n   * @param {Node} el\n   * @param {Node} target\n   * @param {Vue} vm - unused\n   * @param {Function} [cb]\n   */\n\n  function beforeWithCb(el, target, vm, cb) {\n    before(el, target);\n    if (cb) cb();\n  }\n\n  /**\n   * Remove operation that takes a callback.\n   *\n   * @param {Node} el\n   * @param {Vue} vm - unused\n   * @param {Function} [cb]\n   */\n\n  function removeWithCb(el, vm, cb) {\n    remove(el);\n    if (cb) cb();\n  }\n}\n\nfunction eventsAPI (Vue) {\n\n  /**\n   * Listen on the given `event` with `fn`.\n   *\n   * @param {String} event\n   * @param {Function} fn\n   */\n\n  Vue.prototype.$on = function (event, fn) {\n    (this._events[event] || (this._events[event] = [])).push(fn);\n    modifyListenerCount(this, event, 1);\n    return this;\n  };\n\n  /**\n   * Adds an `event` listener that will be invoked a single\n   * time then automatically removed.\n   *\n   * @param {String} event\n   * @param {Function} fn\n   */\n\n  Vue.prototype.$once = function (event, fn) {\n    var self = this;\n    function on() {\n      self.$off(event, on);\n      fn.apply(this, arguments);\n    }\n    on.fn = fn;\n    this.$on(event, on);\n    return this;\n  };\n\n  /**\n   * Remove the given callback for `event` or all\n   * registered callbacks.\n   *\n   * @param {String} event\n   * @param {Function} fn\n   */\n\n  Vue.prototype.$off = function (event, fn) {\n    var cbs;\n    // all\n    if (!arguments.length) {\n      if (this.$parent) {\n        for (event in this._events) {\n          cbs = this._events[event];\n          if (cbs) {\n            modifyListenerCount(this, event, -cbs.length);\n          }\n        }\n      }\n      this._events = {};\n      return this;\n    }\n    // specific event\n    cbs = this._events[event];\n    if (!cbs) {\n      return this;\n    }\n    if (arguments.length === 1) {\n      modifyListenerCount(this, event, -cbs.length);\n      this._events[event] = null;\n      return this;\n    }\n    // specific handler\n    var cb;\n    var i = cbs.length;\n    while (i--) {\n      cb = cbs[i];\n      if (cb === fn || cb.fn === fn) {\n        modifyListenerCount(this, event, -1);\n        cbs.splice(i, 1);\n        break;\n      }\n    }\n    return this;\n  };\n\n  /**\n   * Trigger an event on self.\n   *\n   * @param {String|Object} event\n   * @return {Boolean} shouldPropagate\n   */\n\n  Vue.prototype.$emit = function (event) {\n    var isSource = typeof event === 'string';\n    event = isSource ? event : event.name;\n    var cbs = this._events[event];\n    var shouldPropagate = isSource || !cbs;\n    if (cbs) {\n      cbs = cbs.length > 1 ? toArray(cbs) : cbs;\n      // this is a somewhat hacky solution to the question raised\n      // in #2102: for an inline component listener like <comp @test=\"doThis\">,\n      // the propagation handling is somewhat broken. Therefore we\n      // need to treat these inline callbacks differently.\n      var hasParentCbs = isSource && cbs.some(function (cb) {\n        return cb._fromParent;\n      });\n      if (hasParentCbs) {\n        shouldPropagate = false;\n      }\n      var args = toArray(arguments, 1);\n      for (var i = 0, l = cbs.length; i < l; i++) {\n        var cb = cbs[i];\n        var res = cb.apply(this, args);\n        if (res === true && (!hasParentCbs || cb._fromParent)) {\n          shouldPropagate = true;\n        }\n      }\n    }\n    return shouldPropagate;\n  };\n\n  /**\n   * Recursively broadcast an event to all children instances.\n   *\n   * @param {String|Object} event\n   * @param {...*} additional arguments\n   */\n\n  Vue.prototype.$broadcast = function (event) {\n    var isSource = typeof event === 'string';\n    event = isSource ? event : event.name;\n    // if no child has registered for this event,\n    // then there's no need to broadcast.\n    if (!this._eventsCount[event]) return;\n    var children = this.$children;\n    var args = toArray(arguments);\n    if (isSource) {\n      // use object event to indicate non-source emit\n      // on children\n      args[0] = { name: event, source: this };\n    }\n    for (var i = 0, l = children.length; i < l; i++) {\n      var child = children[i];\n      var shouldPropagate = child.$emit.apply(child, args);\n      if (shouldPropagate) {\n        child.$broadcast.apply(child, args);\n      }\n    }\n    return this;\n  };\n\n  /**\n   * Recursively propagate an event up the parent chain.\n   *\n   * @param {String} event\n   * @param {...*} additional arguments\n   */\n\n  Vue.prototype.$dispatch = function (event) {\n    var shouldPropagate = this.$emit.apply(this, arguments);\n    if (!shouldPropagate) return;\n    var parent = this.$parent;\n    var args = toArray(arguments);\n    // use object event to indicate non-source emit\n    // on parents\n    args[0] = { name: event, source: this };\n    while (parent) {\n      shouldPropagate = parent.$emit.apply(parent, args);\n      parent = shouldPropagate ? parent.$parent : null;\n    }\n    return this;\n  };\n\n  /**\n   * Modify the listener counts on all parents.\n   * This bookkeeping allows $broadcast to return early when\n   * no child has listened to a certain event.\n   *\n   * @param {Vue} vm\n   * @param {String} event\n   * @param {Number} count\n   */\n\n  var hookRE = /^hook:/;\n  function modifyListenerCount(vm, event, count) {\n    var parent = vm.$parent;\n    // hooks do not get broadcasted so no need\n    // to do bookkeeping for them\n    if (!parent || !count || hookRE.test(event)) return;\n    while (parent) {\n      parent._eventsCount[event] = (parent._eventsCount[event] || 0) + count;\n      parent = parent.$parent;\n    }\n  }\n}\n\nfunction lifecycleAPI (Vue) {\n\n  /**\n   * Set instance target element and kick off the compilation\n   * process. The passed in `el` can be a selector string, an\n   * existing Element, or a DocumentFragment (for block\n   * instances).\n   *\n   * @param {Element|DocumentFragment|string} el\n   * @public\n   */\n\n  Vue.prototype.$mount = function (el) {\n    if (this._isCompiled) {\n      process.env.NODE_ENV !== 'production' && warn('$mount() should be called only once.');\n      return;\n    }\n    el = query(el);\n    if (!el) {\n      el = document.createElement('div');\n    }\n    this._compile(el);\n    this._initDOMHooks();\n    if (inDoc(this.$el)) {\n      this._callHook('attached');\n      ready.call(this);\n    } else {\n      this.$once('hook:attached', ready);\n    }\n    return this;\n  };\n\n  /**\n   * Mark an instance as ready.\n   */\n\n  function ready() {\n    this._isAttached = true;\n    this._isReady = true;\n    this._callHook('ready');\n  }\n\n  /**\n   * Teardown the instance, simply delegate to the internal\n   * _destroy.\n   */\n\n  Vue.prototype.$destroy = function (remove, deferCleanup) {\n    this._destroy(remove, deferCleanup);\n  };\n\n  /**\n   * Partially compile a piece of DOM and return a\n   * decompile function.\n   *\n   * @param {Element|DocumentFragment} el\n   * @param {Vue} [host]\n   * @return {Function}\n   */\n\n  Vue.prototype.$compile = function (el, host, scope, frag) {\n    return compile(el, this.$options, true)(this, el, host, scope, frag);\n  };\n}\n\n/**\n * The exposed Vue constructor.\n *\n * API conventions:\n * - public API methods/properties are prefixed with `$`\n * - internal methods/properties are prefixed with `_`\n * - non-prefixed properties are assumed to be proxied user\n *   data.\n *\n * @constructor\n * @param {Object} [options]\n * @public\n */\n\nfunction Vue(options) {\n  this._init(options);\n}\n\n// install internals\ninitMixin(Vue);\nstateMixin(Vue);\neventsMixin(Vue);\nlifecycleMixin(Vue);\nmiscMixin(Vue);\n\n// install APIs\nglobalAPI(Vue);\ndataAPI(Vue);\ndomAPI(Vue);\neventsAPI(Vue);\nlifecycleAPI(Vue);\n\nvar convertArray = vFor._postProcess;\n\n/**\n * Limit filter for arrays\n *\n * @param {Number} n\n * @param {Number} offset (Decimal expected)\n */\n\nfunction limitBy(arr, n, offset) {\n  offset = offset ? parseInt(offset, 10) : 0;\n  n = toNumber(n);\n  return typeof n === 'number' ? arr.slice(offset, offset + n) : arr;\n}\n\n/**\n * Filter filter for arrays\n *\n * @param {String} search\n * @param {String} [delimiter]\n * @param {String} ...dataKeys\n */\n\nfunction filterBy(arr, search, delimiter) {\n  arr = convertArray(arr);\n  if (search == null) {\n    return arr;\n  }\n  if (typeof search === 'function') {\n    return arr.filter(search);\n  }\n  // cast to lowercase string\n  search = ('' + search).toLowerCase();\n  // allow optional `in` delimiter\n  // because why not\n  var n = delimiter === 'in' ? 3 : 2;\n  // extract and flatten keys\n  var keys = toArray(arguments, n).reduce(function (prev, cur) {\n    return prev.concat(cur);\n  }, []);\n  var res = [];\n  var item, key, val, j;\n  for (var i = 0, l = arr.length; i < l; i++) {\n    item = arr[i];\n    val = item && item.$value || item;\n    j = keys.length;\n    if (j) {\n      while (j--) {\n        key = keys[j];\n        if (key === '$key' && contains(item.$key, search) || contains(getPath(val, key), search)) {\n          res.push(item);\n          break;\n        }\n      }\n    } else if (contains(item, search)) {\n      res.push(item);\n    }\n  }\n  return res;\n}\n\n/**\n * Filter filter for arrays\n *\n * @param {String} sortKey\n * @param {String} reverse\n */\n\nfunction orderBy(arr, sortKey, reverse) {\n  arr = convertArray(arr);\n  if (!sortKey) {\n    return arr;\n  }\n  var order = reverse && reverse < 0 ? -1 : 1;\n  // sort on a copy to avoid mutating original array\n  return arr.slice().sort(function (a, b) {\n    if (sortKey !== '$key') {\n      if (isObject(a) && '$value' in a) a = a.$value;\n      if (isObject(b) && '$value' in b) b = b.$value;\n    }\n    a = isObject(a) ? getPath(a, sortKey) : a;\n    b = isObject(b) ? getPath(b, sortKey) : b;\n    return a === b ? 0 : a > b ? order : -order;\n  });\n}\n\n/**\n * String contain helper\n *\n * @param {*} val\n * @param {String} search\n */\n\nfunction contains(val, search) {\n  var i;\n  if (isPlainObject(val)) {\n    var keys = Object.keys(val);\n    i = keys.length;\n    while (i--) {\n      if (contains(val[keys[i]], search)) {\n        return true;\n      }\n    }\n  } else if (isArray(val)) {\n    i = val.length;\n    while (i--) {\n      if (contains(val[i], search)) {\n        return true;\n      }\n    }\n  } else if (val != null) {\n    return val.toString().toLowerCase().indexOf(search) > -1;\n  }\n}\n\nvar digitsRE = /(\\d{3})(?=\\d)/g;\n\n// asset collections must be a plain object.\nvar filters = {\n\n  orderBy: orderBy,\n  filterBy: filterBy,\n  limitBy: limitBy,\n\n  /**\n   * Stringify value.\n   *\n   * @param {Number} indent\n   */\n\n  json: {\n    read: function read(value, indent) {\n      return typeof value === 'string' ? value : JSON.stringify(value, null, Number(indent) || 2);\n    },\n    write: function write(value) {\n      try {\n        return JSON.parse(value);\n      } catch (e) {\n        return value;\n      }\n    }\n  },\n\n  /**\n   * 'abc' => 'Abc'\n   */\n\n  capitalize: function capitalize(value) {\n    if (!value && value !== 0) return '';\n    value = value.toString();\n    return value.charAt(0).toUpperCase() + value.slice(1);\n  },\n\n  /**\n   * 'abc' => 'ABC'\n   */\n\n  uppercase: function uppercase(value) {\n    return value || value === 0 ? value.toString().toUpperCase() : '';\n  },\n\n  /**\n   * 'AbC' => 'abc'\n   */\n\n  lowercase: function lowercase(value) {\n    return value || value === 0 ? value.toString().toLowerCase() : '';\n  },\n\n  /**\n   * 12345 => $12,345.00\n   *\n   * @param {String} sign\n   */\n\n  currency: function currency(value, _currency) {\n    value = parseFloat(value);\n    if (!isFinite(value) || !value && value !== 0) return '';\n    _currency = _currency != null ? _currency : '$';\n    var stringified = Math.abs(value).toFixed(2);\n    var _int = stringified.slice(0, -3);\n    var i = _int.length % 3;\n    var head = i > 0 ? _int.slice(0, i) + (_int.length > 3 ? ',' : '') : '';\n    var _float = stringified.slice(-3);\n    var sign = value < 0 ? '-' : '';\n    return _currency + sign + head + _int.slice(i).replace(digitsRE, '$1,') + _float;\n  },\n\n  /**\n   * 'item' => 'items'\n   *\n   * @params\n   *  an array of strings corresponding to\n   *  the single, double, triple ... forms of the word to\n   *  be pluralized. When the number to be pluralized\n   *  exceeds the length of the args, it will use the last\n   *  entry in the array.\n   *\n   *  e.g. ['single', 'double', 'triple', 'multiple']\n   */\n\n  pluralize: function pluralize(value) {\n    var args = toArray(arguments, 1);\n    return args.length > 1 ? args[value % 10 - 1] || args[args.length - 1] : args[0] + (value === 1 ? '' : 's');\n  },\n\n  /**\n   * Debounce a handler function.\n   *\n   * @param {Function} handler\n   * @param {Number} delay = 300\n   * @return {Function}\n   */\n\n  debounce: function debounce(handler, delay) {\n    if (!handler) return;\n    if (!delay) {\n      delay = 300;\n    }\n    return _debounce(handler, delay);\n  }\n};\n\nvar partial = {\n\n  priority: PARTIAL,\n\n  params: ['name'],\n\n  // watch changes to name for dynamic partials\n  paramWatchers: {\n    name: function name(value) {\n      vIf.remove.call(this);\n      if (value) {\n        this.insert(value);\n      }\n    }\n  },\n\n  bind: function bind() {\n    this.anchor = createAnchor('v-partial');\n    replace(this.el, this.anchor);\n    this.insert(this.params.name);\n  },\n\n  insert: function insert(id) {\n    var partial = resolveAsset(this.vm.$options, 'partials', id);\n    if (process.env.NODE_ENV !== 'production') {\n      assertAsset(partial, 'partial', id);\n    }\n    if (partial) {\n      this.factory = new FragmentFactory(this.vm, partial);\n      vIf.insert.call(this);\n    }\n  },\n\n  unbind: function unbind() {\n    if (this.frag) {\n      this.frag.destroy();\n    }\n  }\n};\n\n// This is the elementDirective that handles <content>\n// transclusions. It relies on the raw content of an\n// instance being stored as `$options._content` during\n// the transclude phase.\n\n// We are exporting two versions, one for named and one\n// for unnamed, because the unnamed slots must be compiled\n// AFTER all named slots have selected their content. So\n// we need to give them different priorities in the compilation\n// process. (See #1965)\n\nvar slot = {\n\n  priority: SLOT,\n\n  bind: function bind() {\n    var host = this.vm;\n    var raw = host.$options._content;\n    if (!raw) {\n      this.fallback();\n      return;\n    }\n    var context = host._context;\n    var slotName = this.params && this.params.name;\n    if (!slotName) {\n      // Default slot\n      this.tryCompile(extractFragment(raw.childNodes, raw, true), context, host);\n    } else {\n      // Named slot\n      var selector = '[slot=\"' + slotName + '\"]';\n      var nodes = raw.querySelectorAll(selector);\n      if (nodes.length) {\n        this.tryCompile(extractFragment(nodes, raw), context, host);\n      } else {\n        this.fallback();\n      }\n    }\n  },\n\n  tryCompile: function tryCompile(content, context, host) {\n    if (content.hasChildNodes()) {\n      this.compile(content, context, host);\n    } else {\n      this.fallback();\n    }\n  },\n\n  compile: function compile(content, context, host) {\n    if (content && context) {\n      if (this.el.hasChildNodes() && content.childNodes.length === 1 && content.childNodes[0].nodeType === 1 && content.childNodes[0].hasAttribute('v-if')) {\n        // if the inserted slot has v-if\n        // inject fallback content as the v-else\n        var elseBlock = document.createElement('template');\n        elseBlock.setAttribute('v-else', '');\n        elseBlock.innerHTML = this.el.innerHTML;\n        content.appendChild(elseBlock);\n      }\n      var scope = host ? host._scope : this._scope;\n      this.unlink = context.$compile(content, host, scope, this._frag);\n    }\n    if (content) {\n      replace(this.el, content);\n    } else {\n      remove(this.el);\n    }\n  },\n\n  fallback: function fallback() {\n    this.compile(extractContent(this.el, true), this.vm);\n  },\n\n  unbind: function unbind() {\n    if (this.unlink) {\n      this.unlink();\n    }\n  }\n};\n\nvar namedSlot = extend(extend({}, slot), {\n  priority: slot.priority + 1,\n  params: ['name']\n});\n\n/**\n * Extract qualified content nodes from a node list.\n *\n * @param {NodeList} nodes\n * @param {Element} parent\n * @param {Boolean} main\n * @return {DocumentFragment}\n */\n\nfunction extractFragment(nodes, parent, main) {\n  var frag = document.createDocumentFragment();\n  for (var i = 0, l = nodes.length; i < l; i++) {\n    var node = nodes[i];\n    // if this is the main outlet, we want to skip all\n    // previously selected nodes;\n    // otherwise, we want to mark the node as selected.\n    // clone the node so the original raw content remains\n    // intact. this ensures proper re-compilation in cases\n    // where the outlet is inside a conditional block\n    if (main && !node.__v_selected) {\n      append(node);\n    } else if (!main && node.parentNode === parent) {\n      node.__v_selected = true;\n      append(node);\n    }\n  }\n  return frag;\n\n  function append(node) {\n    if (isTemplate(node) && !node.hasAttribute('v-if') && !node.hasAttribute('v-for')) {\n      node = parseTemplate(node);\n    }\n    node = cloneNode(node);\n    frag.appendChild(node);\n  }\n}\n\nvar elementDirectives = {\n  slot: slot,\n  _namedSlot: namedSlot, // same as slot but with higher priority\n  partial: partial\n};\n\nVue.version = '1.0.16';\n\n/**\n * Vue and every constructor that extends Vue has an\n * associated options object, which can be accessed during\n * compilation steps as `this.constructor.options`.\n *\n * These can be seen as the default options of every\n * Vue instance.\n */\n\nVue.options = {\n  directives: publicDirectives,\n  elementDirectives: elementDirectives,\n  filters: filters,\n  transitions: {},\n  components: {},\n  partials: {},\n  replace: true\n};\n\n// devtools global hook\n/* istanbul ignore next */\nif (devtools) {\n  devtools.emit('init', Vue);\n} else if (process.env.NODE_ENV !== 'production' && inBrowser && /Chrome\\/\\d+/.test(navigator.userAgent)) {\n  console.log('Download the Vue Devtools for a better development experience:\\n' + 'https://github.com/vuejs/vue-devtools');\n}\n\nmodule.exports = Vue;","\n/**\n * Module dependencies.\n */\n\nvar debug = require('debug')('socket.io-parser');\nvar json = require('json3');\nvar isArray = require('isarray');\nvar Emitter = require('component-emitter');\nvar binary = require('./binary');\nvar isBuf = require('./is-buffer');\n\n/**\n * Protocol version.\n *\n * @api public\n */\n\nexports.protocol = 4;\n\n/**\n * Packet types.\n *\n * @api public\n */\n\nexports.types = [\n  'CONNECT',\n  'DISCONNECT',\n  'EVENT',\n  'ACK',\n  'ERROR',\n  'BINARY_EVENT',\n  'BINARY_ACK'\n];\n\n/**\n * Packet type `connect`.\n *\n * @api public\n */\n\nexports.CONNECT = 0;\n\n/**\n * Packet type `disconnect`.\n *\n * @api public\n */\n\nexports.DISCONNECT = 1;\n\n/**\n * Packet type `event`.\n *\n * @api public\n */\n\nexports.EVENT = 2;\n\n/**\n * Packet type `ack`.\n *\n * @api public\n */\n\nexports.ACK = 3;\n\n/**\n * Packet type `error`.\n *\n * @api public\n */\n\nexports.ERROR = 4;\n\n/**\n * Packet type 'binary event'\n *\n * @api public\n */\n\nexports.BINARY_EVENT = 5;\n\n/**\n * Packet type `binary ack`. For acks with binary arguments.\n *\n * @api public\n */\n\nexports.BINARY_ACK = 6;\n\n/**\n * Encoder constructor.\n *\n * @api public\n */\n\nexports.Encoder = Encoder;\n\n/**\n * Decoder constructor.\n *\n * @api public\n */\n\nexports.Decoder = Decoder;\n\n/**\n * A socket.io Encoder instance\n *\n * @api public\n */\n\nfunction Encoder() {}\n\n/**\n * Encode a packet as a single string if non-binary, or as a\n * buffer sequence, depending on packet type.\n *\n * @param {Object} obj - packet object\n * @param {Function} callback - function to handle encodings (likely engine.write)\n * @return Calls callback with Array of encodings\n * @api public\n */\n\nEncoder.prototype.encode = function(obj, callback){\n  debug('encoding packet %j', obj);\n\n  if (exports.BINARY_EVENT == obj.type || exports.BINARY_ACK == obj.type) {\n    encodeAsBinary(obj, callback);\n  }\n  else {\n    var encoding = encodeAsString(obj);\n    callback([encoding]);\n  }\n};\n\n/**\n * Encode packet as string.\n *\n * @param {Object} packet\n * @return {String} encoded\n * @api private\n */\n\nfunction encodeAsString(obj) {\n  var str = '';\n  var nsp = false;\n\n  // first is type\n  str += obj.type;\n\n  // attachments if we have them\n  if (exports.BINARY_EVENT == obj.type || exports.BINARY_ACK == obj.type) {\n    str += obj.attachments;\n    str += '-';\n  }\n\n  // if we have a namespace other than `/`\n  // we append it followed by a comma `,`\n  if (obj.nsp && '/' != obj.nsp) {\n    nsp = true;\n    str += obj.nsp;\n  }\n\n  // immediately followed by the id\n  if (null != obj.id) {\n    if (nsp) {\n      str += ',';\n      nsp = false;\n    }\n    str += obj.id;\n  }\n\n  // json data\n  if (null != obj.data) {\n    if (nsp) str += ',';\n    str += json.stringify(obj.data);\n  }\n\n  debug('encoded %j as %s', obj, str);\n  return str;\n}\n\n/**\n * Encode packet as 'buffer sequence' by removing blobs, and\n * deconstructing packet into object with placeholders and\n * a list of buffers.\n *\n * @param {Object} packet\n * @return {Buffer} encoded\n * @api private\n */\n\nfunction encodeAsBinary(obj, callback) {\n\n  function writeEncoding(bloblessData) {\n    var deconstruction = binary.deconstructPacket(bloblessData);\n    var pack = encodeAsString(deconstruction.packet);\n    var buffers = deconstruction.buffers;\n\n    buffers.unshift(pack); // add packet info to beginning of data list\n    callback(buffers); // write all the buffers\n  }\n\n  binary.removeBlobs(obj, writeEncoding);\n}\n\n/**\n * A socket.io Decoder instance\n *\n * @return {Object} decoder\n * @api public\n */\n\nfunction Decoder() {\n  this.reconstructor = null;\n}\n\n/**\n * Mix in `Emitter` with Decoder.\n */\n\nEmitter(Decoder.prototype);\n\n/**\n * Decodes an ecoded packet string into packet JSON.\n *\n * @param {String} obj - encoded packet\n * @return {Object} packet\n * @api public\n */\n\nDecoder.prototype.add = function(obj) {\n  var packet;\n  if ('string' == typeof obj) {\n    packet = decodeString(obj);\n    if (exports.BINARY_EVENT == packet.type || exports.BINARY_ACK == packet.type) { // binary packet's json\n      this.reconstructor = new BinaryReconstructor(packet);\n\n      // no attachments, labeled binary but no binary data to follow\n      if (this.reconstructor.reconPack.attachments === 0) {\n        this.emit('decoded', packet);\n      }\n    } else { // non-binary full packet\n      this.emit('decoded', packet);\n    }\n  }\n  else if (isBuf(obj) || obj.base64) { // raw binary data\n    if (!this.reconstructor) {\n      throw new Error('got binary data when not reconstructing a packet');\n    } else {\n      packet = this.reconstructor.takeBinaryData(obj);\n      if (packet) { // received final buffer\n        this.reconstructor = null;\n        this.emit('decoded', packet);\n      }\n    }\n  }\n  else {\n    throw new Error('Unknown type: ' + obj);\n  }\n};\n\n/**\n * Decode a packet String (JSON data)\n *\n * @param {String} str\n * @return {Object} packet\n * @api private\n */\n\nfunction decodeString(str) {\n  var p = {};\n  var i = 0;\n\n  // look up type\n  p.type = Number(str.charAt(0));\n  if (null == exports.types[p.type]) return error();\n\n  // look up attachments if type binary\n  if (exports.BINARY_EVENT == p.type || exports.BINARY_ACK == p.type) {\n    var buf = '';\n    while (str.charAt(++i) != '-') {\n      buf += str.charAt(i);\n      if (i == str.length) break;\n    }\n    if (buf != Number(buf) || str.charAt(i) != '-') {\n      throw new Error('Illegal attachments');\n    }\n    p.attachments = Number(buf);\n  }\n\n  // look up namespace (if any)\n  if ('/' == str.charAt(i + 1)) {\n    p.nsp = '';\n    while (++i) {\n      var c = str.charAt(i);\n      if (',' == c) break;\n      p.nsp += c;\n      if (i == str.length) break;\n    }\n  } else {\n    p.nsp = '/';\n  }\n\n  // look up id\n  var next = str.charAt(i + 1);\n  if ('' !== next && Number(next) == next) {\n    p.id = '';\n    while (++i) {\n      var c = str.charAt(i);\n      if (null == c || Number(c) != c) {\n        --i;\n        break;\n      }\n      p.id += str.charAt(i);\n      if (i == str.length) break;\n    }\n    p.id = Number(p.id);\n  }\n\n  // look up json data\n  if (str.charAt(++i)) {\n    try {\n      p.data = json.parse(str.substr(i));\n    } catch(e){\n      return error();\n    }\n  }\n\n  debug('decoded %s as %j', str, p);\n  return p;\n}\n\n/**\n * Deallocates a parser's resources\n *\n * @api public\n */\n\nDecoder.prototype.destroy = function() {\n  if (this.reconstructor) {\n    this.reconstructor.finishedReconstruction();\n  }\n};\n\n/**\n * A manager of a binary event's 'buffer sequence'. Should\n * be constructed whenever a packet of type BINARY_EVENT is\n * decoded.\n *\n * @param {Object} packet\n * @return {BinaryReconstructor} initialized reconstructor\n * @api private\n */\n\nfunction BinaryReconstructor(packet) {\n  this.reconPack = packet;\n  this.buffers = [];\n}\n\n/**\n * Method to be called when binary data received from connection\n * after a BINARY_EVENT packet.\n *\n * @param {Buffer | ArrayBuffer} binData - the raw binary data received\n * @return {null | Object} returns null if more binary data is expected or\n *   a reconstructed packet object if all buffers have been received.\n * @api private\n */\n\nBinaryReconstructor.prototype.takeBinaryData = function(binData) {\n  this.buffers.push(binData);\n  if (this.buffers.length == this.reconPack.attachments) { // done with buffer list\n    var packet = binary.reconstructPacket(this.reconPack, this.buffers);\n    this.finishedReconstruction();\n    return packet;\n  }\n  return null;\n};\n\n/**\n * Cleans up binary packet reconstruction variables.\n *\n * @api private\n */\n\nBinaryReconstructor.prototype.finishedReconstruction = function() {\n  this.reconPack = null;\n  this.buffers = [];\n};\n\nfunction error(data){\n  return {\n    type: exports.ERROR,\n    data: 'parser error'\n  };\n}\n","\n/**\n * This is the web browser implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = require('./debug');\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = 'undefined' != typeof chrome\n               && 'undefined' != typeof chrome.storage\n                  ? chrome.storage.local\n                  : localstorage();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n  'lightseagreen',\n  'forestgreen',\n  'goldenrod',\n  'dodgerblue',\n  'darkorchid',\n  'crimson'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\nfunction useColors() {\n  // is webkit? http://stackoverflow.com/a/16459606/376773\n  return ('WebkitAppearance' in document.documentElement.style) ||\n    // is firebug? http://stackoverflow.com/a/398120/376773\n    (window.console && (console.firebug || (console.exception && console.table))) ||\n    // is firefox >= v31?\n    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n    (navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31);\n}\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nexports.formatters.j = function(v) {\n  return JSON.stringify(v);\n};\n\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs() {\n  var args = arguments;\n  var useColors = this.useColors;\n\n  args[0] = (useColors ? '%c' : '')\n    + this.namespace\n    + (useColors ? ' %c' : ' ')\n    + args[0]\n    + (useColors ? '%c ' : ' ')\n    + '+' + exports.humanize(this.diff);\n\n  if (!useColors) return args;\n\n  var c = 'color: ' + this.color;\n  args = [args[0], c, 'color: inherit'].concat(Array.prototype.slice.call(args, 1));\n\n  // the final \"%c\" is somewhat tricky, because there could be other\n  // arguments passed either before or after the %c, so we need to\n  // figure out the correct index to insert the CSS into\n  var index = 0;\n  var lastC = 0;\n  args[0].replace(/%[a-z%]/g, function(match) {\n    if ('%%' === match) return;\n    index++;\n    if ('%c' === match) {\n      // we only are interested in the *last* %c\n      // (the user may have provided their own)\n      lastC = index;\n    }\n  });\n\n  args.splice(lastC, 0, c);\n  return args;\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\nfunction log() {\n  // this hackery is required for IE8/9, where\n  // the `console.log` function doesn't have 'apply'\n  return 'object' === typeof console\n    && console.log\n    && Function.prototype.apply.call(console.log, console, arguments);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n  try {\n    if (null == namespaces) {\n      exports.storage.removeItem('debug');\n    } else {\n      exports.storage.debug = namespaces;\n    }\n  } catch(e) {}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n  var r;\n  try {\n    r = exports.storage.debug;\n  } catch(e) {}\n  return r;\n}\n\n/**\n * Enable namespaces listed in `localStorage.debug` initially.\n */\n\nexports.enable(load());\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage(){\n  try {\n    return window.localStorage;\n  } catch (e) {}\n}\n","\n/**\n * Module exports.\n */\n\nmodule.exports = on;\n\n/**\n * Helper for subscriptions.\n *\n * @param {Object|EventEmitter} obj with `Emitter` mixin or `EventEmitter`\n * @param {String} event name\n * @param {Function} callback\n * @api public\n */\n\nfunction on(obj, ev, fn) {\n  obj.on(ev, fn);\n  return {\n    destroy: function(){\n      obj.removeListener(ev, fn);\n    }\n  };\n}\n","// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = setTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    clearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        setTimeout(drainQueue, 0);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","/*global Blob,File*/\n\n/**\n * Module requirements\n */\n\nvar isArray = require('isarray');\nvar isBuf = require('./is-buffer');\n\n/**\n * Replaces every Buffer | ArrayBuffer in packet with a numbered placeholder.\n * Anything with blobs or files should be fed through removeBlobs before coming\n * here.\n *\n * @param {Object} packet - socket.io event packet\n * @return {Object} with deconstructed packet and list of buffers\n * @api public\n */\n\nexports.deconstructPacket = function(packet){\n  var buffers = [];\n  var packetData = packet.data;\n\n  function _deconstructPacket(data) {\n    if (!data) return data;\n\n    if (isBuf(data)) {\n      var placeholder = { _placeholder: true, num: buffers.length };\n      buffers.push(data);\n      return placeholder;\n    } else if (isArray(data)) {\n      var newData = new Array(data.length);\n      for (var i = 0; i < data.length; i++) {\n        newData[i] = _deconstructPacket(data[i]);\n      }\n      return newData;\n    } else if ('object' == typeof data && !(data instanceof Date)) {\n      var newData = {};\n      for (var key in data) {\n        newData[key] = _deconstructPacket(data[key]);\n      }\n      return newData;\n    }\n    return data;\n  }\n\n  var pack = packet;\n  pack.data = _deconstructPacket(packetData);\n  pack.attachments = buffers.length; // number of binary 'attachments'\n  return {packet: pack, buffers: buffers};\n};\n\n/**\n * Reconstructs a binary packet from its placeholder packet and buffers\n *\n * @param {Object} packet - event packet with placeholders\n * @param {Array} buffers - binary buffers to put in placeholder positions\n * @return {Object} reconstructed packet\n * @api public\n */\n\nexports.reconstructPacket = function(packet, buffers) {\n  var curPlaceHolder = 0;\n\n  function _reconstructPacket(data) {\n    if (data && data._placeholder) {\n      var buf = buffers[data.num]; // appropriate buffer (should be natural order anyway)\n      return buf;\n    } else if (isArray(data)) {\n      for (var i = 0; i < data.length; i++) {\n        data[i] = _reconstructPacket(data[i]);\n      }\n      return data;\n    } else if (data && 'object' == typeof data) {\n      for (var key in data) {\n        data[key] = _reconstructPacket(data[key]);\n      }\n      return data;\n    }\n    return data;\n  }\n\n  packet.data = _reconstructPacket(packet.data);\n  packet.attachments = undefined; // no longer useful\n  return packet;\n};\n\n/**\n * Asynchronously removes Blobs or Files from data via\n * FileReader's readAsArrayBuffer method. Used before encoding\n * data as msgpack. Calls callback with the blobless data.\n *\n * @param {Object} data\n * @param {Function} callback\n * @api private\n */\n\nexports.removeBlobs = function(data, callback) {\n  function _removeBlobs(obj, curKey, containingObject) {\n    if (!obj) return obj;\n\n    // convert any blob\n    if ((global.Blob && obj instanceof Blob) ||\n        (global.File && obj instanceof File)) {\n      pendingBlobs++;\n\n      // async filereader\n      var fileReader = new FileReader();\n      fileReader.onload = function() { // this.result == arraybuffer\n        if (containingObject) {\n          containingObject[curKey] = this.result;\n        }\n        else {\n          bloblessData = this.result;\n        }\n\n        // if nothing pending its callback time\n        if(! --pendingBlobs) {\n          callback(bloblessData);\n        }\n      };\n\n      fileReader.readAsArrayBuffer(obj); // blob -> arraybuffer\n    } else if (isArray(obj)) { // handle array\n      for (var i = 0; i < obj.length; i++) {\n        _removeBlobs(obj[i], i, obj);\n      }\n    } else if (obj && 'object' == typeof obj && !isBuf(obj)) { // and object\n      for (var key in obj) {\n        _removeBlobs(obj[key], key, obj);\n      }\n    }\n  }\n\n  var pendingBlobs = 0;\n  var bloblessData = data;\n  _removeBlobs(bloblessData);\n  if (!pendingBlobs) {\n    callback(bloblessData);\n  }\n};\n","\nmodule.exports = isBuf;\n\n/**\n * Returns true if obj is a buffer or an arraybuffer.\n *\n * @api private\n */\n\nfunction isBuf(obj) {\n  return (global.Buffer && global.Buffer.isBuffer(obj)) ||\n         (global.ArrayBuffer && obj instanceof ArrayBuffer);\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = debug;\nexports.coerce = coerce;\nexports.disable = disable;\nexports.enable = enable;\nexports.enabled = enabled;\nexports.humanize = require('ms');\n\n/**\n * The currently active debug mode names, and names to skip.\n */\n\nexports.names = [];\nexports.skips = [];\n\n/**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lowercased letter, i.e. \"n\".\n */\n\nexports.formatters = {};\n\n/**\n * Previously assigned color.\n */\n\nvar prevColor = 0;\n\n/**\n * Previous log timestamp.\n */\n\nvar prevTime;\n\n/**\n * Select a color.\n *\n * @return {Number}\n * @api private\n */\n\nfunction selectColor() {\n  return exports.colors[prevColor++ % exports.colors.length];\n}\n\n/**\n * Create a debugger with the given `namespace`.\n *\n * @param {String} namespace\n * @return {Function}\n * @api public\n */\n\nfunction debug(namespace) {\n\n  // define the `disabled` version\n  function disabled() {\n  }\n  disabled.enabled = false;\n\n  // define the `enabled` version\n  function enabled() {\n\n    var self = enabled;\n\n    // set `diff` timestamp\n    var curr = +new Date();\n    var ms = curr - (prevTime || curr);\n    self.diff = ms;\n    self.prev = prevTime;\n    self.curr = curr;\n    prevTime = curr;\n\n    // add the `color` if not set\n    if (null == self.useColors) self.useColors = exports.useColors();\n    if (null == self.color && self.useColors) self.color = selectColor();\n\n    var args = Array.prototype.slice.call(arguments);\n\n    args[0] = exports.coerce(args[0]);\n\n    if ('string' !== typeof args[0]) {\n      // anything else let's inspect with %o\n      args = ['%o'].concat(args);\n    }\n\n    // apply any `formatters` transformations\n    var index = 0;\n    args[0] = args[0].replace(/%([a-z%])/g, function(match, format) {\n      // if we encounter an escaped % then don't increase the array index\n      if (match === '%%') return match;\n      index++;\n      var formatter = exports.formatters[format];\n      if ('function' === typeof formatter) {\n        var val = args[index];\n        match = formatter.call(self, val);\n\n        // now we need to remove `args[index]` since it's inlined in the `format`\n        args.splice(index, 1);\n        index--;\n      }\n      return match;\n    });\n\n    if ('function' === typeof exports.formatArgs) {\n      args = exports.formatArgs.apply(self, args);\n    }\n    var logFn = enabled.log || exports.log || console.log.bind(console);\n    logFn.apply(self, args);\n  }\n  enabled.enabled = true;\n\n  var fn = exports.enabled(namespace) ? enabled : disabled;\n\n  fn.namespace = namespace;\n\n  return fn;\n}\n\n/**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} namespaces\n * @api public\n */\n\nfunction enable(namespaces) {\n  exports.save(namespaces);\n\n  var split = (namespaces || '').split(/[\\s,]+/);\n  var len = split.length;\n\n  for (var i = 0; i < len; i++) {\n    if (!split[i]) continue; // ignore empty strings\n    namespaces = split[i].replace(/\\*/g, '.*?');\n    if (namespaces[0] === '-') {\n      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n    } else {\n      exports.names.push(new RegExp('^' + namespaces + '$'));\n    }\n  }\n}\n\n/**\n * Disable debug output.\n *\n * @api public\n */\n\nfunction disable() {\n  exports.enable('');\n}\n\n/**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\nfunction enabled(name) {\n  var i, len;\n  for (i = 0, len = exports.skips.length; i < len; i++) {\n    if (exports.skips[i].test(name)) {\n      return false;\n    }\n  }\n  for (i = 0, len = exports.names.length; i < len; i++) {\n    if (exports.names[i].test(name)) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * Coerce `val`.\n *\n * @param {Mixed} val\n * @return {Mixed}\n * @api private\n */\n\nfunction coerce(val) {\n  if (val instanceof Error) return val.stack || val.message;\n  return val;\n}\n","\n/**\n * Expose `Emitter`.\n */\n\nmodule.exports = Emitter;\n\n/**\n * Initialize a new `Emitter`.\n *\n * @api public\n */\n\nfunction Emitter(obj) {\n  if (obj) return mixin(obj);\n};\n\n/**\n * Mixin the emitter properties.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\nfunction mixin(obj) {\n  for (var key in Emitter.prototype) {\n    obj[key] = Emitter.prototype[key];\n  }\n  return obj;\n}\n\n/**\n * Listen on the given `event` with `fn`.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.on =\nEmitter.prototype.addEventListener = function(event, fn){\n  this._callbacks = this._callbacks || {};\n  (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\n    .push(fn);\n  return this;\n};\n\n/**\n * Adds an `event` listener that will be invoked a single\n * time then automatically removed.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.once = function(event, fn){\n  function on() {\n    this.off(event, on);\n    fn.apply(this, arguments);\n  }\n\n  on.fn = fn;\n  this.on(event, on);\n  return this;\n};\n\n/**\n * Remove the given callback for `event` or all\n * registered callbacks.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.off =\nEmitter.prototype.removeListener =\nEmitter.prototype.removeAllListeners =\nEmitter.prototype.removeEventListener = function(event, fn){\n  this._callbacks = this._callbacks || {};\n\n  // all\n  if (0 == arguments.length) {\n    this._callbacks = {};\n    return this;\n  }\n\n  // specific event\n  var callbacks = this._callbacks['$' + event];\n  if (!callbacks) return this;\n\n  // remove all handlers\n  if (1 == arguments.length) {\n    delete this._callbacks['$' + event];\n    return this;\n  }\n\n  // remove specific handler\n  var cb;\n  for (var i = 0; i < callbacks.length; i++) {\n    cb = callbacks[i];\n    if (cb === fn || cb.fn === fn) {\n      callbacks.splice(i, 1);\n      break;\n    }\n  }\n  return this;\n};\n\n/**\n * Emit `event` with the given args.\n *\n * @param {String} event\n * @param {Mixed} ...\n * @return {Emitter}\n */\n\nEmitter.prototype.emit = function(event){\n  this._callbacks = this._callbacks || {};\n  var args = [].slice.call(arguments, 1)\n    , callbacks = this._callbacks['$' + event];\n\n  if (callbacks) {\n    callbacks = callbacks.slice(0);\n    for (var i = 0, len = callbacks.length; i < len; ++i) {\n      callbacks[i].apply(this, args);\n    }\n  }\n\n  return this;\n};\n\n/**\n * Return array of callbacks for `event`.\n *\n * @param {String} event\n * @return {Array}\n * @api public\n */\n\nEmitter.prototype.listeners = function(event){\n  this._callbacks = this._callbacks || {};\n  return this._callbacks['$' + event] || [];\n};\n\n/**\n * Check if this emitter has `event` handlers.\n *\n * @param {String} event\n * @return {Boolean}\n * @api public\n */\n\nEmitter.prototype.hasListeners = function(event){\n  return !! this.listeners(event).length;\n};\n","/**\n * Parses an URI\n *\n * @author Steven Levithan <stevenlevithan.com> (MIT license)\n * @api private\n */\n\nvar re = /^(?:(?![^:@]+:[^:@\\/]*@)(http|https|ws|wss):\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\n\nvar parts = [\n    'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'\n];\n\nmodule.exports = function parseuri(str) {\n    var src = str,\n        b = str.indexOf('['),\n        e = str.indexOf(']');\n\n    if (b != -1 && e != -1) {\n        str = str.substring(0, b) + str.substring(b, e).replace(/:/g, ';') + str.substring(e, str.length);\n    }\n\n    var m = re.exec(str || ''),\n        uri = {},\n        i = 14;\n\n    while (i--) {\n        uri[parts[i]] = m[i] || '';\n    }\n\n    if (b != -1 && e != -1) {\n        uri.source = src;\n        uri.host = uri.host.substring(1, uri.host.length - 1).replace(/;/g, ':');\n        uri.authority = uri.authority.replace('[', '').replace(']', '').replace(/;/g, ':');\n        uri.ipv6uri = true;\n    }\n\n    return uri;\n};\n","/**\n * Slice reference.\n */\n\nvar slice = [].slice;\n\n/**\n * Bind `obj` to `fn`.\n *\n * @param {Object} obj\n * @param {Function|String} fn or string\n * @return {Function}\n * @api public\n */\n\nmodule.exports = function(obj, fn){\n  if ('string' == typeof fn) fn = obj[fn];\n  if ('function' != typeof fn) throw new Error('bind() requires a function');\n  var args = slice.call(arguments, 2);\n  return function(){\n    return fn.apply(obj, args.concat(slice.call(arguments)));\n  }\n};\n","\nmodule.exports =  require('./lib/');\n","\nvar indexOf = [].indexOf;\n\nmodule.exports = function(arr, obj){\n  if (indexOf) return arr.indexOf(obj);\n  for (var i = 0; i < arr.length; ++i) {\n    if (arr[i] === obj) return i;\n  }\n  return -1;\n};","\n/**\n * Expose `Backoff`.\n */\n\nmodule.exports = Backoff;\n\n/**\n * Initialize backoff timer with `opts`.\n *\n * - `min` initial timeout in milliseconds [100]\n * - `max` max timeout [10000]\n * - `jitter` [0]\n * - `factor` [2]\n *\n * @param {Object} opts\n * @api public\n */\n\nfunction Backoff(opts) {\n  opts = opts || {};\n  this.ms = opts.min || 100;\n  this.max = opts.max || 10000;\n  this.factor = opts.factor || 2;\n  this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0;\n  this.attempts = 0;\n}\n\n/**\n * Return the backoff duration.\n *\n * @return {Number}\n * @api public\n */\n\nBackoff.prototype.duration = function(){\n  var ms = this.ms * Math.pow(this.factor, this.attempts++);\n  if (this.jitter) {\n    var rand =  Math.random();\n    var deviation = Math.floor(rand * this.jitter * ms);\n    ms = (Math.floor(rand * 10) & 1) == 0  ? ms - deviation : ms + deviation;\n  }\n  return Math.min(ms, this.max) | 0;\n};\n\n/**\n * Reset the number of attempts.\n *\n * @api public\n */\n\nBackoff.prototype.reset = function(){\n  this.attempts = 0;\n};\n\n/**\n * Set the minimum duration\n *\n * @api public\n */\n\nBackoff.prototype.setMin = function(min){\n  this.ms = min;\n};\n\n/**\n * Set the maximum duration\n *\n * @api public\n */\n\nBackoff.prototype.setMax = function(max){\n  this.max = max;\n};\n\n/**\n * Set the jitter\n *\n * @api public\n */\n\nBackoff.prototype.setJitter = function(jitter){\n  this.jitter = jitter;\n};\n\n","\n/*\n * Module requirements.\n */\n\nvar isArray = require('isarray');\n\n/**\n * Module exports.\n */\n\nmodule.exports = hasBinary;\n\n/**\n * Checks for binary data.\n *\n * Right now only Buffer and ArrayBuffer are supported..\n *\n * @param {Object} anything\n * @api public\n */\n\nfunction hasBinary(data) {\n\n  function _hasBinary(obj) {\n    if (!obj) return false;\n\n    if ( (global.Buffer && global.Buffer.isBuffer && global.Buffer.isBuffer(obj)) ||\n         (global.ArrayBuffer && obj instanceof ArrayBuffer) ||\n         (global.Blob && obj instanceof Blob) ||\n         (global.File && obj instanceof File)\n        ) {\n      return true;\n    }\n\n    if (isArray(obj)) {\n      for (var i = 0; i < obj.length; i++) {\n          if (_hasBinary(obj[i])) {\n              return true;\n          }\n      }\n    } else if (obj && 'object' == typeof obj) {\n      // see: https://github.com/Automattic/has-binary/pull/4\n      if (obj.toJSON && 'function' == typeof obj.toJSON) {\n        obj = obj.toJSON();\n      }\n\n      for (var key in obj) {\n        if (Object.prototype.hasOwnProperty.call(obj, key) && _hasBinary(obj[key])) {\n          return true;\n        }\n      }\n    }\n\n    return false;\n  }\n\n  return _hasBinary(data);\n}\n","module.exports = toArray\n\nfunction toArray(list, index) {\n    var array = []\n\n    index = index || 0\n\n    for (var i = index || 0; i < list.length; i++) {\n        array[i - index] = list[i]\n    }\n\n    return array\n}\n","/*! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */\n;(function () {\n  // Detect the `define` function exposed by asynchronous module loaders. The\n  // strict `define` check is necessary for compatibility with `r.js`.\n  var isLoader = typeof define === \"function\" && define.amd;\n\n  // A set of types used to distinguish objects from primitives.\n  var objectTypes = {\n    \"function\": true,\n    \"object\": true\n  };\n\n  // Detect the `exports` object exposed by CommonJS implementations.\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\n\n  // Use the `global` object exposed by Node (including Browserify via\n  // `insert-module-globals`), Narwhal, and Ringo as the default context,\n  // and the `window` object in browsers. Rhino exports a `global` function\n  // instead.\n  var root = objectTypes[typeof window] && window || this,\n      freeGlobal = freeExports && objectTypes[typeof module] && module && !module.nodeType && typeof global == \"object\" && global;\n\n  if (freeGlobal && (freeGlobal[\"global\"] === freeGlobal || freeGlobal[\"window\"] === freeGlobal || freeGlobal[\"self\"] === freeGlobal)) {\n    root = freeGlobal;\n  }\n\n  // Public: Initializes JSON 3 using the given `context` object, attaching the\n  // `stringify` and `parse` functions to the specified `exports` object.\n  function runInContext(context, exports) {\n    context || (context = root[\"Object\"]());\n    exports || (exports = root[\"Object\"]());\n\n    // Native constructor aliases.\n    var Number = context[\"Number\"] || root[\"Number\"],\n        String = context[\"String\"] || root[\"String\"],\n        Object = context[\"Object\"] || root[\"Object\"],\n        Date = context[\"Date\"] || root[\"Date\"],\n        SyntaxError = context[\"SyntaxError\"] || root[\"SyntaxError\"],\n        TypeError = context[\"TypeError\"] || root[\"TypeError\"],\n        Math = context[\"Math\"] || root[\"Math\"],\n        nativeJSON = context[\"JSON\"] || root[\"JSON\"];\n\n    // Delegate to the native `stringify` and `parse` implementations.\n    if (typeof nativeJSON == \"object\" && nativeJSON) {\n      exports.stringify = nativeJSON.stringify;\n      exports.parse = nativeJSON.parse;\n    }\n\n    // Convenience aliases.\n    var objectProto = Object.prototype,\n        getClass = objectProto.toString,\n        isProperty, forEach, undef;\n\n    // Test the `Date#getUTC*` methods. Based on work by @Yaffle.\n    var isExtended = new Date(-3509827334573292);\n    try {\n      // The `getUTCFullYear`, `Month`, and `Date` methods return nonsensical\n      // results for certain dates in Opera >= 10.53.\n      isExtended = isExtended.getUTCFullYear() == -109252 && isExtended.getUTCMonth() === 0 && isExtended.getUTCDate() === 1 &&\n        // Safari < 2.0.2 stores the internal millisecond time value correctly,\n        // but clips the values returned by the date methods to the range of\n        // signed 32-bit integers ([-2 ** 31, 2 ** 31 - 1]).\n        isExtended.getUTCHours() == 10 && isExtended.getUTCMinutes() == 37 && isExtended.getUTCSeconds() == 6 && isExtended.getUTCMilliseconds() == 708;\n    } catch (exception) {}\n\n    // Internal: Determines whether the native `JSON.stringify` and `parse`\n    // implementations are spec-compliant. Based on work by Ken Snyder.\n    function has(name) {\n      if (has[name] !== undef) {\n        // Return cached feature test result.\n        return has[name];\n      }\n      var isSupported;\n      if (name == \"bug-string-char-index\") {\n        // IE <= 7 doesn't support accessing string characters using square\n        // bracket notation. IE 8 only supports this for primitives.\n        isSupported = \"a\"[0] != \"a\";\n      } else if (name == \"json\") {\n        // Indicates whether both `JSON.stringify` and `JSON.parse` are\n        // supported.\n        isSupported = has(\"json-stringify\") && has(\"json-parse\");\n      } else {\n        var value, serialized = '{\"a\":[1,true,false,null,\"\\\\u0000\\\\b\\\\n\\\\f\\\\r\\\\t\"]}';\n        // Test `JSON.stringify`.\n        if (name == \"json-stringify\") {\n          var stringify = exports.stringify, stringifySupported = typeof stringify == \"function\" && isExtended;\n          if (stringifySupported) {\n            // A test function object with a custom `toJSON` method.\n            (value = function () {\n              return 1;\n            }).toJSON = value;\n            try {\n              stringifySupported =\n                // Firefox 3.1b1 and b2 serialize string, number, and boolean\n                // primitives as object literals.\n                stringify(0) === \"0\" &&\n                // FF 3.1b1, b2, and JSON 2 serialize wrapped primitives as object\n                // literals.\n                stringify(new Number()) === \"0\" &&\n                stringify(new String()) == '\"\"' &&\n                // FF 3.1b1, 2 throw an error if the value is `null`, `undefined`, or\n                // does not define a canonical JSON representation (this applies to\n                // objects with `toJSON` properties as well, *unless* they are nested\n                // within an object or array).\n                stringify(getClass) === undef &&\n                // IE 8 serializes `undefined` as `\"undefined\"`. Safari <= 5.1.7 and\n                // FF 3.1b3 pass this test.\n                stringify(undef) === undef &&\n                // Safari <= 5.1.7 and FF 3.1b3 throw `Error`s and `TypeError`s,\n                // respectively, if the value is omitted entirely.\n                stringify() === undef &&\n                // FF 3.1b1, 2 throw an error if the given value is not a number,\n                // string, array, object, Boolean, or `null` literal. This applies to\n                // objects with custom `toJSON` methods as well, unless they are nested\n                // inside object or array literals. YUI 3.0.0b1 ignores custom `toJSON`\n                // methods entirely.\n                stringify(value) === \"1\" &&\n                stringify([value]) == \"[1]\" &&\n                // Prototype <= 1.6.1 serializes `[undefined]` as `\"[]\"` instead of\n                // `\"[null]\"`.\n                stringify([undef]) == \"[null]\" &&\n                // YUI 3.0.0b1 fails to serialize `null` literals.\n                stringify(null) == \"null\" &&\n                // FF 3.1b1, 2 halts serialization if an array contains a function:\n                // `[1, true, getClass, 1]` serializes as \"[1,true,],\". FF 3.1b3\n                // elides non-JSON values from objects and arrays, unless they\n                // define custom `toJSON` methods.\n                stringify([undef, getClass, null]) == \"[null,null,null]\" &&\n                // Simple serialization test. FF 3.1b1 uses Unicode escape sequences\n                // where character escape codes are expected (e.g., `\\b` => `\\u0008`).\n                stringify({ \"a\": [value, true, false, null, \"\\x00\\b\\n\\f\\r\\t\"] }) == serialized &&\n                // FF 3.1b1 and b2 ignore the `filter` and `width` arguments.\n                stringify(null, value) === \"1\" &&\n                stringify([1, 2], null, 1) == \"[\\n 1,\\n 2\\n]\" &&\n                // JSON 2, Prototype <= 1.7, and older WebKit builds incorrectly\n                // serialize extended years.\n                stringify(new Date(-8.64e15)) == '\"-271821-04-20T00:00:00.000Z\"' &&\n                // The milliseconds are optional in ES 5, but required in 5.1.\n                stringify(new Date(8.64e15)) == '\"+275760-09-13T00:00:00.000Z\"' &&\n                // Firefox <= 11.0 incorrectly serializes years prior to 0 as negative\n                // four-digit years instead of six-digit years. Credits: @Yaffle.\n                stringify(new Date(-621987552e5)) == '\"-000001-01-01T00:00:00.000Z\"' &&\n                // Safari <= 5.1.5 and Opera >= 10.53 incorrectly serialize millisecond\n                // values less than 1000. Credits: @Yaffle.\n                stringify(new Date(-1)) == '\"1969-12-31T23:59:59.999Z\"';\n            } catch (exception) {\n              stringifySupported = false;\n            }\n          }\n          isSupported = stringifySupported;\n        }\n        // Test `JSON.parse`.\n        if (name == \"json-parse\") {\n          var parse = exports.parse;\n          if (typeof parse == \"function\") {\n            try {\n              // FF 3.1b1, b2 will throw an exception if a bare literal is provided.\n              // Conforming implementations should also coerce the initial argument to\n              // a string prior to parsing.\n              if (parse(\"0\") === 0 && !parse(false)) {\n                // Simple parsing test.\n                value = parse(serialized);\n                var parseSupported = value[\"a\"].length == 5 && value[\"a\"][0] === 1;\n                if (parseSupported) {\n                  try {\n                    // Safari <= 5.1.2 and FF 3.1b1 allow unescaped tabs in strings.\n                    parseSupported = !parse('\"\\t\"');\n                  } catch (exception) {}\n                  if (parseSupported) {\n                    try {\n                      // FF 4.0 and 4.0.1 allow leading `+` signs and leading\n                      // decimal points. FF 4.0, 4.0.1, and IE 9-10 also allow\n                      // certain octal literals.\n                      parseSupported = parse(\"01\") !== 1;\n                    } catch (exception) {}\n                  }\n                  if (parseSupported) {\n                    try {\n                      // FF 4.0, 4.0.1, and Rhino 1.7R3-R4 allow trailing decimal\n                      // points. These environments, along with FF 3.1b1 and 2,\n                      // also allow trailing commas in JSON objects and arrays.\n                      parseSupported = parse(\"1.\") !== 1;\n                    } catch (exception) {}\n                  }\n                }\n              }\n            } catch (exception) {\n              parseSupported = false;\n            }\n          }\n          isSupported = parseSupported;\n        }\n      }\n      return has[name] = !!isSupported;\n    }\n\n    if (!has(\"json\")) {\n      // Common `[[Class]]` name aliases.\n      var functionClass = \"[object Function]\",\n          dateClass = \"[object Date]\",\n          numberClass = \"[object Number]\",\n          stringClass = \"[object String]\",\n          arrayClass = \"[object Array]\",\n          booleanClass = \"[object Boolean]\";\n\n      // Detect incomplete support for accessing string characters by index.\n      var charIndexBuggy = has(\"bug-string-char-index\");\n\n      // Define additional utility methods if the `Date` methods are buggy.\n      if (!isExtended) {\n        var floor = Math.floor;\n        // A mapping between the months of the year and the number of days between\n        // January 1st and the first of the respective month.\n        var Months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];\n        // Internal: Calculates the number of days between the Unix epoch and the\n        // first day of the given month.\n        var getDay = function (year, month) {\n          return Months[month] + 365 * (year - 1970) + floor((year - 1969 + (month = +(month > 1))) / 4) - floor((year - 1901 + month) / 100) + floor((year - 1601 + month) / 400);\n        };\n      }\n\n      // Internal: Determines if a property is a direct property of the given\n      // object. Delegates to the native `Object#hasOwnProperty` method.\n      if (!(isProperty = objectProto.hasOwnProperty)) {\n        isProperty = function (property) {\n          var members = {}, constructor;\n          if ((members.__proto__ = null, members.__proto__ = {\n            // The *proto* property cannot be set multiple times in recent\n            // versions of Firefox and SeaMonkey.\n            \"toString\": 1\n          }, members).toString != getClass) {\n            // Safari <= 2.0.3 doesn't implement `Object#hasOwnProperty`, but\n            // supports the mutable *proto* property.\n            isProperty = function (property) {\n              // Capture and break the object's prototype chain (see section 8.6.2\n              // of the ES 5.1 spec). The parenthesized expression prevents an\n              // unsafe transformation by the Closure Compiler.\n              var original = this.__proto__, result = property in (this.__proto__ = null, this);\n              // Restore the original prototype chain.\n              this.__proto__ = original;\n              return result;\n            };\n          } else {\n            // Capture a reference to the top-level `Object` constructor.\n            constructor = members.constructor;\n            // Use the `constructor` property to simulate `Object#hasOwnProperty` in\n            // other environments.\n            isProperty = function (property) {\n              var parent = (this.constructor || constructor).prototype;\n              return property in this && !(property in parent && this[property] === parent[property]);\n            };\n          }\n          members = null;\n          return isProperty.call(this, property);\n        };\n      }\n\n      // Internal: Normalizes the `for...in` iteration algorithm across\n      // environments. Each enumerated key is yielded to a `callback` function.\n      forEach = function (object, callback) {\n        var size = 0, Properties, members, property;\n\n        // Tests for bugs in the current environment's `for...in` algorithm. The\n        // `valueOf` property inherits the non-enumerable flag from\n        // `Object.prototype` in older versions of IE, Netscape, and Mozilla.\n        (Properties = function () {\n          this.valueOf = 0;\n        }).prototype.valueOf = 0;\n\n        // Iterate over a new instance of the `Properties` class.\n        members = new Properties();\n        for (property in members) {\n          // Ignore all properties inherited from `Object.prototype`.\n          if (isProperty.call(members, property)) {\n            size++;\n          }\n        }\n        Properties = members = null;\n\n        // Normalize the iteration algorithm.\n        if (!size) {\n          // A list of non-enumerable properties inherited from `Object.prototype`.\n          members = [\"valueOf\", \"toString\", \"toLocaleString\", \"propertyIsEnumerable\", \"isPrototypeOf\", \"hasOwnProperty\", \"constructor\"];\n          // IE <= 8, Mozilla 1.0, and Netscape 6.2 ignore shadowed non-enumerable\n          // properties.\n          forEach = function (object, callback) {\n            var isFunction = getClass.call(object) == functionClass, property, length;\n            var hasProperty = !isFunction && typeof object.constructor != \"function\" && objectTypes[typeof object.hasOwnProperty] && object.hasOwnProperty || isProperty;\n            for (property in object) {\n              // Gecko <= 1.0 enumerates the `prototype` property of functions under\n              // certain conditions; IE does not.\n              if (!(isFunction && property == \"prototype\") && hasProperty.call(object, property)) {\n                callback(property);\n              }\n            }\n            // Manually invoke the callback for each non-enumerable property.\n            for (length = members.length; property = members[--length]; hasProperty.call(object, property) && callback(property));\n          };\n        } else if (size == 2) {\n          // Safari <= 2.0.4 enumerates shadowed properties twice.\n          forEach = function (object, callback) {\n            // Create a set of iterated properties.\n            var members = {}, isFunction = getClass.call(object) == functionClass, property;\n            for (property in object) {\n              // Store each property name to prevent double enumeration. The\n              // `prototype` property of functions is not enumerated due to cross-\n              // environment inconsistencies.\n              if (!(isFunction && property == \"prototype\") && !isProperty.call(members, property) && (members[property] = 1) && isProperty.call(object, property)) {\n                callback(property);\n              }\n            }\n          };\n        } else {\n          // No bugs detected; use the standard `for...in` algorithm.\n          forEach = function (object, callback) {\n            var isFunction = getClass.call(object) == functionClass, property, isConstructor;\n            for (property in object) {\n              if (!(isFunction && property == \"prototype\") && isProperty.call(object, property) && !(isConstructor = property === \"constructor\")) {\n                callback(property);\n              }\n            }\n            // Manually invoke the callback for the `constructor` property due to\n            // cross-environment inconsistencies.\n            if (isConstructor || isProperty.call(object, (property = \"constructor\"))) {\n              callback(property);\n            }\n          };\n        }\n        return forEach(object, callback);\n      };\n\n      // Public: Serializes a JavaScript `value` as a JSON string. The optional\n      // `filter` argument may specify either a function that alters how object and\n      // array members are serialized, or an array of strings and numbers that\n      // indicates which properties should be serialized. The optional `width`\n      // argument may be either a string or number that specifies the indentation\n      // level of the output.\n      if (!has(\"json-stringify\")) {\n        // Internal: A map of control characters and their escaped equivalents.\n        var Escapes = {\n          92: \"\\\\\\\\\",\n          34: '\\\\\"',\n          8: \"\\\\b\",\n          12: \"\\\\f\",\n          10: \"\\\\n\",\n          13: \"\\\\r\",\n          9: \"\\\\t\"\n        };\n\n        // Internal: Converts `value` into a zero-padded string such that its\n        // length is at least equal to `width`. The `width` must be <= 6.\n        var leadingZeroes = \"000000\";\n        var toPaddedString = function (width, value) {\n          // The `|| 0` expression is necessary to work around a bug in\n          // Opera <= 7.54u2 where `0 == -0`, but `String(-0) !== \"0\"`.\n          return (leadingZeroes + (value || 0)).slice(-width);\n        };\n\n        // Internal: Double-quotes a string `value`, replacing all ASCII control\n        // characters (characters with code unit values between 0 and 31) with\n        // their escaped equivalents. This is an implementation of the\n        // `Quote(value)` operation defined in ES 5.1 section 15.12.3.\n        var unicodePrefix = \"\\\\u00\";\n        var quote = function (value) {\n          var result = '\"', index = 0, length = value.length, useCharIndex = !charIndexBuggy || length > 10;\n          var symbols = useCharIndex && (charIndexBuggy ? value.split(\"\") : value);\n          for (; index < length; index++) {\n            var charCode = value.charCodeAt(index);\n            // If the character is a control character, append its Unicode or\n            // shorthand escape sequence; otherwise, append the character as-is.\n            switch (charCode) {\n              case 8: case 9: case 10: case 12: case 13: case 34: case 92:\n                result += Escapes[charCode];\n                break;\n              default:\n                if (charCode < 32) {\n                  result += unicodePrefix + toPaddedString(2, charCode.toString(16));\n                  break;\n                }\n                result += useCharIndex ? symbols[index] : value.charAt(index);\n            }\n          }\n          return result + '\"';\n        };\n\n        // Internal: Recursively serializes an object. Implements the\n        // `Str(key, holder)`, `JO(value)`, and `JA(value)` operations.\n        var serialize = function (property, object, callback, properties, whitespace, indentation, stack) {\n          var value, className, year, month, date, time, hours, minutes, seconds, milliseconds, results, element, index, length, prefix, result;\n          try {\n            // Necessary for host object support.\n            value = object[property];\n          } catch (exception) {}\n          if (typeof value == \"object\" && value) {\n            className = getClass.call(value);\n            if (className == dateClass && !isProperty.call(value, \"toJSON\")) {\n              if (value > -1 / 0 && value < 1 / 0) {\n                // Dates are serialized according to the `Date#toJSON` method\n                // specified in ES 5.1 section 15.9.5.44. See section 15.9.1.15\n                // for the ISO 8601 date time string format.\n                if (getDay) {\n                  // Manually compute the year, month, date, hours, minutes,\n                  // seconds, and milliseconds if the `getUTC*` methods are\n                  // buggy. Adapted from @Yaffle's `date-shim` project.\n                  date = floor(value / 864e5);\n                  for (year = floor(date / 365.2425) + 1970 - 1; getDay(year + 1, 0) <= date; year++);\n                  for (month = floor((date - getDay(year, 0)) / 30.42); getDay(year, month + 1) <= date; month++);\n                  date = 1 + date - getDay(year, month);\n                  // The `time` value specifies the time within the day (see ES\n                  // 5.1 section 15.9.1.2). The formula `(A % B + B) % B` is used\n                  // to compute `A modulo B`, as the `%` operator does not\n                  // correspond to the `modulo` operation for negative numbers.\n                  time = (value % 864e5 + 864e5) % 864e5;\n                  // The hours, minutes, seconds, and milliseconds are obtained by\n                  // decomposing the time within the day. See section 15.9.1.10.\n                  hours = floor(time / 36e5) % 24;\n                  minutes = floor(time / 6e4) % 60;\n                  seconds = floor(time / 1e3) % 60;\n                  milliseconds = time % 1e3;\n                } else {\n                  year = value.getUTCFullYear();\n                  month = value.getUTCMonth();\n                  date = value.getUTCDate();\n                  hours = value.getUTCHours();\n                  minutes = value.getUTCMinutes();\n                  seconds = value.getUTCSeconds();\n                  milliseconds = value.getUTCMilliseconds();\n                }\n                // Serialize extended years correctly.\n                value = (year <= 0 || year >= 1e4 ? (year < 0 ? \"-\" : \"+\") + toPaddedString(6, year < 0 ? -year : year) : toPaddedString(4, year)) +\n                  \"-\" + toPaddedString(2, month + 1) + \"-\" + toPaddedString(2, date) +\n                  // Months, dates, hours, minutes, and seconds should have two\n                  // digits; milliseconds should have three.\n                  \"T\" + toPaddedString(2, hours) + \":\" + toPaddedString(2, minutes) + \":\" + toPaddedString(2, seconds) +\n                  // Milliseconds are optional in ES 5.0, but required in 5.1.\n                  \".\" + toPaddedString(3, milliseconds) + \"Z\";\n              } else {\n                value = null;\n              }\n            } else if (typeof value.toJSON == \"function\" && ((className != numberClass && className != stringClass && className != arrayClass) || isProperty.call(value, \"toJSON\"))) {\n              // Prototype <= 1.6.1 adds non-standard `toJSON` methods to the\n              // `Number`, `String`, `Date`, and `Array` prototypes. JSON 3\n              // ignores all `toJSON` methods on these objects unless they are\n              // defined directly on an instance.\n              value = value.toJSON(property);\n            }\n          }\n          if (callback) {\n            // If a replacement function was provided, call it to obtain the value\n            // for serialization.\n            value = callback.call(object, property, value);\n          }\n          if (value === null) {\n            return \"null\";\n          }\n          className = getClass.call(value);\n          if (className == booleanClass) {\n            // Booleans are represented literally.\n            return \"\" + value;\n          } else if (className == numberClass) {\n            // JSON numbers must be finite. `Infinity` and `NaN` are serialized as\n            // `\"null\"`.\n            return value > -1 / 0 && value < 1 / 0 ? \"\" + value : \"null\";\n          } else if (className == stringClass) {\n            // Strings are double-quoted and escaped.\n            return quote(\"\" + value);\n          }\n          // Recursively serialize objects and arrays.\n          if (typeof value == \"object\") {\n            // Check for cyclic structures. This is a linear search; performance\n            // is inversely proportional to the number of unique nested objects.\n            for (length = stack.length; length--;) {\n              if (stack[length] === value) {\n                // Cyclic structures cannot be serialized by `JSON.stringify`.\n                throw TypeError();\n              }\n            }\n            // Add the object to the stack of traversed objects.\n            stack.push(value);\n            results = [];\n            // Save the current indentation level and indent one additional level.\n            prefix = indentation;\n            indentation += whitespace;\n            if (className == arrayClass) {\n              // Recursively serialize array elements.\n              for (index = 0, length = value.length; index < length; index++) {\n                element = serialize(index, value, callback, properties, whitespace, indentation, stack);\n                results.push(element === undef ? \"null\" : element);\n              }\n              result = results.length ? (whitespace ? \"[\\n\" + indentation + results.join(\",\\n\" + indentation) + \"\\n\" + prefix + \"]\" : (\"[\" + results.join(\",\") + \"]\")) : \"[]\";\n            } else {\n              // Recursively serialize object members. Members are selected from\n              // either a user-specified list of property names, or the object\n              // itself.\n              forEach(properties || value, function (property) {\n                var element = serialize(property, value, callback, properties, whitespace, indentation, stack);\n                if (element !== undef) {\n                  // According to ES 5.1 section 15.12.3: \"If `gap` {whitespace}\n                  // is not the empty string, let `member` {quote(property) + \":\"}\n                  // be the concatenation of `member` and the `space` character.\"\n                  // The \"`space` character\" refers to the literal space\n                  // character, not the `space` {width} argument provided to\n                  // `JSON.stringify`.\n                  results.push(quote(property) + \":\" + (whitespace ? \" \" : \"\") + element);\n                }\n              });\n              result = results.length ? (whitespace ? \"{\\n\" + indentation + results.join(\",\\n\" + indentation) + \"\\n\" + prefix + \"}\" : (\"{\" + results.join(\",\") + \"}\")) : \"{}\";\n            }\n            // Remove the object from the traversed object stack.\n            stack.pop();\n            return result;\n          }\n        };\n\n        // Public: `JSON.stringify`. See ES 5.1 section 15.12.3.\n        exports.stringify = function (source, filter, width) {\n          var whitespace, callback, properties, className;\n          if (objectTypes[typeof filter] && filter) {\n            if ((className = getClass.call(filter)) == functionClass) {\n              callback = filter;\n            } else if (className == arrayClass) {\n              // Convert the property names array into a makeshift set.\n              properties = {};\n              for (var index = 0, length = filter.length, value; index < length; value = filter[index++], ((className = getClass.call(value)), className == stringClass || className == numberClass) && (properties[value] = 1));\n            }\n          }\n          if (width) {\n            if ((className = getClass.call(width)) == numberClass) {\n              // Convert the `width` to an integer and create a string containing\n              // `width` number of space characters.\n              if ((width -= width % 1) > 0) {\n                for (whitespace = \"\", width > 10 && (width = 10); whitespace.length < width; whitespace += \" \");\n              }\n            } else if (className == stringClass) {\n              whitespace = width.length <= 10 ? width : width.slice(0, 10);\n            }\n          }\n          // Opera <= 7.54u2 discards the values associated with empty string keys\n          // (`\"\"`) only if they are used directly within an object member list\n          // (e.g., `!(\"\" in { \"\": 1})`).\n          return serialize(\"\", (value = {}, value[\"\"] = source, value), callback, properties, whitespace, \"\", []);\n        };\n      }\n\n      // Public: Parses a JSON source string.\n      if (!has(\"json-parse\")) {\n        var fromCharCode = String.fromCharCode;\n\n        // Internal: A map of escaped control characters and their unescaped\n        // equivalents.\n        var Unescapes = {\n          92: \"\\\\\",\n          34: '\"',\n          47: \"/\",\n          98: \"\\b\",\n          116: \"\\t\",\n          110: \"\\n\",\n          102: \"\\f\",\n          114: \"\\r\"\n        };\n\n        // Internal: Stores the parser state.\n        var Index, Source;\n\n        // Internal: Resets the parser state and throws a `SyntaxError`.\n        var abort = function () {\n          Index = Source = null;\n          throw SyntaxError();\n        };\n\n        // Internal: Returns the next token, or `\"$\"` if the parser has reached\n        // the end of the source string. A token may be a string, number, `null`\n        // literal, or Boolean literal.\n        var lex = function () {\n          var source = Source, length = source.length, value, begin, position, isSigned, charCode;\n          while (Index < length) {\n            charCode = source.charCodeAt(Index);\n            switch (charCode) {\n              case 9: case 10: case 13: case 32:\n                // Skip whitespace tokens, including tabs, carriage returns, line\n                // feeds, and space characters.\n                Index++;\n                break;\n              case 123: case 125: case 91: case 93: case 58: case 44:\n                // Parse a punctuator token (`{`, `}`, `[`, `]`, `:`, or `,`) at\n                // the current position.\n                value = charIndexBuggy ? source.charAt(Index) : source[Index];\n                Index++;\n                return value;\n              case 34:\n                // `\"` delimits a JSON string; advance to the next character and\n                // begin parsing the string. String tokens are prefixed with the\n                // sentinel `@` character to distinguish them from punctuators and\n                // end-of-string tokens.\n                for (value = \"@\", Index++; Index < length;) {\n                  charCode = source.charCodeAt(Index);\n                  if (charCode < 32) {\n                    // Unescaped ASCII control characters (those with a code unit\n                    // less than the space character) are not permitted.\n                    abort();\n                  } else if (charCode == 92) {\n                    // A reverse solidus (`\\`) marks the beginning of an escaped\n                    // control character (including `\"`, `\\`, and `/`) or Unicode\n                    // escape sequence.\n                    charCode = source.charCodeAt(++Index);\n                    switch (charCode) {\n                      case 92: case 34: case 47: case 98: case 116: case 110: case 102: case 114:\n                        // Revive escaped control characters.\n                        value += Unescapes[charCode];\n                        Index++;\n                        break;\n                      case 117:\n                        // `\\u` marks the beginning of a Unicode escape sequence.\n                        // Advance to the first character and validate the\n                        // four-digit code point.\n                        begin = ++Index;\n                        for (position = Index + 4; Index < position; Index++) {\n                          charCode = source.charCodeAt(Index);\n                          // A valid sequence comprises four hexdigits (case-\n                          // insensitive) that form a single hexadecimal value.\n                          if (!(charCode >= 48 && charCode <= 57 || charCode >= 97 && charCode <= 102 || charCode >= 65 && charCode <= 70)) {\n                            // Invalid Unicode escape sequence.\n                            abort();\n                          }\n                        }\n                        // Revive the escaped character.\n                        value += fromCharCode(\"0x\" + source.slice(begin, Index));\n                        break;\n                      default:\n                        // Invalid escape sequence.\n                        abort();\n                    }\n                  } else {\n                    if (charCode == 34) {\n                      // An unescaped double-quote character marks the end of the\n                      // string.\n                      break;\n                    }\n                    charCode = source.charCodeAt(Index);\n                    begin = Index;\n                    // Optimize for the common case where a string is valid.\n                    while (charCode >= 32 && charCode != 92 && charCode != 34) {\n                      charCode = source.charCodeAt(++Index);\n                    }\n                    // Append the string as-is.\n                    value += source.slice(begin, Index);\n                  }\n                }\n                if (source.charCodeAt(Index) == 34) {\n                  // Advance to the next character and return the revived string.\n                  Index++;\n                  return value;\n                }\n                // Unterminated string.\n                abort();\n              default:\n                // Parse numbers and literals.\n                begin = Index;\n                // Advance past the negative sign, if one is specified.\n                if (charCode == 45) {\n                  isSigned = true;\n                  charCode = source.charCodeAt(++Index);\n                }\n                // Parse an integer or floating-point value.\n                if (charCode >= 48 && charCode <= 57) {\n                  // Leading zeroes are interpreted as octal literals.\n                  if (charCode == 48 && ((charCode = source.charCodeAt(Index + 1)), charCode >= 48 && charCode <= 57)) {\n                    // Illegal octal literal.\n                    abort();\n                  }\n                  isSigned = false;\n                  // Parse the integer component.\n                  for (; Index < length && ((charCode = source.charCodeAt(Index)), charCode >= 48 && charCode <= 57); Index++);\n                  // Floats cannot contain a leading decimal point; however, this\n                  // case is already accounted for by the parser.\n                  if (source.charCodeAt(Index) == 46) {\n                    position = ++Index;\n                    // Parse the decimal component.\n                    for (; position < length && ((charCode = source.charCodeAt(position)), charCode >= 48 && charCode <= 57); position++);\n                    if (position == Index) {\n                      // Illegal trailing decimal.\n                      abort();\n                    }\n                    Index = position;\n                  }\n                  // Parse exponents. The `e` denoting the exponent is\n                  // case-insensitive.\n                  charCode = source.charCodeAt(Index);\n                  if (charCode == 101 || charCode == 69) {\n                    charCode = source.charCodeAt(++Index);\n                    // Skip past the sign following the exponent, if one is\n                    // specified.\n                    if (charCode == 43 || charCode == 45) {\n                      Index++;\n                    }\n                    // Parse the exponential component.\n                    for (position = Index; position < length && ((charCode = source.charCodeAt(position)), charCode >= 48 && charCode <= 57); position++);\n                    if (position == Index) {\n                      // Illegal empty exponent.\n                      abort();\n                    }\n                    Index = position;\n                  }\n                  // Coerce the parsed value to a JavaScript number.\n                  return +source.slice(begin, Index);\n                }\n                // A negative sign may only precede numbers.\n                if (isSigned) {\n                  abort();\n                }\n                // `true`, `false`, and `null` literals.\n                if (source.slice(Index, Index + 4) == \"true\") {\n                  Index += 4;\n                  return true;\n                } else if (source.slice(Index, Index + 5) == \"false\") {\n                  Index += 5;\n                  return false;\n                } else if (source.slice(Index, Index + 4) == \"null\") {\n                  Index += 4;\n                  return null;\n                }\n                // Unrecognized token.\n                abort();\n            }\n          }\n          // Return the sentinel `$` character if the parser has reached the end\n          // of the source string.\n          return \"$\";\n        };\n\n        // Internal: Parses a JSON `value` token.\n        var get = function (value) {\n          var results, hasMembers;\n          if (value == \"$\") {\n            // Unexpected end of input.\n            abort();\n          }\n          if (typeof value == \"string\") {\n            if ((charIndexBuggy ? value.charAt(0) : value[0]) == \"@\") {\n              // Remove the sentinel `@` character.\n              return value.slice(1);\n            }\n            // Parse object and array literals.\n            if (value == \"[\") {\n              // Parses a JSON array, returning a new JavaScript array.\n              results = [];\n              for (;; hasMembers || (hasMembers = true)) {\n                value = lex();\n                // A closing square bracket marks the end of the array literal.\n                if (value == \"]\") {\n                  break;\n                }\n                // If the array literal contains elements, the current token\n                // should be a comma separating the previous element from the\n                // next.\n                if (hasMembers) {\n                  if (value == \",\") {\n                    value = lex();\n                    if (value == \"]\") {\n                      // Unexpected trailing `,` in array literal.\n                      abort();\n                    }\n                  } else {\n                    // A `,` must separate each array element.\n                    abort();\n                  }\n                }\n                // Elisions and leading commas are not permitted.\n                if (value == \",\") {\n                  abort();\n                }\n                results.push(get(value));\n              }\n              return results;\n            } else if (value == \"{\") {\n              // Parses a JSON object, returning a new JavaScript object.\n              results = {};\n              for (;; hasMembers || (hasMembers = true)) {\n                value = lex();\n                // A closing curly brace marks the end of the object literal.\n                if (value == \"}\") {\n                  break;\n                }\n                // If the object literal contains members, the current token\n                // should be a comma separator.\n                if (hasMembers) {\n                  if (value == \",\") {\n                    value = lex();\n                    if (value == \"}\") {\n                      // Unexpected trailing `,` in object literal.\n                      abort();\n                    }\n                  } else {\n                    // A `,` must separate each object member.\n                    abort();\n                  }\n                }\n                // Leading commas are not permitted, object property names must be\n                // double-quoted strings, and a `:` must separate each property\n                // name and value.\n                if (value == \",\" || typeof value != \"string\" || (charIndexBuggy ? value.charAt(0) : value[0]) != \"@\" || lex() != \":\") {\n                  abort();\n                }\n                results[value.slice(1)] = get(lex());\n              }\n              return results;\n            }\n            // Unexpected token encountered.\n            abort();\n          }\n          return value;\n        };\n\n        // Internal: Updates a traversed object member.\n        var update = function (source, property, callback) {\n          var element = walk(source, property, callback);\n          if (element === undef) {\n            delete source[property];\n          } else {\n            source[property] = element;\n          }\n        };\n\n        // Internal: Recursively traverses a parsed JSON object, invoking the\n        // `callback` function for each value. This is an implementation of the\n        // `Walk(holder, name)` operation defined in ES 5.1 section 15.12.2.\n        var walk = function (source, property, callback) {\n          var value = source[property], length;\n          if (typeof value == \"object\" && value) {\n            // `forEach` can't be used to traverse an array in Opera <= 8.54\n            // because its `Object#hasOwnProperty` implementation returns `false`\n            // for array indices (e.g., `![1, 2, 3].hasOwnProperty(\"0\")`).\n            if (getClass.call(value) == arrayClass) {\n              for (length = value.length; length--;) {\n                update(value, length, callback);\n              }\n            } else {\n              forEach(value, function (property) {\n                update(value, property, callback);\n              });\n            }\n          }\n          return callback.call(source, property, value);\n        };\n\n        // Public: `JSON.parse`. See ES 5.1 section 15.12.2.\n        exports.parse = function (source, callback) {\n          var result, value;\n          Index = 0;\n          Source = \"\" + source;\n          result = get(lex());\n          // If a JSON string contains multiple tokens, it is invalid.\n          if (lex() != \"$\") {\n            abort();\n          }\n          // Reset the parser state.\n          Index = Source = null;\n          return callback && getClass.call(callback) == functionClass ? walk((value = {}, value[\"\"] = result, value), \"\", callback) : result;\n        };\n      }\n    }\n\n    exports[\"runInContext\"] = runInContext;\n    return exports;\n  }\n\n  if (freeExports && !isLoader) {\n    // Export for CommonJS environments.\n    runInContext(root, freeExports);\n  } else {\n    // Export for web browsers and JavaScript engines.\n    var nativeJSON = root.JSON,\n        previousJSON = root[\"JSON3\"],\n        isRestored = false;\n\n    var JSON3 = runInContext(root, (root[\"JSON3\"] = {\n      // Public: Restores the original value of the global `JSON` object and\n      // returns a reference to the `JSON3` object.\n      \"noConflict\": function () {\n        if (!isRestored) {\n          isRestored = true;\n          root.JSON = nativeJSON;\n          root[\"JSON3\"] = previousJSON;\n          nativeJSON = previousJSON = null;\n        }\n        return JSON3;\n      }\n    }));\n\n    root.JSON = {\n      \"parse\": JSON3.parse,\n      \"stringify\": JSON3.stringify\n    };\n  }\n\n  // Export for asynchronous module loaders.\n  if (isLoader) {\n    define(function () {\n      return JSON3;\n    });\n  }\n}).call(this);\n","\nmodule.exports = require('./socket');\n\n/**\n * Exports parser\n *\n * @api public\n *\n */\nmodule.exports.parser = require('engine.io-parser');\n","/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n *  - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} options\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options){\n  options = options || {};\n  if ('string' == typeof val) return parse(val);\n  return options.long\n    ? long(val)\n    : short(val);\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n  str = '' + str;\n  if (str.length > 10000) return;\n  var match = /^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str);\n  if (!match) return;\n  var n = parseFloat(match[1]);\n  var type = (match[2] || 'ms').toLowerCase();\n  switch (type) {\n    case 'years':\n    case 'year':\n    case 'yrs':\n    case 'yr':\n    case 'y':\n      return n * y;\n    case 'days':\n    case 'day':\n    case 'd':\n      return n * d;\n    case 'hours':\n    case 'hour':\n    case 'hrs':\n    case 'hr':\n    case 'h':\n      return n * h;\n    case 'minutes':\n    case 'minute':\n    case 'mins':\n    case 'min':\n    case 'm':\n      return n * m;\n    case 'seconds':\n    case 'second':\n    case 'secs':\n    case 'sec':\n    case 's':\n      return n * s;\n    case 'milliseconds':\n    case 'millisecond':\n    case 'msecs':\n    case 'msec':\n    case 'ms':\n      return n;\n  }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction short(ms) {\n  if (ms >= d) return Math.round(ms / d) + 'd';\n  if (ms >= h) return Math.round(ms / h) + 'h';\n  if (ms >= m) return Math.round(ms / m) + 'm';\n  if (ms >= s) return Math.round(ms / s) + 's';\n  return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction long(ms) {\n  return plural(ms, d, 'day')\n    || plural(ms, h, 'hour')\n    || plural(ms, m, 'minute')\n    || plural(ms, s, 'second')\n    || ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, n, name) {\n  if (ms < n) return;\n  if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name;\n  return Math.ceil(ms / n) + ' ' + name + 's';\n}\n","/**\n * Module dependencies.\n */\n\nvar transports = require('./transports');\nvar Emitter = require('component-emitter');\nvar debug = require('debug')('engine.io-client:socket');\nvar index = require('indexof');\nvar parser = require('engine.io-parser');\nvar parseuri = require('parseuri');\nvar parsejson = require('parsejson');\nvar parseqs = require('parseqs');\n\n/**\n * Module exports.\n */\n\nmodule.exports = Socket;\n\n/**\n * Noop function.\n *\n * @api private\n */\n\nfunction noop(){}\n\n/**\n * Socket constructor.\n *\n * @param {String|Object} uri or options\n * @param {Object} options\n * @api public\n */\n\nfunction Socket(uri, opts){\n  if (!(this instanceof Socket)) return new Socket(uri, opts);\n\n  opts = opts || {};\n\n  if (uri && 'object' == typeof uri) {\n    opts = uri;\n    uri = null;\n  }\n\n  if (uri) {\n    uri = parseuri(uri);\n    opts.hostname = uri.host;\n    opts.secure = uri.protocol == 'https' || uri.protocol == 'wss';\n    opts.port = uri.port;\n    if (uri.query) opts.query = uri.query;\n  } else if (opts.host) {\n    opts.hostname = parseuri(opts.host).host;\n  }\n\n  this.secure = null != opts.secure ? opts.secure :\n    (global.location && 'https:' == location.protocol);\n\n  if (opts.hostname && !opts.port) {\n    // if no port is specified manually, use the protocol default\n    opts.port = this.secure ? '443' : '80';\n  }\n\n  this.agent = opts.agent || false;\n  this.hostname = opts.hostname ||\n    (global.location ? location.hostname : 'localhost');\n  this.port = opts.port || (global.location && location.port ?\n       location.port :\n       (this.secure ? 443 : 80));\n  this.query = opts.query || {};\n  if ('string' == typeof this.query) this.query = parseqs.decode(this.query);\n  this.upgrade = false !== opts.upgrade;\n  this.path = (opts.path || '/engine.io').replace(/\\/$/, '') + '/';\n  this.forceJSONP = !!opts.forceJSONP;\n  this.jsonp = false !== opts.jsonp;\n  this.forceBase64 = !!opts.forceBase64;\n  this.enablesXDR = !!opts.enablesXDR;\n  this.timestampParam = opts.timestampParam || 't';\n  this.timestampRequests = opts.timestampRequests;\n  this.transports = opts.transports || ['polling', 'websocket'];\n  this.readyState = '';\n  this.writeBuffer = [];\n  this.policyPort = opts.policyPort || 843;\n  this.rememberUpgrade = opts.rememberUpgrade || false;\n  this.binaryType = null;\n  this.onlyBinaryUpgrades = opts.onlyBinaryUpgrades;\n  this.perMessageDeflate = false !== opts.perMessageDeflate ? (opts.perMessageDeflate || {}) : false;\n\n  if (true === this.perMessageDeflate) this.perMessageDeflate = {};\n  if (this.perMessageDeflate && null == this.perMessageDeflate.threshold) {\n    this.perMessageDeflate.threshold = 1024;\n  }\n\n  // SSL options for Node.js client\n  this.pfx = opts.pfx || null;\n  this.key = opts.key || null;\n  this.passphrase = opts.passphrase || null;\n  this.cert = opts.cert || null;\n  this.ca = opts.ca || null;\n  this.ciphers = opts.ciphers || null;\n  this.rejectUnauthorized = opts.rejectUnauthorized === undefined ? null : opts.rejectUnauthorized;\n\n  // other options for Node.js client\n  var freeGlobal = typeof global == 'object' && global;\n  if (freeGlobal.global === freeGlobal) {\n    if (opts.extraHeaders && Object.keys(opts.extraHeaders).length > 0) {\n      this.extraHeaders = opts.extraHeaders;\n    }\n  }\n\n  this.open();\n}\n\nSocket.priorWebsocketSuccess = false;\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Socket.prototype);\n\n/**\n * Protocol version.\n *\n * @api public\n */\n\nSocket.protocol = parser.protocol; // this is an int\n\n/**\n * Expose deps for legacy compatibility\n * and standalone browser access.\n */\n\nSocket.Socket = Socket;\nSocket.Transport = require('./transport');\nSocket.transports = require('./transports');\nSocket.parser = require('engine.io-parser');\n\n/**\n * Creates transport of the given type.\n *\n * @param {String} transport name\n * @return {Transport}\n * @api private\n */\n\nSocket.prototype.createTransport = function (name) {\n  debug('creating transport \"%s\"', name);\n  var query = clone(this.query);\n\n  // append engine.io protocol identifier\n  query.EIO = parser.protocol;\n\n  // transport name\n  query.transport = name;\n\n  // session id if we already have one\n  if (this.id) query.sid = this.id;\n\n  var transport = new transports[name]({\n    agent: this.agent,\n    hostname: this.hostname,\n    port: this.port,\n    secure: this.secure,\n    path: this.path,\n    query: query,\n    forceJSONP: this.forceJSONP,\n    jsonp: this.jsonp,\n    forceBase64: this.forceBase64,\n    enablesXDR: this.enablesXDR,\n    timestampRequests: this.timestampRequests,\n    timestampParam: this.timestampParam,\n    policyPort: this.policyPort,\n    socket: this,\n    pfx: this.pfx,\n    key: this.key,\n    passphrase: this.passphrase,\n    cert: this.cert,\n    ca: this.ca,\n    ciphers: this.ciphers,\n    rejectUnauthorized: this.rejectUnauthorized,\n    perMessageDeflate: this.perMessageDeflate,\n    extraHeaders: this.extraHeaders\n  });\n\n  return transport;\n};\n\nfunction clone (obj) {\n  var o = {};\n  for (var i in obj) {\n    if (obj.hasOwnProperty(i)) {\n      o[i] = obj[i];\n    }\n  }\n  return o;\n}\n\n/**\n * Initializes transport to use and starts probe.\n *\n * @api private\n */\nSocket.prototype.open = function () {\n  var transport;\n  if (this.rememberUpgrade && Socket.priorWebsocketSuccess && this.transports.indexOf('websocket') != -1) {\n    transport = 'websocket';\n  } else if (0 === this.transports.length) {\n    // Emit error on next tick so it can be listened to\n    var self = this;\n    setTimeout(function() {\n      self.emit('error', 'No transports available');\n    }, 0);\n    return;\n  } else {\n    transport = this.transports[0];\n  }\n  this.readyState = 'opening';\n\n  // Retry with the next transport if the transport is disabled (jsonp: false)\n  try {\n    transport = this.createTransport(transport);\n  } catch (e) {\n    this.transports.shift();\n    this.open();\n    return;\n  }\n\n  transport.open();\n  this.setTransport(transport);\n};\n\n/**\n * Sets the current transport. Disables the existing one (if any).\n *\n * @api private\n */\n\nSocket.prototype.setTransport = function(transport){\n  debug('setting transport %s', transport.name);\n  var self = this;\n\n  if (this.transport) {\n    debug('clearing existing transport %s', this.transport.name);\n    this.transport.removeAllListeners();\n  }\n\n  // set up transport\n  this.transport = transport;\n\n  // set up transport listeners\n  transport\n  .on('drain', function(){\n    self.onDrain();\n  })\n  .on('packet', function(packet){\n    self.onPacket(packet);\n  })\n  .on('error', function(e){\n    self.onError(e);\n  })\n  .on('close', function(){\n    self.onClose('transport close');\n  });\n};\n\n/**\n * Probes a transport.\n *\n * @param {String} transport name\n * @api private\n */\n\nSocket.prototype.probe = function (name) {\n  debug('probing transport \"%s\"', name);\n  var transport = this.createTransport(name, { probe: 1 })\n    , failed = false\n    , self = this;\n\n  Socket.priorWebsocketSuccess = false;\n\n  function onTransportOpen(){\n    if (self.onlyBinaryUpgrades) {\n      var upgradeLosesBinary = !this.supportsBinary && self.transport.supportsBinary;\n      failed = failed || upgradeLosesBinary;\n    }\n    if (failed) return;\n\n    debug('probe transport \"%s\" opened', name);\n    transport.send([{ type: 'ping', data: 'probe' }]);\n    transport.once('packet', function (msg) {\n      if (failed) return;\n      if ('pong' == msg.type && 'probe' == msg.data) {\n        debug('probe transport \"%s\" pong', name);\n        self.upgrading = true;\n        self.emit('upgrading', transport);\n        if (!transport) return;\n        Socket.priorWebsocketSuccess = 'websocket' == transport.name;\n\n        debug('pausing current transport \"%s\"', self.transport.name);\n        self.transport.pause(function () {\n          if (failed) return;\n          if ('closed' == self.readyState) return;\n          debug('changing transport and sending upgrade packet');\n\n          cleanup();\n\n          self.setTransport(transport);\n          transport.send([{ type: 'upgrade' }]);\n          self.emit('upgrade', transport);\n          transport = null;\n          self.upgrading = false;\n          self.flush();\n        });\n      } else {\n        debug('probe transport \"%s\" failed', name);\n        var err = new Error('probe error');\n        err.transport = transport.name;\n        self.emit('upgradeError', err);\n      }\n    });\n  }\n\n  function freezeTransport() {\n    if (failed) return;\n\n    // Any callback called by transport should be ignored since now\n    failed = true;\n\n    cleanup();\n\n    transport.close();\n    transport = null;\n  }\n\n  //Handle any error that happens while probing\n  function onerror(err) {\n    var error = new Error('probe error: ' + err);\n    error.transport = transport.name;\n\n    freezeTransport();\n\n    debug('probe transport \"%s\" failed because of error: %s', name, err);\n\n    self.emit('upgradeError', error);\n  }\n\n  function onTransportClose(){\n    onerror(\"transport closed\");\n  }\n\n  //When the socket is closed while we're probing\n  function onclose(){\n    onerror(\"socket closed\");\n  }\n\n  //When the socket is upgraded while we're probing\n  function onupgrade(to){\n    if (transport && to.name != transport.name) {\n      debug('\"%s\" works - aborting \"%s\"', to.name, transport.name);\n      freezeTransport();\n    }\n  }\n\n  //Remove all listeners on the transport and on self\n  function cleanup(){\n    transport.removeListener('open', onTransportOpen);\n    transport.removeListener('error', onerror);\n    transport.removeListener('close', onTransportClose);\n    self.removeListener('close', onclose);\n    self.removeListener('upgrading', onupgrade);\n  }\n\n  transport.once('open', onTransportOpen);\n  transport.once('error', onerror);\n  transport.once('close', onTransportClose);\n\n  this.once('close', onclose);\n  this.once('upgrading', onupgrade);\n\n  transport.open();\n\n};\n\n/**\n * Called when connection is deemed open.\n *\n * @api public\n */\n\nSocket.prototype.onOpen = function () {\n  debug('socket open');\n  this.readyState = 'open';\n  Socket.priorWebsocketSuccess = 'websocket' == this.transport.name;\n  this.emit('open');\n  this.flush();\n\n  // we check for `readyState` in case an `open`\n  // listener already closed the socket\n  if ('open' == this.readyState && this.upgrade && this.transport.pause) {\n    debug('starting upgrade probes');\n    for (var i = 0, l = this.upgrades.length; i < l; i++) {\n      this.probe(this.upgrades[i]);\n    }\n  }\n};\n\n/**\n * Handles a packet.\n *\n * @api private\n */\n\nSocket.prototype.onPacket = function (packet) {\n  if ('opening' == this.readyState || 'open' == this.readyState) {\n    debug('socket receive: type \"%s\", data \"%s\"', packet.type, packet.data);\n\n    this.emit('packet', packet);\n\n    // Socket is live - any packet counts\n    this.emit('heartbeat');\n\n    switch (packet.type) {\n      case 'open':\n        this.onHandshake(parsejson(packet.data));\n        break;\n\n      case 'pong':\n        this.setPing();\n        this.emit('pong');\n        break;\n\n      case 'error':\n        var err = new Error('server error');\n        err.code = packet.data;\n        this.onError(err);\n        break;\n\n      case 'message':\n        this.emit('data', packet.data);\n        this.emit('message', packet.data);\n        break;\n    }\n  } else {\n    debug('packet received with socket readyState \"%s\"', this.readyState);\n  }\n};\n\n/**\n * Called upon handshake completion.\n *\n * @param {Object} handshake obj\n * @api private\n */\n\nSocket.prototype.onHandshake = function (data) {\n  this.emit('handshake', data);\n  this.id = data.sid;\n  this.transport.query.sid = data.sid;\n  this.upgrades = this.filterUpgrades(data.upgrades);\n  this.pingInterval = data.pingInterval;\n  this.pingTimeout = data.pingTimeout;\n  this.onOpen();\n  // In case open handler closes socket\n  if  ('closed' == this.readyState) return;\n  this.setPing();\n\n  // Prolong liveness of socket on heartbeat\n  this.removeListener('heartbeat', this.onHeartbeat);\n  this.on('heartbeat', this.onHeartbeat);\n};\n\n/**\n * Resets ping timeout.\n *\n * @api private\n */\n\nSocket.prototype.onHeartbeat = function (timeout) {\n  clearTimeout(this.pingTimeoutTimer);\n  var self = this;\n  self.pingTimeoutTimer = setTimeout(function () {\n    if ('closed' == self.readyState) return;\n    self.onClose('ping timeout');\n  }, timeout || (self.pingInterval + self.pingTimeout));\n};\n\n/**\n * Pings server every `this.pingInterval` and expects response\n * within `this.pingTimeout` or closes connection.\n *\n * @api private\n */\n\nSocket.prototype.setPing = function () {\n  var self = this;\n  clearTimeout(self.pingIntervalTimer);\n  self.pingIntervalTimer = setTimeout(function () {\n    debug('writing ping packet - expecting pong within %sms', self.pingTimeout);\n    self.ping();\n    self.onHeartbeat(self.pingTimeout);\n  }, self.pingInterval);\n};\n\n/**\n* Sends a ping packet.\n*\n* @api private\n*/\n\nSocket.prototype.ping = function () {\n  var self = this;\n  this.sendPacket('ping', function(){\n    self.emit('ping');\n  });\n};\n\n/**\n * Called on `drain` event\n *\n * @api private\n */\n\nSocket.prototype.onDrain = function() {\n  this.writeBuffer.splice(0, this.prevBufferLen);\n\n  // setting prevBufferLen = 0 is very important\n  // for example, when upgrading, upgrade packet is sent over,\n  // and a nonzero prevBufferLen could cause problems on `drain`\n  this.prevBufferLen = 0;\n\n  if (0 === this.writeBuffer.length) {\n    this.emit('drain');\n  } else {\n    this.flush();\n  }\n};\n\n/**\n * Flush write buffers.\n *\n * @api private\n */\n\nSocket.prototype.flush = function () {\n  if ('closed' != this.readyState && this.transport.writable &&\n    !this.upgrading && this.writeBuffer.length) {\n    debug('flushing %d packets in socket', this.writeBuffer.length);\n    this.transport.send(this.writeBuffer);\n    // keep track of current length of writeBuffer\n    // splice writeBuffer and callbackBuffer on `drain`\n    this.prevBufferLen = this.writeBuffer.length;\n    this.emit('flush');\n  }\n};\n\n/**\n * Sends a message.\n *\n * @param {String} message.\n * @param {Function} callback function.\n * @param {Object} options.\n * @return {Socket} for chaining.\n * @api public\n */\n\nSocket.prototype.write =\nSocket.prototype.send = function (msg, options, fn) {\n  this.sendPacket('message', msg, options, fn);\n  return this;\n};\n\n/**\n * Sends a packet.\n *\n * @param {String} packet type.\n * @param {String} data.\n * @param {Object} options.\n * @param {Function} callback function.\n * @api private\n */\n\nSocket.prototype.sendPacket = function (type, data, options, fn) {\n  if('function' == typeof data) {\n    fn = data;\n    data = undefined;\n  }\n\n  if ('function' == typeof options) {\n    fn = options;\n    options = null;\n  }\n\n  if ('closing' == this.readyState || 'closed' == this.readyState) {\n    return;\n  }\n\n  options = options || {};\n  options.compress = false !== options.compress;\n\n  var packet = {\n    type: type,\n    data: data,\n    options: options\n  };\n  this.emit('packetCreate', packet);\n  this.writeBuffer.push(packet);\n  if (fn) this.once('flush', fn);\n  this.flush();\n};\n\n/**\n * Closes the connection.\n *\n * @api private\n */\n\nSocket.prototype.close = function () {\n  if ('opening' == this.readyState || 'open' == this.readyState) {\n    this.readyState = 'closing';\n\n    var self = this;\n\n    if (this.writeBuffer.length) {\n      this.once('drain', function() {\n        if (this.upgrading) {\n          waitForUpgrade();\n        } else {\n          close();\n        }\n      });\n    } else if (this.upgrading) {\n      waitForUpgrade();\n    } else {\n      close();\n    }\n  }\n\n  function close() {\n    self.onClose('forced close');\n    debug('socket closing - telling transport to close');\n    self.transport.close();\n  }\n\n  function cleanupAndClose() {\n    self.removeListener('upgrade', cleanupAndClose);\n    self.removeListener('upgradeError', cleanupAndClose);\n    close();\n  }\n\n  function waitForUpgrade() {\n    // wait for upgrade to finish since we can't send packets while pausing a transport\n    self.once('upgrade', cleanupAndClose);\n    self.once('upgradeError', cleanupAndClose);\n  }\n\n  return this;\n};\n\n/**\n * Called upon transport error\n *\n * @api private\n */\n\nSocket.prototype.onError = function (err) {\n  debug('socket error %j', err);\n  Socket.priorWebsocketSuccess = false;\n  this.emit('error', err);\n  this.onClose('transport error', err);\n};\n\n/**\n * Called upon transport close.\n *\n * @api private\n */\n\nSocket.prototype.onClose = function (reason, desc) {\n  if ('opening' == this.readyState || 'open' == this.readyState || 'closing' == this.readyState) {\n    debug('socket close with reason: \"%s\"', reason);\n    var self = this;\n\n    // clear timers\n    clearTimeout(this.pingIntervalTimer);\n    clearTimeout(this.pingTimeoutTimer);\n\n    // stop event from firing again for transport\n    this.transport.removeAllListeners('close');\n\n    // ensure transport won't stay open\n    this.transport.close();\n\n    // ignore further transport communication\n    this.transport.removeAllListeners();\n\n    // set ready state\n    this.readyState = 'closed';\n\n    // clear session id\n    this.id = null;\n\n    // emit close event\n    this.emit('close', reason, desc);\n\n    // clean buffers after, so users can still\n    // grab the buffers on `close` event\n    self.writeBuffer = [];\n    self.prevBufferLen = 0;\n  }\n};\n\n/**\n * Filters upgrades, returning only those matching client transports.\n *\n * @param {Array} server upgrades\n * @api private\n *\n */\n\nSocket.prototype.filterUpgrades = function (upgrades) {\n  var filteredUpgrades = [];\n  for (var i = 0, j = upgrades.length; i<j; i++) {\n    if (~index(this.transports, upgrades[i])) filteredUpgrades.push(upgrades[i]);\n  }\n  return filteredUpgrades;\n};\n","/**\n * Module dependencies.\n */\n\nvar keys = require('./keys');\nvar hasBinary = require('has-binary');\nvar sliceBuffer = require('arraybuffer.slice');\nvar base64encoder = require('base64-arraybuffer');\nvar after = require('after');\nvar utf8 = require('utf8');\n\n/**\n * Check if we are running an android browser. That requires us to use\n * ArrayBuffer with polling transports...\n *\n * http://ghinda.net/jpeg-blob-ajax-android/\n */\n\nvar isAndroid = navigator.userAgent.match(/Android/i);\n\n/**\n * Check if we are running in PhantomJS.\n * Uploading a Blob with PhantomJS does not work correctly, as reported here:\n * https://github.com/ariya/phantomjs/issues/11395\n * @type boolean\n */\nvar isPhantomJS = /PhantomJS/i.test(navigator.userAgent);\n\n/**\n * When true, avoids using Blobs to encode payloads.\n * @type boolean\n */\nvar dontSendBlobs = isAndroid || isPhantomJS;\n\n/**\n * Current protocol version.\n */\n\nexports.protocol = 3;\n\n/**\n * Packet types.\n */\n\nvar packets = exports.packets = {\n    open:     0    // non-ws\n  , close:    1    // non-ws\n  , ping:     2\n  , pong:     3\n  , message:  4\n  , upgrade:  5\n  , noop:     6\n};\n\nvar packetslist = keys(packets);\n\n/**\n * Premade error packet.\n */\n\nvar err = { type: 'error', data: 'parser error' };\n\n/**\n * Create a blob api even for blob builder when vendor prefixes exist\n */\n\nvar Blob = require('blob');\n\n/**\n * Encodes a packet.\n *\n *     <packet type id> [ <data> ]\n *\n * Example:\n *\n *     5hello world\n *     3\n *     4\n *\n * Binary is encoded in an identical principle\n *\n * @api private\n */\n\nexports.encodePacket = function (packet, supportsBinary, utf8encode, callback) {\n  if ('function' == typeof supportsBinary) {\n    callback = supportsBinary;\n    supportsBinary = false;\n  }\n\n  if ('function' == typeof utf8encode) {\n    callback = utf8encode;\n    utf8encode = null;\n  }\n\n  var data = (packet.data === undefined)\n    ? undefined\n    : packet.data.buffer || packet.data;\n\n  if (global.ArrayBuffer && data instanceof ArrayBuffer) {\n    return encodeArrayBuffer(packet, supportsBinary, callback);\n  } else if (Blob && data instanceof global.Blob) {\n    return encodeBlob(packet, supportsBinary, callback);\n  }\n\n  // might be an object with { base64: true, data: dataAsBase64String }\n  if (data && data.base64) {\n    return encodeBase64Object(packet, callback);\n  }\n\n  // Sending data as a utf-8 string\n  var encoded = packets[packet.type];\n\n  // data fragment is optional\n  if (undefined !== packet.data) {\n    encoded += utf8encode ? utf8.encode(String(packet.data)) : String(packet.data);\n  }\n\n  return callback('' + encoded);\n\n};\n\nfunction encodeBase64Object(packet, callback) {\n  // packet data is an object { base64: true, data: dataAsBase64String }\n  var message = 'b' + exports.packets[packet.type] + packet.data.data;\n  return callback(message);\n}\n\n/**\n * Encode packet helpers for binary types\n */\n\nfunction encodeArrayBuffer(packet, supportsBinary, callback) {\n  if (!supportsBinary) {\n    return exports.encodeBase64Packet(packet, callback);\n  }\n\n  var data = packet.data;\n  var contentArray = new Uint8Array(data);\n  var resultBuffer = new Uint8Array(1 + data.byteLength);\n\n  resultBuffer[0] = packets[packet.type];\n  for (var i = 0; i < contentArray.length; i++) {\n    resultBuffer[i+1] = contentArray[i];\n  }\n\n  return callback(resultBuffer.buffer);\n}\n\nfunction encodeBlobAsArrayBuffer(packet, supportsBinary, callback) {\n  if (!supportsBinary) {\n    return exports.encodeBase64Packet(packet, callback);\n  }\n\n  var fr = new FileReader();\n  fr.onload = function() {\n    packet.data = fr.result;\n    exports.encodePacket(packet, supportsBinary, true, callback);\n  };\n  return fr.readAsArrayBuffer(packet.data);\n}\n\nfunction encodeBlob(packet, supportsBinary, callback) {\n  if (!supportsBinary) {\n    return exports.encodeBase64Packet(packet, callback);\n  }\n\n  if (dontSendBlobs) {\n    return encodeBlobAsArrayBuffer(packet, supportsBinary, callback);\n  }\n\n  var length = new Uint8Array(1);\n  length[0] = packets[packet.type];\n  var blob = new Blob([length.buffer, packet.data]);\n\n  return callback(blob);\n}\n\n/**\n * Encodes a packet with binary data in a base64 string\n *\n * @param {Object} packet, has `type` and `data`\n * @return {String} base64 encoded message\n */\n\nexports.encodeBase64Packet = function(packet, callback) {\n  var message = 'b' + exports.packets[packet.type];\n  if (Blob && packet.data instanceof global.Blob) {\n    var fr = new FileReader();\n    fr.onload = function() {\n      var b64 = fr.result.split(',')[1];\n      callback(message + b64);\n    };\n    return fr.readAsDataURL(packet.data);\n  }\n\n  var b64data;\n  try {\n    b64data = String.fromCharCode.apply(null, new Uint8Array(packet.data));\n  } catch (e) {\n    // iPhone Safari doesn't let you apply with typed arrays\n    var typed = new Uint8Array(packet.data);\n    var basic = new Array(typed.length);\n    for (var i = 0; i < typed.length; i++) {\n      basic[i] = typed[i];\n    }\n    b64data = String.fromCharCode.apply(null, basic);\n  }\n  message += global.btoa(b64data);\n  return callback(message);\n};\n\n/**\n * Decodes a packet. Changes format to Blob if requested.\n *\n * @return {Object} with `type` and `data` (if any)\n * @api private\n */\n\nexports.decodePacket = function (data, binaryType, utf8decode) {\n  // String data\n  if (typeof data == 'string' || data === undefined) {\n    if (data.charAt(0) == 'b') {\n      return exports.decodeBase64Packet(data.substr(1), binaryType);\n    }\n\n    if (utf8decode) {\n      try {\n        data = utf8.decode(data);\n      } catch (e) {\n        return err;\n      }\n    }\n    var type = data.charAt(0);\n\n    if (Number(type) != type || !packetslist[type]) {\n      return err;\n    }\n\n    if (data.length > 1) {\n      return { type: packetslist[type], data: data.substring(1) };\n    } else {\n      return { type: packetslist[type] };\n    }\n  }\n\n  var asArray = new Uint8Array(data);\n  var type = asArray[0];\n  var rest = sliceBuffer(data, 1);\n  if (Blob && binaryType === 'blob') {\n    rest = new Blob([rest]);\n  }\n  return { type: packetslist[type], data: rest };\n};\n\n/**\n * Decodes a packet encoded in a base64 string\n *\n * @param {String} base64 encoded message\n * @return {Object} with `type` and `data` (if any)\n */\n\nexports.decodeBase64Packet = function(msg, binaryType) {\n  var type = packetslist[msg.charAt(0)];\n  if (!global.ArrayBuffer) {\n    return { type: type, data: { base64: true, data: msg.substr(1) } };\n  }\n\n  var data = base64encoder.decode(msg.substr(1));\n\n  if (binaryType === 'blob' && Blob) {\n    data = new Blob([data]);\n  }\n\n  return { type: type, data: data };\n};\n\n/**\n * Encodes multiple messages (payload).\n *\n *     <length>:data\n *\n * Example:\n *\n *     11:hello world2:hi\n *\n * If any contents are binary, they will be encoded as base64 strings. Base64\n * encoded strings are marked with a b before the length specifier\n *\n * @param {Array} packets\n * @api private\n */\n\nexports.encodePayload = function (packets, supportsBinary, callback) {\n  if (typeof supportsBinary == 'function') {\n    callback = supportsBinary;\n    supportsBinary = null;\n  }\n\n  var isBinary = hasBinary(packets);\n\n  if (supportsBinary && isBinary) {\n    if (Blob && !dontSendBlobs) {\n      return exports.encodePayloadAsBlob(packets, callback);\n    }\n\n    return exports.encodePayloadAsArrayBuffer(packets, callback);\n  }\n\n  if (!packets.length) {\n    return callback('0:');\n  }\n\n  function setLengthHeader(message) {\n    return message.length + ':' + message;\n  }\n\n  function encodeOne(packet, doneCallback) {\n    exports.encodePacket(packet, !isBinary ? false : supportsBinary, true, function(message) {\n      doneCallback(null, setLengthHeader(message));\n    });\n  }\n\n  map(packets, encodeOne, function(err, results) {\n    return callback(results.join(''));\n  });\n};\n\n/**\n * Async array map using after\n */\n\nfunction map(ary, each, done) {\n  var result = new Array(ary.length);\n  var next = after(ary.length, done);\n\n  var eachWithIndex = function(i, el, cb) {\n    each(el, function(error, msg) {\n      result[i] = msg;\n      cb(error, result);\n    });\n  };\n\n  for (var i = 0; i < ary.length; i++) {\n    eachWithIndex(i, ary[i], next);\n  }\n}\n\n/*\n * Decodes data when a payload is maybe expected. Possible binary contents are\n * decoded from their base64 representation\n *\n * @param {String} data, callback method\n * @api public\n */\n\nexports.decodePayload = function (data, binaryType, callback) {\n  if (typeof data != 'string') {\n    return exports.decodePayloadAsBinary(data, binaryType, callback);\n  }\n\n  if (typeof binaryType === 'function') {\n    callback = binaryType;\n    binaryType = null;\n  }\n\n  var packet;\n  if (data == '') {\n    // parser error - ignoring payload\n    return callback(err, 0, 1);\n  }\n\n  var length = ''\n    , n, msg;\n\n  for (var i = 0, l = data.length; i < l; i++) {\n    var chr = data.charAt(i);\n\n    if (':' != chr) {\n      length += chr;\n    } else {\n      if ('' == length || (length != (n = Number(length)))) {\n        // parser error - ignoring payload\n        return callback(err, 0, 1);\n      }\n\n      msg = data.substr(i + 1, n);\n\n      if (length != msg.length) {\n        // parser error - ignoring payload\n        return callback(err, 0, 1);\n      }\n\n      if (msg.length) {\n        packet = exports.decodePacket(msg, binaryType, true);\n\n        if (err.type == packet.type && err.data == packet.data) {\n          // parser error in individual packet - ignoring payload\n          return callback(err, 0, 1);\n        }\n\n        var ret = callback(packet, i + n, l);\n        if (false === ret) return;\n      }\n\n      // advance cursor\n      i += n;\n      length = '';\n    }\n  }\n\n  if (length != '') {\n    // parser error - ignoring payload\n    return callback(err, 0, 1);\n  }\n\n};\n\n/**\n * Encodes multiple messages (payload) as binary.\n *\n * <1 = binary, 0 = string><number from 0-9><number from 0-9>[...]<number\n * 255><data>\n *\n * Example:\n * 1 3 255 1 2 3, if the binary contents are interpreted as 8 bit integers\n *\n * @param {Array} packets\n * @return {ArrayBuffer} encoded payload\n * @api private\n */\n\nexports.encodePayloadAsArrayBuffer = function(packets, callback) {\n  if (!packets.length) {\n    return callback(new ArrayBuffer(0));\n  }\n\n  function encodeOne(packet, doneCallback) {\n    exports.encodePacket(packet, true, true, function(data) {\n      return doneCallback(null, data);\n    });\n  }\n\n  map(packets, encodeOne, function(err, encodedPackets) {\n    var totalLength = encodedPackets.reduce(function(acc, p) {\n      var len;\n      if (typeof p === 'string'){\n        len = p.length;\n      } else {\n        len = p.byteLength;\n      }\n      return acc + len.toString().length + len + 2; // string/binary identifier + separator = 2\n    }, 0);\n\n    var resultArray = new Uint8Array(totalLength);\n\n    var bufferIndex = 0;\n    encodedPackets.forEach(function(p) {\n      var isString = typeof p === 'string';\n      var ab = p;\n      if (isString) {\n        var view = new Uint8Array(p.length);\n        for (var i = 0; i < p.length; i++) {\n          view[i] = p.charCodeAt(i);\n        }\n        ab = view.buffer;\n      }\n\n      if (isString) { // not true binary\n        resultArray[bufferIndex++] = 0;\n      } else { // true binary\n        resultArray[bufferIndex++] = 1;\n      }\n\n      var lenStr = ab.byteLength.toString();\n      for (var i = 0; i < lenStr.length; i++) {\n        resultArray[bufferIndex++] = parseInt(lenStr[i]);\n      }\n      resultArray[bufferIndex++] = 255;\n\n      var view = new Uint8Array(ab);\n      for (var i = 0; i < view.length; i++) {\n        resultArray[bufferIndex++] = view[i];\n      }\n    });\n\n    return callback(resultArray.buffer);\n  });\n};\n\n/**\n * Encode as Blob\n */\n\nexports.encodePayloadAsBlob = function(packets, callback) {\n  function encodeOne(packet, doneCallback) {\n    exports.encodePacket(packet, true, true, function(encoded) {\n      var binaryIdentifier = new Uint8Array(1);\n      binaryIdentifier[0] = 1;\n      if (typeof encoded === 'string') {\n        var view = new Uint8Array(encoded.length);\n        for (var i = 0; i < encoded.length; i++) {\n          view[i] = encoded.charCodeAt(i);\n        }\n        encoded = view.buffer;\n        binaryIdentifier[0] = 0;\n      }\n\n      var len = (encoded instanceof ArrayBuffer)\n        ? encoded.byteLength\n        : encoded.size;\n\n      var lenStr = len.toString();\n      var lengthAry = new Uint8Array(lenStr.length + 1);\n      for (var i = 0; i < lenStr.length; i++) {\n        lengthAry[i] = parseInt(lenStr[i]);\n      }\n      lengthAry[lenStr.length] = 255;\n\n      if (Blob) {\n        var blob = new Blob([binaryIdentifier.buffer, lengthAry.buffer, encoded]);\n        doneCallback(null, blob);\n      }\n    });\n  }\n\n  map(packets, encodeOne, function(err, results) {\n    return callback(new Blob(results));\n  });\n};\n\n/*\n * Decodes data when a payload is maybe expected. Strings are decoded by\n * interpreting each byte as a key code for entries marked to start with 0. See\n * description of encodePayloadAsBinary\n *\n * @param {ArrayBuffer} data, callback method\n * @api public\n */\n\nexports.decodePayloadAsBinary = function (data, binaryType, callback) {\n  if (typeof binaryType === 'function') {\n    callback = binaryType;\n    binaryType = null;\n  }\n\n  var bufferTail = data;\n  var buffers = [];\n\n  var numberTooLong = false;\n  while (bufferTail.byteLength > 0) {\n    var tailArray = new Uint8Array(bufferTail);\n    var isString = tailArray[0] === 0;\n    var msgLength = '';\n\n    for (var i = 1; ; i++) {\n      if (tailArray[i] == 255) break;\n\n      if (msgLength.length > 310) {\n        numberTooLong = true;\n        break;\n      }\n\n      msgLength += tailArray[i];\n    }\n\n    if(numberTooLong) return callback(err, 0, 1);\n\n    bufferTail = sliceBuffer(bufferTail, 2 + msgLength.length);\n    msgLength = parseInt(msgLength);\n\n    var msg = sliceBuffer(bufferTail, 0, msgLength);\n    if (isString) {\n      try {\n        msg = String.fromCharCode.apply(null, new Uint8Array(msg));\n      } catch (e) {\n        // iPhone Safari doesn't let you apply to typed arrays\n        var typed = new Uint8Array(msg);\n        msg = '';\n        for (var i = 0; i < typed.length; i++) {\n          msg += String.fromCharCode(typed[i]);\n        }\n      }\n    }\n\n    buffers.push(msg);\n    bufferTail = sliceBuffer(bufferTail, msgLength);\n  }\n\n  var total = buffers.length;\n  buffers.forEach(function(buffer, i) {\n    callback(exports.decodePacket(buffer, binaryType, true), i, total);\n  });\n};\n","/**\n * Module dependencies.\n */\n\nvar parser = require('engine.io-parser');\nvar Emitter = require('component-emitter');\n\n/**\n * Module exports.\n */\n\nmodule.exports = Transport;\n\n/**\n * Transport abstract constructor.\n *\n * @param {Object} options.\n * @api private\n */\n\nfunction Transport (opts) {\n  this.path = opts.path;\n  this.hostname = opts.hostname;\n  this.port = opts.port;\n  this.secure = opts.secure;\n  this.query = opts.query;\n  this.timestampParam = opts.timestampParam;\n  this.timestampRequests = opts.timestampRequests;\n  this.readyState = '';\n  this.agent = opts.agent || false;\n  this.socket = opts.socket;\n  this.enablesXDR = opts.enablesXDR;\n\n  // SSL options for Node.js client\n  this.pfx = opts.pfx;\n  this.key = opts.key;\n  this.passphrase = opts.passphrase;\n  this.cert = opts.cert;\n  this.ca = opts.ca;\n  this.ciphers = opts.ciphers;\n  this.rejectUnauthorized = opts.rejectUnauthorized;\n\n  // other options for Node.js client\n  this.extraHeaders = opts.extraHeaders;\n}\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Transport.prototype);\n\n/**\n * Emits an error.\n *\n * @param {String} str\n * @return {Transport} for chaining\n * @api public\n */\n\nTransport.prototype.onError = function (msg, desc) {\n  var err = new Error(msg);\n  err.type = 'TransportError';\n  err.description = desc;\n  this.emit('error', err);\n  return this;\n};\n\n/**\n * Opens the transport.\n *\n * @api public\n */\n\nTransport.prototype.open = function () {\n  if ('closed' == this.readyState || '' == this.readyState) {\n    this.readyState = 'opening';\n    this.doOpen();\n  }\n\n  return this;\n};\n\n/**\n * Closes the transport.\n *\n * @api private\n */\n\nTransport.prototype.close = function () {\n  if ('opening' == this.readyState || 'open' == this.readyState) {\n    this.doClose();\n    this.onClose();\n  }\n\n  return this;\n};\n\n/**\n * Sends multiple packets.\n *\n * @param {Array} packets\n * @api private\n */\n\nTransport.prototype.send = function(packets){\n  if ('open' == this.readyState) {\n    this.write(packets);\n  } else {\n    throw new Error('Transport not open');\n  }\n};\n\n/**\n * Called upon open\n *\n * @api private\n */\n\nTransport.prototype.onOpen = function () {\n  this.readyState = 'open';\n  this.writable = true;\n  this.emit('open');\n};\n\n/**\n * Called with data.\n *\n * @param {String} data\n * @api private\n */\n\nTransport.prototype.onData = function(data){\n  var packet = parser.decodePacket(data, this.socket.binaryType);\n  this.onPacket(packet);\n};\n\n/**\n * Called with a decoded packet.\n */\n\nTransport.prototype.onPacket = function (packet) {\n  this.emit('packet', packet);\n};\n\n/**\n * Called upon close.\n *\n * @api private\n */\n\nTransport.prototype.onClose = function () {\n  this.readyState = 'closed';\n  this.emit('close');\n};\n","/**\n * Module dependencies\n */\n\nvar XMLHttpRequest = require('xmlhttprequest-ssl');\nvar XHR = require('./polling-xhr');\nvar JSONP = require('./polling-jsonp');\nvar websocket = require('./websocket');\n\n/**\n * Export transports.\n */\n\nexports.polling = polling;\nexports.websocket = websocket;\n\n/**\n * Polling transport polymorphic constructor.\n * Decides on xhr vs jsonp based on feature detection.\n *\n * @api private\n */\n\nfunction polling(opts){\n  var xhr;\n  var xd = false;\n  var xs = false;\n  var jsonp = false !== opts.jsonp;\n\n  if (global.location) {\n    var isSSL = 'https:' == location.protocol;\n    var port = location.port;\n\n    // some user agents have empty `location.port`\n    if (!port) {\n      port = isSSL ? 443 : 80;\n    }\n\n    xd = opts.hostname != location.hostname || port != opts.port;\n    xs = opts.secure != isSSL;\n  }\n\n  opts.xdomain = xd;\n  opts.xscheme = xs;\n  xhr = new XMLHttpRequest(opts);\n\n  if ('open' in xhr && !opts.forceJSONP) {\n    return new XHR(opts);\n  } else {\n    if (!jsonp) throw new Error('JSONP disabled');\n    return new JSONP(opts);\n  }\n}\n","\n/**\n * Expose `Emitter`.\n */\n\nmodule.exports = Emitter;\n\n/**\n * Initialize a new `Emitter`.\n *\n * @api public\n */\n\nfunction Emitter(obj) {\n  if (obj) return mixin(obj);\n};\n\n/**\n * Mixin the emitter properties.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\nfunction mixin(obj) {\n  for (var key in Emitter.prototype) {\n    obj[key] = Emitter.prototype[key];\n  }\n  return obj;\n}\n\n/**\n * Listen on the given `event` with `fn`.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.on =\nEmitter.prototype.addEventListener = function(event, fn){\n  this._callbacks = this._callbacks || {};\n  (this._callbacks[event] = this._callbacks[event] || [])\n    .push(fn);\n  return this;\n};\n\n/**\n * Adds an `event` listener that will be invoked a single\n * time then automatically removed.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.once = function(event, fn){\n  var self = this;\n  this._callbacks = this._callbacks || {};\n\n  function on() {\n    self.off(event, on);\n    fn.apply(this, arguments);\n  }\n\n  on.fn = fn;\n  this.on(event, on);\n  return this;\n};\n\n/**\n * Remove the given callback for `event` or all\n * registered callbacks.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.off =\nEmitter.prototype.removeListener =\nEmitter.prototype.removeAllListeners =\nEmitter.prototype.removeEventListener = function(event, fn){\n  this._callbacks = this._callbacks || {};\n\n  // all\n  if (0 == arguments.length) {\n    this._callbacks = {};\n    return this;\n  }\n\n  // specific event\n  var callbacks = this._callbacks[event];\n  if (!callbacks) return this;\n\n  // remove all handlers\n  if (1 == arguments.length) {\n    delete this._callbacks[event];\n    return this;\n  }\n\n  // remove specific handler\n  var cb;\n  for (var i = 0; i < callbacks.length; i++) {\n    cb = callbacks[i];\n    if (cb === fn || cb.fn === fn) {\n      callbacks.splice(i, 1);\n      break;\n    }\n  }\n  return this;\n};\n\n/**\n * Emit `event` with the given args.\n *\n * @param {String} event\n * @param {Mixed} ...\n * @return {Emitter}\n */\n\nEmitter.prototype.emit = function(event){\n  this._callbacks = this._callbacks || {};\n  var args = [].slice.call(arguments, 1)\n    , callbacks = this._callbacks[event];\n\n  if (callbacks) {\n    callbacks = callbacks.slice(0);\n    for (var i = 0, len = callbacks.length; i < len; ++i) {\n      callbacks[i].apply(this, args);\n    }\n  }\n\n  return this;\n};\n\n/**\n * Return array of callbacks for `event`.\n *\n * @param {String} event\n * @return {Array}\n * @api public\n */\n\nEmitter.prototype.listeners = function(event){\n  this._callbacks = this._callbacks || {};\n  return this._callbacks[event] || [];\n};\n\n/**\n * Check if this emitter has `event` handlers.\n *\n * @param {String} event\n * @return {Boolean}\n * @api public\n */\n\nEmitter.prototype.hasListeners = function(event){\n  return !! this.listeners(event).length;\n};\n","/**\n * Compiles a querystring\n * Returns string representation of the object\n *\n * @param {Object}\n * @api private\n */\n\nexports.encode = function (obj) {\n  var str = '';\n\n  for (var i in obj) {\n    if (obj.hasOwnProperty(i)) {\n      if (str.length) str += '&';\n      str += encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]);\n    }\n  }\n\n  return str;\n};\n\n/**\n * Parses a simple querystring into an object\n *\n * @param {String} qs\n * @api private\n */\n\nexports.decode = function(qs){\n  var qry = {};\n  var pairs = qs.split('&');\n  for (var i = 0, l = pairs.length; i < l; i++) {\n    var pair = pairs[i].split('=');\n    qry[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n  }\n  return qry;\n};\n","/**\n * JSON parse.\n *\n * @see Based on jQuery#parseJSON (MIT) and JSON2\n * @api private\n */\n\nvar rvalidchars = /^[\\],:{}\\s]*$/;\nvar rvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g;\nvar rvalidtokens = /\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g;\nvar rvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g;\nvar rtrimLeft = /^\\s+/;\nvar rtrimRight = /\\s+$/;\n\nmodule.exports = function parsejson(data) {\n  if ('string' != typeof data || !data) {\n    return null;\n  }\n\n  data = data.replace(rtrimLeft, '').replace(rtrimRight, '');\n\n  // Attempt to parse using the native JSON parser first\n  if (global.JSON && JSON.parse) {\n    return JSON.parse(data);\n  }\n\n  if (rvalidchars.test(data.replace(rvalidescape, '@')\n      .replace(rvalidtokens, ']')\n      .replace(rvalidbraces, ''))) {\n    return (new Function('return ' + data))();\n  }\n};","\n/**\n * Gets the keys for an object.\n *\n * @return {Array} keys\n * @api private\n */\n\nmodule.exports = Object.keys || function keys (obj){\n  var arr = [];\n  var has = Object.prototype.hasOwnProperty;\n\n  for (var i in obj) {\n    if (has.call(obj, i)) {\n      arr.push(i);\n    }\n  }\n  return arr;\n};\n","// browser shim for xmlhttprequest module\nvar hasCORS = require('has-cors');\n\nmodule.exports = function(opts) {\n  var xdomain = opts.xdomain;\n\n  // scheme must be same when usign XDomainRequest\n  // http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx\n  var xscheme = opts.xscheme;\n\n  // XDomainRequest has a flow of not sending cookie, therefore it should be disabled as a default.\n  // https://github.com/Automattic/engine.io-client/pull/217\n  var enablesXDR = opts.enablesXDR;\n\n  // XMLHttpRequest can be disabled on IE\n  try {\n    if ('undefined' != typeof XMLHttpRequest && (!xdomain || hasCORS)) {\n      return new XMLHttpRequest();\n    }\n  } catch (e) { }\n\n  // Use XDomainRequest for IE8 if enablesXDR is true\n  // because loading bar keeps flashing when using jsonp-polling\n  // https://github.com/yujiosaka/socke.io-ie8-loading-example\n  try {\n    if ('undefined' != typeof XDomainRequest && !xscheme && enablesXDR) {\n      return new XDomainRequest();\n    }\n  } catch (e) { }\n\n  if (!xdomain) {\n    try {\n      return new ActiveXObject('Microsoft.XMLHTTP');\n    } catch(e) { }\n  }\n}\n","/**\n * Module requirements.\n */\n\nvar XMLHttpRequest = require('xmlhttprequest-ssl');\nvar Polling = require('./polling');\nvar Emitter = require('component-emitter');\nvar inherit = require('component-inherit');\nvar debug = require('debug')('engine.io-client:polling-xhr');\n\n/**\n * Module exports.\n */\n\nmodule.exports = XHR;\nmodule.exports.Request = Request;\n\n/**\n * Empty function\n */\n\nfunction empty(){}\n\n/**\n * XHR Polling constructor.\n *\n * @param {Object} opts\n * @api public\n */\n\nfunction XHR(opts){\n  Polling.call(this, opts);\n\n  if (global.location) {\n    var isSSL = 'https:' == location.protocol;\n    var port = location.port;\n\n    // some user agents have empty `location.port`\n    if (!port) {\n      port = isSSL ? 443 : 80;\n    }\n\n    this.xd = opts.hostname != global.location.hostname ||\n      port != opts.port;\n    this.xs = opts.secure != isSSL;\n  } else {\n    this.extraHeaders = opts.extraHeaders;\n  }\n}\n\n/**\n * Inherits from Polling.\n */\n\ninherit(XHR, Polling);\n\n/**\n * XHR supports binary\n */\n\nXHR.prototype.supportsBinary = true;\n\n/**\n * Creates a request.\n *\n * @param {String} method\n * @api private\n */\n\nXHR.prototype.request = function(opts){\n  opts = opts || {};\n  opts.uri = this.uri();\n  opts.xd = this.xd;\n  opts.xs = this.xs;\n  opts.agent = this.agent || false;\n  opts.supportsBinary = this.supportsBinary;\n  opts.enablesXDR = this.enablesXDR;\n\n  // SSL options for Node.js client\n  opts.pfx = this.pfx;\n  opts.key = this.key;\n  opts.passphrase = this.passphrase;\n  opts.cert = this.cert;\n  opts.ca = this.ca;\n  opts.ciphers = this.ciphers;\n  opts.rejectUnauthorized = this.rejectUnauthorized;\n\n  // other options for Node.js client\n  opts.extraHeaders = this.extraHeaders;\n\n  return new Request(opts);\n};\n\n/**\n * Sends data.\n *\n * @param {String} data to send.\n * @param {Function} called upon flush.\n * @api private\n */\n\nXHR.prototype.doWrite = function(data, fn){\n  var isBinary = typeof data !== 'string' && data !== undefined;\n  var req = this.request({ method: 'POST', data: data, isBinary: isBinary });\n  var self = this;\n  req.on('success', fn);\n  req.on('error', function(err){\n    self.onError('xhr post error', err);\n  });\n  this.sendXhr = req;\n};\n\n/**\n * Starts a poll cycle.\n *\n * @api private\n */\n\nXHR.prototype.doPoll = function(){\n  debug('xhr poll');\n  var req = this.request();\n  var self = this;\n  req.on('data', function(data){\n    self.onData(data);\n  });\n  req.on('error', function(err){\n    self.onError('xhr poll error', err);\n  });\n  this.pollXhr = req;\n};\n\n/**\n * Request constructor\n *\n * @param {Object} options\n * @api public\n */\n\nfunction Request(opts){\n  this.method = opts.method || 'GET';\n  this.uri = opts.uri;\n  this.xd = !!opts.xd;\n  this.xs = !!opts.xs;\n  this.async = false !== opts.async;\n  this.data = undefined != opts.data ? opts.data : null;\n  this.agent = opts.agent;\n  this.isBinary = opts.isBinary;\n  this.supportsBinary = opts.supportsBinary;\n  this.enablesXDR = opts.enablesXDR;\n\n  // SSL options for Node.js client\n  this.pfx = opts.pfx;\n  this.key = opts.key;\n  this.passphrase = opts.passphrase;\n  this.cert = opts.cert;\n  this.ca = opts.ca;\n  this.ciphers = opts.ciphers;\n  this.rejectUnauthorized = opts.rejectUnauthorized;\n\n  // other options for Node.js client\n  this.extraHeaders = opts.extraHeaders;\n\n  this.create();\n}\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Request.prototype);\n\n/**\n * Creates the XHR object and sends the request.\n *\n * @api private\n */\n\nRequest.prototype.create = function(){\n  var opts = { agent: this.agent, xdomain: this.xd, xscheme: this.xs, enablesXDR: this.enablesXDR };\n\n  // SSL options for Node.js client\n  opts.pfx = this.pfx;\n  opts.key = this.key;\n  opts.passphrase = this.passphrase;\n  opts.cert = this.cert;\n  opts.ca = this.ca;\n  opts.ciphers = this.ciphers;\n  opts.rejectUnauthorized = this.rejectUnauthorized;\n\n  var xhr = this.xhr = new XMLHttpRequest(opts);\n  var self = this;\n\n  try {\n    debug('xhr open %s: %s', this.method, this.uri);\n    xhr.open(this.method, this.uri, this.async);\n    try {\n      if (this.extraHeaders) {\n        xhr.setDisableHeaderCheck(true);\n        for (var i in this.extraHeaders) {\n          if (this.extraHeaders.hasOwnProperty(i)) {\n            xhr.setRequestHeader(i, this.extraHeaders[i]);\n          }\n        }\n      }\n    } catch (e) {}\n    if (this.supportsBinary) {\n      // This has to be done after open because Firefox is stupid\n      // http://stackoverflow.com/questions/13216903/get-binary-data-with-xmlhttprequest-in-a-firefox-extension\n      xhr.responseType = 'arraybuffer';\n    }\n\n    if ('POST' == this.method) {\n      try {\n        if (this.isBinary) {\n          xhr.setRequestHeader('Content-type', 'application/octet-stream');\n        } else {\n          xhr.setRequestHeader('Content-type', 'text/plain;charset=UTF-8');\n        }\n      } catch (e) {}\n    }\n\n    // ie6 check\n    if ('withCredentials' in xhr) {\n      xhr.withCredentials = true;\n    }\n\n    if (this.hasXDR()) {\n      xhr.onload = function(){\n        self.onLoad();\n      };\n      xhr.onerror = function(){\n        self.onError(xhr.responseText);\n      };\n    } else {\n      xhr.onreadystatechange = function(){\n        if (4 != xhr.readyState) return;\n        if (200 == xhr.status || 1223 == xhr.status) {\n          self.onLoad();\n        } else {\n          // make sure the `error` event handler that's user-set\n          // does not throw in the same tick and gets caught here\n          setTimeout(function(){\n            self.onError(xhr.status);\n          }, 0);\n        }\n      };\n    }\n\n    debug('xhr data %s', this.data);\n    xhr.send(this.data);\n  } catch (e) {\n    // Need to defer since .create() is called directly fhrom the constructor\n    // and thus the 'error' event can only be only bound *after* this exception\n    // occurs.  Therefore, also, we cannot throw here at all.\n    setTimeout(function() {\n      self.onError(e);\n    }, 0);\n    return;\n  }\n\n  if (global.document) {\n    this.index = Request.requestsCount++;\n    Request.requests[this.index] = this;\n  }\n};\n\n/**\n * Called upon successful response.\n *\n * @api private\n */\n\nRequest.prototype.onSuccess = function(){\n  this.emit('success');\n  this.cleanup();\n};\n\n/**\n * Called if we have data.\n *\n * @api private\n */\n\nRequest.prototype.onData = function(data){\n  this.emit('data', data);\n  this.onSuccess();\n};\n\n/**\n * Called upon error.\n *\n * @api private\n */\n\nRequest.prototype.onError = function(err){\n  this.emit('error', err);\n  this.cleanup(true);\n};\n\n/**\n * Cleans up house.\n *\n * @api private\n */\n\nRequest.prototype.cleanup = function(fromError){\n  if ('undefined' == typeof this.xhr || null === this.xhr) {\n    return;\n  }\n  // xmlhttprequest\n  if (this.hasXDR()) {\n    this.xhr.onload = this.xhr.onerror = empty;\n  } else {\n    this.xhr.onreadystatechange = empty;\n  }\n\n  if (fromError) {\n    try {\n      this.xhr.abort();\n    } catch(e) {}\n  }\n\n  if (global.document) {\n    delete Request.requests[this.index];\n  }\n\n  this.xhr = null;\n};\n\n/**\n * Called upon load.\n *\n * @api private\n */\n\nRequest.prototype.onLoad = function(){\n  var data;\n  try {\n    var contentType;\n    try {\n      contentType = this.xhr.getResponseHeader('Content-Type').split(';')[0];\n    } catch (e) {}\n    if (contentType === 'application/octet-stream') {\n      data = this.xhr.response;\n    } else {\n      if (!this.supportsBinary) {\n        data = this.xhr.responseText;\n      } else {\n        try {\n          data = String.fromCharCode.apply(null, new Uint8Array(this.xhr.response));\n        } catch (e) {\n          var ui8Arr = new Uint8Array(this.xhr.response);\n          var dataArray = [];\n          for (var idx = 0, length = ui8Arr.length; idx < length; idx++) {\n            dataArray.push(ui8Arr[idx]);\n          }\n\n          data = String.fromCharCode.apply(null, dataArray);\n        }\n      }\n    }\n  } catch (e) {\n    this.onError(e);\n  }\n  if (null != data) {\n    this.onData(data);\n  }\n};\n\n/**\n * Check if it has XDomainRequest.\n *\n * @api private\n */\n\nRequest.prototype.hasXDR = function(){\n  return 'undefined' !== typeof global.XDomainRequest && !this.xs && this.enablesXDR;\n};\n\n/**\n * Aborts the request.\n *\n * @api public\n */\n\nRequest.prototype.abort = function(){\n  this.cleanup();\n};\n\n/**\n * Aborts pending requests when unloading the window. This is needed to prevent\n * memory leaks (e.g. when using IE) and to ensure that no spurious error is\n * emitted.\n */\n\nif (global.document) {\n  Request.requestsCount = 0;\n  Request.requests = {};\n  if (global.attachEvent) {\n    global.attachEvent('onunload', unloadHandler);\n  } else if (global.addEventListener) {\n    global.addEventListener('beforeunload', unloadHandler, false);\n  }\n}\n\nfunction unloadHandler() {\n  for (var i in Request.requests) {\n    if (Request.requests.hasOwnProperty(i)) {\n      Request.requests[i].abort();\n    }\n  }\n}\n","\n/**\n * Module requirements.\n */\n\nvar Polling = require('./polling');\nvar inherit = require('component-inherit');\n\n/**\n * Module exports.\n */\n\nmodule.exports = JSONPPolling;\n\n/**\n * Cached regular expressions.\n */\n\nvar rNewline = /\\n/g;\nvar rEscapedNewline = /\\\\n/g;\n\n/**\n * Global JSONP callbacks.\n */\n\nvar callbacks;\n\n/**\n * Callbacks count.\n */\n\nvar index = 0;\n\n/**\n * Noop.\n */\n\nfunction empty () { }\n\n/**\n * JSONP Polling constructor.\n *\n * @param {Object} opts.\n * @api public\n */\n\nfunction JSONPPolling (opts) {\n  Polling.call(this, opts);\n\n  this.query = this.query || {};\n\n  // define global callbacks array if not present\n  // we do this here (lazily) to avoid unneeded global pollution\n  if (!callbacks) {\n    // we need to consider multiple engines in the same page\n    if (!global.___eio) global.___eio = [];\n    callbacks = global.___eio;\n  }\n\n  // callback identifier\n  this.index = callbacks.length;\n\n  // add callback to jsonp global\n  var self = this;\n  callbacks.push(function (msg) {\n    self.onData(msg);\n  });\n\n  // append to query string\n  this.query.j = this.index;\n\n  // prevent spurious errors from being emitted when the window is unloaded\n  if (global.document && global.addEventListener) {\n    global.addEventListener('beforeunload', function () {\n      if (self.script) self.script.onerror = empty;\n    }, false);\n  }\n}\n\n/**\n * Inherits from Polling.\n */\n\ninherit(JSONPPolling, Polling);\n\n/*\n * JSONP only supports binary as base64 encoded strings\n */\n\nJSONPPolling.prototype.supportsBinary = false;\n\n/**\n * Closes the socket.\n *\n * @api private\n */\n\nJSONPPolling.prototype.doClose = function () {\n  if (this.script) {\n    this.script.parentNode.removeChild(this.script);\n    this.script = null;\n  }\n\n  if (this.form) {\n    this.form.parentNode.removeChild(this.form);\n    this.form = null;\n    this.iframe = null;\n  }\n\n  Polling.prototype.doClose.call(this);\n};\n\n/**\n * Starts a poll cycle.\n *\n * @api private\n */\n\nJSONPPolling.prototype.doPoll = function () {\n  var self = this;\n  var script = document.createElement('script');\n\n  if (this.script) {\n    this.script.parentNode.removeChild(this.script);\n    this.script = null;\n  }\n\n  script.async = true;\n  script.src = this.uri();\n  script.onerror = function(e){\n    self.onError('jsonp poll error',e);\n  };\n\n  var insertAt = document.getElementsByTagName('script')[0];\n  if (insertAt) {\n    insertAt.parentNode.insertBefore(script, insertAt);\n  }\n  else {\n    (document.head || document.body).appendChild(script);\n  }\n  this.script = script;\n\n  var isUAgecko = 'undefined' != typeof navigator && /gecko/i.test(navigator.userAgent);\n  \n  if (isUAgecko) {\n    setTimeout(function () {\n      var iframe = document.createElement('iframe');\n      document.body.appendChild(iframe);\n      document.body.removeChild(iframe);\n    }, 100);\n  }\n};\n\n/**\n * Writes with a hidden iframe.\n *\n * @param {String} data to send\n * @param {Function} called upon flush.\n * @api private\n */\n\nJSONPPolling.prototype.doWrite = function (data, fn) {\n  var self = this;\n\n  if (!this.form) {\n    var form = document.createElement('form');\n    var area = document.createElement('textarea');\n    var id = this.iframeId = 'eio_iframe_' + this.index;\n    var iframe;\n\n    form.className = 'socketio';\n    form.style.position = 'absolute';\n    form.style.top = '-1000px';\n    form.style.left = '-1000px';\n    form.target = id;\n    form.method = 'POST';\n    form.setAttribute('accept-charset', 'utf-8');\n    area.name = 'd';\n    form.appendChild(area);\n    document.body.appendChild(form);\n\n    this.form = form;\n    this.area = area;\n  }\n\n  this.form.action = this.uri();\n\n  function complete () {\n    initIframe();\n    fn();\n  }\n\n  function initIframe () {\n    if (self.iframe) {\n      try {\n        self.form.removeChild(self.iframe);\n      } catch (e) {\n        self.onError('jsonp polling iframe removal error', e);\n      }\n    }\n\n    try {\n      // ie6 dynamic iframes with target=\"\" support (thanks Chris Lambacher)\n      var html = '<iframe src=\"javascript:0\" name=\"'+ self.iframeId +'\">';\n      iframe = document.createElement(html);\n    } catch (e) {\n      iframe = document.createElement('iframe');\n      iframe.name = self.iframeId;\n      iframe.src = 'javascript:0';\n    }\n\n    iframe.id = self.iframeId;\n\n    self.form.appendChild(iframe);\n    self.iframe = iframe;\n  }\n\n  initIframe();\n\n  // escape \\n to prevent it from being converted into \\r\\n by some UAs\n  // double escaping is required for escaped new lines because unescaping of new lines can be done safely on server-side\n  data = data.replace(rEscapedNewline, '\\\\\\n');\n  this.area.value = data.replace(rNewline, '\\\\n');\n\n  try {\n    this.form.submit();\n  } catch(e) {}\n\n  if (this.iframe.attachEvent) {\n    this.iframe.onreadystatechange = function(){\n      if (self.iframe.readyState == 'complete') {\n        complete();\n      }\n    };\n  } else {\n    this.iframe.onload = complete;\n  }\n};\n","/**\n * Module dependencies.\n */\n\nvar Transport = require('../transport');\nvar parser = require('engine.io-parser');\nvar parseqs = require('parseqs');\nvar inherit = require('component-inherit');\nvar yeast = require('yeast');\nvar debug = require('debug')('engine.io-client:websocket');\nvar BrowserWebSocket = global.WebSocket || global.MozWebSocket;\n\n/**\n * Get either the `WebSocket` or `MozWebSocket` globals\n * in the browser or try to resolve WebSocket-compatible\n * interface exposed by `ws` for Node-like environment.\n */\n\nvar WebSocket = BrowserWebSocket;\nif (!WebSocket && typeof window === 'undefined') {\n  try {\n    WebSocket = require('ws');\n  } catch (e) { }\n}\n\n/**\n * Module exports.\n */\n\nmodule.exports = WS;\n\n/**\n * WebSocket transport constructor.\n *\n * @api {Object} connection options\n * @api public\n */\n\nfunction WS(opts){\n  var forceBase64 = (opts && opts.forceBase64);\n  if (forceBase64) {\n    this.supportsBinary = false;\n  }\n  this.perMessageDeflate = opts.perMessageDeflate;\n  Transport.call(this, opts);\n}\n\n/**\n * Inherits from Transport.\n */\n\ninherit(WS, Transport);\n\n/**\n * Transport name.\n *\n * @api public\n */\n\nWS.prototype.name = 'websocket';\n\n/*\n * WebSockets support binary\n */\n\nWS.prototype.supportsBinary = true;\n\n/**\n * Opens socket.\n *\n * @api private\n */\n\nWS.prototype.doOpen = function(){\n  if (!this.check()) {\n    // let probe timeout\n    return;\n  }\n\n  var self = this;\n  var uri = this.uri();\n  var protocols = void(0);\n  var opts = {\n    agent: this.agent,\n    perMessageDeflate: this.perMessageDeflate\n  };\n\n  // SSL options for Node.js client\n  opts.pfx = this.pfx;\n  opts.key = this.key;\n  opts.passphrase = this.passphrase;\n  opts.cert = this.cert;\n  opts.ca = this.ca;\n  opts.ciphers = this.ciphers;\n  opts.rejectUnauthorized = this.rejectUnauthorized;\n  if (this.extraHeaders) {\n    opts.headers = this.extraHeaders;\n  }\n\n  this.ws = BrowserWebSocket ? new WebSocket(uri) : new WebSocket(uri, protocols, opts);\n\n  if (this.ws.binaryType === undefined) {\n    this.supportsBinary = false;\n  }\n\n  if (this.ws.supports && this.ws.supports.binary) {\n    this.supportsBinary = true;\n    this.ws.binaryType = 'buffer';\n  } else {\n    this.ws.binaryType = 'arraybuffer';\n  }\n\n  this.addEventListeners();\n};\n\n/**\n * Adds event listeners to the socket\n *\n * @api private\n */\n\nWS.prototype.addEventListeners = function(){\n  var self = this;\n\n  this.ws.onopen = function(){\n    self.onOpen();\n  };\n  this.ws.onclose = function(){\n    self.onClose();\n  };\n  this.ws.onmessage = function(ev){\n    self.onData(ev.data);\n  };\n  this.ws.onerror = function(e){\n    self.onError('websocket error', e);\n  };\n};\n\n/**\n * Override `onData` to use a timer on iOS.\n * See: https://gist.github.com/mloughran/2052006\n *\n * @api private\n */\n\nif ('undefined' != typeof navigator\n  && /iPad|iPhone|iPod/i.test(navigator.userAgent)) {\n  WS.prototype.onData = function(data){\n    var self = this;\n    setTimeout(function(){\n      Transport.prototype.onData.call(self, data);\n    }, 0);\n  };\n}\n\n/**\n * Writes data to socket.\n *\n * @param {Array} array of packets.\n * @api private\n */\n\nWS.prototype.write = function(packets){\n  var self = this;\n  this.writable = false;\n\n  // encodePacket efficient as it uses WS framing\n  // no need for encodePayload\n  var total = packets.length;\n  for (var i = 0, l = total; i < l; i++) {\n    (function(packet) {\n      parser.encodePacket(packet, self.supportsBinary, function(data) {\n        if (!BrowserWebSocket) {\n          // always create a new object (GH-437)\n          var opts = {};\n          if (packet.options) {\n            opts.compress = packet.options.compress;\n          }\n\n          if (self.perMessageDeflate) {\n            var len = 'string' == typeof data ? global.Buffer.byteLength(data) : data.length;\n            if (len < self.perMessageDeflate.threshold) {\n              opts.compress = false;\n            }\n          }\n        }\n\n        //Sometimes the websocket has already been closed but the browser didn't\n        //have a chance of informing us about it yet, in that case send will\n        //throw an error\n        try {\n          if (BrowserWebSocket) {\n            // TypeError is thrown when passing the second argument on Safari\n            self.ws.send(data);\n          } else {\n            self.ws.send(data, opts);\n          }\n        } catch (e){\n          debug('websocket closed before onclose event');\n        }\n\n        --total || done();\n      });\n    })(packets[i]);\n  }\n\n  function done(){\n    self.emit('flush');\n\n    // fake drain\n    // defer to next tick to allow Socket to clear writeBuffer\n    setTimeout(function(){\n      self.writable = true;\n      self.emit('drain');\n    }, 0);\n  }\n};\n\n/**\n * Called upon close\n *\n * @api private\n */\n\nWS.prototype.onClose = function(){\n  Transport.prototype.onClose.call(this);\n};\n\n/**\n * Closes socket.\n *\n * @api private\n */\n\nWS.prototype.doClose = function(){\n  if (typeof this.ws !== 'undefined') {\n    this.ws.close();\n  }\n};\n\n/**\n * Generates uri for connection.\n *\n * @api private\n */\n\nWS.prototype.uri = function(){\n  var query = this.query || {};\n  var schema = this.secure ? 'wss' : 'ws';\n  var port = '';\n\n  // avoid port if default for schema\n  if (this.port && (('wss' == schema && this.port != 443)\n    || ('ws' == schema && this.port != 80))) {\n    port = ':' + this.port;\n  }\n\n  // append timestamp to URI\n  if (this.timestampRequests) {\n    query[this.timestampParam] = yeast();\n  }\n\n  // communicate binary support capabilities\n  if (!this.supportsBinary) {\n    query.b64 = 1;\n  }\n\n  query = parseqs.encode(query);\n\n  // prepend ? to query\n  if (query.length) {\n    query = '?' + query;\n  }\n\n  var ipv6 = this.hostname.indexOf(':') !== -1;\n  return schema + '://' + (ipv6 ? '[' + this.hostname + ']' : this.hostname) + port + this.path + query;\n};\n\n/**\n * Feature detection for WebSocket.\n *\n * @return {Boolean} whether this transport is available.\n * @api public\n */\n\nWS.prototype.check = function(){\n  return !!WebSocket && !('__initialize' in WebSocket && this.name === WS.prototype.name);\n};\n","/*! https://mths.be/utf8js v2.0.0 by @mathias */\n;(function(root) {\n\n\t// Detect free variables `exports`\n\tvar freeExports = typeof exports == 'object' && exports;\n\n\t// Detect free variable `module`\n\tvar freeModule = typeof module == 'object' && module &&\n\t\tmodule.exports == freeExports && module;\n\n\t// Detect free variable `global`, from Node.js or Browserified code,\n\t// and use it as `root`\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {\n\t\troot = freeGlobal;\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\tvar stringFromCharCode = String.fromCharCode;\n\n\t// Taken from https://mths.be/punycode\n\tfunction ucs2decode(string) {\n\t\tvar output = [];\n\t\tvar counter = 0;\n\t\tvar length = string.length;\n\t\tvar value;\n\t\tvar extra;\n\t\twhile (counter < length) {\n\t\t\tvalue = string.charCodeAt(counter++);\n\t\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t\t// high surrogate, and there is a next character\n\t\t\t\textra = string.charCodeAt(counter++);\n\t\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t\t} else {\n\t\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\t\toutput.push(value);\n\t\t\t\t\tcounter--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toutput.push(value);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\t// Taken from https://mths.be/punycode\n\tfunction ucs2encode(array) {\n\t\tvar length = array.length;\n\t\tvar index = -1;\n\t\tvar value;\n\t\tvar output = '';\n\t\twhile (++index < length) {\n\t\t\tvalue = array[index];\n\t\t\tif (value > 0xFFFF) {\n\t\t\t\tvalue -= 0x10000;\n\t\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t\t}\n\t\t\toutput += stringFromCharCode(value);\n\t\t}\n\t\treturn output;\n\t}\n\n\tfunction checkScalarValue(codePoint) {\n\t\tif (codePoint >= 0xD800 && codePoint <= 0xDFFF) {\n\t\t\tthrow Error(\n\t\t\t\t'Lone surrogate U+' + codePoint.toString(16).toUpperCase() +\n\t\t\t\t' is not a scalar value'\n\t\t\t);\n\t\t}\n\t}\n\t/*--------------------------------------------------------------------------*/\n\n\tfunction createByte(codePoint, shift) {\n\t\treturn stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80);\n\t}\n\n\tfunction encodeCodePoint(codePoint) {\n\t\tif ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence\n\t\t\treturn stringFromCharCode(codePoint);\n\t\t}\n\t\tvar symbol = '';\n\t\tif ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence\n\t\t\tsymbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0);\n\t\t}\n\t\telse if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence\n\t\t\tcheckScalarValue(codePoint);\n\t\t\tsymbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0);\n\t\t\tsymbol += createByte(codePoint, 6);\n\t\t}\n\t\telse if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence\n\t\t\tsymbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0);\n\t\t\tsymbol += createByte(codePoint, 12);\n\t\t\tsymbol += createByte(codePoint, 6);\n\t\t}\n\t\tsymbol += stringFromCharCode((codePoint & 0x3F) | 0x80);\n\t\treturn symbol;\n\t}\n\n\tfunction utf8encode(string) {\n\t\tvar codePoints = ucs2decode(string);\n\t\tvar length = codePoints.length;\n\t\tvar index = -1;\n\t\tvar codePoint;\n\t\tvar byteString = '';\n\t\twhile (++index < length) {\n\t\t\tcodePoint = codePoints[index];\n\t\t\tbyteString += encodeCodePoint(codePoint);\n\t\t}\n\t\treturn byteString;\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\tfunction readContinuationByte() {\n\t\tif (byteIndex >= byteCount) {\n\t\t\tthrow Error('Invalid byte index');\n\t\t}\n\n\t\tvar continuationByte = byteArray[byteIndex] & 0xFF;\n\t\tbyteIndex++;\n\n\t\tif ((continuationByte & 0xC0) == 0x80) {\n\t\t\treturn continuationByte & 0x3F;\n\t\t}\n\n\t\t// If we end up here, it’s not a continuation byte\n\t\tthrow Error('Invalid continuation byte');\n\t}\n\n\tfunction decodeSymbol() {\n\t\tvar byte1;\n\t\tvar byte2;\n\t\tvar byte3;\n\t\tvar byte4;\n\t\tvar codePoint;\n\n\t\tif (byteIndex > byteCount) {\n\t\t\tthrow Error('Invalid byte index');\n\t\t}\n\n\t\tif (byteIndex == byteCount) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Read first byte\n\t\tbyte1 = byteArray[byteIndex] & 0xFF;\n\t\tbyteIndex++;\n\n\t\t// 1-byte sequence (no continuation bytes)\n\t\tif ((byte1 & 0x80) == 0) {\n\t\t\treturn byte1;\n\t\t}\n\n\t\t// 2-byte sequence\n\t\tif ((byte1 & 0xE0) == 0xC0) {\n\t\t\tvar byte2 = readContinuationByte();\n\t\t\tcodePoint = ((byte1 & 0x1F) << 6) | byte2;\n\t\t\tif (codePoint >= 0x80) {\n\t\t\t\treturn codePoint;\n\t\t\t} else {\n\t\t\t\tthrow Error('Invalid continuation byte');\n\t\t\t}\n\t\t}\n\n\t\t// 3-byte sequence (may include unpaired surrogates)\n\t\tif ((byte1 & 0xF0) == 0xE0) {\n\t\t\tbyte2 = readContinuationByte();\n\t\t\tbyte3 = readContinuationByte();\n\t\t\tcodePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3;\n\t\t\tif (codePoint >= 0x0800) {\n\t\t\t\tcheckScalarValue(codePoint);\n\t\t\t\treturn codePoint;\n\t\t\t} else {\n\t\t\t\tthrow Error('Invalid continuation byte');\n\t\t\t}\n\t\t}\n\n\t\t// 4-byte sequence\n\t\tif ((byte1 & 0xF8) == 0xF0) {\n\t\t\tbyte2 = readContinuationByte();\n\t\t\tbyte3 = readContinuationByte();\n\t\t\tbyte4 = readContinuationByte();\n\t\t\tcodePoint = ((byte1 & 0x0F) << 0x12) | (byte2 << 0x0C) |\n\t\t\t\t(byte3 << 0x06) | byte4;\n\t\t\tif (codePoint >= 0x010000 && codePoint <= 0x10FFFF) {\n\t\t\t\treturn codePoint;\n\t\t\t}\n\t\t}\n\n\t\tthrow Error('Invalid UTF-8 detected');\n\t}\n\n\tvar byteArray;\n\tvar byteCount;\n\tvar byteIndex;\n\tfunction utf8decode(byteString) {\n\t\tbyteArray = ucs2decode(byteString);\n\t\tbyteCount = byteArray.length;\n\t\tbyteIndex = 0;\n\t\tvar codePoints = [];\n\t\tvar tmp;\n\t\twhile ((tmp = decodeSymbol()) !== false) {\n\t\t\tcodePoints.push(tmp);\n\t\t}\n\t\treturn ucs2encode(codePoints);\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\tvar utf8 = {\n\t\t'version': '2.0.0',\n\t\t'encode': utf8encode,\n\t\t'decode': utf8decode\n\t};\n\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttypeof define == 'function' &&\n\t\ttypeof define.amd == 'object' &&\n\t\tdefine.amd\n\t) {\n\t\tdefine(function() {\n\t\t\treturn utf8;\n\t\t});\n\t}\telse if (freeExports && !freeExports.nodeType) {\n\t\tif (freeModule) { // in Node.js or RingoJS v0.8.0+\n\t\t\tfreeModule.exports = utf8;\n\t\t} else { // in Narwhal or RingoJS v0.7.0-\n\t\t\tvar object = {};\n\t\t\tvar hasOwnProperty = object.hasOwnProperty;\n\t\t\tfor (var key in utf8) {\n\t\t\t\thasOwnProperty.call(utf8, key) && (freeExports[key] = utf8[key]);\n\t\t\t}\n\t\t}\n\t} else { // in Rhino or a web browser\n\t\troot.utf8 = utf8;\n\t}\n\n}(this));\n","\n/*\n * Module requirements.\n */\n\nvar isArray = require('isarray');\n\n/**\n * Module exports.\n */\n\nmodule.exports = hasBinary;\n\n/**\n * Checks for binary data.\n *\n * Right now only Buffer and ArrayBuffer are supported..\n *\n * @param {Object} anything\n * @api public\n */\n\nfunction hasBinary(data) {\n\n  function _hasBinary(obj) {\n    if (!obj) return false;\n\n    if ( (global.Buffer && global.Buffer.isBuffer(obj)) ||\n         (global.ArrayBuffer && obj instanceof ArrayBuffer) ||\n         (global.Blob && obj instanceof Blob) ||\n         (global.File && obj instanceof File)\n        ) {\n      return true;\n    }\n\n    if (isArray(obj)) {\n      for (var i = 0; i < obj.length; i++) {\n          if (_hasBinary(obj[i])) {\n              return true;\n          }\n      }\n    } else if (obj && 'object' == typeof obj) {\n      if (obj.toJSON) {\n        obj = obj.toJSON();\n      }\n\n      for (var key in obj) {\n        if (Object.prototype.hasOwnProperty.call(obj, key) && _hasBinary(obj[key])) {\n          return true;\n        }\n      }\n    }\n\n    return false;\n  }\n\n  return _hasBinary(data);\n}\n","/**\n * An abstraction for slicing an arraybuffer even when\n * ArrayBuffer.prototype.slice is not supported\n *\n * @api public\n */\n\nmodule.exports = function(arraybuffer, start, end) {\n  var bytes = arraybuffer.byteLength;\n  start = start || 0;\n  end = end || bytes;\n\n  if (arraybuffer.slice) { return arraybuffer.slice(start, end); }\n\n  if (start < 0) { start += bytes; }\n  if (end < 0) { end += bytes; }\n  if (end > bytes) { end = bytes; }\n\n  if (start >= bytes || start >= end || bytes === 0) {\n    return new ArrayBuffer(0);\n  }\n\n  var abv = new Uint8Array(arraybuffer);\n  var result = new Uint8Array(end - start);\n  for (var i = start, ii = 0; i < end; i++, ii++) {\n    result[ii] = abv[i];\n  }\n  return result.buffer;\n};\n","module.exports = after\n\nfunction after(count, callback, err_cb) {\n    var bail = false\n    err_cb = err_cb || noop\n    proxy.count = count\n\n    return (count === 0) ? callback() : proxy\n\n    function proxy(err, result) {\n        if (proxy.count <= 0) {\n            throw new Error('after called too many times')\n        }\n        --proxy.count\n\n        // after first error, rest are passed to err_cb\n        if (err) {\n            bail = true\n            callback(err)\n            // future error callbacks will go to error handler\n            callback = err_cb\n        } else if (proxy.count === 0 && !bail) {\n            callback(null, result)\n        }\n    }\n}\n\nfunction noop() {}\n","/**\n * Create a blob builder even when vendor prefixes exist\n */\n\nvar BlobBuilder = global.BlobBuilder\n  || global.WebKitBlobBuilder\n  || global.MSBlobBuilder\n  || global.MozBlobBuilder;\n\n/**\n * Check if Blob constructor is supported\n */\n\nvar blobSupported = (function() {\n  try {\n    var a = new Blob(['hi']);\n    return a.size === 2;\n  } catch(e) {\n    return false;\n  }\n})();\n\n/**\n * Check if Blob constructor supports ArrayBufferViews\n * Fails in Safari 6, so we need to map to ArrayBuffers there.\n */\n\nvar blobSupportsArrayBufferView = blobSupported && (function() {\n  try {\n    var b = new Blob([new Uint8Array([1,2])]);\n    return b.size === 2;\n  } catch(e) {\n    return false;\n  }\n})();\n\n/**\n * Check if BlobBuilder is supported\n */\n\nvar blobBuilderSupported = BlobBuilder\n  && BlobBuilder.prototype.append\n  && BlobBuilder.prototype.getBlob;\n\n/**\n * Helper function that maps ArrayBufferViews to ArrayBuffers\n * Used by BlobBuilder constructor and old browsers that didn't\n * support it in the Blob constructor.\n */\n\nfunction mapArrayBufferViews(ary) {\n  for (var i = 0; i < ary.length; i++) {\n    var chunk = ary[i];\n    if (chunk.buffer instanceof ArrayBuffer) {\n      var buf = chunk.buffer;\n\n      // if this is a subarray, make a copy so we only\n      // include the subarray region from the underlying buffer\n      if (chunk.byteLength !== buf.byteLength) {\n        var copy = new Uint8Array(chunk.byteLength);\n        copy.set(new Uint8Array(buf, chunk.byteOffset, chunk.byteLength));\n        buf = copy.buffer;\n      }\n\n      ary[i] = buf;\n    }\n  }\n}\n\nfunction BlobBuilderConstructor(ary, options) {\n  options = options || {};\n\n  var bb = new BlobBuilder();\n  mapArrayBufferViews(ary);\n\n  for (var i = 0; i < ary.length; i++) {\n    bb.append(ary[i]);\n  }\n\n  return (options.type) ? bb.getBlob(options.type) : bb.getBlob();\n};\n\nfunction BlobConstructor(ary, options) {\n  mapArrayBufferViews(ary);\n  return new Blob(ary, options || {});\n};\n\nmodule.exports = (function() {\n  if (blobSupported) {\n    return blobSupportsArrayBufferView ? global.Blob : BlobConstructor;\n  } else if (blobBuilderSupported) {\n    return BlobBuilderConstructor;\n  } else {\n    return undefined;\n  }\n})();\n","/*\n * base64-arraybuffer\n * https://github.com/niklasvh/base64-arraybuffer\n *\n * Copyright (c) 2012 Niklas von Hertzen\n * Licensed under the MIT license.\n */\n(function(chars){\n  \"use strict\";\n\n  exports.encode = function(arraybuffer) {\n    var bytes = new Uint8Array(arraybuffer),\n    i, len = bytes.length, base64 = \"\";\n\n    for (i = 0; i < len; i+=3) {\n      base64 += chars[bytes[i] >> 2];\n      base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n      base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n      base64 += chars[bytes[i + 2] & 63];\n    }\n\n    if ((len % 3) === 2) {\n      base64 = base64.substring(0, base64.length - 1) + \"=\";\n    } else if (len % 3 === 1) {\n      base64 = base64.substring(0, base64.length - 2) + \"==\";\n    }\n\n    return base64;\n  };\n\n  exports.decode =  function(base64) {\n    var bufferLength = base64.length * 0.75,\n    len = base64.length, i, p = 0,\n    encoded1, encoded2, encoded3, encoded4;\n\n    if (base64[base64.length - 1] === \"=\") {\n      bufferLength--;\n      if (base64[base64.length - 2] === \"=\") {\n        bufferLength--;\n      }\n    }\n\n    var arraybuffer = new ArrayBuffer(bufferLength),\n    bytes = new Uint8Array(arraybuffer);\n\n    for (i = 0; i < len; i+=4) {\n      encoded1 = chars.indexOf(base64[i]);\n      encoded2 = chars.indexOf(base64[i+1]);\n      encoded3 = chars.indexOf(base64[i+2]);\n      encoded4 = chars.indexOf(base64[i+3]);\n\n      bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n      bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n      bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n    }\n\n    return arraybuffer;\n  };\n})(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\");\n","/**\n * Module dependencies.\n */\n\nvar Transport = require('../transport');\nvar parseqs = require('parseqs');\nvar parser = require('engine.io-parser');\nvar inherit = require('component-inherit');\nvar yeast = require('yeast');\nvar debug = require('debug')('engine.io-client:polling');\n\n/**\n * Module exports.\n */\n\nmodule.exports = Polling;\n\n/**\n * Is XHR2 supported?\n */\n\nvar hasXHR2 = (function() {\n  var XMLHttpRequest = require('xmlhttprequest-ssl');\n  var xhr = new XMLHttpRequest({ xdomain: false });\n  return null != xhr.responseType;\n})();\n\n/**\n * Polling interface.\n *\n * @param {Object} opts\n * @api private\n */\n\nfunction Polling(opts){\n  var forceBase64 = (opts && opts.forceBase64);\n  if (!hasXHR2 || forceBase64) {\n    this.supportsBinary = false;\n  }\n  Transport.call(this, opts);\n}\n\n/**\n * Inherits from Transport.\n */\n\ninherit(Polling, Transport);\n\n/**\n * Transport name.\n */\n\nPolling.prototype.name = 'polling';\n\n/**\n * Opens the socket (triggers polling). We write a PING message to determine\n * when the transport is open.\n *\n * @api private\n */\n\nPolling.prototype.doOpen = function(){\n  this.poll();\n};\n\n/**\n * Pauses polling.\n *\n * @param {Function} callback upon buffers are flushed and transport is paused\n * @api private\n */\n\nPolling.prototype.pause = function(onPause){\n  var pending = 0;\n  var self = this;\n\n  this.readyState = 'pausing';\n\n  function pause(){\n    debug('paused');\n    self.readyState = 'paused';\n    onPause();\n  }\n\n  if (this.polling || !this.writable) {\n    var total = 0;\n\n    if (this.polling) {\n      debug('we are currently polling - waiting to pause');\n      total++;\n      this.once('pollComplete', function(){\n        debug('pre-pause polling complete');\n        --total || pause();\n      });\n    }\n\n    if (!this.writable) {\n      debug('we are currently writing - waiting to pause');\n      total++;\n      this.once('drain', function(){\n        debug('pre-pause writing complete');\n        --total || pause();\n      });\n    }\n  } else {\n    pause();\n  }\n};\n\n/**\n * Starts polling cycle.\n *\n * @api public\n */\n\nPolling.prototype.poll = function(){\n  debug('polling');\n  this.polling = true;\n  this.doPoll();\n  this.emit('poll');\n};\n\n/**\n * Overloads onData to detect payloads.\n *\n * @api private\n */\n\nPolling.prototype.onData = function(data){\n  var self = this;\n  debug('polling got data %s', data);\n  var callback = function(packet, index, total) {\n    // if its the first message we consider the transport open\n    if ('opening' == self.readyState) {\n      self.onOpen();\n    }\n\n    // if its a close packet, we close the ongoing requests\n    if ('close' == packet.type) {\n      self.onClose();\n      return false;\n    }\n\n    // otherwise bypass onData and handle the message\n    self.onPacket(packet);\n  };\n\n  // decode payload\n  parser.decodePayload(data, this.socket.binaryType, callback);\n\n  // if an event did not trigger closing\n  if ('closed' != this.readyState) {\n    // if we got data we're not polling\n    this.polling = false;\n    this.emit('pollComplete');\n\n    if ('open' == this.readyState) {\n      this.poll();\n    } else {\n      debug('ignoring poll - transport state \"%s\"', this.readyState);\n    }\n  }\n};\n\n/**\n * For polling, send a close packet.\n *\n * @api private\n */\n\nPolling.prototype.doClose = function(){\n  var self = this;\n\n  function close(){\n    debug('writing close packet');\n    self.write([{ type: 'close' }]);\n  }\n\n  if ('open' == this.readyState) {\n    debug('transport open - closing');\n    close();\n  } else {\n    // in case we're trying to close while\n    // handshaking is in progress (GH-164)\n    debug('transport not open - deferring close');\n    this.once('open', close);\n  }\n};\n\n/**\n * Writes a packets payload.\n *\n * @param {Array} data packets\n * @param {Function} drain callback\n * @api private\n */\n\nPolling.prototype.write = function(packets){\n  var self = this;\n  this.writable = false;\n  var callbackfn = function() {\n    self.writable = true;\n    self.emit('drain');\n  };\n\n  var self = this;\n  parser.encodePayload(packets, this.supportsBinary, function(data) {\n    self.doWrite(data, callbackfn);\n  });\n};\n\n/**\n * Generates uri for connection.\n *\n * @api private\n */\n\nPolling.prototype.uri = function(){\n  var query = this.query || {};\n  var schema = this.secure ? 'https' : 'http';\n  var port = '';\n\n  // cache busting is forced\n  if (false !== this.timestampRequests) {\n    query[this.timestampParam] = yeast();\n  }\n\n  if (!this.supportsBinary && !query.sid) {\n    query.b64 = 1;\n  }\n\n  query = parseqs.encode(query);\n\n  // avoid port if default for schema\n  if (this.port && (('https' == schema && this.port != 443) ||\n     ('http' == schema && this.port != 80))) {\n    port = ':' + this.port;\n  }\n\n  // prepend ? to query\n  if (query.length) {\n    query = '?' + query;\n  }\n\n  var ipv6 = this.hostname.indexOf(':') !== -1;\n  return schema + '://' + (ipv6 ? '[' + this.hostname + ']' : this.hostname) + port + this.path + query;\n};\n","\n/**\n * Module exports.\n *\n * Logic borrowed from Modernizr:\n *\n *   - https://github.com/Modernizr/Modernizr/blob/master/feature-detects/cors.js\n */\n\ntry {\n  module.exports = typeof XMLHttpRequest !== 'undefined' &&\n    'withCredentials' in new XMLHttpRequest();\n} catch (err) {\n  // if XMLHttp support is disabled in IE then it will throw\n  // when trying to create\n  module.exports = false;\n}\n","module.exports = Array.isArray || function (arr) {\n  return Object.prototype.toString.call(arr) == '[object Array]';\n};\n","'use strict';\n\nvar alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_'.split('')\n  , length = 64\n  , map = {}\n  , seed = 0\n  , i = 0\n  , prev;\n\n/**\n * Return a string representing the specified number.\n *\n * @param {Number} num The number to convert.\n * @returns {String} The string representation of the number.\n * @api public\n */\nfunction encode(num) {\n  var encoded = '';\n\n  do {\n    encoded = alphabet[num % length] + encoded;\n    num = Math.floor(num / length);\n  } while (num > 0);\n\n  return encoded;\n}\n\n/**\n * Return the integer value specified by the given string.\n *\n * @param {String} str The string to convert.\n * @returns {Number} The integer value represented by the string.\n * @api public\n */\nfunction decode(str) {\n  var decoded = 0;\n\n  for (i = 0; i < str.length; i++) {\n    decoded = decoded * length + map[str.charAt(i)];\n  }\n\n  return decoded;\n}\n\n/**\n * Yeast: A tiny growing id generator.\n *\n * @returns {String} A unique id.\n * @api public\n */\nfunction yeast() {\n  var now = encode(+new Date());\n\n  if (now !== prev) return seed = 0, prev = now;\n  return now +'.'+ encode(seed++);\n}\n\n//\n// Map each character to its index.\n//\nfor (; i < length; i++) map[alphabet[i]] = i;\n\n//\n// Expose the `yeast`, `encode` and `decode` functions.\n//\nyeast.encode = encode;\nyeast.decode = decode;\nmodule.exports = yeast;\n","\nmodule.exports = function(a, b){\n  var fn = function(){};\n  fn.prototype = b.prototype;\n  a.prototype = new fn;\n  a.prototype.constructor = a;\n};","module.exports = function(Creek){\n\nreturn ''\n+ '<div class=\"creek-shows-container\">'\n+ '  <div class=\"creek-weekdays\">'\n+ '    <ul>'\n+ '      <li class=\"creek-weekday creek-weekday-1\"><a href=\"#!/weekday/1\" data-weekday=\"1\">Monday</a></li>'\n+ '      <li class=\"creek-weekday creek-weekday-2\"><a href=\"#!/weekday/2\" data-weekday=\"2\">Tuesday</a></li>'\n+ '      <li class=\"creek-weekday creek-weekday-3\"><a href=\"#!/weekday/3\" data-weekday=\"3\">Wednesday</a></li>'\n+ '      <li class=\"creek-weekday creek-weekday-4\"><a href=\"#!/weekday/4\" data-weekday=\"4\">Thursday</a></li>'\n+ '      <li class=\"creek-weekday creek-weekday-5\"><a href=\"#!/weekday/5\" data-weekday=\"5\">Friday</a></li>'\n+ '      <li class=\"creek-weekday creek-weekday-6\"><a href=\"#!/weekday/6\" data-weekday=\"6\">Saturday</a></li>'\n+ '      <li class=\"creek-weekday creek-weekday-7\"><a href=\"#!/weekday/7\" data-weekday=\"7\">Sunday</a></li>'\n+ '      <li class=\"creek-weekday creek-weekday-0 creek-shows-all\"><a href=\"#!/all\"><i class=\"fa fa-search\"></i> All Shows</a></li>'\n// + '    <a class=\"creek-shows-all creek-shows-all\"><a href=\"#!/all\">All Shows</a>'\n+ '    </ul>'\n+ '  </div>'\n+ '  <div class=\"creek-shows\">'\n+ '    <div :class=\"\\'creek-show \\'+show.short_name\" v-for=\"show in shows\">'\n+ '      <div class=\"creek-time-container\">'\n+ '        <div class=\"creek-time\">'\n+ '          <span class=\"creek-start\" v-text=\"\\'2000-01-01 \\'+show.Airtime.start | moment \\'h:mma\\'\"></span>'\n+ '          <span class=\"creek-divider\">&mdash;</span>'\n+ '          <span class=\"creek-end\" v-text=\"\\'2000-01-01 \\'+show.Airtime.end | moment \\'h:mma\\'\"></span>'\n+ '        </div>'\n+ '      </div>'\n+ '      <div v-if=\"!show.group\" class=\"creek-image-container\">'\n+ '        <a :href=\"\\''+Creek.data.shows.prefix+'\\'+show.short_name\"><img v-if=\"show.Image\" :src=\"show.Image.url_sm\" /></a>'\n+ '      </div>'\n+ '      <div v-if=\"show.group\" class=\"creek-grouped-image-container\">'\n+ '        <a v-for=\"grouped_show in show.group\" :href=\"\\''+Creek.data.shows.prefix+'\\'+grouped_show.short_name\" :class= \"\\'creek-grouped-image creek-grouped-image-\\'+grouped_show.id\"><img v-if=\"grouped_show.Image\" :src=\"grouped_show.Image.url_sm\" /></a>'\n+ '      </div>'\n+ '      <div class=\"creek-info-container readmore-js-section readmore-js-collapsed\">'\n+ '        <h3 v-if=\"!show.group\" class=\"creek-title\"><a :href=\"\\''+Creek.data.shows.prefix+'\\'+show.short_name\" v-text=\"show.title\"></a></h3>'\n+ '        <div v-if=\"show.group\" class=\"creek-show-group-titles\">'\n+ '          <h3 class=\"creek-title\"><span v-for=\"grouped_show in show.group\" class=\"creek-show-group-title\"><span class=\"creek-show-group-titles-divider\">/</span><a class=\"creek-show-group-title-link\" :href=\"\\''+Creek.data.shows.prefix+'\\'+grouped_show.short_name\" data-show-id=\"{{grouped_show.id}}\" v-text=\"grouped_show.title\"></a></span></h3>'\n+ '        </div>'\n+ '        <div class=\"creek-hosts-container\">'\n+ '          <ul>'\n+ '            <li v-for=\"host in show.hosts\"><a class=\"creek-host-link\" href=\"/profiles/\" :href=\"\\'/profiles/\\'+host.username\" v-text=\"host.display_name\"></a></li>'\n+ '          </ul>'\n+ '        </div>'\n+ '        <div class=\"creek-short-description\" v-text=\"show.short_description\"></div>'\n+ '        <!--'\n+ '        <div class=\"categories\">'\n+ '          <div class=\"categories-container\">'\n+ '            <ul>'\n+ '              <li><a href=\"#\" class=\"creek-category-link\" v-text=\"category.title\"></a></li>'\n+ '            </ul>'\n+ '          </div>'\n+ '        </div>'\n+ '        -->'\n+ '      </div>'\n+ '      <a href=\"#\" class=\"creek-readmore-js-toggle\"></a>'\n+ '    </div>'\n+ '  </div>'\n+ '</div>'\n\n}\n"]}